练习Python,计算指数基金组合对应的指数,并绘制变化趋势。
基金组合中一共有 7 支基金,分别为a,b,c,d,e,f,g。创建一个 Dataframe 用来存放各支基金在组合中的份额占比以及跟踪的指数。指数代码从新浪财经查找。
pythonimport 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)
rate | indexname | indexnum | |
---|---|---|---|
a | 0.2097 | 上证指数 | sh000001 |
b | 0.0989 | 中证500 | sh000905 |
c | 0.0966 | 沪深300 | sh000300 |
d | 0.0884 | 上证指数 | sh000001 |
e | 0.2174 | 上证指数 | sh000001 |
f | 0.1906 | 深证金融地产行业指数 | sz399619 |
g | 0.0984 | 上证指数 | sh000001 |
利用 AkShare 获取各指数的历史数据。因为股票基金是以收盘价定价,所以只需要各指数的收盘价来合成基金组合的对应指数。
pythonimport 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']
基金份额作为基金在组合中的权重,给每只基金追踪的指数乘以权重。
pythondata3 = {}
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)
a | b | c | d | e | f | g | |
---|---|---|---|---|---|---|---|
0 | 20.965806 | 97.607080 | 127.169553 | 8.838232 | 21.735652 | 624.215191 | 9.838032 |
1 | 21.890583 | 99.259304 | 125.781314 | 9.228076 | 22.694386 | 614.938689 | 10.271976 |
2 | 22.884561 | 98.365446 | 124.876172 | 9.647092 | 23.724862 | 614.153798 | 10.738392 |
3 | 24.021135 | 98.663233 | 122.937507 | 10.126220 | 24.903170 | 615.741686 | 11.271720 |
4 | 25.216425 | 99.526729 | 123.769813 | 10.630100 | 26.142350 | 624.679492 | 11.832600 |
... | ... | ... | ... | ... | ... | ... | ... |
2735 | 332.051772 | 623.495270 | 236.618899 | 139.977952 | 344.244421 | 1151.094773 | 155.812562 |
2736 | 327.414885 | 618.399250 | 241.072931 | 138.023252 | 339.437273 | 1159.137140 | 153.636742 |
2737 | 330.578839 | 627.443951 | 238.396725 | 139.357031 | 342.717404 | 1147.121716 | 155.121401 |
2738 | 322.013852 | 633.143459 | 236.409760 | 135.746421 | 333.837918 | 1149.457519 | 151.102351 |
2739 | 311.427148 | 631.412215 | 236.635127 | 131.283547 | 322.862479 | 1093.204598 | 146.134627 |
2740 rows × 7 columns
将所有基金乘以权重后的指数相加,得到加权平均值,作为基金组合的指数。
pythondf4['all'] = df4.iloc[:, 0:6].sum(axis=1)
display(df4)
a | b | c | d | e | f | g | all | |
---|---|---|---|---|---|---|---|---|
0 | 20.965806 | 97.607080 | 127.169553 | 8.838232 | 21.735652 | 624.215191 | 9.838032 | 900.531514 |
1 | 21.890583 | 99.259304 | 125.781314 | 9.228076 | 22.694386 | 614.938689 | 10.271976 | 893.792352 |
2 | 22.884561 | 98.365446 | 124.876172 | 9.647092 | 23.724862 | 614.153798 | 10.738392 | 893.651931 |
3 | 24.021135 | 98.663233 | 122.937507 | 10.126220 | 24.903170 | 615.741686 | 11.271720 | 896.392952 |
4 | 25.216425 | 99.526729 | 123.769813 | 10.630100 | 26.142350 | 624.679492 | 11.832600 | 909.964909 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
2735 | 332.051772 | 623.495270 | 236.618899 | 139.977952 | 344.244421 | 1151.094773 | 155.812562 | 2827.483087 |
2736 | 327.414885 | 618.399250 | 241.072931 | 138.023252 | 339.437273 | 1159.137140 | 153.636742 | 2823.484731 |
2737 | 330.578839 | 627.443951 | 238.396725 | 139.357031 | 342.717404 | 1147.121716 | 155.121401 | 2825.615666 |
2738 | 322.013852 | 633.143459 | 236.409760 | 135.746421 | 333.837918 | 1149.457519 | 151.102351 | 2810.608930 |
2739 | 311.427148 | 631.412215 | 236.635127 | 131.283547 | 322.862479 | 1093.204598 | 146.134627 | 2726.825114 |
2740 rows × 8 columns
绘制基金组合指数的变化趋势图。
python%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()
从历史数据变化趋势看,2004年之前的变化参考价值不大,对2004年之后的数据重新绘制趋势图。从上图看,只有上证指数和沪深300指数有2004年之前的数据。
pythondf4['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()
从上图看:
本文作者:tsingk
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!