当前位置: 首页 > news >正文

Python数据风险案例54——人工智能热门概念股爬虫分析其价值(三因子模型)

案例背景

人工智能概念如火如荼的夏天,在这个2024年,我觉得需要提早布局一下这个概念。所以我们找一下A股里面人们的人工智能概念股,然后分析他们的数据应用三因子模型,也就是最经典的资本资产定价模型的衍生版去研究他们各自的投资价值。

(本案例仅用于研究学术分享,不构成任何投资建议。)


数据介绍

本次案例只有三因子数据是本地的,其他的数据都爬虫或者API接口获得,从互联网上爬取,首先从这个网站上获取:人工智能概念股名单一览_2024A股、B股人工智能概念上市公司有哪些 – 华西证券,热门的概念的股票名称,然后再使用akshare这个非常好用且免费的金融数据库,获取这些股票的交易数据,然后再采用三因子模型进行回归对比评估。

当然数据我也下载到本地了,和三因子数据打包一起放在这里,需要的这些数据和全部代的同学可以参考:人工智能data


代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
import statsmodels.api as sm
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号

获取人工智能概念股票

下面直接进行爬虫,懂网页文件的同学可以看看代码,不懂的同学直接用就行

import requests
from bs4 import BeautifulSoup
# 目标网页地址
url = 'https://m.hx168.com.cn/stock/concept/BK2196.html'
# 发送HTTP请求获取网页内容
response = requests.get(url)
response.encoding = 'utf-8'  # 确保中文正确显示
# 解析网页
soup = BeautifulSoup(response.text, 'html.parser')def get_code(class_name=''):# 定位到目标表格tables = soup.find_all('table', {'class': 'am-table am-table-bordered am-table-striped am-text-nowrap'})#print(len(tables))dfs=pd.DataFrame()for table in tables:# 解析表格标题headings = [th.get_text().strip() for th in table.find('thead').find_all('th')]# 解析表格数据data = []for row in table.find('tbody').find_all('tr'):cells = row.find_all('td')if len(cells) > 0:  # 确保行内有数据data_row = []for cell in cells:a_tag = cell.find('a')if a_tag:data_row.append(a_tag.get_text().strip())  # 如果单元格内有链接,则获取链接文本else:data_row.append(cell.get_text().strip())data.append(data_row)df=pd.DataFrame(data=data,columns=headings)dfs=pd.concat([dfs,df],axis=0,ignore_index=True)# 打印结果return dfs

运行然后,查看:

dfs=get_code()
dfs.head()

然后我们用列表跟字典把它们这些名称和代码都装起来。

code_name=dict(zip(dfs['股票代码'],dfs['股票简称']))
code_list=dfs['股票代码'].to_list()

获取这些股票的交易数据

自定义一个函数从ak share这个库里面获取

import akshare as ak
# 定义获取A股历史交易数据的函数
def get_stock_data(stock_code, start_date, end_date):""":param stock_code: 股票代码,如 '000001':param start_date: 开始日期,格式为 'YYYYMMDD':param end_date: 结束日期,格式为 'YYYYMMDD':return: 指定时间段内的股票交易数据(DataFrame)"""# 使用 AkShare 的 stock_zh_a_hist 接口获取数据stock_df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date=start_date, end_date=end_date, adjust="qfq")stock_df['收益率'] = stock_df['收盘'].pct_change() return stock_df.dropna()

 下面开始循环遍历所有的代码,然后获取他们的交易数据。

return_dict={}#创建一个 ExcelWriter 对象
#writer = pd.ExcelWriter('股票数据.xlsx', engine='xlsxwriter')
for code in code_list:try:return_dict[code]=get_stock_data(stock_code=code,start_date='20230201',end_date='20240201')[['日期','收盘','收益率']].set_index('日期')#get_stock_data(stock_code=code,start_date='20230201',end_date='20240201').to_excel(writer, sheet_name=code)except:pass#writer.save()
#writer.close()

 因为存的是字典,我们拿出来看一下其中的一个数据的情况。

return_dict['002415'].head(4)

数据没有什么问题,下面我们开始使用三因子模型去进行分析。


三因子模型

这是gpt写的模型的简介,我觉得还写的挺好的,大家可以看看。

 下面读取三因子的数据,三因子的数据。我的数据里面有五个因子。但是我这里只用了三因子就没搞那么多。

#读取三因子数据
three_factors=pd.read_csv('fivefactor_daily.csv')[['trddy','mkt_rf','smb','hml']].rename(columns={'trddy':'日期'}).set_index('日期')
three_factors=three_factors.loc['2023-02-01':'2024-02-01',:]
three_factors.index=pd.to_datetime(three_factors.index)
three_factors.head(3)

  • trddy [交易日期]
  • mkt_rf [市场风险因子]
  • smb [规模风险因子]
  • hml [账面市值比风险因子]
  • rf [无风险利率]

自定义一些股票里面常用的,评价一个资产表现的函数。

def sum_return_ratio(price_list):'''实际总收益率'''price_list = price_list.to_numpy()return (price_list[-1] - price_list[0]) / price_list[0]def MaxDrawdown(price_list):'''最大回撤率'''i = np.argmax((np.maximum.accumulate(price_list) - price_list) / np.maximum.accumulate(price_list))  # 结束位置if i == 0:return 0j = np.argmax(price_list[:i])  # 开始位置return (price_list[j] - price_list[i]) / (price_list[j])def sharpe_ratio(price_list, rf=0.000041):'''夏普比率'''# 公式 夏普率 = (回报率均值 - 无风险率) / 回报率的标准差# pct_change()是pandas里面的自带的计算每日增长率的函数daily_return = price_list.pct_change()return (daily_return.mean() - rf) / daily_return.std()def Information_Ratio(price_list, rf=0.000041):'''信息比率'''chaoer = sum_return_ratio(price_list) - ((1 + rf) ** 365 - 1)return chaoer / np.std(price_list.pct_change() - rf)def skewness_return(price_list):'''负偏态收益'''daily_return = price_list.pct_change()return daily_return.skew()def downside_upside_volatility_ratio(price_list):'''下跌波动比率'''daily_return = price_list.pct_change()# 获取下跌和上涨的日子的收益率returns_down = daily_return[daily_return < 0]returns_up = daily_return[daily_return > 0]# 计算各自的天数和收益率平方和n_down = len(returns_down)n_up = len(returns_up)sum_squared_returns_down = (returns_down ** 2).sum()sum_squared_returns_up = (returns_up ** 2).sum()# 计算DUVOLif n_down == 0 or n_up == 0:  # 避免除以0return np.nanduvol = np.log((n_up * sum_squared_returns_down) / (n_down * sum_squared_returns_up))return duvol

 自定义一个函数,输入这个股票的代码,我们就能够去计算它这些所有的资产表现的评价指标。方便复用。

def deal(code=''): day_return = return_dict[code]#['收益率']day_return.index=pd.to_datetime(day_return.index)zgpa_threefactor = pd.merge(three_factors, day_return,left_index=True, right_index=True)result = sm.OLS(zgpa_threefactor['收益率'], sm.add_constant(zgpa_threefactor.loc[:,['mkt_rf','smb','hml']])).fit()betas=result.params实际总收益率=sum_return_ratio(day_return['收盘'])最大回测率=MaxDrawdown(day_return['收盘'])夏普比率=sharpe_ratio(day_return['收盘'])信息比率=Information_Ratio(day_return['收盘'])负偏态收益 = skewness_return(day_return['收盘'])下跌波动比率 = downside_upside_volatility_ratio(day_return['收盘'])return pd.DataFrame({'阿尔法': betas[0], '市场风险因子MKT': betas[1], '市值因子SMB': betas[2], '账面市值因子HML': betas[3],'实际总收益率': 实际总收益率, '最大回测率': 最大回测率, '夏普比率': 夏普比率, '信息比率': 信息比率, '负偏态收益': 负偏态收益, '下跌波动比率': 下跌波动比率, '股票代码': code}, index=[0])

循环遍历去计算 

df_results=pd.DataFrame()
for code,df_one in return_dict.items():result=deal(code=code) ;  result['股票名称']=code_name[code]df_results=pd.concat([df_results,result],axis=0,ignore_index=True)

我们来查看结果

df_results


选出阿尔法前十的股票 来分析画图

阿尔法就是超额收益嘛,也就是回归里面的截距,我们选出前10的来画图看看。

df_results=df_results[['股票代码', '股票名称','阿尔法', '市场风险因子MKT', '市值因子SMB', '账面市值因子HML', '实际总收益率', '最大回测率', '夏普比率', '信息比率','负偏态收益','下跌波动比率']].sort_values(by='阿尔法',ascending=False)
df_results.head(10)

plt.figure(figsize=(10, 8),dpi=128)# 创建多子图布局
for i, column in enumerate(['阿尔法', '市场风险因子MKT', '市值因子SMB', '账面市值因子HML', '实际总收益率', '最大回测率', '夏普比率', '信息比率','负偏态收益','下跌波动比率'], 1):plt.subplot(5, 2, i)plt.bar(df_results.head(10)['股票名称'], df_results.head(10)[column], color='skyblue')plt.title(column)plt.xticks(rotation=45)  # 旋转标签,避免重叠# 调整布局
plt.tight_layout()
plt.show()

通过对比各股票的阿尔法值(Alpha)、贝塔值(Beta)、市值因子(SMB)、账面市值因子(HML)、实际总收益率、最大回测率、夏普比率和信息比率这些指标来分析和比较不同股票的表现。

阿尔法值(Alpha): 表示投资组合相对于基准业绩的超额回报,是投资者获取的与市场无关的回报。阿尔法值越高,说明股票表现越好。在您的列表中,昆仑万维的阿尔法值最高,表示在考虑风险因素后,其超额回报最高。

贝塔值(Beta): 表示股票相对于整个市场的波动性。贝塔值大于1意味着股票的价格波动大于市场平均水平,小于1则表示波动性小于市场。例如,昆仑万维的贝塔值是2.564679,这意味着它比市场波动性大,风险较高。

市值因子(SMB)和账面市值因子(HML): SMB表示小市值公司相对于大市值公司的超额回报,HML表示高账面市值比的公司相对于低账面市值比公司的超额回报。在您的数据中,鸿博股份的SMB值最高,表明它在小市值公司中表现较好;而同样的鸿博股份的HML值也是正的,意味着高账面市值比的公司表现更好。

实际总收益率: 表明股票在某段时间内的总回报。例如,中科信息的实际总收益率最高,说明它在过去一段时间内的表现最好。

最大回撤率: 表示在选定的周期内,投资组合可能遭受的最大损失。低最大回撤率意味着下跌风险较小。例如,柯力传感的最大回撤率最低,说明其价格下跌的风险相对较小。

夏普比率: 表示投资的每单位风险带来的超额回报,夏普比率越高,意味着单位风险带来的超额回报越高。鸿博股份的夏普比率最高,表明它在风险调整后的回报上表现最佳。

信息比率: 表示投资组合超额回报相对于跟踪误差的比率,信息比率越高,说明投资经理超越基准指数的能力越强。万兴科技的信息比率最高,表明其相对于其跟踪基准的表现最为出色。

综上所述,如果是在寻找高风险高回报的股票,可能会考虑昆仑万维中科信息,因为它们具有较高的阿尔法值和实际总收益率。如果更注重稳定性和低风险,柯力传感可能是一个更好的选择,因为其最大回撤率较低。另外,从风险调整后的回报来看,鸿博股份万兴科技表现较好,它们的夏普比率和信息比率较高。


储存结果

### 储存结果
df_results.to_csv('人工智能三因子结果.csv',index=False)


创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制类似的代码可私信)

相关文章:

Python数据风险案例54——人工智能热门概念股爬虫分析其价值(三因子模型)

案例背景 人工智能概念如火如荼的夏天&#xff0c;在这个2024年&#xff0c;我觉得需要提早布局一下这个概念。所以我们找一下A股里面人们的人工智能概念股&#xff0c;然后分析他们的数据应用三因子模型&#xff0c;也就是最经典的资本资产定价模型的衍生版去研究他们各自的投…...

【HarmonyOS开发】Navigation使用

简介 Navigation是路由容器组件&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。适用于模块内和跨模块的路由切换。 在页面跳转时&#xff0c;应该使用页面路由router&#xff0c;在页面内的页面跳转时&#xff0c;建议使用Navigation达到更好的转场动效…...

计算机网络参考模型与5G协议

目录 OSI七层参考模型OSI模型vsTCP/IP模型TCP/IP协议族的组成 OSI七层参考模型 分层功能应用层网络服务与最终用户的一个接口表示层数据的表示,安全,压缩会话层建立,管理,终止会话传输层定义传输数据的协议端口号,以及流控和差错校验网络层进行逻辑地址寻址,实现不同网路之间的…...

docker自建rustdesk-server远程桌面

rustdesk简介 RustDesk 是一款可以平替 TeamViewer 的开源软件&#xff0c;旨在提供安全便捷的自建方案。 RustDesk 是一款功能齐全的远程桌面应用&#xff0c;具有以下特性&#xff1a; 支持 Windows、macOS、Linux、iOS、Android、Web 等多个平台。支持 VP8 / VP9 / AV1 …...

海外抖音黑屏是网络问题还是硬件问题?

随着海外抖音&#xff08;TikTok&#xff09;在全球范围内的普及&#xff0c;越来越多的用户开始体验这一短视频社交平台。然而&#xff0c;不少用户在使用过程中遇到了黑屏问题&#xff0c;这让人不禁疑惑&#xff1a;这究竟是网络问题还是硬件问题&#xff1f; 首先&#xf…...

为了实现接口缓存,专门写了个缓存库 f-cache-memory

问题起因 起因是某次发版之后&#xff0c;服务器接口压力过大&#xff0c;当场宕机&#xff0c;排查之后发现有个接口在首页被调十来次&#xff08;六七年的老项目了&#xff0c;都是泪呀&#xff09;&#xff0c;后端反馈这个接口的sql很复杂&#xff0c;很耗性能&#xff0c…...

actual combat 35 —— es

一、windows中es执行步骤 参考&#xff1a;https://blog.csdn.net/qq_21197507/article/details/115076913 下es安装包下es前端gitHub代码&#xff0c;然后npm -i安装&#xff0c;npm run start 启动安装kibana 二、遇到的问题 1. 第二步安装前端代码依赖报错 npm ERR! co…...

android R ext4 image打包脚本介绍

一、Android R打包指令使用介绍 &#xff08;1&#xff09;mkuserimg_mke2fs #./mkuserimg_mke2fs --help usage: mkuserimg_mke2fs [-h] [--android_sparse] [--journal_size JOURNAL_SIZE][--timestamp TIMESTAMP] [--fs_config FS_CONFIG][--product_out PRODUCT_OUT][--b…...

美式键盘 QWERTY 布局的来历

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…...

ETL数据同步之DataX,附赠一套DataX通用模板

今天跟大家分享数据同步datax的模板&#xff0c;小伙伴们简单直接借鉴使用。 还记得上一篇关于大数据DS调度工具的分享嘛&#xff1f; 主流大数据调度工具DolphinScheduler之数据ETL流程-CSDN博客 里面的核心就是采用了DATAX的数据同步原理。 一&#xff0c;什么是DataX D…...

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…...

某4G区域终端有时驻留弱信号小区分析

这些区域其实是长时间处于连接态的电信卡4G终端更容易出现。 出现问题时都是band1 100频点下发了针对弱信号的1650频点的连接态A4测量事件配置&#xff08;其阈值为-106&#xff09;。而这个条件很容易满足&#xff0c;一旦下发就会切到band3 1650频点。 而1650频点虽然下发ban…...

【体外诊断】ARM/X86+FPGA嵌入式计算机在免疫分析设备中的应用

体外诊断 信迈提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板&#xff0c;以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显&#xff0c;提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口&#xff0c;扩展性强&#xf…...

Linux上启动和停止jar

linux 后台运行jar 在Linux系统中&#xff0c;要想让jar包在后台运行&#xff0c;可以使用nohup命令和&符号。nohup命令可以使进程在后台不受挂起信号影响的执行&#xff0c;而&符号则是将任务放入后台执行。 以下是一个简单的命令示例&#xff0c;它将启动一个jar包…...

浏览器缓存:强缓存与协商缓存实现原理有哪些?

1、强缓存&#xff1a;设置缓存时间的&#xff0c;那么在这个时间内浏览器向服务器发送请求更新数据&#xff0c;但是服务器会让其从缓存中获取数据。 可参考&#xff1a;彻底弄懂强缓存与协商缓存 - 简书 2、协商缓存每次都会向浏览器询问&#xff0c;那么是怎么询问的呢&…...

持续集成04--Jenkins结合Gitee创建项目

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅途中&#xff0c;Jenkins与版本控制系统的紧密集成是不可或缺的一环。本篇“持续集成03--Jenkins结合Gitee创建项目”将引导如何将Jenkins与Gitee&#xff08;一个流行的Git代码托管平台&#xff09;相结合&#xff…...

【Node.js基础02】fs、path模块

目录 一&#xff1a;fs模块-读写文件 1 加载fs模块对象 2 读制定文件内容文件 3 向文件中写入内容 二&#xff1a;path模块-路径处理 1 问题引入 2 __dirname内置变量 使用方法 一&#xff1a;fs模块-读写文件 fs模块封装了与本机文件系统交互方法和属性 1 加载fs模块…...

牛客TOP101:单链表的排序

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 按我们以往的排序算法来看&#xff0c;针对链表来说都是太不合适&#xff0c;因为很多都会出现指针前移后移&#xff0c;后移还好说&#xff0c;前移对于链表来说就太难了&#xff0c;而且大部分都是某一个…...

数据可视化配色新工具,颜色盘多达2500+类

好看的配色,不仅能让图表突出主要信息,更能吸引读者,之前分享过很多配色工具,例如, 👉可视化配色工具:颜色盘多达3000+类,数万种颜色! 本次再分享一个配色工具pypalettes,颜色盘多达2500+类。 安装pypalettes pip install pypalettes pypalettes使用 第1步,挑选…...

SpringAI简单使用(本地模型+自定义知识库)

Ollama 简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它允许用户在本地机器上构建和运行语言模型&#xff0c;提供了一个简单易用的API来创建、运行和管理模型&#xff0c;同时还提供了丰富的预构建模型库&#xff0c;这些模型可以轻松地应用在多种应用场景中。O…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...