1. 程式人生 > >Python量化分析—指數基金定投及Matplotlib作圖: 實現雙Y軸和中文顯示

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()

指數定投策略

如果想要實現雙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