【量化小講堂-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="bbs.pinggu.org/forum.ph">下載附件 (59.95 KB)

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


掃描下圖二維碼,或直接添加微信號:xbx_laoshi,加我私人微信,獲取文中附件、代碼、數據的下載鏈接,討論《量化小講堂》之後的內容。

我每天會在知識星球(原小密圈)分享我關於量化的所見、所聞、所思,歡迎點擊加入:小密圈 - 量化小講堂

想要快速、系統的學習量化知識,可以參與我的課程,一邊看視頻,一邊做作業,有問題隨時諮詢,點擊查看詳情::Python量化入門課程 - 量化小講堂


推薦閱讀:

聽消息炒股票的正確姿勢(下)
壓抑已久的爆發,主線卻從未變
方向錯了,你再努力也沒用
人生至少有一次暴富的機會!
唐能通:國慶節後多空會有大搏殺

TAG:交易策略 | Python教程 | 炒股 |