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均值的变化
- 对观察结果进行思考与分析
股票基础信息获取网站
将沪深300的成分股的基础信息整合到txt文件中
将获取的股票基础信息整理成csv文件便于在Python中读取
使用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 npdef 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年之前还未上市,作为特殊情况处理,返回0if len(gzmt.date) == 0:return [0]gzmt["p_change"] = (gzmt["close"] / gzmt["close"].shift(1) - 1) * 100except: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-RfEret = ret_merge-RfEret.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["股票代码"] = codeplt.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 dataif __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 = dfdf1['α'] = n1 # 添加股票α系数df1['β'] = n2 # 添加股票β系数new1 = df1.sort_values(by='α', ascending=False) # 按照α进行降序new1.to_csv("stock1.csv", index=False) # 将数据存入csv文件中new1 = new1[:100]# 设定股票池1,选取α系数前30 的股票放入股票池1mean1 = 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 = dfdf2['α'] = 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 = 0print("股票池1和股票池2都出现的企业")for i in new1["企业名称"]:if i in list(new2["企业名称"]):print(i)c += 1print("股票池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模型相关推荐
- python获取股指_用Python读取csv文件中的沪深300指数历史交易数据
保存路径:D:\python\用Python读取csv文件中的沪深300指数历史交易数据 程序名称:readcsvhs300.py: 数据名称:沪深300指数历史交易数据.csv: 开发环境:Win7 ...
- 利用tushare和pandas获得沪深300指数在每个工作日的平均日收益率
我用下面的代码来获得沪深300指数在不同工作日的平均日收益率. 运用的python包有: pandas tushare numpy datetime #导入需要的包 import pandas as ...
- tushare获取沪深300指数历史_TuShare -财经数据接口包
在Pro版接口中,我们也增加了通用通用行情接口,可以方便获得各种资产各种频度的数据,欢迎使用. 获取个股历史交易数据(包括均线数据),可以通过参数设置获取日k线.周k线.月k线,以及5分钟.15分钟. ...
- tushare获取沪深300指数历史_在tushare上提取沪深300指交易数据
import numpy as np import pandas as pd import tushare as ts import MySQLdb as mdb #获取沪深300指数的股票名单 hs ...
- Python爬虫入门:爬虫抓取沪深300指数列表
使用Python3爬取沪深300指数列表 1. 思路分析 用chrome打开维基百科沪深300的页面,网址为:https://en.wikipedia.org/wiki/CSI_300_Index . ...
- python分析数据走势图_左大营 | python数据分析篇系列1——探索沪深300指数(附代码)(中)...
探索沪深300指数(HS300)--基于Python(中) [承接上文] 写在前面:本文只做分析,提供观点,不构成投资建议 如需转载请微信联系:eosO_oke 佛系更新,关注不迷路 沪深300指数是 ...
- 在tushare上提取沪深300指交易数据
import numpy as np import pandas as pd import tushare as ts import MySQLdb as mdb #获取沪深300指数的股票名单 hs ...
- 用爬虫分析沪深300指数超长走势
我们知道,一个股市里面有非常多的股票,我们如何能够量化整个股市整体的行情呢,答案是通过一些综合性的指数.本文所选用的沪深300就是这类指数中的一个.我们先来看一下百度百科对于沪深300的解释. 由于股 ...
- Barra 结构化风险模型实现(1)——沪深300指数的风格因子暴露度分析
米筐科技(RiceQuant)策略研究报告:Barra 结构化风险模型实现(1)--沪深300指数的风格因子暴露度分析 江嘉键 1 年前1 概述 Barra 结构化风险模型是全球知名的投资组合表现和风 ...
最新文章
- Django模型Model的定义
- 【新鲜出炉】25套的精美 Web 应用程序图标素材
- 福建省高等学校非计算机考试大纲,福建省高等院校学生计算机一级考试大纲
- Python回调函数
- shell 脚本 生成文件,文件名为日期时间
- h5c3 part6 flex
- Android软件安全与逆向分析之Dalvik
- Spring入门之一-------实现一个简单的IoC
- python文件按行读取变为嵌套列表_迭代两个嵌套的2D列表,其中list2具有list1的行号...
- ping html 微信支付,说说PING++介入微信H5支付,我趟过的坑。
- 苹果降价潮一波接一波 两款廉价iPad“箭在弦上”
- Pantera Capital合伙人:ETH已成为机构资产类别
- plink 与 ssh 远程登录问题
- lisp用entmake生产圆柱体_蚌埠踏步板钢盖板沟盖板生产加工厂家材质齐全-老友网...
- 2022年工作室暑期培训
- element-vue admin 右击路由选项 利用fullscreen实现全局页面全屏
- pg8168改mac命令_使用PG8168修改8111b网卡MAC地址
- python 小海龟 教案_幼儿园小班健康活动《勇敢的小海龟》教案
- Hybrid Trajectory Planning for Autonomous Driving in On-Road Dynamic Scenarios文章解读
- Failed to execute ‘btoa‘ on ‘Window‘: The string to be encoded contains characters outside of the La