【python量化交易】qteasy使用教程07——创建更加复杂的自定义交易策略

本文主要是介绍【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()  # 开始运行

在这里插入图片描述

本节回顾

这篇关于【python量化交易】qteasy使用教程07——创建更加复杂的自定义交易策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984871

相关文章

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的