Python的tushare库实现沪深300指数数据分析———CAMP模型.
2021/7/8 17:06:18
本文主要是介绍Python的tushare库实现沪深300指数数据分析———CAMP模型.,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
(1)筛选
使用作业1的程序
- 完成对沪深300指数成分股过去2015年1月-2018年1月三年的数据分析
- 按alpha从大到小,选择出30只alpha最高的股票形成股票池1,以备进一步分析
(2)预测
- 对沪深300指数成分股2018年1月-2021年1月三年的数据分析
- 选择出30只alpha最高的股票形成股票池2
- 观察股票池1和股票池2的重合度
- 分别计算股票池1在2015-2018时间段和2018-2021时间段的Alpha均值,观察Alpha均值的变化
- 对观察结果进行思考与分析
股票基础信息获取网站
![在这里插入图片描述](https://www.www.zyiz.net/i/ll/?i=20210405112019579.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQzNjMxOQ==,size_16,color_FFFFFF,t_70)
将沪深300的成分股的基础信息整合到txt文件中
![在这里插入图片描述](https://www.www.zyiz.net/i/ll/?i=20210405111953557.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQzNjMxOQ,size_16,color_FFFFFF,t_70)
将获取的股票基础信息整理成csv文件便于在Python中读取
![在这里插入图片描述](https://www.www.zyiz.net/i/ll/?i=20210405112101693.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQzNjMxOQ,size_16,color_FFFFFF,t_70)
使用tushare库爬取股票交易数据,建立CAMP模型,进行分析,废话不多话,直接上代码!
""" python3.7 -*- coding: UTF-8 -*- @Project -> File :Code -> CAMP @IDE :PyCharm @Author :YangShouWei @USER: 296714435 @Date :2021/4/6 15:41:37 @LastEditor: """ import pandas as pd import tushare as ts import matplotlib.pyplot as plt import statsmodels.api as sm import re import numpy as np def modelCAMP(code,name, starttime, endtime): # 资本资产进价模型(CAPM) # Ri -Rf = β*(Rm-Rf) + ε # 载入股指数据 sh = ts.get_k_data('sh', start=starttime,end=endtime, autype='qfq') # 获取上证数据 sh["p_change"] = (sh["close"] / sh["close"].shift(1) - 1) * 100 # 利用今日收盘价和前日收盘价计算股价波动,新增一列 try: gzmt = ts.get_k_data(code, start=starttime,end=endtime, autype='qfq') # 获取股票数据 # 一些企业在2018年之前还未上市,作为特殊情况处理,返回0 if len(gzmt.date) == 0: return [0] gzmt["p_change"] = (gzmt["close"] / gzmt["close"].shift(1) - 1) * 100 except: return [0] # print(code) ret_merge = pd.merge(pd.DataFrame(sh.p_change), pd.DataFrame(gzmt.p_change), left_index = True, right_index = True, how = 'inner') # 计算日无风险利率 Rf_year = 0.04 # 以2018 年中国三年期国债年化收益率为无风险利率 Rf = (1+Rf_year)**(1/365)-1 # 年利率转化为日利率 # 计算风险溢价:Ri-Rf Eret = ret_merge-Rf Eret.head() # 画出两个风险溢价的散点图,查看相关性 plt.scatter(Eret.values[:, 0], Eret.values[:,1]) # plt.show() # 利用最小二乘法进行线性回归,拟合CAPM 模型 md_capm = sm.OLS(Eret.p_change_y[1:], sm.add_constant(Eret.p_change_x[1:])) result = md_capm.fit() text = str(result.summary()) print("\n{}CAMP建立".format(name)) print(result.summary()) alpha = result.params[0] # α系数 Beita = result.params[1] # β系数 Pvalue = result.pvalues[1] print("a={},β={},pvalue={}".format(alpha,Beita,Pvalue)) # print("{}的α系数:{},β系数:{}".format(name,number1,number2)) return [alpha, Beita] def readData(): # 读取沪深300成分股的基础信息 data = pd.read_csv('one.csv') # print(data.head()) # print(data.columns) # 处理数据,将股票代码的数据类型从int转换成字符串 code =[] for i in data['股票代码']: if i<10: i = '00000'+str(i) elif i<100: i = '0000' + str(i) elif i < 1000: i = '000' + str(i) elif i < 10000: i = '00' + str(i) elif i < 100000: i = '0' + str(i) else: i = str(i) code.append(i) data["股票代码"] = code plt.rcParams["font.sans-serif"] = "SimHei" #设置图片中字体为中文黑体 # 绘制沪深300指数成分股行业汇总统计图 draw = pd.DataFrame({"行业": data.groupby('主营行业')["主营行业"].count()}) draw.plot(kind="barh") plt.title("沪深300成分股行业统计图") plt.xlabel("数量") plt.ylabel("行业名称") plt.tick_params(axis='x', labelsize=8) plt.tick_params(axis='y', labelsize=8) plt.show() return data if __name__ == "__main__": data = readData() # 读取股票基础数据 info ={"股票代码":list(data["股票代码"]), "企业名称": list(data['股票简称']),"主营行业":list(data["主营行业"])} df = pd.DataFrame(info) # print(df) # 筛选 stime = '2015-01-01' etime = '2018-01-01' # 依次计算企业的CAMP拟合结果 code = list(df['股票代码']) name = list(df["企业名称"]) n1 = [] # 用于存放α系数 n2 = [] # 用于存放β系数 print("对沪深300指数成分股2015年1月-2018年1月的CAMP模型计算") for i in range(len(code)): num = modelCAMP(code[i],name[i],stime,etime) if len(num) == 2: n1.append(num[0]) n2.append(num[1]) elif num[0] == 0: # print("{}在2018年还未上市".format(name[i])) n1.append(np.nan) n2.append(np.nan) else: print("不存在风险系数") df1 = df df1['α'] = n1 # 添加股票α系数 df1['β'] = n2 # 添加股票β系数 new1 = df1.sort_values(by='α', ascending=False) # 按照α进行降序 new1.to_csv("stock1.csv", index=False) # 将数据存入csv文件中 new1 = new1[:100]# 设定股票池1,选取α系数前30 的股票放入股票池1 mean1 = new1['α'].mean() # print("股票池1的α平均值{}".format(mean1)) # 预测 stime = '2018-01-01' etime = '2021-01-01' n3 = [] # 存放α系数 n4 = [] # 存放β系数 print("对沪深300指数成分股2018年1月-2021年1月的CAMP模型计算") for i in range(len(code)): num = modelCAMP(code[i],name[i], stime, etime) if len(num) == 2: n3.append(num[0]) n4.append(num[1]) else: print("不存在风险系数") df2 = df df2['α'] = n3 # 添加股票α系数 df2['β'] = n4 # 添加股票β系数 new2 = df2.sort_values(by='α', ascending=False) # 按照α进行降序 new2.to_csv("stock2.csv", index=None) new2 = new2[:100] # 设定股票池1,选取α系数前30 的股票放入股票池2 # 计算股票池1和股票池2的重合度 c = 0 print("股票池1和股票池2都出现的企业") for i in new1["企业名称"]: if i in list(new2["企业名称"]): print(i) c += 1 print("股票池1和股票池2一共有{}支股票重合,重合度为{}".format(c,c/100)) # 绘制股票池中企业所属行业分布图 # draw1 = pd.DataFrame({"行业": new1.groupby('主营行业')["主营行业"].count()}) # draw1.plot(kind="barh") # plt.title("股票池1行业统计图") # plt.xlabel("数量") # plt.ylabel("行业名称") # plt.tick_params(axis='x', labelsize=8) # plt.tick_params(axis='y', labelsize=8) # # draw2 = pd.DataFrame({"行业": new2.groupby('主营行业')["主营行业"].count()}) # draw2.plot(kind="barh") # plt.title("股票池2行业统计图") # plt.xlabel("数量") # plt.ylabel("行业名称") # plt.tick_params(axis='x', labelsize=8) # plt.tick_params(axis='y', labelsize=8) # plt.show() # # stime = '2018-01-01' # etime = '2021-01-01' # n5=[] # print("对股票池1中的股票2018年1月-2021年1月的阿尔法值进行计算") # code = list(new1["股票代码"]) # name = list(new1["企业名称"]) # for i in range(len(code)): # num = modelCAMP(code[i], name[i], stime, etime) # if len(num) == 2: # n5.append(num[0]) # elif num[0] == 0: # print("{}在2018年还未上市".format(name[i])) # else: # print("不存在风险系数") # df3 = new1 # df3['α'] = n5 # 添加股票α系数 # m = 0 # for i in n5: # m += i # mean2 = m/len(n5) # print("股票池1在2015年-2018年的α均值{},在2018年-2021年α的均值{}".format(mean1, mean2))
这篇关于Python的tushare库实现沪深300指数数据分析———CAMP模型.的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-27使用python 将ETH账户的资产打散
- 2024-09-26Python编程基础
- 2024-09-2610 种方法写出更好的 Python 代码
- 2024-09-25Python编程基础详解
- 2024-09-25Python编程入门教程
- 2024-09-25从零开始使用Python构建LLaMA 3
- 2024-09-23Python中理解和使用树形结构的简单教程
- 2024-09-23Python 编程基础入门
- 2024-09-18初探Python股票自动化交易:入门指南
- 2024-09-18Python量化入门:轻松掌握量化分析基础与实战