【python量化交易】qteasy使用教程07——創建更加復雜的自定義交易策略

創建更加復雜的自定義交易策略

  • 使用交易策略類,創建更復雜的自定義策略
    • 開始前的準備工作
    • 本節的目標
    • 繼承Strategy類,創建一個復雜的多因子選股策略
      • 策略和回測參數配置,并開始回測
    • 本節回顧

使用交易策略類,創建更復雜的自定義策略

qteasy是一個完全本地化部署和運行的量化交易分析工具包,Github地址在這里,并且可以通過pip安裝:

$ pip install qteasy -U

qteasy具備以下功能:

  • 金融數據的獲取、清洗、存儲以及處理、可視化、使用
  • 量化交易策略的創建,并提供大量內置基本交易策略
  • 向量化的高速交易策略回測及交易結果評價
  • 交易策略參數的優化以及評價
  • 交易策略的部署、實盤運行

通過本系列教程,您將會通過一系列的實際示例,充分了解qteasy的主要功能以及使用方法。

開始前的準備工作

在開始本節教程前,請先確保您已經掌握了下面的內容:

  • 安裝、配置qteasy —— QTEASY教程1
  • 設置了一個本地數據源,并已經將足夠的歷史數據下載到本地——QTEASY教程2
  • 學會創建交易員對象,使用內置交易策略,——QTEASY教程3
  • 學會使用混合器,將多個簡單策略混合成較為復雜的交易策略——QTEASY教程4
  • 了解自定策略的基礎——QTEASY教程5 ,QTEASY教程6

在QTEASY文檔中,還能找到更多關于使用內置交易策略、創建自定義策略等等相關內容。對qteasy的基本使用方法還不熟悉的同學,可以移步那里查看更多詳細說明。

qteasy的內核被設計為一個兼顧高速執行以及足夠的靈活性的框架,理論上您可以實現您所設想的任何類型的交易策略。

同時,qteasy的回測框架也做了相當多的特殊設計,可以完全避免您無意中在交易策略中導入"未來函數",確保您的交易策略在回測時完全基于過去的數據,同時也使用了很多預處理技術以及JIT技術對內核關鍵函數進行了編譯,以實現不亞于C語言的運行速度。

不過,為了實現理論上無限可能的交易策略,僅僅使用內置交易策略以及策略混合就不一定夠用了,一些特定的交易策略,或者一些特別復雜的交易策略是無法通過內置策略混合而成的,這就需要我們使用qteasy提供的Strategy基類,基于一定的規則創建一個自定義交易策略了。

本節的目標

在本節中,我們將介紹qteasy的交易策略基類,通過一個具體的例子詳細講解如何基于這幾個基類,創建一個只屬于您自己的交易策略。為了說明

繼承Strategy類,創建一個復雜的多因子選股策略

在這個例子中,我們使用

import qteasy as qt
import numpy as npdef market_value_weighted(stock_return, mv, mv_cat, bp_cat, mv_target, bp_target):""" 根據mv_target和bp_target計算市值加權收益率,在策略中調用此函數計算加權收益率"""sel = (mv_cat == mv_target) & (bp_cat == bp_target)mv_total = np.nansum(mv[sel])mv_weight = mv / mv_totalreturn_total = np.nansum(stock_return[sel] * mv_weight[sel])return return_totalclass MultiFactors(qt.FactorSorter):""" 開始定義交易策略"""def __init__(self, pars: tuple = (0.5, 0.3, 0.7)):"""交易策略的初始化參數"""super().__init__(pars=pars,  par_count=3,  # 策略的可調參數有三個par_types=['float', 'float', 'float'],  # 參數1:大小市值分類界限,參數2:小/中bp分界線,參數3,中/大bp分界線par_range=[(0.01, 0.99), (0.01, 0.49), (0.50, 0.99)],name='MultiFactor',description='根據Fama-French三因子回歸模型估算HS300成分股的alpha值選股',strategy_run_timing='close',  # 在周期結束(收盤)時運行strategy_run_freq='m',  # 每月執行一次選股(每周或每天都可以)strategy_data_types='pb, total_mv, close',  # 執行選股需要用到的股票數據data_freq='d',  # 數據頻率(包括股票數據和參考數據)window_length=20,  # 回測時的視窗長度為20天use_latest_data_cycle=True,  # 設置使用最新的數據reference_data_types='close-000300.SH',  # 選股需要用到市場收益率,使用滬深300指數的收盤價計算,因此設置HS300指數的收盤價作為參考數據傳入max_sel_count=10,  # 最多選出10支股票sort_ascending=True,  # 選擇因子最小的股票condition='less',  # 僅選擇因子小于某個值的股票lbound=0,  # 僅選擇因子小于0的股票ubound=0,  # 僅選擇因子小于0的股票 )def realize(self, h, **kwargs):""" 策略的選股邏輯在realize()函數中定義"""size_gate_percentile, bp_small_percentile, bp_large_percentile = self.pars# 讀取投資組合的數據PB和total_MV的最新值pb = h[:, -1, 0]  # 當前所有股票的PB值mv = h[:, -1, 1]  # 當前所有股票的市值pre_close = h[:, -2, 2]  # 當前所有股票的前收盤價close = h[:, -1, 2]  # 當前所有股票的最新收盤價# 讀取參考數據(r)market_pre_close = r[-2, 0]  # HS300的昨收價market_close = r[-1, 0]  # HS300的收盤價# 計算賬面市值比,為pb的倒數bp = pb ** -1# 計算市值的50%的分位點,用于后面的分類size_gate = np.nanquantile(mv, size_gate_percentile)# 計算賬面市值比的30%和70%分位點,用于后面的分類bm_30_gate = np.nanquantile(bp, bp_small_percentile)bm_70_gate = np.nanquantile(bp, bp_large_percentile)# 計算每只股票的當日收益率stock_return = pre_close / close - 1# 根據每只股票的賬面市值比和市值,給它們分配bp分類和mv分類# 市值小于size_gate的cat為1,否則為2mv_cat = np.ones_like(mv)mv_cat += (mv > size_gate).astype('float')# bp小于30%的cat為1,30%~70%之間為2,大于70%為3bp_cat = np.ones_like(bp)bp_cat += (bp > bm_30_gate).astype('float')bp_cat += (bp > bm_70_gate).astype('float')# 獲取小市值組合的市值加權組合收益率smb_s = (market_value_weighted(stock_return, mv, mv_cat, bp_cat, 1, 1) +market_value_weighted(stock_return, mv, mv_cat, bp_cat, 1, 2) +market_value_weighted(stock_return, mv, mv_cat, bp_cat, 1, 3)) / 3# 獲取大市值組合的市值加權組合收益率smb_b = (market_value_weighted(stock_return, mv, mv_cat, bp_cat, 2, 1) +market_value_weighted(stock_return, mv, mv_cat, bp_cat, 2, 2) +market_value_weighted(stock_return, mv, mv_cat, bp_cat, 2, 3)) / 3smb = smb_s - smb_b# 獲取大賬面市值比組合的市值加權組合收益率hml_b = (market_value_weighted(stock_return, mv, mv_cat, bp_cat, 1, 3) +market_value_weighted(stock_return, mv, mv_cat, bp_cat, 2, 3)) / 2# 獲取小賬面市值比組合的市值加權組合收益率hml_s = (market_value_weighted(stock_return, mv, mv_cat, bp_cat, 1, 1) +market_value_weighted(stock_return, mv, mv_cat, bp_cat, 2, 1)) / 2hml = hml_b - hml_s# 計算市場收益率market_return = market_pre_close / market_close - 1coff_pool = []# 對每只股票進行回歸獲取其alpha值for rtn in stock_return:x = np.array([[market_return, smb, hml, 1.0]])y = np.array([[rtn]])# OLS估計系數coff = np.linalg.lstsq(x, y)[0][3][0]coff_pool.append(coff)# 以alpha值為股票組合的選股因子執行選股factors = np.array(coff_pool)return factors

策略和回測參數配置,并開始回測

定義好上面的策略之后,就可以開始進行回測了,我們需要在qteasy中創建一個交易員對象,操作前面創建的策略:

shares = qt.filter_stock_codes(index='000300.SH', date='20190501')  # 選擇股票池,包括2019年5月以來所有滬深300指數成分股
# 設置回測的運行參數
qt.config(mode=1,  # mode=1表示回測模式invest_start='20160405',  # 回測開始日期invest_end='20210201',  # 回測結束日期asset_type='E',  # 投資品種為股票asset_pool=shares,  # shares包含同期滬深300指數的成份股trade_batch_size=100,  # 買入批量為100股sell_batch_size=1,  # 賣出批量為整數股trade_log=True,  # 生成交易記錄)#  開始策略的回測alpha = MultiFactors()  # 生成一個交易策略的實例,名為alpha
op = qt.Operator(alpha, signal_type='PT')  # 生成交易員對象,操作alpha策略,交易信號的類型為‘PT',意思是生成的信號代表持倉比例,例如1代表100%持有股票,0.35表示持有股票占資產的35%
op.op_type = 'stepwise'  # 運行模式為步進模式
op.set_blender('1.0*s0', "close")  # 交易策略混合方式,只有一個策略,不需要混合
op.run()  # 開始運行

在這里插入圖片描述

本節回顧

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11051.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql 多表查詢,內外連接

內連接: 隱式內連接 使用sql語句直接進行多表查詢 select 字段列表 from 表1 , 表2 where 條件 … ; 顯式內連接 將‘,’改為 inner join 連接兩個表的 on select 字段列表 from 表1 [ inner ] join 表2 on 連接條件 … ; select emp.id, emp.name, …

應急響應篇——加固

Linux 安全配置 1.下載安裝安全軟件 2.取消Telnet登錄采用SSH方式并更改ssh服務端遠程登錄的配置 1)Telnet登錄協議是明文不加密不安全,所以采用更安全的SSH協議。 2)更改ssh服務端遠程登錄相關配置。 3.用戶管理相關 1)刪除不必要的用戶和用戶組。 2)用戶密碼管理…

Selenium 自動化 —— 一篇文章徹底搞懂XPath

更多關于Selenium的知識請訪問“蘭亭序咖啡”的專欄:專欄《Selenium 從入門到精通》 文章目錄 前言 一、什么是xpath? 二、XPath 節點 三. 節點的關系 1. 父(Parent) 2. 子(Children) 3. 同胞(S…

力扣:48. 旋轉圖像(Java)

目錄 題目描述:輸入:輸出:代碼實現: 題目描述: 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要 使…

LangChain:模型 I/O 封裝使用解析和感觸

目錄 模型 API:LLM vs. ChatModel OpenAI 模型封裝 多輪對話 Session 封裝 換個國產模型 模型的輸入與輸出 Prompt 模板封裝 PromptTemplate ChatPromptTemplate MessagesPlaceholder 從文件加載 Prompt 模板 TXT模板 Yaml模板 Json模板 輸出封裝 Out…

mediasoup源碼(一)編譯及部署

基本介紹 mediasoup是一個sfu架構的流媒體服務器,讀者可以根據需要選擇不同的編譯方式。如果只需要學習c流媒體傳輸部分,則選擇mediasoup,如果需要學習mediasoup整個demo,并做演示,則可以選擇mediasoup-demo&#xff…

is和==的關系

Python中is和的關系 is判斷兩個變量是不是指的是同一個內存地址,也就是通過id()函數判斷 判斷兩個變量的值是不是相同 a [1, 2, 3, 4] b [1, 2, 3, 4] print(id(a)) # 2298268712768 print(id(b)) # 2298269716992 print(a is b) # False print(a b) # Tr…

目標檢測標注工具Labelimg安裝與使用

目錄 一、安裝Labelimg與打開 二、使用 1、基本功能介紹 2、快捷鍵 3、狀態欄的工具 三、附錄 1、YOLO模式創建標簽的樣式 2、create ML模式創建標簽的樣式 3、PascalVOC模式創建標簽的樣式 一、安裝Labelimg與打開 labelimg是一款開源的數據標注工具,可以…

51基于單片機的溫室大棚系統設計

設計摘要: 本設計旨在基于51單片機和藍牙技術,實現一個功能完善的溫室大棚系統。該系統具備以下主要功能:首先,通過連接的顯示屏能夠實時地顯示當前的溫度和濕度信息,方便用戶了解溫室內的環境變化。其次,…

ctfshow web271--web273

web271 laravel5.7反序列化漏洞 define(LARAVEL_START, microtime(true));/* |-------------------------------------------------------------------------- | Register The Auto Loader |-------------------------------------------------------------------------- | |…

mysql IF語句,模糊檢索

使用MySQL IF語句完成條件檢索 IF(expr1,expr2,expr3),expr1如果滿足條件就用expr2,否則用expr3 SELECTa.*,count(*) AS stdSum FROMidb_std_power_engin_v1 a WHERE1 1 AND (IF( KV IS NOT NULL, a.NAME REGEXP KV, 1 1 ) ORIF( KV IS NOT NULL, …

凸優化理論學習二|凸函數及其相關概念

系列文章目錄 凸優化理論學習一|最優化及凸集的基本概念 文章目錄 系列文章目錄一、凸函數(一)凸集(二)凸函數的定義及舉例(三)凸函數的證明1、將凸函數限制在一條直線上2、判斷函數是否為凸函數的一階條件…

如何做筆記

鏈接: 程序員讀技術類書籍如何做筆記? - 知乎 我是如何寫好一篇技術博客的 - 簡書 技術博客,該寫些什么? - 知乎 前言 最近翻翻以前的博客和筆記,都覺得寫的不好。工作這么多年,其實一直都有想做成知識系列…

貝葉斯分類器詳解

1 概率論知識 1.1 先驗概率 先驗概率是基于背景常識或者歷史數據的統計得出的預判概率,一般只包含一個變量,例如P(A),P(B)。 1.2 聯合概率 聯合概率指的是事件同時發生的概率,例如現在A,B兩個事件同時發生的概率,記…

Python: 獲取時間

from datetime import datetime, timedelta# 獲取當前時間 current_time datetime.now() print(f"current_time {current_time}")# 獲取時分秒部分 time current_time.time() print(f"time {time}")# 獲取當前時間,只要日期部分 current_date current…

華為交換機配置導出備份python腳本

一、腳本編寫思路 (一)針對設備型號 主要針對華為(Huawei)和華三(H3C)交換機設備的配置備份 (二)導出前預處理 1.在配置導出前,自動打開crt軟件或者MobaXterm軟件&am…

掌握MySQL執行計劃分析【Explain】

前言 MySQL是一個強大的關系型數據庫管理系統,其高效執行SQL查詢的能力是其核心價值之一。然而,當查詢變得復雜或者數據量急劇增長時,SQL查詢的性能問題往往成為我們不得不面對的挑戰。為了深入了解查詢的執行過程并找到性能瓶頸&#xff0c…

Modbus通訊協議初學

目錄 Modbus通訊協議初學什么是Modbus?Modbus用來做什么?4個種類的寄存器協議速記功能碼Modbus 報文幀示例解讀 Modbus通訊協議初學 什么是Modbus? 顧名思義,它是一個bus,即總線協議。比如串口協議、IIC協議、SPI都是通訊協議。你接觸到這種協議,相信你所處的行業是工業方…

如何自定義Linux命令

說明:本文介紹如何將自己常用的命令設置為自定義的命令,以下操作在阿里云服務器CentOS上進行。 修改配置文件 修改配置文件前,先敲下面的命令查看當前系統配置的shell版本 echo $SHELL或者 echo $0區別在于,$SHELL查看的是系統…

落雪音樂 超好用的桌面端音樂播放器

之前一直都是充某Q音樂的會員,突然不想氪金了,終于找到一個開源的音樂播放器,在此先給落雪無痕大佬跪了 太愛了 簡直白嫖怪的福音 話不多說,直接上操作:解壓密碼:www.1234f.com下載地址:極速云…