利用Python和Tushare构建自定义指数
2018-11-01 10:57阅读:
利用Python 和
Tushare构建自定义指数
我们经常用到指数这个概念。所谓指数,就是一堆股票组合成的一个集合编制成的一个数字,用来反映这些股票的变动情况。例如我们常用的沪深300指数,上证指数等。Tushare提供了一些指数接口,例如:
- index_basic
- index_daily
- index_weight
但有时候,我们需要自定义一些指数,例如,我们构建了一个投资组合,想把他们编制成一个指数。本文就如何借助tushare编制自定义指数做一个探索。
初始化
初始化部分无非是:
#各种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)

后记
在编制指数时,注意以下问题:
- 如果股票较多,时间跨度较大,可能网络流量和计算量都较大,需要等待
- 注意处理复权问题,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'] = [ |