【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.mzph.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, …

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…

目标检测标注工具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 |-------------------------------------------------------------------------- | |…

凸优化理论学习二|凸函数及其相关概念

系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 文章目录 系列文章目录一、凸函数(一)凸集(二)凸函数的定义及举例(三)凸函数的证明1、将凸函数限制在一条直线上2、判断函数是否为凸函数的一阶条件…

贝叶斯分类器详解

1 概率论知识 1.1 先验概率 先验概率是基于背景常识或者历史数据的统计得出的预判概率,一般只包含一个变量,例如P(A),P(B)。 1.2 联合概率 联合概率指的是事件同时发生的概率,例如现在A,B两个事件同时发生的概率,记…

华为交换机配置导出备份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下载地址:极速云…

图片批量管理迈入智能新时代:一键输入关键词,自动生成并保存惊艳图片,轻松开启创意之旅!

在数字化时代,图片已成为我们表达创意、记录生活、传递信息的重要工具。然而,随着图片数量的不断增加,如何高效、便捷地管理这些图片,却成为了一个令人头疼的问题。 第一步,进入首助编辑高手主页面,在上方…

视频封面一键提取:从指定时长中轻松获取您想要的帧图片

在数字媒体时代,视频已成为人们获取信息、娱乐和沟通的主要形式之一。而一个好的视频封面,往往能够吸引观众的眼球,增加视频的点击率和观看量。然而,对于很多视频创作者和编辑者来说,如何从视频中快速、准确地提取出合…

Git知识点总结

目录 1、版本控制 1.1什么是版本控制 1.2常见的版本控制工具 1.3版本控制分类 2、集中版本控制 SVN 3、分布式版本控制 Git 2、Git与SVN的主要区别 3、软件下载 安装:无脑下一步即可!安装完毕就可以使用了! 4、启动Git 4.1常用的Li…

Shell编程之循环语句之for

一.for循环语句 读取不同的变量值,用来逐个执行同一组命令 for 变量名 in 取值列表 do命令序列 done 示例: 1.计算从1到100所有整数的和 2.提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和…

【牛客】SQL206 获取每个部门中当前员工薪水最高的相关信息

1、描述 有一个员工表dept_emp简况如下: 有一个薪水表salaries简况如下: 获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列,以上例子输出如下: 2、题目…

SBM模型、超效率SBM模型代码及案例数据(补充操作视频)

01、数据简介 SBM(Slack-Based Measure)模型是一种数据包络分析(Data Envelopment Analysis, DEA)的方法,用于评估决策单元(Decision Making Units, DMUs)的效率。而超效率SBM模型是对SBM模型的…