一、關于RQAlpha
RQAlpha是一個由米筐科技Ricequant開源的Python算法交易和回測引擎,適合A股市場,是事件驅動的設計。RQAlpha 從數(shù)據(jù)獲取、算法交易、回測引擎,實盤模擬,實盤交易到數(shù)據(jù)分析,為程序化交易者提供了全套解決方案。RQAlpha 具有靈活的配置方式,強大的擴展性,用戶可以非常容易地定制專屬于自己的程序化交易系統(tǒng)。
二、相關背景知識
股票回測:股票回測是指設定了某些股票指標組合后,基于歷史已經發(fā)生過的真實行情數(shù)據(jù),在歷史上某一個時間點開始,嚴格按照設定的組合進行選股,并模擬真實金融市場交易的規(guī)則進行模型買入、模型賣出,得出一個時間段內的盈利率、最大回撤率等數(shù)據(jù)。
最大回撤(Max Drawdown):策略在整個時間段上虧損最嚴重的時候相比凈值最高值下跌的百分比。描述策略可能出現(xiàn)的最糟糕的情況。例如一個賬戶的凈值是100,200,50,300,150,100, 200,那最大的虧損就是從300那個點開始一直虧到100。MaxDrawDown=1-(100/300)=0.67
最大回撤是策略評估時非常關鍵的一個指標,通常與風險承受能力相關。
三、RQAlpha框架代碼結構

四、RQAlpha事件機制
· 事件注冊:
RQAlpha 大部分的組件是以 add_listener 的方式進行事件的注冊。
以策略執(zhí)行為例:
1. 當Bar數(shù)據(jù)生成時,觸發(fā) EVENT.BAR 事件,那么用戶的 handle_bar 相關的代碼注冊了該事件則會立即執(zhí)行。
2. 當訂單下單時,觸發(fā) EVENT.ORDER_PENDING_NEW 事件,前端風控模塊注冊了該事件,則可以立即對該訂單進行審核,如果不滿足風控要求,則直接指定執(zhí)行 order._cancel(reason) 來保證有問題的訂單不會進入實際下單環(huán)節(jié)。
3. 當訂單成交時,觸發(fā) EVENT.TRADE 事件,那么系統(tǒng)的賬戶模塊因為注冊了該事件,就可以立即計算成交以后的收益和資金變化。
程序化交易中很多操作,都是通過注冊事件的方式插入到 RQAlpha 中進行擴展的。
· 事件源:
1. 獲取回測時間段內的交易日;
2. 遍歷交易日獲取日線/分鐘線/tick的行情數(shù)據(jù),發(fā)布事件到事件總線。
EVENT.TICK tick數(shù)據(jù)更新事件
· PRE_TICK
· HANDLE_TICK
· POST_TICK
EVENT.BAR bar數(shù)據(jù)更新事件
· PRE_BAR
· HANDLE_BAR
· POST_BAR
EVENT.BEFORE_TRADING 交易發(fā)生前事件
· PRE_BEFORE_TRADING
· HANDLE_BEFORE_TRADING
· POST_BEFORE_TRADING
EVENT.AFTER_TRADING 交易成交后事件
· PRE_AFTER_TRADING
· HANDLE_AFTER_TRADING
· POST_AFTER_TRADING
EVENT.SETTLEMENT 結算事件
· PRE_SETTLEMENT
· HANDLE_SETTLEMENT
· POST_SETTLEMENT
· 事件分類:

五、日回測系統(tǒng)流程

六、RQAlpha策略
· 策略運行方式:

· RQAlpha的API:

RQAlpha 抽離了策略框架的所有技術細節(jié),以API的方式提供給策略研發(fā)者用于編寫策略,從而避免陷入過多的技術細節(jié),而非金融程序建模本身。
·?策略編寫流程:

·?范例策略的運行:
(1)buy_and_hold.py:
buy_and_hold策略:在回測開始的第一天買入資金量的100%的平安銀行并且一直持有。
命令行運行:

回測的起始時間為 2016-06-01, 結束時間為 2016-12-01,我們給策略分配的起始資金為 100000, Benchmark 設置為 000300.XSHG。
運行結果:

(2)golden_cross.py:
golden_cross策略:使用talib計算長短兩根均線,如果短均線從上往下跌破長均線,也就是在目前的bar短線平均值低于長線平均值,而上一個bar的短線平均值高于長線平均值,即進行清倉;如果短均線從下往上突破長均線,為入場信號。
命令行運行:

回測的起始時間為 2016-06-01, 結束時間為 2017-12-01,我們給策略分配的起始資金為 300000, Benchmark 設置為 000300.XSHG。
運行結果:

(3)macd.py:
單股票macd策略:用Talib計算MACD取值,macd 是長短均線的差值,signal是macd的均線。 如果macd從上往下跌破macd_signal,進行清倉。如果短均線從下往上突破長均線,為入場信號,滿倉入股。
命令行運行:

回測的起始時間為 2016-06-01, 結束時間為 2017-12-01,我們給策略分配的起始資金為 300000, Benchmark 設置為 000300.XSHG。
運行結果:

回測衡量指標:
阿爾法(Alpha):表示策略所持有投資組合的收益中和市場整體收益無關的部分,是策略選股能力的度量。當策略所選股票的總體表現(xiàn)優(yōu)于市場基準組合成分股時,阿爾法取正值;反之取負值,該值越大越好。
貝塔(Beta):表示投資的系統(tǒng)性風險,反映了策略對大盤變化的敏感性。例如,一個策略的Beta為1.3,則大盤漲1%的時候,策略可能漲1.3%,反之亦然;如果一個策略的Beta為-1.3,說明大盤漲1%的時候,策略可能跌1.3%,反之亦然。該值越小越好。
夏普比率(Sharpe Ratio):表示每承受一單位總風險,會產生多少的超額報酬,可以同時對策略的收益與風險進行綜合考慮。sharp是衡量策略最重要的一個指標,該指標的計算不僅考慮收益率,還考慮了風險,因此比較具有參考價值,可以理解為經過風險調整后的收益率。
信息比率(Information Ratio):衡量單位超額風險帶來的超額收益。信息比率越大,說明該策略單位跟蹤誤差所獲得的超額收益越高,因此,信息比率較大的策略的表現(xiàn)要優(yōu)于信息比率較低的。
索提諾比率(Sortino ratio):應該是每承擔一單位的下行波動(相對于比較基準或無風險收益率)所能獲得的單位收益,數(shù)值越大,說明承擔同樣下跌風險的情況下,可以獲得更多的超額收益或者基準上的回報。
收益波動率(Volatility):金融資產價格的波動程度,是對資產收益率不確定性的衡量,用于反映金融資產的風險水平。波動率越高,金融資產價格的波動越劇烈,資產收益率的不確定性就越強;波動率越低,金融資產價格的波動越平緩,資產收益率的確定性就越強。