股票分析與資產組合(python)
本文利用python3.4進行分析,對財通福享,銀華鑫盛和國金鑫新三支股票在2017的情況進行解讀,並優化資產組合。
首先導入python相關的庫,這裡用tushare作為獲取數據的入口。
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt%matplotlib inlinefrom pylab import *mpl.rcParams[font.sans-serif] = [SimHei]plt.style.use(seaborn-whitegrid)import tushare as tsfrom datetime import datetime
建立我們需要股票名稱和代碼的欄位,股票代碼可以網上查得。
dic={財通福享:501026,銀華鑫盛:501022,國金鑫新:501000}
通過對字典進行迭代,用tushare的get_hist_data方法獲取股票數據,並選取交易量(volume)和變化趨勢(p_change)做曲線圖,觀察整體變情況。
info={}for name,code in dic.items(): info[name]=ts.get_hist_data(code,start=2017-01-01,end=2017-12-19) info[name].index=pd.to_datetime(info[name].index) info[name][[volume,p_change,]].plot(figsize=(15, 8),layout=(2,1),subplots=True) plt.subplot(2,1,1).set_title(name,fontproperties=SimHei)
三支股票的全年變化如下所示:
發現三支股票都沒有明顯的漲勢,波動比較劇烈,也可以理解,畢竟都炒房子去了。
然後還可以發現股票出現較大的波動時,不管是上漲還是下跌,交易量都會上升,說明還是有多空的活躍跡象。
年度的日數據變動過於頻繁,沒有操作價值,短線操作也很少以天為周期。我們想看看月的變化情況,用reshape進行重新採樣。
在這之前,要講一下,收益率不能簡單的平均求和,而是要算幾何平均和乘積。
即:若一支股票先漲50%後跌50%,
那麼他總共的變化應該是:1*(1+0.5)*(1-0.5)=0.75(跌了25%)。
這樣的話我們要先建立對列表求個元素乘積的函數:
def acc(list): t=1 for i in list: t=t*i return t
然後對三支股票求每個月度的總體變化趨勢:
pchange={}for name,df in info.items(): df[p1_change]=df[p_change]/100+1 p1c=df.resample(M).apply(lambda x : acc(x)).to_period(M) pchange[name]=p1c[p1_change].values*100-100pchangedf=pd.DataFrame(pchange)
發現數據的小數點位數過多:
用round保持兩位小數
pchangedf=pchangedf.applymap(lambda x: round(x,2))
看上去舒服多了:
作圖看一下:
mpl.rcParams[font.sans-serif] = [SimHei]plt.rcParams[axes.unicode_minus]=False #上邊這兩句都是為了中文顯示問題pchangedf.plot(figsize=(15, 8),style=o--)
可以發現,國金鑫新還是有穩步上升的趨勢的,另外兩支就不好看了,在四月有一次大跌,其他月份也波動的比較厲害。
用describe()看下均值和方差,進一步證證實了國金鑫新的前景更好。
好了,到這裡就很尷尬了。我本來想選一支平均收益高但波動大的股票和平均收益低點但穩定的股票做資產組合。這裡『國金鑫新』不僅平均收益高,而且也很穩定。
我只能拿兩支股票強行做資產組合了,反正意思是這麼意思,大家都懂就行是吧。
資產組合的原理就是:z=ax+(1-a)y x,y分別為兩支股票,a為投資比例。
根據隨機變數的線性組合,求資產組合的期望和方差。
資產組合的期望 =aE(x)+aE(y);
資產組合的方差 =a^2*D(X)+2abCov(X,Y)+b^2*D(Y)
這裡,E表示期望,D表示方差,Cov表示協方差。
這裡用國金鑫新和財通福享做資產組合。
先用corr求協方差,
corr=pchangedf[國金鑫新].corr(pchangedf[財通福享])
然後,分別對國金鑫新投資比例為0.2,0.4,0.6,0.8求期望和方差。
dfgroup=pchangedf.describe()[1:3].T[0]gp={mean:[],std:[]}for i in [0.2,0.4,0.6,0.8]: gp[mean].append(i*dfgroup.ix[0,0]+(1-i)*dfgroup.ix[1,0]) gp[std].append(i*i*dfgroup.ix[0,1]+2*i*(1-i)*corr+(1-i)*(1-i)*dfgroup.ix[1,1])gpdf=pd.DataFrame(gp,index=[0.2,0.4,0.6,0.8])
做個圖,對比下。
gpdf.plot(kind=bar,subplots=True,figsize=(8,8))
好了,現在你就可以選取你能接受的期望收益和方差的投資組合進行投資了。
推薦閱讀: