练习Python,计算指数基金组合对应的指数,并绘制变化趋势。

基金组合信息

基金组合中一共有 7 支基金,分别为a,b,c,d,e,f,g。创建一个 Dataframe 用来存放各支基金在组合中的份额占比以及跟踪的指数。指数代码从新浪财经查找。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd

data1 = {'rate': [0.2097, 0.0989, 0.0966, 0.0884, 0.2174, 0.1906, 0.0984],
         'indexname': ['上证指数',
                       '中证500',
                       '沪深300',
                       '上证指数',
                       '上证指数',
                       '深证金融地产行业指数',
                       '上证指数'],
         'indexnum': ['sh000001', 'sh000905', 'sh000300', 'sh000001', 'sh000001', 'sz399619', 'sh000001']
        }
df1 = pd.DataFrame(data1, index=list('abcdefg'))
display(df1)
rateindexnameindexnum
a0.2097上证指数sh000001
b0.0989中证500sh000905
c0.0966沪深300sh000300
d0.0884上证指数sh000001
e0.2174上证指数sh000001
f0.1906深证金融地产行业指数sz399619
g0.0984上证指数sh000001

获取各指数历史数据

利用 AkShare 获取各指数的历史数据。因为股票基金是以收盘价定价,所以只需要各指数的收盘价来合成基金组合的对应指数。

1
2
3
4
5
6
7
import akshare as ak

df2 = df1.drop_duplicates(subset='indexnum', keep='first', inplace=False)
data2 = {}
for i in df2['indexnum']:
    stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol=i)
    data2[i] = stock_zh_index_daily_df['close']

基金份额作为基金在组合中的权重,给每只基金追踪的指数乘以权重。

1
2
3
4
5
6
data3 = {}
for i in df1.index:
    data3[i] = data2[df1.loc[i, 'indexnum']] * df1.loc[i, 'rate']
df3 = pd.DataFrame(data3)
df4 = df3.dropna(axis=0, how='any')
display(df4)
abcdefg
020.96580697.607080127.1695538.83823221.735652624.2151919.838032
121.89058399.259304125.7813149.22807622.694386614.93868910.271976
222.88456198.365446124.8761729.64709223.724862614.15379810.738392
324.02113598.663233122.93750710.12622024.903170615.74168611.271720
425.21642599.526729123.76981310.63010026.142350624.67949211.832600
........................
2735332.051772623.495270236.618899139.977952344.2444211151.094773155.812562
2736327.414885618.399250241.072931138.023252339.4372731159.137140153.636742
2737330.578839627.443951238.396725139.357031342.7174041147.121716155.121401
2738322.013852633.143459236.409760135.746421333.8379181149.457519151.102351
2739311.427148631.412215236.635127131.283547322.8624791093.204598146.134627

2740 rows × 7 columns

计算基金对应指数

将所有基金乘以权重后的指数相加,得到加权平均值,作为基金组合的指数。

1
2
df4['all'] = df4.iloc[:, 0:6].sum(axis=1)
display(df4)
abcdefgall
020.96580697.607080127.1695538.83823221.735652624.2151919.838032900.531514
121.89058399.259304125.7813149.22807622.694386614.93868910.271976893.792352
222.88456198.365446124.8761729.64709223.724862614.15379810.738392893.651931
324.02113598.663233122.93750710.12622024.903170615.74168611.271720896.392952
425.21642599.526729123.76981310.63010026.142350624.67949211.832600909.964909
...........................
2735332.051772623.495270236.618899139.977952344.2444211151.094773155.8125622827.483087
2736327.414885618.399250241.072931138.023252339.4372731159.137140153.6367422823.484731
2737330.578839627.443951238.396725139.357031342.7174041147.121716155.1214012825.615666
2738322.013852633.143459236.409760135.746421333.8379181149.457519151.1023512810.608930
2739311.427148631.412215236.635127131.283547322.8624791093.204598146.1346272726.825114

2740 rows × 8 columns

绘制基金组合指数的变化趋势图。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
%matplotlib inline
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['simhei'] 
mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['figure.figsize'] = (15.0, 6.0)

df4['all'].plot(linewidth=1, label='基金组合指数') # 添加label可指定图例
for i in data2:
    data2[i].plot(linewidth=1, label=i)
plt.title("基金组合指数的变化趋势")
plt.xlabel('时间')
plt.ylabel('指数')
plt.legend()
plt.show()

ji-suan-ji-jin-zu-he-zhi-shu_9_0.png

从历史数据变化趋势看,2004年之前的变化参考价值不大,对2004年之后的数据重新绘制趋势图。从上图看,只有上证指数和沪深300指数有2004年之前的数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
df4['all'].plot(linewidth=1, label='基金组合指数') # 添加label可指定图例
for i in data2:
    if i == 'sh000001' or 'sh000300':
        data2[i].loc['2004-01-01': ].plot(linewidth=1, label=i)
    else:
        data2[i].plot(linewidth=1, label=i)
plt.title("基金组合指数的变化趋势")
plt.xlabel('时间')
plt.ylabel('指数')
plt.legend()
plt.show()

ji-suan-ji-jin-zu-he-zhi-shu_11_0.png

从上图看:

  • 所有指数的变化方向基本一直,要涨都涨,要跌都跌,但涨跌幅度不一样;
  • 大概2009年之前这几个指数的值基本一样,图中线条接近重合;2009年之后开始分化,说明不同行业、不同类型企业的发展速度和程度开始分化;
  • 基金组合指数在2016年之后处于上证指数和沪深300指数之间,但因为都是增强性基金,所以不意味着该基金组合收益率一定小于沪深300的增长率;
  • 基金组合指数由各支基金跟踪的指数加权平均得到,由于都是增强性基金,不能准确反应基金组合的净值变化,但可以用来辅助选择定投的时间点。
  • 长期来看,指数基金是能赚钱的,但需要把握好买卖时间。