量化投資: 第1節 擇時策略的開發

来源:http://www.cnblogs.com/abupy/archive/2017/10/18/7689393.html
-Advertisement-
Play Games

作者: 阿布 阿布量化版權所有 未經允許 禁止轉載 "abu量化系統github地址" (您的star是我的動力!) "本節ipython notebook" "本節界面操作教程視頻播放地址" 量化系統一般分為回測模塊、實盤模塊。 回測模塊:首先交易者編寫實現一個交易策略,它基於一段歷史的交易數據, ...


作者: 阿布

阿布量化版權所有 未經允許 禁止轉載

abu量化系統github地址 (您的star是我的動力!)

本節ipython notebook

本節界面操作教程視頻播放地址

量化系統一般分為回測模塊、實盤模塊。

  • 回測模塊:首先交易者編寫實現一個交易策略,它基於一段歷史的交易數據,根據交易策略進行模擬買入賣出,策略中可以涉及買入規則、賣出規則、選股規則、倉位控制及滑點策略等等,回測的目的是驗證交易策略是否可行。
  • 實盤模塊:將回測通過的策略應用於每天的實時交易數據,根據策略發出買入信號、賣出信號,進行實際的買入、賣出操作。

回測模塊最重要的組成部份是擇時、選股:

  • 擇時(什麼時候投資)
  • 選股(投資什麼股票)

只有在對的時間買入對的股票才能獲利,就像下麵張小嫻的名言一樣,可以把‘股票’ 代替 ‘人’完全合乎邏輯。

在對的時間,遇見對的人(股票),是一種幸福

在對的時間,遇見錯的人(股票),是一種悲傷

在錯的時間,遇見對的人(股票),是一聲嘆息

在錯的時間,遇見錯的人(股票),是一種無奈

本節首先講解擇時(什麼時候投資), 後面的小節將講解選股

1. 買入擇時因數的編寫

海龜交易法則是量化經典書籍中的經典作品,它裡面介紹過一種趨勢跟蹤策略:N日趨勢突破策略

趨勢突破定義為當天收盤價格超過N天內的最高價或最低價,超過最高價格作為買入信號買入股票持有,超過最低價格作為賣出信號。

下麵將用abupy來實現海龜交易法則作為一個買入因數的實現代碼,向經典致敬:

class AbuFactorBuyBreak(AbuFactorBuyXD, BuyCallMixin):
    """示例繼承AbuFactorBuyXD完成正向突破買入擇時類, 混入BuyCallMixin,即向上突破觸發買入event"""
    def fit_day(self, today):
        """
        針對每一個交易日擬合買入交易策略,尋找向上突破買入機會
        :param today: 當前驅動的交易日金融時間序列數據
        :return:
        """
        # 今天的收盤價格達到xd天內最高價格則符合買入條件
        if today.close == self.xd_kl.close.max():
            # 生成買入訂單, 由於使用了今天的收盤價格做為策略信號判斷,所以信號發出後,只能明天買
            return self.buy_tomorrow()
        return None

上AbuFactorBuyBreak即是完成了海龜突破策略的代碼實現:

  1. 買入因數需要繼承AbuFactorBuyXD或者更複雜的策略繼承AbuFactorBuyBase
  2. 買入因數混入BuyCallMixin,即做為正向策略,股票相關的策略全部是正向策略,即買漲,後續章節示例期貨,期權會使用BuyPutMixin
  3. 買入因數需要實現fit_day,即每一個交易日如何執行交易策略,當符合買入條件後,使用buy_tomorrow或者buy_today生成訂單

更多買入因數實現代碼請閱讀AbuFactorBuyBase

2. 分解模式一步一步對策略進行回測

本節首先通過分解流程方式一步一步實現使用AbuFactorBuyBreak進行回測,目的是為了更清晰的說明內部操作流程,
編碼過程會顯的有些複雜臃腫,但實際上在編寫完成一個策略後只需要使用一行代碼即可以完成回測,在後面的小節中會進行講解。

通過字典形式初始化買入buy_factors,首先實現針對一支股票的擇時操作:

  • benchmark的意義為基準參考,基準預設使用回測股票對應市場的大盤指數
  • 預設參數下回測過去兩年的交易數據,傳遞AbuBenchmark(n_folds=2)參數修改回測周期
  • AbuCapital為資金主類,參數需要初始資金設定,這裡初始設定1000000(100萬),另一個參數為剛剛介紹過的benchmark(基準參考)對象
  • buy_factors由兩個買入因數組成,進行擇時的時候兩個因數同時並行生效
# buy_factors 60日向上突破,42日向上突破兩個因數
buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak}, 
               {'xd': 42, 'class': AbuFactorBuyBreak}]
benchmark = AbuBenchmark()
capital = AbuCapital(1000000, benchmark)

擇時ABuPickTimeExecute主要驅動方式為時間驅動,即通過時間序列一天一天遞進,通過買入因數賣出因數的fit來查詢是否有事件生成(買入賣出行為),另外也有框架使用事件驅動,它們分別有各自的優點,原始的abu框架就是時間驅動+事件驅動的,它最大的優點是執行效率比時間驅動高,但是靈活性及擴展性要比時間驅動差。

下麵使用ABuPickTimeExecute開始進行擇時交易回測,ABuPickTimeExecute實際上不是最簡潔的回測介面,更簡單的介面可以使用abu.run_loop_back()函數,在後面的章節將會示例使用,本節目的是為了更清晰的說明內部操作流程。

由回測結果圖可看出由於AbuPickTimeWorker沒有設置sell_factors,所以所有的交易單子都一直保留沒有賣出:

  • orders_pd:所有交易的相關數據(之後會有內容展示)
  • action_pd:所有交易的行為數據(之後會有內容展示)
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
                                                                            benchmark,
                                                                            buy_factors,
                                                                            None,
                                                                            capital, show=True)

3. 賣出擇時因數的實現

上面所有單子都沒有成交的原因是沒有賣出因數,下麵首先實現類似買入策略的N日趨勢突破策略AbuFactorSellBreak,當股價向下突破N日最低價格時賣出股票,即當天收盤價格低於N天內最低價格作為賣出信號,認為下跌趨勢成立賣出股票:

class AbuFactorSellBreak(AbuFactorSellXD):
    """示例繼承AbuFactorBuyXD, 向下突破賣出擇時因數"""
    def support_direction(self):
        """支持的方向,只支持正向"""
        return [ESupportDirection.DIRECTION_CAll.value]

    def fit_day(self, today, orders):
        """
        尋找向下突破作為策略賣出驅動event
        :param today: 當前驅動的交易日金融時間序列數據
        :param orders: 買入擇時策略中生成的訂單序列
        """
        # 今天的收盤價格達到xd天內最低價格則符合條件
        if today.close == self.xd_kl.close.min():
            for order in orders:
                self.sell_tomorrow(order)

上AbuFactorSellBreak即是完成了賣出突破策略的代碼實現:

  1. 賣出因數需要繼承AbuFactorSellXD或者更複雜的策略繼承AbuFactorSellBase
  2. 賣出因數需要實現support_direction方法,確定策略支持的買入策略方向,本例中[ESupportDirection.DIRECTION_CAll.value]即只支持正向買入策略,即買漲
  3. 賣出因數需要實現fit_day,看有沒有符合賣出條件的交易單子

更多具體賣出因數實現代碼請閱讀AbuFactorSellBase

備註:之後章節的期貨示例講講解如何使用ESupportDirection做反向交易,buy put

3.2 買入因數和賣出因數在回測中同時生效

同理使用字典組裝賣出因數:

# 使用120天向下突破為賣出信號
sell_factor1 = {'xd': 120, 'class': AbuFactorSellBreak}

# buy_factors 60日向上突破,42日向上突破兩個因數
buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak}, 
               {'xd': 42, 'class': AbuFactorBuyBreak}]

# 只使用120天向下突破為賣出因數
sell_factors = [sell_factor1]
capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
                                                                            benchmark,
                                                                            buy_factors,
                                                                            sell_factors,
                                                                            capital, show=True)

從上圖可以看到,大多數的交易賣出因數都生效了,但效果很不好, 下一節將繼續通過增加多個賣出因數同時作用於策略上來提高策略的效果。

abu量化文檔目錄章節

  1. 擇時策略的開發
  2. 擇時策略的優化
  3. 滑點策略與交易手續費
  4. 多支股票擇時回測與倉位管理
  5. 選股策略的開發
  6. 回測結果的度量
  7. 尋找策略最優參數和評分
  8. A股市場的回測
  9. 港股市場的回測
  10. 比特幣,萊特幣的回測
  11. 期貨市場的回測
  12. 機器學習與比特幣示例
  13. 量化技術分析應用
  14. 量化相關性分析應用
  15. 量化交易和搜索引擎
  16. UMP主裁交易決策
  17. UMP邊裁交易決策
  18. 自定義裁判決策交易
  19. 數據源
  20. A股全市場回測
  21. A股UMP決策
  22. 美股全市場回測
  23. 美股UMP決策

abu量化系統文檔教程持續更新中,請關註公眾號中的更新提醒。

更多阿布量化量化技術文章

更多關於量化交易相關請閱讀《量化交易之路》

更多關於abu量化系統請關註微信公眾號: abu_quant


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 30分鐘?不需要,輕鬆讀懂IL http://www.cnblogs.com/brookshi/p/5225801.html IL指令詳細 http://www.cnblogs.com/zery/p/3368460.html 進階篇:以IL為劍,直指async/await http://www.cn ...
  • 前言:去年剛工作的時候,也是剛剛正式接觸.net,當時瞭解了EF以及三種開發模式,Database First、Model First 、Code First。公司用的開發模式是Database First,由於公司有一套成熟的框架,我只需要按部就班的開發即可,因此就沒有詳細學習過這些開發模式,總覺 ...
  • C#多線程 一、使用線程的理由 1、可以使用線程將代碼同其他代碼隔離,提高應用程式的可靠性。 2、可以使用線程來簡化編碼。 3、可以使用線程來實現併發執行。 二、基本知識 1、進程與線程:進程作為操作系統執行程式的基本單位,擁有應用程式的資源,進程包含線程,進程的資源被線程共用,線程不擁有資源。 2 ...
  • 自己上網查了好多種方法,最後還是選了這種不收費,還挺好用的方法 為了用戶有一個好的體驗我將word、excel、ppt轉Pdf,Pdf轉Swf寫在服務上,因為我當時做的時候Pdf轉Swf會執行pdf2swf.exe彈出黑框,對用戶體驗不好,還有就是ppt轉swf時會有一個彈出框,提示正在發佈,我沒搞 ...
  • 1. JMS基本概念 JMS(Java Message Service) 即Java消息服務。它提供標準的產生、發送、接收消息的介面簡化企業應用的開發。 它支持兩種消息通信模型:點到點(point-to-point)(P2P)模型和發佈/訂閱(Pub/Sub)模型。 P2P 模型規定了一個消息只能有 ...
  • 之前沒課的時候寫過安居客的爬蟲,但那也是小打小鬧,那這次呢, 還是小打小鬧 哈哈,現在開始正式進行爬蟲書寫 首先,需要分析一下要爬取的網站的結構: 作為一名河南的學生,那就看看鄭州的二手房信息吧! 在上面這個頁面中,我們可以看到一條條的房源信息,從中我們發現了什麼,發現了連鄭州的二手房都是這麼的貴, ...
  • 在web.xml中配置載入spring時,發現項目無法運行;而去掉spring的配置時,項目可以被初始化。 此時應考慮到spring的配置文件中存在錯誤,以至於web容器無法對項目成功初始化,在web.xml中配置log4j, 根據列印的信息對spring的配置進行修改。 <context-para ...
  • 作者: 阿布 阿布量化版權所有 未經允許 禁止轉載 "abu量化系統github地址(歡迎+star,你的支持是我更新的動力!)" "本節ipython notebook" 上一節使用AbuFactorBuyBreak和AbuFactorSellBreak且混入基本止盈止損策略AbuFactorAt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...