Python量化分析—指数基金定投及Matplotlib作图: 实现双Y轴和中文显示

pandas指数基金定投策略

1.pd.read_csv中的index_col表示将交易日期这一列指定为index索引,parse_dates表示将某一column(通常包含时间数据信息)解析为时间列,以便将输入的字符串转换为可变的的时间序列;做时间序列数据分析通常要指定parse_dates,否则在选取时间范围时可能识别错误。
2.cumprod()函数和cumsum()函数使用
3.了解pd.concat()的用法:concat 与其说是连接,更准确的说是拼接。就是把两个表直接合在一起。于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis。axis=0 是行拼接,拼接之后行数增加,列数也根据join来定,join=’outer’时,列数是两表并集。同理join=’inner’,列数是两表交集。
在默认情况下,axis=0为纵向拼接,此时有concat([df1,df2]) 等价于 df1.append(df2),在axis=1 时为横向拼接 ,此时有concat([df1,df2],axis=1) 等价于merge(df1,df2,left_index=True,right_index=True,how=’outer’)
4.loc,iloc,ix的区别,loc[[0,100],[‘a’,’b’]]表示选取第0和100行两行,a,b两列;iloc同样用法,不同是iloc可以用iloc[[0,-1],[‘a’,’b’]],loc不行,但iloc不能用行标签来选取;

data=pd.read_csv('overview-data-sh/index/sh000001.csv',encoding='gbk',index_col='交易日期',parse_dates=['交易日期'])

data=data[['股票代码','收盘价']].sort_index()
data.index=pd.to_datetime(data.index)
data=data['20130731':'20160930']
data['无风险利率']=(4/100 + 1) **(1/250)-1   #将4%作为无风险年化利率
data['无风险收益_净值']=(data.无风险利率+1).cumprod()

by_month=data.resample('M',how='first',kind='period')
trade_log=pd.DataFrame(index=by_month.index)
trade_log['基金净值']=by_month.收盘价/1000
trade_log['money']=1000
trade_log['基金份额']=trade_log.money/trade_log.基金净值
trade_log['总基金份额']=trade_log['基金份额'].cumsum()
trade_log['累积定投资金']=trade_log['money'].cumsum()
trade_log['理财份额']=trade_log.money/by_month.无风险收益_净值
trade_log['总理财份额']=trade_log['理财份额'].cumsum()

temp=trade_log.resample('D',fill_method='ffill')
data=data.to_period('D')


daily_data=pd.concat([data,temp],axis=1,join='inner')  # inner表示交集,outer 表示并集,left 和right 表示取某一边。
daily_data['基金定投资金曲线']=daily_data['收盘价']/1000 * daily_data['总基金份额']
daily_data['理财定投资金曲线']=daily_data['无风险收益_净值'] * daily_data['总理财份额']
df=daily_data.reset_index()

df['基金/理财']=(df['基金定投资金曲线']/df['理财定投资金曲线']) - 1
df=df[['交易日期','累积定投资金','基金定投资金曲线','理财定投资金曲线','基金/理财']].sort('基金/理财',ascending=False)
df.to_csv('df',encoding='gbk')
df=pd.read_csv('df',encoding='gbk')
temp=df[['交易日期','基金/理财']]
temp=temp.set_index('交易日期')
print ('最差时基金定投比理财定投亏损:%.2f%%,时间为:%s' % (temp.iloc[-1]*100,str(temp.index[-1])))
print ('最好时基金定投比理财定投盈利:%.2f%%,时间为:%s' % (temp.iloc[0]*100,str(temp.index[0])))

df.交易日期=pd.to_datetime(df.交易日期)


df2=df[['交易日期','累积定投资金','基金定投资金曲线','理财定投资金曲线','基金/理财']].sort('交易日期')
df2.to_csv('df2',encoding='gbk')
df3=pd.read_csv('df2',encoding='gbk')
df3=df3[['交易日期','累积定投资金','基金定投资金曲线','理财定投资金曲线','基金/理财']]
df3.交易日期=pd.to_datetime(df3.交易日期)

用matplotlib绘图:

1.如何实现matplotlib画图时候的中文显示:
2.如何实现双y轴的label显示;

如果想要三条曲线用同一个X、Y轴,可以用如下函数;

%pylab
import matplotlib.pyplot as plt
zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
data1=df3['基金定投资金曲线']
data2=df3['理财定投资金曲线']
data3=df3['基金/理财']
line1,=plt.plot(data1,'k',label='基金定投资金曲线')
line2,=plt.plot(data2,'g',label='理财定投资金曲线')
line3,=plt.plot(data3,'b',label='基金/理财')

plt.legend(prop=zhfont1,loc='best')
plt.xlabel('时间',fontproperties=zhfont1)
plt.ylabel('累积资金',fontproperties=zhfont1)
plt.title('指数定投策略',fontproperties=zhfont1)
plt.show()

Python量化分析—指数基金定投及Matplotlib作图: 实现双Y轴和中文显示_第1张图片

如果想要实现双y轴,同一x轴,以下代码:

%pylab
import matplotlib.pyplot as plt
zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
data1=df3['基金定投资金曲线']
data2=df3['理财定投资金曲线']
data3=df3['基金/理财']
fig=plt.figure()

ax1=fig.add_subplot(111)
ax1.plot(data1,'b',label='基金定投资金曲线')
ax1.plot(data2,'g',label='理财定投资金曲线')
ax1.legend(loc=1,prop=zhfont1)  #这边如果没有legend(),只最后用legend()的话,matplotlib会覆盖掉ax1的label,这点linux不会这样;
ax1.set_ylabel('累积资金',fontproperties=zhfont1)

ax2=ax1.twinx()   #关键函数,和df['收盘价'].plot(secondary_y=True)实现同样功能
ax2.plot(data3,'r',label='基金/理财')
ax2.legend(loc=2,prop=zhfont1)
ax2.set_ylabel('基金/理财-1',fontproperties=zhfont1)
ax2.set_xlabel('时间',fontproperties=zhfont1)
ax2.set_title('指数定投策略',fontproperties=zhfont1)

plt.show()

Python量化分析—指数基金定投及Matplotlib作图: 实现双Y轴和中文显示_第2张图片

上图中选择了’20130731’:’20160930’的上证指数做定投与4%的无风险利率买理财对比,发现最差时基金定投比理财定投亏损:-6.65%,时间为:2014-01-20
最好时基金定投比理财定投盈利:106.59%,时间为:2015-06-12
20130731上证指数为1993.8,20160930上证指数为3004.7,在这39个月时间,每个月定投1000元,到20160930累积指数基金和理财的总资金如下,指数定投实现收益13.8%;理财实现6.7%收益;我们从图上可以看出,基本上指数定投每年都会战胜理财,最高的时候超出理财106.59%,所以在资金的保值增值方面,指数基金定投大概率会战胜理财。

这是2016年9月30号累积定投资金情况
交易日期 累积定投资金 基金定投资金曲线 理财定投资金曲线 基金/理财
2016-09-30 39000 44386.663772 41605.42466 0.066848

你可能感兴趣的:(python量化分析)