引言:
本系列帖子“量化小講堂”,通過實(shí)際案例教初學(xué)者使用python、pandas進(jìn)行金融數(shù)據(jù)處理,希望能對(duì)大家有幫助。
【必讀文章】:《10年400倍策略分享-附視頻逐行講解代碼》
微信:xbx_laoshi,量化交流Q群(快滿):438143420,有問題歡迎交流。
文中用到的A股數(shù)據(jù)可在www.yucezhe.com下載,這里可以下載到所有股票、從上市日起的交易數(shù)據(jù)、財(cái)務(wù)數(shù)據(jù)、分鐘數(shù)據(jù)、分筆數(shù)據(jù)、逐筆數(shù)據(jù)等。
【量化小講堂-Python、Pandas系列】諾獎(jiǎng)得主的倉位分配算法,有效嗎?
假設(shè)你有1千萬準(zhǔn)備投資股票,你從A股接近3000只股票當(dāng)中挑選出了50只,準(zhǔn)備把這50只股票作為一個(gè)投資組合打包購買。那么在這50只股票之間應(yīng)該如何分配倉位才是最好的呢?是平均每個(gè)股票各買20萬,還是有的股票多買點(diǎn)有的股票少買點(diǎn)?
如何在這些股票之間分配倉位?這個(gè)問題就是諾貝爾獎(jiǎng)得主馬克維茨(Harry Markowitz)在1952年通過數(shù)學(xué)方法解決的問題。他也為此而拿到了諾貝爾獎(jiǎng)。
馬克維茨提出的解決方案叫做資產(chǎn)組合理論。感興趣的可以看看附件中的論文原文,也可以看又一齋主的這篇文章《馬克維茨與投資組合理論》。
本文的主要目是和大家分享如何使用Python在A股市場(chǎng)實(shí)證資產(chǎn)組合理論。所以在這里簡(jiǎn)單的講一下理論的具體原理。會(huì)盡量寫的淺顯,目標(biāo)是讓高中生也可以看懂。建議感興趣的同學(xué)可以先看本篇文章,大概了解后再去閱讀又一齋主的文章。
---資產(chǎn)組合理論---
假設(shè)現(xiàn)在有3只股票A、B、C。股票A,在一年后有一半概率上漲20%,一半的概率上漲10%。它的期望收益是15%(計(jì)算方法:20% * 0.5 + 10% * 0.5);股票B在一年后有一半概率上漲60%,一半概率下跌20%,期望收益20%;股票C有一半概率上漲100%,一半概率下跌50%,期望收益25%。具體如下:
在這三個(gè)股票中選擇一個(gè)股票進(jìn)行買賣,你會(huì)選擇哪個(gè)呢?我覺得選擇任何股票都是正常的。選擇股票A的人比較保守,雖然賺的少一點(diǎn),但是畢竟任何情況下都是穩(wěn)賺(風(fēng)險(xiǎn)。。選擇股票B的話,差的情況下也就虧20%,好得情況下可以賺60%,相當(dāng)高的收益了。選擇股票C的人其實(shí)也能理解,畢竟富貴險(xiǎn)中求(風(fēng)險(xiǎn)大),雖然可能虧一半,但是翻倍的誘惑還是巨大的。汝之蜜糖彼之砒霜,適合自己的才是最好的。
在從這3個(gè)股票當(dāng)中進(jìn)行選擇的時(shí)候,你有沒有發(fā)現(xiàn)其實(shí)你是在權(quán)衡每個(gè)股票的收益和風(fēng)險(xiǎn)。我們往往希望收益越高越好,風(fēng)險(xiǎn)越低越好。然而金融領(lǐng)域自打有宇宙以來的第一定律就是高收益和低風(fēng)險(xiǎn)不可兼得。收益高,往往風(fēng)險(xiǎn)也高,風(fēng)險(xiǎn)低往往收益也就低了。人生又何嘗不是如此呢?所以我們只能根據(jù)自己的偏好在收益和風(fēng)險(xiǎn)之間進(jìn)行權(quán)衡。那用什么方式來定量化的刻畫股票的風(fēng)險(xiǎn)呢?——用方差。
對(duì),就是初中課堂上學(xué)習(xí)過的方差。方差用來描述一組數(shù)據(jù)之間的離散程度,而收益的離散程度就是風(fēng)險(xiǎn)。比如對(duì)于股票A,它的方差就是[(0.2 - 0.15)^2 + (0.1 - 0.15)^2] / 2 = 0.0025。同理,股票B和股票C的方差分別是0.16和0.5625。股票的風(fēng)險(xiǎn)越大,它的方差也就越大,反之,方差大說明這個(gè)股票的風(fēng)險(xiǎn)也大。
了解了方差之后,我們回到從3個(gè)股票當(dāng)中選擇一個(gè)進(jìn)行投資的話題上來。我估計(jì)大多數(shù)人會(huì)選擇B股票,冒著虧不多錢的風(fēng)險(xiǎn),賺取60%的收益。
(【python量化課程】想要快速、系統(tǒng)的學(xué)習(xí)量化知識(shí),可以參與我與論壇合作開設(shè)的課程:《python量化投資入門》,我會(huì)親自授課,隨問隨答。參與課程還可以免費(fèi)加入我的小密圈,我每天會(huì)在圈中分享量化的所見所思,圈子介紹點(diǎn)擊此處。)
這時(shí)候有的聰明人就會(huì)說,我能不能這樣來投資:我將所有的錢平均分成兩份,一份全部買股票A,一份全部買C形成一個(gè)組合,這個(gè)組合里面有A、C兩只股票,那么這整個(gè)組合一年后的期望收益是20%,跟股票B是一樣的,而我一年后收益的可能性是:
- 25%的概率上漲60%(A漲20%,C漲100%)
- 25%的概率上漲55%(A漲10%,C漲100%)
- 25%的概率下跌15%(A漲20%,C跌50%)
- 25%的概率上漲20%(A漲10%,C跌50%)
收益的方差是0.14125,比股票B的方差0.16小。也就是說我通過構(gòu)建了一個(gè)組合,得到了一個(gè)和B期望收益一樣,但是風(fēng)險(xiǎn)比B小的投資。相比于這個(gè)投資組合,全倉買股票B顯然就是一個(gè)很蠢的選擇。
更聰明的人這個(gè)時(shí)候又要問了:剛剛是在A、C兩只股票里面平均分配50%的倉位購進(jìn)組合,那么是不是存在另外的一種分配方式,使得這個(gè)組合在20%的期望收益下,風(fēng)險(xiǎn)(方差)可以更小呢?或者說我想要的期望收益是25%,怎么在3只股票里面分配倉位,保證組合方差最小呢?或者說我想要0.1的方差,怎么在3只股票里面分配倉位,保證我組合的期望收益最大呢?(感興趣的話真的可以動(dòng)筆算算,很有意思。)
其實(shí)以上這些就是馬克維茨想要解決的問題:怎么才能在一堆股票當(dāng)中通過分配倉位,來使整個(gè)組合的期望收益盡可能的高,風(fēng)險(xiǎn)(方差)盡可能的低;蛘哒f,在一定的期望收益下,風(fēng)險(xiǎn)盡可能的低;在一定的風(fēng)險(xiǎn)條件下,期望收益盡可能的高。
這時(shí)候你可能會(huì)講:這看上去也沒什么難度嘛,就算是離諾獎(jiǎng)無窮遠(yuǎn)的我,即使多花點(diǎn)時(shí)間也能算出最優(yōu)的倉位呀。是的,以上的計(jì)算確實(shí)并不復(fù)雜。因?yàn)椋驗(yàn),因(yàn)椤?/font>
因?yàn)槲?/font>們?cè)谟?jì)算當(dāng)中想當(dāng)然的多增加了一個(gè)條件:我們假設(shè)這些股票之間的收益是相互獨(dú)立的。也就是股票和股票之間的收益不會(huì)相互影響。
然而現(xiàn)實(shí)中所有股票之間的收益都是相關(guān)的啊。!
工商銀行上漲的時(shí)候,農(nóng)業(yè)銀行大概率也會(huì)上漲吧?京東股票漲得時(shí)候,阿里的股票有可能會(huì)跌吧?2015年7月份千股跌停、千股漲停等現(xiàn)象,這些都是在說明股票之間會(huì)有相關(guān)性。所以上面A、B、C三只股票的問題,可能會(huì)變成股票A上漲的時(shí)候,股票B也有80%的概率上漲;股票A上漲的時(shí)候,股票C卻有60%的概率下跌......這個(gè)時(shí)候想要算出個(gè)最優(yōu)倉位比例,就比較麻煩了吧?
而人家馬克維茨牛逼就牛逼在,即使考慮到股票之間的相關(guān)性,他也找到了計(jì)算的方法。
他使用相關(guān)系數(shù)來衡量股票之間的相關(guān)性。相關(guān)系數(shù)的取值范圍是-1到1,越接近1代表這兩個(gè)股票的收益越正相關(guān)(工行和農(nóng)行),越接近-1代表這兩個(gè)股票的收益越負(fù)相關(guān)(阿里和京東),接近0則代表不相關(guān)。他假設(shè)已知N個(gè)股票未來一段時(shí)間的期望收益、收益的方差,以及這些股票兩兩之間之間的相關(guān)系數(shù),僅僅知道這些,就可以計(jì)算出最優(yōu)的倉位比例,來保證我們的投資組合獲得盡可能高的收益以及相應(yīng)盡可能低的風(fēng)險(xiǎn)。
人家具體怎么算的我就不細(xì)說了,是個(gè)純數(shù)學(xué)問題,歸根到底是一個(gè)標(biāo)準(zhǔn)的凸二次規(guī)劃問題。具體可以看論文原文或者又一齋主的文章。本文重點(diǎn)關(guān)注的是如何將馬克維茨的理論真正的投入到實(shí)戰(zhàn)中去。
---實(shí)戰(zhàn)---
要把馬克維茨的方案運(yùn)用到投資實(shí)戰(zhàn)中,最大的難點(diǎn)就是要確定模型的輸入?yún)?shù)。必須得知道這些股票的期望收益、方差以及兩兩間的相關(guān)系數(shù)才能計(jì)算最終的倉位啊,可是到底怎么才能知道股票未來一年的期望收益、方差、以及相關(guān)系數(shù)呢?(這幾乎不可能嘛)
實(shí)戰(zhàn)中一般的做法就是拿股票過去一段時(shí)間的收益來估計(jì)這些參數(shù)。落實(shí)到具體的策略,我們是采用如下方法來構(gòu)建的:在每月的最后一個(gè)交易日收盤后,根據(jù)過去6個(gè)月(這個(gè)數(shù)字可以自己設(shè)定)的歷史數(shù)據(jù)計(jì)算出每個(gè)備選股票的收益、方差、相關(guān)系數(shù),將這些數(shù)據(jù)作為參數(shù),套入到馬克維茨的方法中,計(jì)算出每個(gè)股票的最優(yōu)倉位。按計(jì)算出來的倉位買入這些股票并持有整個(gè)下個(gè)月,在下月末再按照該方法,根據(jù)最新的過去6個(gè)月的數(shù)據(jù)重新計(jì)算倉位,進(jìn)行調(diào)整,再持有一個(gè)月,如此往復(fù)。
其中,在采用馬克維茨的方法計(jì)算最優(yōu)倉位的時(shí)候,我們的優(yōu)化目標(biāo)是最優(yōu)夏普比例,也就是最大化期望收益/方差。在程序中也可以調(diào)整為最優(yōu)收益或者最優(yōu)方差。
為了方便起見,我們以滬深300指數(shù),中小板指數(shù),還有創(chuàng)業(yè)板指數(shù)為例,假設(shè)我們是要投資這3個(gè)指數(shù),并在這3個(gè)指數(shù)之間分配倉位。當(dāng)然在程序中你也可以自己通過修改代碼來嘗試在更多的股票、指數(shù)之間進(jìn)行分配倉位。
---程序---
要用三大指數(shù)構(gòu)造投資組合,首先需要指數(shù)的原始數(shù)據(jù)。在yucezhe.com的歷史日線數(shù)據(jù)中,可以下載到所有指數(shù)歷史至今的數(shù)據(jù)。如下圖所示,每一行是每一天的數(shù)據(jù):
數(shù)據(jù)中有以下的字段:
【index_code】指數(shù)的代碼
【date】 交易日期
【open】 開盤價(jià)
【high】 最高價(jià)
【low】 最低價(jià)
【close】 收盤價(jià)
【volume】 成交量
【money】 成交額
【change】 漲跌幅
下面是代碼的截圖,代碼里面有詳細(xì)的注釋,有問題可以留言,附件中有程序的源碼,回復(fù)即可下載。
把代碼和數(shù)據(jù)下載下來,運(yùn)行代碼,就可以看到輸出的結(jié)果了。
數(shù)據(jù)的回測(cè)是從2011年開始的(因?yàn)閯?chuàng)業(yè)板指數(shù)開始時(shí)間較晚)。從結(jié)果中可以看到,通過馬克維茨的方法構(gòu)建的投資組合的年化收益率是高于滬深300、中小板指數(shù),但低于創(chuàng)業(yè)板指數(shù)。在風(fēng)險(xiǎn)方面,由于是采用的最大化夏普比的方法,所以最大回撤還是略大于滬深300和中小板的。
大家下載程序后,可以把3個(gè)指數(shù)改成其他的股票,嘗試著在不同的股票之間進(jìn)行倉位的配置,看看效果。
此處也留一個(gè)思考題:是否能搞到余額寶的每日收益率,作為無風(fēng)險(xiǎn)利率,也作為組合中的一個(gè)備選資產(chǎn)。這樣就能算出投資股票和投資余額寶的倉位比例的,
之后會(huì)講的內(nèi)容:
- 以均線策略為基礎(chǔ),從頭到尾教大家如何使用Python編寫一個(gè)完整的策略
- 基金定投是否真的賺錢?通過數(shù)據(jù)模擬給你看。
- 關(guān)于《量化小講堂》之后想看的內(nèi)容,或者相關(guān)問題,可以加我微信xbx_laoshi、Q群(快滿):438143420溝通。
附件中是馬科維茨當(dāng)年的論文和Python程序文件,免費(fèi),回復(fù)可見。覺得文章內(nèi)容有幫助的話,頂貼是最好的鼓勵(lì)!
本帖隱藏的內(nèi)容