ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python的tushare库实现沪深300指数数据分析———CAMP模型.

2021-07-08 16:32:46  阅读:343  来源: 互联网

标签:tushare Python CAMP Rf 2018 print import data change


(1)筛选
使用作业1的程序

  1. 完成对沪深300指数成分股过去2015年1月-2018年1月三年的数据分析
  2. 按alpha从大到小,选择出30只alpha最高的股票形成股票池1,以备进一步分析

(2)预测

  1. 对沪深300指数成分股2018年1月-2021年1月三年的数据分析
  2. 选择出30只alpha最高的股票形成股票池2
  3. 观察股票池1和股票池2的重合度
  4. 分别计算股票池1在2015-2018时间段和2018-2021时间段的Alpha均值,观察Alpha均值的变化
  5. 对观察结果进行思考与分析

股票基础信息获取网站
![在这里插入图片描述](https://www.icode9.com/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.icode9.com/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.icode9.com/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))
    
    
    
    
    
    

在这里插入图片描述

标签:tushare,Python,CAMP,Rf,2018,print,import,data,change
来源: https://www.cnblogs.com/lj-C/p/14986647.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有