加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2018-11-01 10:57:17)
标签:

python

tushare

自定义指数

金融数据

分类: 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有兴趣,尽请先免费注册和免费使用tushare https://tushare.pro/register?reg=124585


完整代码

 Python Code 
1
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 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('08a1f9ec1344c'#请注册使用自己的TS key,这个key没用
pro ts.pro_api()

#凑一堆股票做指数
stock_list=[]
for in range(600000,600050):
    stock_list.append(str(i)+'.SH')
#取基准日算权重,这里参照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

#取半年日线
df1 pd.DataFrame()
for 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=20subplots=Truelogy=False)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有