1. 程式人生 > >量化投資:第1節 擇時策略的開發

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

作者: 阿布

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

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

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

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

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

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

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

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

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

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

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量化文件目錄章節

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

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

更多關於量化交易與機器學習相關請閱讀《機器學習之路》

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

相關推薦

量化投資:1 策略開發

作者: 阿布 量化系統一般分為回測模組、實盤模組。 回測模組:首先交易者編寫實現一個交易策略,它基於一段歷史的交易資料,根據交易策略進行模擬買入賣出,策略中可以涉及買入規則、賣出規則、選股規則、倉位控制及滑點策略等等,回測的目的是驗證交易策

量化投資:2 策略的優化

作者: 阿布 上一節編寫了AbuFactorBuyBreak和AbuFactorSellBreak,做為擇時買入策略和擇時賣出策略,本節將繼續使用這兩個策略, 通過混入其它賣出策略來提高優化交易效果。 備註:已將AbuFactorBuyBr

基於布林帶的股票量化策略研究

策略介紹: 該布林策略經回測,2007-01-01 到 2017-01-01,選用滬深 300 前 100 只股作 為樣本,在聚寬平臺上回測結果如下: 該策略十年收益為 255.44%,策略年化收益為 13.92%,Alpha 是投資者獲得與市 場波動無關的回報, 即超額收益

11練習題10 查找中位數

str idt findmi proc borde 1.3 hidden argc -a 問題描寫敘述 一個長度為L(L ≥1) 的升序序列S。處在第 ? L/2 ? 個位置的數稱為S的中位數。比如,若序列S1=(11,13,15,17,19)S

使用寄存器點亮LED(1)—GPIO功能框圖講解

smbus 其它 block 負載能力 tst 很好 通用 描述 大致 GPIO簡介 GPIO 是通用輸入輸出端口的簡稱,簡單來說就是 STM32 可控制的引腳, STM32 芯片的 GPIO 引腳與外部設備連接起來,從而實現與外部通訊、控制以及數據采集的功能

讓我們一起走進大數據開源項目--1

大數據 hadoop 最近大數據領域最火的消息莫過於Pivotal兌現了其年初對於開源其大數據核心產品GemFire,HAWQ,Greemplum DB的承諾 。這個消息也讓Pivotal在國內技術社區風風光光的火了一把,程序猿們可以看到真正的企業級數據倉庫是如何設計和實現的。 與此同時,開源社區中也

1、一個蘿蔔一個坑——計數排序

算法基礎1、栗子 期末成績出來了,大白考了第4名,得了6 分,總分10分,回家媽媽打他了一頓:你看鄰居家的孩子考得多好呀!家長會上,老師要求大家成績從低到高排序,前三名獎勵小紅花,大家如何排隊呢? 2、準備工作 一個蘿蔔一個坑,首先要準備很多個坑,之後把對應的蘿蔔放進去,之後數一下那個坑裏有蘿蔔就OK了! 我

Spring Boot基礎教程》 1工具的安裝和使用

article pac java upd ips help 如何快速 安裝 nbsp 《Spring Boot基礎教程》 第1節 工具的安裝和使用 Spring Boot文檔 https://qbgbook.gitbooks.io/spring-boot-reference

易學筆記-1:redis資料型別

redis資料型別 String型別 127.0.0.1:6379> set name "xxx" OK 127.0.0.1:6379> get name "xxx" HASH型別 127.0.0.1:6379> HMSET myhash name1 "

1 JavaScript概述

第一節 JavaScript概述 JavaScript:其實就是對HTML+CSS靜態頁面進行樣式修改,使其實現各種動態效果。 編寫JS指令碼基本步驟:   1. HTML+CSS靜態佈局;   2. 確定要修改的屬性;   3.確定使用者做哪些操作,即事件(產品樣式);   4.在事件中,用JS

步步詳解之1----ALTERA FPGA關於PLL的使用,幫你用光所有PLL

PLL 建立工程 建立新工程 引導說明,點選next 設定工程路徑,不能有中文;設定工程名稱,點選next 點選next 選擇器件庫,這裡選擇cyclone IV E,器件型號為EP4C6EE22C8,該器件有兩個PLL; 點選next 呼叫

學前班11_怎麼看原理圖之GPIO和閘電路

原理圖主要分為三類 一、管腳類即GPIO和閘電路 1.1輸入、輸出引腳、上拉電阻、三極體 1.2與門、或門、非門 1.3中斷 二、協議類 2.1 UART 2.2 I2C 2.3 SPI 2.4 NAND 2.5 LCD 三、類似記憶體的介面

# Chan 定位演算法:1

Chan 定位演算法 Author: [email protected]Author: [email protected] Chan 演算法是 TDOA 定位方法的一

JQData應用 | 基於估值波動週期的策略

文章轉發自聚寬使用者「夏魯迅」的投稿文章,並被“聚寬資料”公眾號收錄~ 一、前言 在變化莫測的A股市場上,永遠流傳著三個終極問題:我該買什麼?什麼時候買?什麼時候賣?多少人以為自己知道答案,直到股災降臨,灰飛煙滅。在經歷了一輪又一輪牛市和熊市的洗禮後,我們終於透過估值資料發現了市場週

Netty原始碼分析1章(Netty啟動流程)-------->1: 服務端初始化

第一章:  Server啟動流程   概述:     本章主要講解server啟動的關鍵步驟, 讀者只需要瞭解server啟動的大概邏輯, 知道關鍵的步驟在哪個類執行即可, 並不需要了解每一步的運作機制, 之後會對每個模組進行深度分析 第一節:服務端初

Netty原始碼分析2章(NioEventLoop)---->1: NioEventLoopGroup之建立執行緒執行器

  第二章: NioEventLoop   概述:         通過上一章的學習, 我們瞭解了Server啟動的大致流程, 有很多元件與模組並沒有細講, 從這個章開始, 我們開始詳細剖析netty的各個元件, 並結合啟動流程, 將這些元件

Netty原始碼分析3章(客戶端接入流程)---->1: 初始化NioSockectChannelConfig

  Netty原始碼分析第三章: 客戶端接入流程   概述:         之前的章節學習了server啟動以及eventLoop相關的邏輯, eventLoop輪詢到客戶端接入事件之後是如何處理的?這一章我們循序漸進, 帶大家繼續剖析客戶

Netty原始碼分析4章(pipeline)---->1: pipeline的建立

  Netty原始碼分析第四章: pipeline   概述:          pipeline, 顧名思義, 就是管道的意思, 在netty中, 事件在pipeline中傳輸, 使用者可以中斷事件, 新增自己的事件處理邏輯, 可

Netty原始碼分析5章(ByteBuf)---->1: AbstractByteBuf

  Netty原始碼分析第五章: ByteBuf   概述:         熟悉Nio的小夥伴應該對jdk底層byteBuffer不會陌生, 也就是位元組緩衝區, 主要用於對網路底層io進行讀寫, 當channel中有資料時, 將chann

Netty原始碼分析6章(解碼器)---->1: ByteToMessageDecoder

  Netty原始碼分析第六章: 解碼器   概述:           在我們上一個章節遺留過一個問題, 就是如果Server在讀取客戶端的資料的時候, 如果一次讀取不完整, 就觸發channelRead事件, 那麼Netty是