利用Python和Tushare构建自定义指数

标签:
pythontushare自定义指数金融数据 |
分类: Python |
利用Python 和 Tushare构建自定义指数
我们经常用到指数这个概念。所谓指数,就是一堆股票组合成的一个集合编制成的一个数字,用来反映这些股票的变动情况。例如我们常用的沪深300指数,上证指数等。Tushare提供了一些指数接口,例如:
- index_basic
- index_daily
- index_weight
但有时候,我们需要自定义一些指数,例如,我们构建了一个投资组合,想把他们编制成一个指数。本文就如何借助tushare编制自定义指数做一个探索。
初始化
初始化部分无非是:
- 引入一些需要用到的包
- 设置显示格式
- 初始化tushare pro接口 在接口初始化部分,请使用自己的token,如果没有token,请先免费注册tusharehttps://tushare.pro/register?reg=124585
#各种Import import tushare as ts import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import seaborn as sb import numpy as np sb.set_style("whitegrid") #绘图样式 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 ts.set_token('94d84c') #请注册使用自己的TS key,这个key没用 pro = ts.pro_api()
构建指数的成分股
我们选取600000-600050的部分为例,把他们作为我们这个组合的成分股
#凑一堆股票做指数 stock_list=[] for i in range(600000,600050): stock_list.append(str(i)+'.SH')
计算成分股权重
成分股权重的确定方式很多,例如总股本,流通股,持仓数量,甚至你自己的偏好都可以,这里用总股本占比,我记得沪深300也是如此。 整个过程是这样的:
- 取得基准日(这里是2018年十月三十一日)的成分股总股本(同时也取了流通股本,您可以自己改)
- 权重=个股占比 * 系数,这个系数只是为了好看,您自己凑
#取基准日算权重,这里参照HS300使用总股本做权重占比,也有用流通股本的,那就用float_share df = pro.daily_basic(trade_date='20181031')[['ts_code','total_share','float_share']] df = df[df['ts_code'].isin (stock_list)] #权重,100随便凑个数字 df['weight'] = df['total_share']/df['total_share'].sum()*100
指数历史行情
到这里,有了成分股和权重,指数已经编制完成了,那么我们如何显示其历史走势呢?
- 取得每个成分股的行情(这里以2018.1-2018.6为例)
- 给行情数据加上权重项
- 将价格乘以权重
- 按日分类求和
- 显示
可以看出,这个指数就是:
- 每个股票的价格乘以其权重后相加得出
#取半年日线 df1 = pd.DataFrame() for x in stock_list: df1 = df1.append(pro.daily(ts_code=x, start_date='20180101', end_date = '20180630')[['ts_code','trade_date','close']]) #合并表,给行情数据加上权重项 df1 = df1.merge(right=df,on='ts_code',how='left') df1['index']=df1['weight']*df1['close'] df2 = df1[['trade_date','index']] idx = pd.DataFrame(df2.groupby(by=['trade_date']).sum().reset_index()) idx['trade_date'] = pd.to_datetime(idx['trade_date']) idx.plot(kind='line',x='trade_date',y='index', figsize=(10,5),fontsize=20, subplots=True, logy=False)
http://s6/mw690/0025YMIgzy7oQOeDPCd75&690
后记
在编制指数时,注意以下问题:
- 如果股票较多,时间跨度较大,可能网络流量和计算量都较大,需要等待
- 注意处理复权问题,tushare提供复权因子
- 注意权重变动情况,如果使用股本作为权重参考值,注意处理股本变动情况,如果使用持仓,那么在交易后请及时调整
对tushare有兴趣,尽请先免费注册和免费使用tusharehttps://tushare.pro/register?reg=124585
完整代码
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#各种Import
import import import import import import sb.set_style("whitegrid") mpl.rcParams['font.sans-serif'] ts.set_token('08a1f9ec1344c') #凑一堆股票做指数 stock_list=[] for #取基准日算权重,这里参照HS300使用总股本做权重占比,也有用流通股本的,那就用float_share df df #权重,100随便凑个数字 df['weight'] #取半年日线 df1 for #合并表,给行情数据加上权重项 df1 df1['index']=df1['weight']*df1['close'] df2 idx idx['trade_date'] idx.plot(kind='line',x='trade_date',y='index', |