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.交易日期)
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%收益;我们从图上可以看出,基本上指数定投每年都会战胜理财,最高的时候超出理财106.59%,所以在资金的保值增值方面,指数基金定投大概率会战胜理财。
这是2016年9月30号累积定投资金情况
交易日期 累积定投资金 基金定投资金曲线 理财定投资金曲线 基金/理财
2016-09-30 39000 44386.663772 41605.42466 0.066848