【量化小講堂-Python&Pandas系列10】如何判斷一個策略的好壞?(附代碼)
本系列「量化小講堂」,通過實際案例教初學者使用python、pandas進行金融數據處理,希望能對大家有幫助。詳盡教學內容盡在量化小講堂,歡迎交流指教。
文中用到的A股數據可在www.yucezhe.com下載,這裡可以下載到所有股票、從上市日起的交易數據、財務數據、分鐘數據、分筆數據、逐筆數據等
對於一個交易策略,初學者往往認為收益越高越好。收益確實是一個重要的評價指標,但是除了收益之外,還有很多其他重要的角度來衡量一個策略的好壞。例如這個策略的風險性、勝率、交易頻率等。
本篇文章以幾個常見的交易策略評價指標為案例,向大家介紹pandas的以下幾個功能的運用:
- dataframe的合併操作:append()、concat()函數的用法
- 按某一列的值排序操作:sort_values()函數的用法
- 常見統計指標的方法:mean(), std()等
- pandas畫圖操作:plot方法
我將介紹如下幾個經典指標
- 年化收益
任何收益都應該轉換成年化收益,以進行比較。股神巴菲特投資幾十年以來的年化收益是20%左右。美國股市百年來年化收益大概是10%左右。所以我們也不要太貪心,不要動輒就要求每年翻倍的收益。計算公式為:(賬戶最終價值/賬戶初始價值)^(250/回測期間總天數)-1
- 最大回撤
最大回撤就是從一個高點到一個低點最大的下跌幅度,用來描述我們的策略可能出現的最糟糕的情況,衡量了最極端可能的虧損。例如一個策略的最大回撤是50%,那麼你使用這個策略之前就要掂量掂量,自己是否能經受得起50%的下跌。計算公式為:min(賬戶當日價值
/ 當日之前賬戶最高價值-1)。我一般認為,年華收益/最大回撤,是個最簡單有效的策略判斷指標。
- 平均漲幅
平均漲幅衡量了在回測期間資產的平均漲跌情況。計算公式為:賬戶日收益的平均值。
- 上漲概率
上漲概率衡量了我們投資組合上漲的可能性。計算公式為:上漲天數 / 回測交易日數量。
- 最大連續上漲天數
衡量了我們策略連續盈利的最大天數。
- 最大連續下跌天數
衡量了我們策略連續虧損的最大天數。或者說策略連續失效的次數。這個指標很重要,在實戰中,若連續失敗的次數多了,會動搖自己的信心,使自己很難跟著策略走下去。
- 最大單周期漲幅
所有日期中最大的漲幅,衡量了資產一天內的最好表現。
- 最大單周期跌幅
所有日期中最大的跌幅,衡量了資產一天內的最差表現。
- 收益波動率
單單追求高收益率是不行的,我們在投資中還必須考慮到潛在的風險。波動太大的策略往往風險也較高。收益波動率就衡量了策略收益的波動情況即風險。計算公式為:賬戶日收益的年化標準差。
- 貝塔(beta)值
根據經典的資本資產定價理論(CAPM模型),β係數衡量了資產的回報率對市場變動的敏感程度,代表了該資產的系統性風險,表示策略對大盤的敏感性。計算公式為:賬戶日收益與參考基準日收益的協方差 / 參考基準日收益的方差。
- 阿爾法(alpha)值
雖然我們的策略會受到大盤的影響,但是每個策略都會有自己市場因素之外的收益,alpha值表示實際風險回報和平均預期風險回報的差額,衡量了投資的非系統性風險。計算公式為:(賬戶年化收益-無風險收益)-beta*(參考基準年化收益-無風險收益)。
- 夏普比率
理性的投資者將選擇並持有有效的投資組合,即那些在給定的風險水平下使期望回報最大的投資組合,夏普比率就是一個可以同時對收益與風險加以綜合考慮的經典指標,表示每承受一單位風險,會產生多少的超額回報。計算公式為:(賬戶年化收益率-無風險利率)/ 收益波動率。
- 信息比率
信息比率以馬克維茨的均異模型為基礎,用來衡量超額風險所帶來的超額收益。它表示單位主動風險所帶來的超額收益。計算公式為:(賬戶日收益 - 參考基準日收益)的年化均值/年化標準差。
任何策略的結果都是一個收益序列,根據這個收益序列可以得到一條資金曲線。為了簡單起見,我們就任選一隻股票每天的收益率作為原始數據,來計算上文提到的各種策略評價指標。在http://yucezhe.com/product?name=trading-data可以下載到所有股票的歷史日線數據,可以作為我們計算的原始數據。
數據下載下來解壓縮打開後,裡面有所有股票和幾個常見指數的數據。打開其中一個股票文件之後是下圖這個樣子,每一行是每一天的數據:
數據有以下的欄位:
【code】股票的代碼,上證股票以sh開頭,深證股票以sz開頭
【date】交易日期
【open】開盤價
【high】最高價
【low】最低價
【close】收盤價
【change】漲跌幅,復權之後的真實漲跌幅,保證準確
【volume】成交量
【money】成交額
【traded_market_value】流通市值
【market_value】總市值
【turnover】換手率,成交量/流通股本
【adjust_price】後復權價,復權開始時間為股票上市日,精確到小數點後10位
【report_date】最近一期財務報告實際發布的日期
【report_type】最近一期財務報告的類型,3-31對應一季報,6-30對應半年報,9-30對應三季報,12-31對應年報
【PE_TTM】最近12個月市盈率,股價 / 最近12個月歸屬母公司的每股收益TTM
【PS_TTM】最近12個月市銷率, 股價 / 最近12個月每股營業收入
【PC_TTM】最近12個月市現率, 股價 / 最近12個月每股經營現金流
【PB】市凈率,股價 / 最近期財報每股凈資產
對於我們來說,只要取【date】以及【change】就行了。下面是代碼的截圖,這段代碼截取指定的股票在指定時間段內的收益率,計算相關指標。代碼裡面有詳細的注釋,有問題可以留言,附件中有程序的源碼,回復即可下載。
獲取數據函數:
計算年化收益率函數:
計算最大回撤函數:
計算平均漲幅:
計算最大連續上漲天數和最大連續下跌天數:
計算最大單周期漲幅和最大單周期跌幅:
計算收益波動率的函數、計算貝塔的函數:
計算alpha的函數:
計算夏普比函數:
計算信息比率函數、計算股票和基準在回測期間的累計收益率並畫圖:
導入數據運行以上函數:
把數據和代碼下載下來後,修改代碼中原始數據的地址(也就是選擇一個股票),並選定時間段,運行代碼,就可以看到輸出結果了。假設我們選擇萬科A,並設定時間段為1991年1月1日到2015年12月31日這25年,得到如下的輸出結果:
2016-3-3 22:37:18 上傳
ref="http://bbs.pinggu.org/forum.php?mod=attachment&aid=MTk4NDY1Nnw2Mzg4ZDNlMnwxNTA1NTI0Njc5fDB8NDQ1NDQyOQ%3D%3D¬humb=yes">下載附件 (59.95 KB)
萬科A二十幾年年年化回報是15%,已經相當不錯了,最大回撤為78.9756%,也就是將近跌了80%,發生在08年的股災。最大連續下跌50天,也是有點猛...
掃描下圖二維碼,或直接添加微信號:xbx_laoshi,加我私人微信,獲取文中附件、代碼、數據的下載鏈接,討論《量化小講堂》之後的內容。
我每天會在知識星球(原小密圈)分享我關於量化的所見、所聞、所思,歡迎點擊加入:小密圈 - 量化小講堂
想要快速、系統的學習量化知識,可以參與我的課程,一邊看視頻,一邊做作業,有問題隨時諮詢,點擊查看詳情::Python量化入門課程 - 量化小講堂
推薦閱讀:
※聽消息炒股票的正確姿勢(下)
※壓抑已久的爆發,主線卻從未變
※方向錯了,你再努力也沒用
※人生至少有一次暴富的機會!
※唐能通:國慶節後多空會有大搏殺