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