數(shù)據(jù)準(zhǔn)備
選擇如下幾只股票寝受,從tushare.org獲取其2007-10-31到2017-10-31十年的交易數(shù)據(jù),保存為csv文件以備后用:
- 招商證券 600999
- 廣發(fā)證券 000776
- 萬(wàn)科a 000002
- 保利地產(chǎn) 600048
- 招商銀行 600036
- 工商銀行 601398
- 恒瑞醫(yī)藥 600276
- 同仁堂 600685
- 大族激光 002008
- 三安光電 600703
- 中國(guó)石油 601857
- 中國(guó)石化 600028
- ST中富 000659
- ST山水 600234
- 滬深300指數(shù)
import tushare as ts
import pandas as pd
codes=[
(u'招商證券','600999'),(u'廣發(fā)證券','000776'),(u'萬(wàn)科a','000002'),
(u'保利地產(chǎn)','600048'),(u'招商銀行','600036'),(u'工商銀行','601398'),
(u'恒瑞醫(yī)藥','600276'),(u'同仁堂','600685'),(u'大族激光','002008'),
(u'三安光電','600703'),(u'中國(guó)石油','601857'),(u'中國(guó)石化','600028'),
(u'ST中富','000659'),(u'ST山水','600234'),(u'滬深300','hs300')
]
for c in codes:
df=ts.get_hist_data(c[1],start='2007-10-31',end='2017-10-31')
df.to_csv('assets/'+c[0]+'.csv')
print 'now '+c[0]+' earliest='+str(df.index[-1])
實(shí)際執(zhí)行結(jié)果:
now 招商證券 earliest=2014-11-03
now 廣發(fā)證券 earliest=2014-11-03
now 萬(wàn)科a earliest=2014-11-03
now 保利地產(chǎn) earliest=2014-11-03
now 招商銀行 earliest=2014-11-03
now 工商銀行 earliest=2014-11-03
now 恒瑞醫(yī)藥 earliest=2014-11-03
now 同仁堂 earliest=2014-11-03
now 大族激光 earliest=2014-11-04
now 三安光電 earliest=2014-11-03
now 中國(guó)石油 earliest=2014-11-03
now 中國(guó)石化 earliest=2014-11-03
now ST中富 earliest=2014-11-03
now ST山水 earliest=2015-01-26
now 滬深300 earliest=2014-11-03
從結(jié)果看缓苛,只能選擇 2014-11-03 之后到 2017-9-26 之前的數(shù)據(jù)圣猎,因?yàn)楂@取到的最早和最近的數(shù)據(jù)是這樣爆惧。
%matplotlib inline
import matplotlib as mpl
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
plt.rcParams['font.sans-serif']=['SimHei']
# myfont=FontProperties(fname=u'C:\\Windows\Fonts\\幼圓.TTF')
mpl.rcParams['axes.unicode_minus']=False
# legend_font=FontProperties(fname=u'C:\\Windows\Fonts\\幼圓.TTF',size=10)
dpi = 72.
xinch = 800 / dpi
yinch = 400 / dpi
mpl.rcParams['figure.figsize']=(xinch,yinch)
stocks=[
(u'招商證券','600999'),(u'廣發(fā)證券','000776'),(u'萬(wàn)科a','000002'),
(u'保利地產(chǎn)','600048'),(u'招商銀行','600036'),(u'工商銀行','601398'),
(u'恒瑞醫(yī)藥','600276'),(u'同仁堂','600685'),(u'大族激光','002008'),
(u'三安光電','600703'),(u'中國(guó)石油','601857'),(u'中國(guó)石化','600028'),
(u'ST中富','000659'),(u'ST山水','600234'),(u'滬深300','hs300')
]
codes={}
for s in stocks:
codes[s[0]]=s[1]
symbols=codes.keys()
def col_converter(x):
try:
return float(x)
except:
return None
prices=None
for i,s in enumerate(symbols):
p=pd.read_csv('assets/'+s.upper()+'.csv',usecols=['close','date'],index_col='date',converters={'close':col_converter})
if i==0:
prices=pd.DataFrame(index=p.index)
prices[s]=p['close']
prices.sort_index(ascending=True,inplace=True)
prices.dropna(inplace=True)
兩支地產(chǎn)股和兩支券商股的比較
股價(jià)波動(dòng)情況
prices[[u'招商證券',u'廣發(fā)證券',u'萬(wàn)科a',u'保利地產(chǎn)']].plot()
plt.ylabel(u'每日收盤價(jià)')
plt.xlabel(u'日期')
plt.legend()
print '----期初股價(jià)----'
print prices[[u'招商證券',u'廣發(fā)證券',u'萬(wàn)科a',u'保利地產(chǎn)']].head(1)
print '----期末股價(jià)----'
print prices[[u'招商證券',u'廣發(fā)證券',u'萬(wàn)科a',u'保利地產(chǎn)']].tail(1)
----期初股價(jià)----
招商證券 廣發(fā)證券 萬(wàn)科a 保利地產(chǎn)
date
2015-02-03 24.9 22.3 12.96 10.15
----期末股價(jià)----
招商證券 廣發(fā)證券 萬(wàn)科a 保利地產(chǎn)
date
2017-09-26 20.59 18.87 26.76 10.65
收益率比較
假定同時(shí)在2014-11-03日買入這四只股票和滬深300指數(shù)寥袭,比較一下到2017-9-26的收益率
prices_norm=prices.copy()
for symbol in symbols:
prices_norm[symbol]=prices[symbol]/prices[symbol][0]
prices_norm[[u'招商證券',u'廣發(fā)證券',u'萬(wàn)科a',u'保利地產(chǎn)']].plot()
plt.ylabel(u'收益率')
plt.xlabel(u'日期')
plt.legend()
print prices_norm[[u'招商證券',u'廣發(fā)證券',u'萬(wàn)科a',u'保利地產(chǎn)']].tail(1)
招商證券 廣發(fā)證券 萬(wàn)科a 保利地產(chǎn)
date
2017-09-26 0.826908 0.846188 2.064815 1.049261
從圖表來(lái)看,到2017-10-31為止撒顿,投資萬(wàn)科a收益率最高(是期初的206.4%)丑罪,投資招商證券最低(是期初的82.70%,還在站崗中)凤壁。
股價(jià)波動(dòng)情況比較
再看看兩支券商股和兩支地產(chǎn)股的收盤價(jià)波動(dòng)情況吩屹,同時(shí)與滬深300的收盤價(jià)波動(dòng)情況比較:
prices.pct_change()[[u'招商證券',u'廣發(fā)證券',u'萬(wàn)科a',u'保利地產(chǎn)',u'滬深300']].plot()
plt.ylabel(u'每日波動(dòng)率')
plt.xlabel(u'日期')
plt.legend()
print prices.pct_change()[[u'招商證券',u'廣發(fā)證券',u'萬(wàn)科a',u'保利地產(chǎn)',u'滬深300']].describe()
招商證券 廣發(fā)證券 萬(wàn)科a 保利地產(chǎn) 滬深300
count 332.000000 332.000000 332.000000 332.000000 332.000000
mean 0.000319 0.000345 0.002647 0.000730 0.000556
std 0.042842 0.042965 0.030688 0.033740 0.021790
min -0.297507 -0.313300 -0.100045 -0.229651 -0.151217
25% -0.009038 -0.007870 -0.011612 -0.011329 -0.004597
50% 0.000000 -0.000584 -0.000400 0.000460 0.000990
75% 0.008002 0.008111 0.010071 0.010879 0.005632
max 0.470405 0.551145 0.113119 0.169173 0.196912
從圖像上看廣發(fā)證券外波動(dòng)最大,但是從區(qū)間收盤價(jià)標(biāo)準(zhǔn)差來(lái)看拧抖,其實(shí)招商證券和廣發(fā)證券都在0.043附近煤搜,風(fēng)險(xiǎn)程度相近。保利地產(chǎn)標(biāo)準(zhǔn)差僅0.022唧席,風(fēng)險(xiǎn)最小擦盾。
計(jì)算股價(jià)波動(dòng)的相關(guān)性
co=prices.pct_change().corr()
for symbol in symbols:
v=co[symbol].sort_values()
print symbol,u' | 正相關(guān)度最高: ',v.index[-2],u' 相關(guān)系數(shù)=',v[-2],u' | 負(fù)相關(guān)度最高: ',v.index[0],u' 相關(guān)系數(shù)=',v[0]
print ''
恒瑞醫(yī)藥 | 正相關(guān)度最高: 招商證券 相關(guān)系數(shù)= 0.373459451207 | 負(fù)相關(guān)度最高: ST山水 相關(guān)系數(shù)= -0.184459943941
中國(guó)石化 | 正相關(guān)度最高: 中國(guó)石油 相關(guān)系數(shù)= 0.924324466248 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= 0.086023084494
大族激光 | 正相關(guān)度最高: 滬深300 相關(guān)系數(shù)= 0.661414109 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= 0.0872177335242
中國(guó)石油 | 正相關(guān)度最高: 中國(guó)石化 相關(guān)系數(shù)= 0.924324466248 | 負(fù)相關(guān)度最高: ST山水 相關(guān)系數(shù)= 0.117857884825
滬深300 | 正相關(guān)度最高: 廣發(fā)證券 相關(guān)系數(shù)= 0.860752981977 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= 0.289424888497
三安光電 | 正相關(guān)度最高: ST山水 相關(guān)系數(shù)= 0.621160353597 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= 0.0579186039258
萬(wàn)科a | 正相關(guān)度最高: 保利地產(chǎn) 相關(guān)系數(shù)= 0.575758930125 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= 0.196663064699
工商銀行 | 正相關(guān)度最高: 中國(guó)石油 相關(guān)系數(shù)= 0.782436477866 | 負(fù)相關(guān)度最高: ST山水 相關(guān)系數(shù)= 0.0843699347197
招商證券 | 正相關(guān)度最高: 廣發(fā)證券 相關(guān)系數(shù)= 0.921710029685 | 負(fù)相關(guān)度最高: ST山水 相關(guān)系數(shù)= 0.130198313722
招商銀行 | 正相關(guān)度最高: 工商銀行 相關(guān)系數(shù)= 0.686388691468 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= 0.0239442789959
ST山水 | 正相關(guān)度最高: 三安光電 相關(guān)系數(shù)= 0.621160353597 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= -0.184459943941
廣發(fā)證券 | 正相關(guān)度最高: 招商證券 相關(guān)系數(shù)= 0.921710029685 | 負(fù)相關(guān)度最高: ST山水 相關(guān)系數(shù)= 0.250817065922
同仁堂 | 正相關(guān)度最高: 滬深300 相關(guān)系數(shù)= 0.675505803837 | 負(fù)相關(guān)度最高: 恒瑞醫(yī)藥 相關(guān)系數(shù)= 0.11457913001
ST中富 | 正相關(guān)度最高: 廣發(fā)證券 相關(guān)系數(shù)= 0.563662524852 | 負(fù)相關(guān)度最高: 招商銀行 相關(guān)系數(shù)= 0.0833174028769
保利地產(chǎn) | 正相關(guān)度最高: 滬深300 相關(guān)系數(shù)= 0.746992561689 | 負(fù)相關(guān)度最高: ST山水 相關(guān)系數(shù)= 0.176521765306
結(jié)論有點(diǎn)意思:
- 同屬一個(gè)版塊,中石油淌哟、中石化關(guān)聯(lián)度很高迹卢;券商關(guān)聯(lián)度也很高
- 正相關(guān)中,滬深300 和 廣發(fā)證券 出現(xiàn)頻率最高绞绒,莫非廣發(fā)證券也能作為大勢(shì)研判的一個(gè)指標(biāo)了婶希,連ST的都與它正相關(guān)最高榕暇?
- 恒瑞醫(yī)藥出現(xiàn)在負(fù)相關(guān)中的頻率最高蓬衡,屬于獨(dú)立行情,適合在資產(chǎn)配置加入彤枢,降低風(fēng)險(xiǎn)
聚類分析
看看基于股價(jià)波動(dòng)性聚類狰晚,會(huì)是什么結(jié)果?
from sklearn.cluster import affinity_propagation
_,labels=affinity_propagation(co)
df_c=pd.DataFrame({'label':labels,'name':symbols})
g=df_c.groupby('label')
for item in g:
print item[0],','.join(item[1]['name'].values)
print '============='
0 恒瑞醫(yī)藥
=============
1 中國(guó)石化,中國(guó)石油,工商銀行,招商銀行
=============
2 大族激光,滬深300,三安光電,萬(wàn)科a,招商證券,ST山水,廣發(fā)證券,同仁堂,ST中富,保利地產(chǎn)
=============
果然和前面的數(shù)值分析有很大的相關(guān)性缴啡! 恒瑞醫(yī)療就是獨(dú)行俠壁晒,第一個(gè)歸類里就只有它。石油业栅、石化秒咐、銀行混在一起谬晕,嗯,也符合它們的身份吧携取。
驗(yàn)證一下每日股價(jià)波動(dòng)是否符合正態(tài)分布
prices.pct_change().hist(column=[u'恒瑞醫(yī)藥',u'招商銀行',u'保利地產(chǎn)',u'三安光電'],sharex=True,sharey=True,bins=30)
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000000000CEDA320>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000CEF4588>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000000000D210B00>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000D31CAC8>]], dtype=object)
從圖表來(lái)看攒钳,所選樣本波動(dòng)率集中度都很高,也符合正太分布雷滋。
從投資組合的角度分析
僅選兩支股票的投資組合
既然前面談到了不撑,恒瑞醫(yī)藥走出獨(dú)立行情,那么就設(shè)定一種投資組合晤斩,都是恒瑞醫(yī)藥加上另一只票焕檬。如果投資風(fēng)格是追求收益風(fēng)險(xiǎn)比值是最高,那么計(jì)算一下不同的組合中澳泵,如何配比可以達(dá)到最佳值实愚。
恒瑞醫(yī)藥+萬(wàn)科a
group_dots=np.linspace(0,1,100,endpoint=False)
hryy_wka=pd.DataFrame({
u'回報(bào)':pd.Series([(r*prices_norm[u'恒瑞醫(yī)藥']+(1-r)*prices_norm[u'萬(wàn)科a']).pct_change().mean() for r in group_dots],index=group_dots),
u'風(fēng)險(xiǎn)':pd.Series([(r*prices_norm[u'恒瑞醫(yī)藥']+(1-r)*prices_norm[u'萬(wàn)科a']).pct_change().std() for r in group_dots],index=group_dots)
})
ax=hryy_wka.plot(secondary_y=u'風(fēng)險(xiǎn)')
ax.set_xlabel(u'恒瑞醫(yī)藥占比')
ax.set_ylabel(u'單日股價(jià)波動(dòng)均值')
ax.right_ax.set_ylabel(u'單日股價(jià)波動(dòng)標(biāo)準(zhǔn)差')
plt.title(u'恒瑞醫(yī)藥+萬(wàn)科a 不同配比的收益風(fēng)險(xiǎn)變化圖')
<matplotlib.text.Text at 0x20e0b668>
繪制這個(gè)組合的風(fēng)險(xiǎn)回報(bào)比變化曲線
reward_over_risk=hryy_wka[u'回報(bào)']/hryy_wka[u'風(fēng)險(xiǎn)']
reward_over_risk.plot()
plt.xlabel(u'恒瑞醫(yī)藥占比')
plt.ylabel(u'回報(bào)/風(fēng)險(xiǎn)')
print u'恒瑞醫(yī)藥最佳占比:', reward_over_risk.argmax()
恒瑞醫(yī)藥最佳占比: 0.14
分析表明:這個(gè)組合中 15%恒瑞醫(yī)藥+85%萬(wàn)科a 時(shí),回報(bào)和風(fēng)險(xiǎn)比最高兔辅。
恒瑞醫(yī)藥+招商證券
group_dots=np.linspace(0,1,100,endpoint=False)
hryy_wka=pd.DataFrame({
u'回報(bào)':pd.Series([(r*prices_norm[u'恒瑞醫(yī)藥']+(1-r)*prices_norm[u'招商證券']).pct_change().mean() for r in group_dots],index=group_dots),
u'風(fēng)險(xiǎn)':pd.Series([(r*prices_norm[u'恒瑞醫(yī)藥']+(1-r)*prices_norm[u'招商證券']).pct_change().std() for r in group_dots],index=group_dots)
})
ax=hryy_wka.plot(secondary_y=u'風(fēng)險(xiǎn)')
ax.set_xlabel(u'恒瑞醫(yī)藥占比')
ax.set_ylabel(u'單日股價(jià)波動(dòng)均值')
ax.right_ax.set_ylabel(u'單日股價(jià)波動(dòng)標(biāo)準(zhǔn)差')
plt.title(u'恒瑞醫(yī)藥+招商證券 不同配比的收益風(fēng)險(xiǎn)變化圖')
<matplotlib.text.Text at 0x213725f8>
reward_over_risk=hryy_wka[u'回報(bào)']/hryy_wka[u'風(fēng)險(xiǎn)']
reward_over_risk.plot()
plt.xlabel(u'恒瑞醫(yī)藥占比')
plt.ylabel(u'回報(bào)/風(fēng)險(xiǎn)')
print u'恒瑞醫(yī)藥最佳占比:', reward_over_risk.argmax()
恒瑞醫(yī)藥最佳占比: 0.99
這個(gè)組合中爆侣,恒瑞醫(yī)藥幾乎占據(jù)全部比例時(shí),回報(bào)/風(fēng)險(xiǎn)值最佳幢妄。
恒瑞醫(yī)藥+三安光電
group_dots=np.linspace(0,1,100,endpoint=False)
hryy_wka=pd.DataFrame({
u'回報(bào)':pd.Series([(r*prices_norm[u'恒瑞醫(yī)藥']+(1-r)*prices_norm[u'三安光電']).pct_change().mean() for r in group_dots],index=group_dots),
u'風(fēng)險(xiǎn)':pd.Series([(r*prices_norm[u'恒瑞醫(yī)藥']+(1-r)*prices_norm[u'三安光電']).pct_change().std() for r in group_dots],index=group_dots)
})
ax=hryy_wka.plot(secondary_y=u'風(fēng)險(xiǎn)')
ax.set_xlabel(u'恒瑞醫(yī)藥占比')
ax.set_ylabel(u'單日股價(jià)波動(dòng)均值')
ax.right_ax.set_ylabel(u'單日股價(jià)波動(dòng)標(biāo)準(zhǔn)差')
plt.title(u'恒瑞醫(yī)藥+招商證券 不同配比的收益風(fēng)險(xiǎn)變化圖')
<matplotlib.text.Text at 0x2166e0b8>
reward_over_risk=hryy_wka[u'回報(bào)']/hryy_wka[u'風(fēng)險(xiǎn)']
reward_over_risk.plot()
plt.xlabel(u'恒瑞醫(yī)藥占比')
plt.ylabel(u'回報(bào)/風(fēng)險(xiǎn)')
print u'恒瑞醫(yī)藥最佳占比:', reward_over_risk.argmax()
恒瑞醫(yī)藥最佳占比: 0.89
這個(gè)組合中 89%恒瑞醫(yī)藥+11%三安光電 時(shí)兔仰,回報(bào)和風(fēng)險(xiǎn)比最高。
多支票組合的效果對(duì)比
如果同時(shí)選擇恒瑞醫(yī)藥+滬深300+萬(wàn)科a蕉鸳,但是根據(jù)配比不同有以下三種方案:
- 重倉(cāng)恒瑞醫(yī)藥乎赴,恒瑞醫(yī)藥、滬深300和萬(wàn)科a三者配比為 50%:30%:20%
- 重倉(cāng)滬深300潮尝,恒瑞醫(yī)藥榕吼、滬深300和萬(wàn)科a三者配比為 20%:50%:30%
- 重倉(cāng)萬(wàn)科a,恒瑞醫(yī)藥勉失、滬深300和萬(wàn)科a三者配比為 20%:30%:50%
portfolios=pd.DataFrame({
u'重倉(cāng)恒瑞醫(yī)療':0.5*prices_norm[u'恒瑞醫(yī)藥']+0.3*prices_norm[u'滬深300']+0.2*prices_norm[u'萬(wàn)科a'],
u'重倉(cāng)滬深300':0.2*prices_norm[u'恒瑞醫(yī)藥']+0.50*prices_norm[u'滬深300']+0.3*prices_norm[u'萬(wàn)科a'],
u'重倉(cāng)萬(wàn)科a':0.2*prices_norm[u'恒瑞醫(yī)藥']+0.30*prices_norm[u'滬深300']+0.5*prices_norm[u'萬(wàn)科a']
})
portfolios.plot()
print portfolios.pct_change().describe()
重倉(cāng)萬(wàn)科a 重倉(cāng)恒瑞醫(yī)療 重倉(cāng)滬深300
count 332.000000 332.000000 332.000000
mean 0.001767 0.001322 0.001347
std 0.023129 0.020336 0.020824
min -0.123201 -0.148621 -0.133951
25% -0.009271 -0.007207 -0.007543
50% 0.000218 0.001041 0.001170
75% 0.008352 0.008673 0.008061
max 0.136271 0.134773 0.152384
結(jié)論:
- 重倉(cāng)萬(wàn)科a收益率最高羹蚣,但是風(fēng)險(xiǎn)值也更大,股價(jià)波動(dòng)率標(biāo)準(zhǔn)差為0.023
- 重倉(cāng)恒瑞醫(yī)藥或滬深300乱凿,收益率相近顽素,股價(jià)波動(dòng)率標(biāo)準(zhǔn)差也相近,都在 0.020附近