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——人工智能热门概念股爬虫分析其价值(三因子模型)
案例背景 人工智能概念如火如荼的夏天,在这个2024年,我觉得需要提早布局一下这个概念。所以我们找一下A股里面人们的人工智能概念股,然后分析他们的数据应用三因子模型,也就是最经典的资本资产定价模型的衍生版去研究他们各自的投…...
【HarmonyOS开发】Navigation使用
简介 Navigation是路由容器组件,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。适用于模块内和跨模块的路由切换。 在页面跳转时,应该使用页面路由router,在页面内的页面跳转时,建议使用Navigation达到更好的转场动效…...
计算机网络参考模型与5G协议
目录 OSI七层参考模型OSI模型vsTCP/IP模型TCP/IP协议族的组成 OSI七层参考模型 分层功能应用层网络服务与最终用户的一个接口表示层数据的表示,安全,压缩会话层建立,管理,终止会话传输层定义传输数据的协议端口号,以及流控和差错校验网络层进行逻辑地址寻址,实现不同网路之间的…...
docker自建rustdesk-server远程桌面
rustdesk简介 RustDesk 是一款可以平替 TeamViewer 的开源软件,旨在提供安全便捷的自建方案。 RustDesk 是一款功能齐全的远程桌面应用,具有以下特性: 支持 Windows、macOS、Linux、iOS、Android、Web 等多个平台。支持 VP8 / VP9 / AV1 …...
海外抖音黑屏是网络问题还是硬件问题?
随着海外抖音(TikTok)在全球范围内的普及,越来越多的用户开始体验这一短视频社交平台。然而,不少用户在使用过程中遇到了黑屏问题,这让人不禁疑惑:这究竟是网络问题还是硬件问题? 首先…...
为了实现接口缓存,专门写了个缓存库 f-cache-memory
问题起因 起因是某次发版之后,服务器接口压力过大,当场宕机,排查之后发现有个接口在首页被调十来次(六七年的老项目了,都是泪呀),后端反馈这个接口的sql很复杂,很耗性能,…...
actual combat 35 —— es
一、windows中es执行步骤 参考:https://blog.csdn.net/qq_21197507/article/details/115076913 下es安装包下es前端gitHub代码,然后npm -i安装,npm run start 启动安装kibana 二、遇到的问题 1. 第二步安装前端代码依赖报错 npm ERR! co…...
android R ext4 image打包脚本介绍
一、Android R打包指令使用介绍 (1)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 布局的来历
注:机翻,未校对。 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的模板,小伙伴们简单直接借鉴使用。 还记得上一篇关于大数据DS调度工具的分享嘛? 主流大数据调度工具DolphinScheduler之数据ETL流程-CSDN博客 里面的核心就是采用了DATAX的数据同步原理。 一,什么是DataX D…...
[论文笔记] CT数据配比方法论——1、Motivation
我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…...
某4G区域终端有时驻留弱信号小区分析
这些区域其实是长时间处于连接态的电信卡4G终端更容易出现。 出现问题时都是band1 100频点下发了针对弱信号的1650频点的连接态A4测量事件配置(其阈值为-106)。而这个条件很容易满足,一旦下发就会切到band3 1650频点。 而1650频点虽然下发ban…...
【体外诊断】ARM/X86+FPGA嵌入式计算机在免疫分析设备中的应用
体外诊断 信迈提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板,以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显,提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口,扩展性强…...
Linux上启动和停止jar
linux 后台运行jar 在Linux系统中,要想让jar包在后台运行,可以使用nohup命令和&符号。nohup命令可以使进程在后台不受挂起信号影响的执行,而&符号则是将任务放入后台执行。 以下是一个简单的命令示例,它将启动一个jar包…...
浏览器缓存:强缓存与协商缓存实现原理有哪些?
1、强缓存:设置缓存时间的,那么在这个时间内浏览器向服务器发送请求更新数据,但是服务器会让其从缓存中获取数据。 可参考:彻底弄懂强缓存与协商缓存 - 简书 2、协商缓存每次都会向浏览器询问,那么是怎么询问的呢&…...
持续集成04--Jenkins结合Gitee创建项目
前言 在持续集成/持续部署(CI/CD)的旅途中,Jenkins与版本控制系统的紧密集成是不可或缺的一环。本篇“持续集成03--Jenkins结合Gitee创建项目”将引导如何将Jenkins与Gitee(一个流行的Git代码托管平台)相结合ÿ…...
【Node.js基础02】fs、path模块
目录 一:fs模块-读写文件 1 加载fs模块对象 2 读制定文件内容文件 3 向文件中写入内容 二:path模块-路径处理 1 问题引入 2 __dirname内置变量 使用方法 一:fs模块-读写文件 fs模块封装了与本机文件系统交互方法和属性 1 加载fs模块…...
牛客TOP101:单链表的排序
文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 按我们以往的排序算法来看,针对链表来说都是太不合适,因为很多都会出现指针前移后移,后移还好说,前移对于链表来说就太难了,而且大部分都是某一个…...
数据可视化配色新工具,颜色盘多达2500+类
好看的配色,不仅能让图表突出主要信息,更能吸引读者,之前分享过很多配色工具,例如, 👉可视化配色工具:颜色盘多达3000+类,数万种颜色! 本次再分享一个配色工具pypalettes,颜色盘多达2500+类。 安装pypalettes pip install pypalettes pypalettes使用 第1步,挑选…...
SpringAI简单使用(本地模型+自定义知识库)
Ollama 简介 Ollama是一个开源的大型语言模型服务工具,它允许用户在本地机器上构建和运行语言模型,提供了一个简单易用的API来创建、运行和管理模型,同时还提供了丰富的预构建模型库,这些模型可以轻松地应用在多种应用场景中。O…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
