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数据分析领域的代码文章~(需要定制类似的代码可私信)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51 单片机[8]:串口通信

一、目标 单片机通过串口向电脑发送数据&#xff08;数字递增&#xff09;电脑通过串口控制单片机上的LED 二、基本概念 1. 串口 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。 单片机的串口可以…

Visio绘制的relu激活函数结构图,可导出高清图片,可修改,无水印。

Visio绘制的relu激活函数结构图,可导出高清图片&#xff0c;可修改&#xff0c;无水印。 方便用于小论文写作&#xff0c;方便用于毕业设计。 Visio版本为2021版&#xff0c;可用更高版本打开。 下载地址&#xff1a;地址 图片展示&#xff1a;

【Linux Commands】命令分类整理-命令搜索引擎-速查手册

Linux命令速查网站&#xff1a;https://linux.embeddev.asia 目前已经搜集了600条命令,对每一条命令都有详细的介绍。 本文展示的命令不全是安装系统时自带的。 Linux命令基于Unix哲学&#xff0c;旨在创建简单、短小、可组合的工具。每个命令通常只执行一个任务&#xff0…

open3d:随机采样一致性分割平面

1、背景介绍 随机采样一致性算法&#xff08;RANSAC Random Sample Consensus&#xff09;是一种迭代的参数估计算法&#xff0c;主要用于从包含大量噪声数据的样本中估计模型参数。其核心思想是通过随机采样和模型验证来找到数据中最符合模型假设的点。因此&#xff0c;只要事…

TI 【ads131m02】DSP TMS320F280049C调试与学习笔记

ads131m02 调试与学习笔记 时序SPI 参考链接&#xff1a; ADS131M02_TI官网资料参考 ADS131M02—英文使用手册 ADS131M0x—参考代码 Example C Code ADS131M02 是一款 two 通道、同步采样、24 位、ΔΣ 模数转换器 (ADC)&#xff0c;具有宽动态范围、低功耗和电能测量特定功能…

你还在手动构建Python项目吗?PyBuilder让一切自动化!

在 Python 项目开发中&#xff0c;构建和管理项目是一项繁琐但必不可少的工作。你可能需要处理依赖项、运行测试、生成文档等。这时候&#xff0c;PyBuilder 出场了。它是一个强大的构建自动化工具&#xff0c;可以帮助你简化项目管理&#xff0c;让你更专注于编写代码。 什么…

Unity Meta Quest 开发:如何在每只手指上添加 Poke 交互

XR 开发社区&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 找到玩家物体 OVRCameraRig 下的子物体 HandInteractorsRight/Left&#xff08;分别管理左右手的 Interactor&#xff09;下的 HandPokeInteractor 子物体&#x…

JMX 反序列化漏洞

前言 前段时间看到普元 EOS Platform 爆了这个洞&#xff0c;Apache James&#xff0c;Kafka-UI 都爆了这几个洞&#xff0c;所以决定系统来学习一下这个漏洞点。 JMX 基础 JMX 前置知识 JMX&#xff08;Java Management Extensions&#xff0c;即 Java 管理扩展&#xff0…

程序的机器级表示(一)汇编,汇编格式和数据传输指令

系列文章 : 深入理解计算机系统笔记 文章目录 系列文章3 程序的机器级表示3.1 历史观点3.2 程序编码3.2.1 机器级代码3.2.2 代码示例3.2.3 关于格式的注解 3.3 数据格式3.4 访问信息3.4.1 操作数指示符3.4.2 数据传送指令3.4.3 数据传送示例3.4.4 压入和弹出栈数据 3 程序的机…

达梦数据库系列—30. DTS迁移Mysql到DM

目录 1.MySQL 源端信息 2.DM 目的端信息 3.迁移评估 4.数据库迁移 4.1源端 MySQL 准备 4.2目的端达梦准备 初始化参数设置 兼容性参数设置 创建迁移用户和表空间 4.3迁移步骤 创建迁移 配置迁移对象及策略 开始迁移 对象补迁 5.数据校验 统计 MySQL 端对象及数…

Unity: TextMeshPro生成中文字体(附3.5k,7k,2w常用字集)

免费常用3千5&#xff0c;7千字&#xff0c;2万字中文字体包 1.选择Window/TextMeshPro/Font Asset Creator 注&#xff1a;准备字体&#xff1a;从字体库或其他来源获取中文字体文件&#xff0c;通常为.ttf、.otf或.ttc格式。最简单的方式是从Windows系统文件的Font文件夹里…

应用层自定义协议与序列化

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 协议 简单来说&#xff0c;就是通信双方约定好的结构化的数据。 序列化与反序列化 我们通过一个问题引入这个概念&#xff0c;假如我们要实现一个网络版的计算器&#xff0c;那么现在有两种方案&#xff0c;第一种&#x…

C语言超市管理系统UI界面

以下是部分代码。需要源码的私信 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 //字体宽度 #define font_h 90 //字体高度typedef struct node {char name[100];//名字char number[1…

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块&#xff08;XD-MDEP100&#xff09;是一种用于将Modbus协议转换为Ethernet/IP协议的设备。它可以将Modbus RTU和Modbus TCP两种不同格式的Modbus数据包转换为Ethernet/IP协议的数据包&#xff0c;实现不同厂家的设备之间的数据交换和共享。在汇川P…

软件测试----概念篇(笔试相关,一般考察开发模型和测试模型的特点及适用场景)

文章目录 前言一、需求二、开发模型1.什么是“模型”2.软件的生命周期3.常见开发模型瀑布模型螺旋模型增量模型、迭代模型敏捷模型 三、测试模型V模型W模型(双V模型&#xff09; 前言 在当今软件行业飞速发展的时代&#xff0c;软件测试已成为软件质量保障的重要环节。它贯穿于…

WhisperX

文章目录 一、关于 WhisperX新闻 &#x1f6a8; 二、设置⚙️1、创建Python3.10环境2、安装PyTorch&#xff0c;例如Linux和Windows CUDA11.8&#xff1a;3、安装此repo4、Speaker Diarization 三、使用&#x1f4ac;&#xff08;命令行&#xff09;1、English2、他语言例如德语…

Cyber Weekly #16

赛博新闻 1、OpenAI 发布 GPT-4o mini OpenAI 本周官宣推出 GPT-4o mini&#xff0c;这是 GPT-4o 更小参数量的简化版本。ChatGPT 的免费用户、Plus 用户和 Team 用户能使用 GPT-4o mini 而并非 GPT-3.5 Turbo&#xff0c;企业用户在下周也将获得 GPT-4o mini 的权限。GPT-4o…

少儿编程启蒙宝典:Scratch动画游戏108变

一、编程教育的时代价值与意义 随着数字时代的深入发展&#xff0c;社会对人才的需求正发生深刻变革&#xff0c;计算思维与编程能力已成为衡量个人竞争力的重要指标。在此背景下&#xff0c;培养孩子们运用计算思维解决实际问题的能力&#xff0c;成为教育领域的重要任务。编…

UE4-获得角色控制权的两种方法

方法一&#xff1a; 方法二&#xff1a; 注意此方法不能有多个玩家出生点&#xff0c;如果有多个玩家出生点&#xff0c;会随机的选择一个玩家出生点进行生成。

IP5306移动电源DIY

最近制作一款移动电源&#xff0c;芯片采用的是IP5306