【邢不行|量化小講堂系列11-Python量化入門】如何判斷一個策略的好壞?(附代碼)

引言:

邢不行的系列帖子“量化小講堂”,通過實際案例教初學者使用python進行量化投資,瞭解行業研究方向,希望能對大家有幫助。

【歷史文章彙總】請點擊此處

【必讀文章】EOS期現套利,一週時間,15%無風險收益

                     10年400倍策略分享(附視頻逐行代碼講解)

個人微信:xbx9025,有問題歡迎交流。


如何判斷一個策略的好壞?

對於一個交易策略,初學者往往認爲收益越高越好。收益確實是一個重要的評價指標,但是除了收益之外,還有很多其他重要的角度來衡量一個策略的好壞。例如這個策略的風險性、勝率、交易頻率等。

本篇文章以幾個常見的交易策略評價指標爲案例,向大家介紹pandas的以下幾個功能的運用:

  1. dataframe的合併操作:append()、concat()函數的用法
  2. 按某一列的值排序操作:sort_values()函數的用法
  3. 常見統計指標的方法:mean(), std()等
  4. 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】就行了。下面是代碼的截圖,這段代碼截取指定的股票在指定時間段內的收益率,計算相關指標。代碼裏面有詳細的註釋,有問題可以留言,需要代碼可以加我微信xbx9025索要。

獲取數據函數:

計算年化收益率函數:

image.pn計算最大回撤函數:

計算平均漲幅:

計算上漲概率:

計算最大連續上漲天數和最大連續下跌天數:

 

計算最大單週期漲幅和最大單週期跌幅:

計算收益波動率的函數、計算貝塔的函數:

計算alpha的函數:

計算夏普比函數:

計算信息比率函數、計算股票和基準在回測期間的累計收益率並畫圖:

導入數據運行以上函數:

把數據和代碼下載下來後,修改代碼中原始數據的地址(也就是選擇一個股票),並選定時間段,運行代碼,就可以看到輸出結果了。假設我們選擇萬科A,並設定時間段爲1991年1月1日到2015年12月31日這25年,得到如下的輸出結果:

 

萬科A二十幾年年年化回報是15%,已經相當不錯了,最大回撤爲78.9756%,也就是將近跌了80%,發生在08年的股災。最大連續下跌50天,也是有點猛…

對本文研究有自己的想法的朋友,歡迎在評論區留言。關於文中的代碼、數據,以及下期《量化小講堂》想了解的內容,也可以加我個人微信xbx9025交流。

如果你想入門量化,但是始終找不到方向,可以加入我的知識星球。我會在裏面解答你的問題,分享我的感悟,不論是投資、技術,還是職業選擇、思維方式。 

                                                                         -- 學習和成長從來都不是一個人的事 -- 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章