Python量化分析—指数基金定投及Matplotlib作图: 实现双Y轴和中文显示
2016-11-21 22:50
961 查看
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()
如果想要实现双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()
上图中选择了’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%收益;我们从图上可以看出,基本上指数定投每年都会
9fdd
战胜理财,最高的时候超出理财106.59%,所以在资金的保值增值方面,指数基金定投大概率会战胜理财。
这是2016年9月30号累积定投资金情况
交易日期 累积定投资金 基金定投资金曲线 理财定投资金曲线 基金/理财
2016-09-30 39000 44386.663772 41605.42466 0.066848
相关文章推荐
- Python实现matplotlib显示中文的方法详解
- python的matplotlib画图时无法显示中文的解决方法
- python实现Kmeans文本聚类,通过PCA降维和Matplotlib显示聚类3d三维图像
- Linux下python matplotlib.pyplot在图像上显示中文的问题
- 解决python中matplotlib绘图中文显示问题
- python中matplotlib绘图中文显示问题
- python番外(1)——matplotlib中文显示问题
- python中matplotlib绘图中文显示问题
- python matplotlib 中文显示参数设置
- python matplotlib plot 数据中的中文无法正常显示的解决办法
- Python 图形库 PIL, matplotlib 显示中文
- matplotlib作图中文显示问题
- Python 3下Matplotlib画图中文显示乱码的解决方法
- python matplotlib中文显示问题
- python matplotlib 中文显示参数设置
- python matplotlib.plot画图显示中文乱码的问题
- Linux下python matplotlib.pyplot在图像上显示中文的问题
- python画图包seaborn和matplotlib中文字体显示(针对windows系统,,使用ipython notebook)
- python matplotlib 中文显示参数设置
- python matplotlib plot 数据中的中文无法正常显示的解决办法