引言:
本系列帖子“量化小講堂”,通過實(shí)際案例教初學(xué)者使用python、pandas進(jìn)行金融數(shù)據(jù)處理,希望能對(duì)大家有幫助。
【必讀文章】:《10年400倍策略分享-附視頻逐行講解代碼》
【所有系列文章匯總】:http://xalimeijing.com/thread-3950124-1-1.html
【python量化課程】想要快速、系統(tǒng)的學(xué)習(xí)量化知識(shí),可以參與我與論壇合作開設(shè)的課程:《python量化投資入門》,我會(huì)親自授課,隨問隨答。參與課程還可以免費(fèi)加入我的小密圈,我每天會(huì)在圈中分享量化的所見所思,圈子介紹點(diǎn)擊此處。
微信: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系列15】完整策略框架:以均線策略為例
=====策略框架=====
應(yīng)很多同學(xué)的要求,本篇文章介紹如何從頭到尾的編寫一個(gè)策略框架。一個(gè)完整的策略框架主要包含以下三個(gè)部分:
- 產(chǎn)生買賣信號(hào)的策略。
- 根據(jù)買賣信號(hào)生成資金曲線。
- 根據(jù)資金曲線計(jì)算策略評(píng)價(jià)指標(biāo)。
其中第一部分是最重要的。本文用最簡(jiǎn)單的均線策略作為示范,關(guān)于均線策略的詳細(xì)內(nèi)容可以看之前的文章【量化小講堂 - python & pandas技巧系列】使用python計(jì)算移動(dòng)平均線。第二、第三部分是通用部分,在大家熟悉框架之后,可以將第一部分修改為自己的策略,其他部分直接復(fù)用。
# 第一部分:產(chǎn)生買賣信號(hào)的策略,以均線策略為例
說到均線大家應(yīng)該都不陌生,均線應(yīng)該是股市技術(shù)分析中最簡(jiǎn)單的一個(gè)指標(biāo)了,就是股價(jià)在一段時(shí)間的平均值,一般是指移動(dòng)平均線。例如,5日均線就是最近5個(gè)交易日股票的收盤價(jià)之和除以5。均線最早是由著名的美國投資專家Joseph E.Granville于20世紀(jì)中期提出來的,由于其簡(jiǎn)單容易理解的特點(diǎn),成為當(dāng)今應(yīng)用最普遍的技術(shù)指標(biāo)之一。基于均線本身的趨勢(shì)性和穩(wěn)定性,出現(xiàn)了很多利用均線的不同形態(tài)來產(chǎn)生買賣信號(hào)的策略。
本文采用的均線策略的具體規(guī)則為:
- 當(dāng)短期均線上穿長(zhǎng)期均線時(shí),視為買入信號(hào),以第二天開盤價(jià)全倉買入;
- 當(dāng)短期均線下穿長(zhǎng)期均線時(shí),視為賣出信號(hào),以第二天開盤價(jià)全倉賣出。
(【python量化課程】想要快速、系統(tǒng)的學(xué)習(xí)量化知識(shí),可以參與我與論壇合作開設(shè)的課程:《python量化投資入門》,我會(huì)親自授課,隨問隨答。參與課程還可以免費(fèi)加入我的小密圈,我每天會(huì)在圈中分享量化的所見所思,圈子介紹點(diǎn)擊此處。)
可見下圖示例:
# 第二部分:根據(jù)信號(hào)生成資金曲線
在產(chǎn)生買賣信號(hào)后,可以據(jù)此生成每天的倉位。實(shí)際操作中可以不用每次都全倉買賣,本文為了方便,每次買賣都是全倉買入或者賣出。所以倉位只有0和1兩種狀態(tài),1表示滿倉,0表示空倉。由于本文以個(gè)股為例,所以出現(xiàn)買賣信號(hào)后的第二天開盤可能會(huì)出現(xiàn)漲;虻5那闆r,當(dāng)出現(xiàn)漲跌停時(shí)當(dāng)天不進(jìn)行買賣操作,倉位和前一天的倉位保持一致。有了每天的倉位之后,就可以計(jì)算出每日漲跌幅、資金曲線。
# 第三部分:根據(jù)資金曲線計(jì)算策略評(píng)價(jià)指標(biāo)
根據(jù)資金曲線可以計(jì)算相應(yīng)的統(tǒng)計(jì)指標(biāo)來判斷這個(gè)策略的好壞。關(guān)于指標(biāo)的相關(guān)內(nèi)容可以參考之前的一篇文章【量化小講堂 - Python、Pandas系列】如何判斷一個(gè)策略的好壞?。
=====實(shí)戰(zhàn)=====
一、選擇標(biāo)的股票并計(jì)算復(fù)權(quán)后的價(jià)格
假設(shè)我們選擇萬科A(sz000002)作為考慮的目標(biāo)股票(程序中可以通過修改股票代碼任選一只個(gè)股),為了數(shù)據(jù)的真實(shí)可靠,本文重新計(jì)算了復(fù)權(quán)后的開盤價(jià)和收盤價(jià),后面計(jì)算均線和漲跌幅都以復(fù)權(quán)后的數(shù)據(jù)為基礎(chǔ)。
二、判斷所選股票的上市天數(shù)
接著,為了回測(cè)結(jié)果的可靠性,本文在執(zhí)行均線策略之前會(huì)先判斷該股票上市至今的交易天數(shù),默認(rèn)的交易天數(shù)下限是500天(可以自行設(shè)置),即如果該股票交易天數(shù)小于500,則不運(yùn)行策略。
三、產(chǎn)生買賣信號(hào)
所選股票確定之后就是計(jì)算短期和長(zhǎng)期均線了,本文默認(rèn)采用的是5日移動(dòng)平均線和60日移動(dòng)平均線(在程序中是參數(shù),也可以自行設(shè)置),當(dāng)5日均線大于60日均線時(shí),給出買入信號(hào);當(dāng)5日均線小于60日均線時(shí),給出賣出信號(hào),兩者相等時(shí)維持之前的信號(hào)判斷。
四、根據(jù)信號(hào)產(chǎn)生資金曲線
根據(jù)上一步產(chǎn)生的買賣信號(hào),可以得到每天的倉位。有了每天的倉位之后,就是計(jì)算資金曲線的日漲跌幅了。在這一步,本文為了盡量接近真實(shí)的投資情況,考慮了手續(xù)費(fèi)和成交的滑點(diǎn)。默認(rèn)的手續(xù)費(fèi)為雙邊千分之2,默認(rèn)的滑點(diǎn)為雙邊千分之1(在程序中為參數(shù),可自行設(shè)置)。具體的計(jì)算過程參見程序代碼的注釋。
在得到資金曲線每天的漲跌幅之后,可以計(jì)算出資金曲線。本文在計(jì)算回測(cè)資金曲線的時(shí)候,從它上市250個(gè)交易日(在程序中為參數(shù),可自行設(shè)置)之后才開始計(jì)算,并且最早不早于2006年1月1號(hào)(在程序中為參數(shù),也可自行設(shè)置)。
五、根據(jù)資金曲線計(jì)算統(tǒng)計(jì)指標(biāo)
在得到資金曲線之后,本文計(jì)算了最近250個(gè)交易日(在程序中為參數(shù),可自行設(shè)置)的股票和策略的累計(jì)收益率以及每年(月,周)的股票和策略收益,并計(jì)算了股票和策略相應(yīng)的年(月,周)的勝率進(jìn)行比較。
為了直觀的看出采用均線策略后實(shí)際的交易情況,本文還記錄了每次交易(一買一賣視為一次交易)的盈虧情況以及股票同期的漲跌幅,并計(jì)算了與交易相關(guān)的一些指標(biāo),包括交易次數(shù)、最長(zhǎng)持有天數(shù)、每次平均漲幅、單次最大盈利和虧損、年均買賣次數(shù)、最大連續(xù)盈利次數(shù)和最大連續(xù)虧損次數(shù)。
最后,本文計(jì)算了該均線策略在回測(cè)期間的年化收益和最大回撤,并和股票的年化收益及最大回撤做了一下對(duì)比。
==程序==
要運(yùn)行均線策略,需要某只股票的歷史交易數(shù)據(jù),在www.yucezhe.com可以下載到所有股票歷史至今的數(shù)據(jù)。如下圖所示,每一行是每一天的數(shù)據(jù):
數(shù)據(jù)有以下的字段:
【code】股票的代碼,上證股票以sh開頭,深證股票以sz開頭
【date】交易日期
【open】開盤價(jià)
【high】最高價(jià)
【low】最低價(jià)
【close】收盤價(jià)
【change】漲跌幅,復(fù)權(quán)之后的真實(shí)漲跌幅,保證準(zhǔn)確
【volume】成交量
【money】成交額
【traded_market_value】流通市值
【market_value】總市值
【turnover】換手率,成交量/流通股本
【adjust_price】后復(fù)權(quán)價(jià),復(fù)權(quán)開始時(shí)間為股票上市日,精確到小數(shù)點(diǎn)后10位
下面是代碼的截圖,代碼里面有詳細(xì)的注釋,有問題可以留言,附件中有程序的源碼,回復(fù)即可下載。
本文以萬科A為例,將數(shù)據(jù)下載下來,運(yùn)行代碼,可以看到在萬科A這只股票上運(yùn)用均線策略的回測(cè)結(jié)果。
首先是最近250天股票和策略的累計(jì)漲跌幅:
這有助于我們直觀的了解策略在最近一段時(shí)間的表現(xiàn)情況,從數(shù)據(jù)來看,均線策略在15年的效果好像不怎么樣,還不如直接持有萬科的股票,不過本文目的主要是教大家如何從頭到尾用python編寫一個(gè)完整的策略,均線策略只是為了方便作為例子,大家也可以開發(fā)其他一些更好的策略。
接著是過去每年、每月、每周股票和策略的收益對(duì)比:
從結(jié)果可以看出,該均線策略的年勝率和股票一樣,為60%,月勝率低于股票的月勝率但周勝率卻略高于股票本身。
然后是賬戶交易的各項(xiàng)指標(biāo)的統(tǒng)計(jì)。
從結(jié)果可以看到,對(duì)萬科這只股票采用均線交易策略的話,從它上市至今一共交易了98次,最長(zhǎng)的持有天數(shù)為248天。單次交易的最大盈利為176.16%,賺了一倍多,而單次最大虧損為-19.84%,平均每次交易的收益大概為7.75%。1年內(nèi)平均交易次數(shù)差不多為4次,交易頻率比較低,最大連續(xù)盈利4次,但最大連續(xù)虧損也達(dá)到11次之多,這可能對(duì)大部分人來說有點(diǎn)無法忍受。
最后是在回測(cè)期間(2006年1月1號(hào)之后)策略和股票的年化收益及最大回撤。策略的年化收益為37.7%,超過了股票本身的年化收益32.9%,最大回撤為-48.5%,遠(yuǎn)小于股票的最大回撤-79%,說明該策略總的來說效果還是不錯(cuò)的。大家可以試著選擇其他股票或者修改均線策略的參數(shù),再看看運(yùn)行的效果如何。
以上就是構(gòu)建一個(gè)完整策略的框架的整個(gè)過程,大家如果有其他的策略,只需要將第一部分信號(hào)產(chǎn)生方式改成自己的策略邏輯就可以進(jìn)行回測(cè)了。
之后會(huì)講的內(nèi)容:
關(guān)于《量化小講堂》之后想看的內(nèi)容,或者相關(guān)問題,可以加我微信xbx_laoshi、Q群(快滿):438143420溝通。
附件中是Python程序文件,回復(fù)可見。覺得文章內(nèi)容有幫助的話,頂貼是最好的鼓勵(lì)!