多因子選股+權重排序策略3.0

程序框架說明:

與之前發布過的面向對象二八小市值是基本類似的,只是整個框架更加完善更加靈活了。

重點類說明:

1. Rule(object)所有規則的基類。包含聚寬策略的事件Initialize,handle_data,before_trading_start.....等等。即每次聚寬事件都會調用所有規則的相關事件,除了handle_data,會根據策略流程可能中斷執行,不會所有都執行。除此之外,新增自定義的一些事件on_sell_stock,on_buy_stock,before_clear_position,on_clear_position為賣股,買股,清倉前,清倉後觸發的事件。2. Group_Rules(Rule)為包含一系列規則組合的規則,通該類或擴展該類,實現樹形策略執行流程。3. Global_variable(object)自定義所有規則共用的全局變數,用於規則通用數據存儲。一個策略對應一個 Global_variable.包含較為通用的賣股、買股、清倉函數。4. Pick_stocks2(Group_rules) 選股規則組合器。此類通過一系列Filter_query,Filter_stock_list的子類組合選出股票池5. Pick_financial_data(Filter_query)根據聚寬財務數據的多因子選股器。6. SortRules(Group_rules,Filter_stock_list)多因子權重排序規則組合器。多因子權重排序演算法實現類

---------------(分割線)---------------

關於類繼承結構(部分):

策略流程查看日誌生成的策略結構就成行了:

多因子小市值策略 1.預先處理的輔助規則 1.1. 設置系統參數:[使用真實價格交易] [忽略order 的 log] [設置基準] 1.2. 根據時間設置不同的交易費率 1.3. 持倉信息列印 1.4. 策略績效統計 2.調倉執行條件的判斷規則組合 2.1. 調倉時間控制器: [調倉時間: ["14:50"] ] 2.2. 大盤高低價比例止損器:[指數: 000001.XSHG] [參數: 160日內最高最低價: 2.2倍] [當前狀態: False] 2.3. 多指數20日漲幅損器[指數:["000016.XSHG", "399333.XSHE"]] [漲幅:0.50%] 2.4. 調倉日計數器:[調倉頻率: 3日] [調倉日計數 0] 3.選股 3.1. 多因子選股: ---[ 0 < valuation.circulating_market_cap < 100 ] ---[ 0 < valuation.pe_ratio < 200 ] ---[ 0 < indicator.eps ] ---[排序:valuation.circulating_market_cap 從小到大] ---[限制選股數:200] 3.2. 過濾創業板股票 3.3. 一般性股票過濾器:["st", "high_limit", "low_limit", "pause"] 3.4.多因子權重排序器 3.4.1. [權重: 100 ] [排序: 從小到大 ] 流通市值排序 3.4.2. [權重: 20 ] [排序: 從小到大 ] 按當 PriceType.now 價格排序 3.4.3. [權重: 10 ] [排序: 從小到大 ] 按 20 日漲幅排序 3.4.4. [權重: 10 ] [排序: 從小到大 ] 按 60 日漲幅排序 3.4.5. [權重: 10 ] [排序: 從小到大 ] 按換手率排序 3.5. 獲取最終待購買股票數:[ 3 ] 4.調倉執行規則組合 4.1. 股票調倉賣出規則:賣出不在buy_stocks的股票 4.2. 股票調倉買入規則:現金平分式買入股票達目標股票數 4.3. 顯示調倉時買賣的股票

---------------(分割線)---------------

關於關於多因子選股的說明

其實沒啥好說明的,無非是根據各種條件取並集而已。

多因子選股有待擴展的是按市場分布比例取集,比如,取流通市值最小的20%的股票,以後有空再做吧,果仁有這個功能。

關於多因子權重排序說明

對於每個因子,都對股票池進行獨立的排序,然後以該因子排名*因子權重加到總權重。最後再對總權重進行排序。

---------------(分割線)---------------

關於策略實盤的說明

Shipane_manager 規則為把聚寬持倉同步到實盤同步的規則

使用該規則需下載 trader_sync.py和shipane_sdk.py到研究里。

下載地址:pan.baidu.com/s/1skZHEV

Purchase_new_stocks為自動打新規則,需要 shipane_sdk.py

以上基於 實盤易實現策略實盤。

---------------(分割線)---------------

關於面向對象策略更新代碼失敗的各種坑的總結:

大部分都是由序列化和反序列化引起的。

  1. 不要把一個對象函數賦與另一個對象變數。如 obj1.func = obj2.func
  2. 更新代碼前,一些廢棄的類、函數請不要刪除或改名。要刪除或改名請在更新代碼成功後。不然會反序列化失敗。
  3. 新增一個類的成員變數,在使用前需要檢測並賦初值,因為原策略里已創建的對象,可能沒有被重新創建,然後並不存在這個新增的成員變數,後續再使用時就會報錯,尤其是在把各個規則分拆放到研究里時,這個問題相當嚴重。在本策略中,用以下相互配合達到避免這個錯誤。

    a) 在update_params函數里進行成員變數初始化。

    b) Rule自帶保存了傳入參數的dict self._params,規則使用參數時,請直接用self._params.get(『參數』,默認值)的方式使用參數,參數不再每個都保存為類成員,自然就不存在因為新增類成員導致策略錯誤的問題。

    c) 假如是在修改研究文件中的類,而該類在策略里有使用,新增成員變數時,在使用前,請Try,異常則初始化。
  4. 同一個Group_Rules規則組合下的規則,假如是同一個規則類使用了兩次,則一定要設置對象名。即策略配置里的第二個字元串參數。否則會導致策略混亂出現亂七八糟的錯誤。本策略示例里沒有這種情況。

以前我發布的面向對象,代碼更新還是經常失敗的。現在好多了,掌握了要點,基本沒有再出現過更新失敗的問題。

---------------(分割線)---------------

最後聲明:

該策略只是作為我這個程序框架下的多因子選股票池,多因子權重排序的示例,希望起到拋磚引玉的作用,而對策略結果、收益、風險不負任何責任,也不作任何解釋。。。因為我也沒研究,隨便寫的幾個因子玩玩的。

該策略框架為較通用的框架,我自己實盤策略也是基於這個寫的,只是規則更多,所以有些基類里出現一些沒使用過的代碼,不要介意,可能我別的地方用了,無視了就好。

感謝原文作者:晚起的小蟲(聚寬社區昵稱)

到JoinQuant查看策略源碼,並與作者交流討論:面向對象策略框架升級版: 多因子選股+多因子權重排序示例策略

前面文章中對次新小盤策略和多頭趨勢回踩策略進行了一些研究,歡迎留言交流討論。

面向對象重構策略(二):次新小盤策略

面向對象重構策略(三):多頭趨勢回踩策略
推薦閱讀:

barra風險模型因子計算中的半衰期?
多因子模型的因子有效性檢驗?

TAG:多因子模型 | 量化交易 | 量化 |