【python量化交易】—— 经典网格交易 - Qteasy自定义交易策略【附源码】

使用qteasy自定义并回测经典网格交易策略

我们今天使用qteasy来回测一个双均线择时交易策略,qteasy是一个功能全面且易用的量化交易策略框架,Github地址在这里。使用它,能轻松地获取历史数据,创建交易策略并完成回测和优化,还能实盘运行。项目文档在这里。

为了继续本章的内容,您需要安装qteasy【教程1】,并下载历史数据到本地【教程2、),详情可以参考更多教程【教程3】

建议您先按照前面教程的内容了解qteasy的使用方法,然后再参考这里的例子创建自己的交易策略。

策略思想

本策略是一个经典的网格交易策略
策略的运行标的是000651.SZ格力电器,策略第一次运行时,买入1000股并持有,同时设定当前买入价格(四舍五入到0.1元)为基准网格,
并根据网格尺寸计算出卖出网格和买入网格, 接下来每隔5分钟运行一次,当股票价格触及买入网格或卖出网格时,产生交易信号,并刷新网格:

例如:

  • 假设当前基准网格为30元,网格尺寸为0.5元,卖出网格为30.5元,买入网格为29.5元
  • 当价格触及卖出网格30.5元时,产生卖出信号,卖出200股并更新基准网格为30.5元,同时计算出新的卖出网格31元和买入网格30元

交易回测的标的是:000651.SZ格力电器,

交易回测区间是:2023年1月1日至2023年3月1日

注,由于策略网格参数在每次交易以后都会被刷新,因此该策略只能以stepwise方式进行回测,为了方便生成交易信号,该策略使用了VS信号类型

策略实现

import qteasy as qt
import pandas as pd
import numpy as np

class GridTrade(qt.RuleIterator):
    
    def realize(self, h, r=None, t=None, pars=None):
        
        # 读取当前保存的策略参数,首次运行时base_grid参数为0,此时买入1000股并设置当前价格为基准网格
        grid_size, trade_batch, base_grid = self.pars

        # 读取最新价格
        price = h[-1, 0]  # 最近一个K线周期的close价格
        
        # 计算当前价格与当前网格的偏离程度,判断是否产生交易信号
        if base_grid <= 0.01:
            # 基准网格尚未设置,此时为首次运行,首次买入1000股并设置基准网格为当前价格(精确到0.1元)
            result = 1510
            base_grid = np.round(price / 0.1) * 0.1
        elif price - base_grid > grid_size:
            # 触及卖出网格线,产生卖出信号
            result = - trade_batch  # 交易信号等于交易数量,必须使用VS信号类型
            # 重新计算基准网格
            base_grid += grid_size 
        elif base_grid - price > grid_size:
            # 触及买入网格线,产生买入信号
            result = trade_batch + 10
            # 重新计算基准网格
            base_grid -= grid_size
        else:
            result = 0
        
        # 使用新的基准网格更新交易参数
        self.pars = grid_size, trade_batch, base_grid
        
        return result
            

策略回测

我们使用下面的参数来回测交易策略:

  • 网格宽度为0.5元
  • 买入/卖出批量为200股
  • 交易标的为000651-格力电器
  • 回测开始日期为23年1月1日,结束日期为23年3月1日
alpha = GridTrade(pars=(0.5, 200, 0.0),  # 当基准网格为0时,代表首次运行,此时买入1000股,并设置当前价为基准网格
                   par_count=3,
                   par_types=['float', 'int', 'float'],
                   par_range=[(0.2, 2), (100, 300), (0, 40)],
                   name='GridTrade',
                   description='网格交易策略,当前股票价格波动幅度超过网格尺寸时,产生卖出或买入交易信号,并更新网格',
                   strategy_run_timing='close',
                   strategy_run_freq='5min',
                   data_freq='5min',
                   window_length=20,
                  ) 

op = qt.Operator(alpha, signal_type='VS')  # 交易信号等于交易数量,必须使用VS信号类型
op.op_type = 'stepwise'  # 需要动态更新策略参数,必须使用'stepwise'交易类型
op.set_parameter(0, (0.5, 200, 0.0))
op.run(mode=1,
       asset_type='E',
       asset_pool='000651.SZ',
       benchmark_asset='000651.SZ',
       benchmark_asset_type='E',
       benchmark_dtype='close',
       trade_batch_size=100,
       sell_batch_size=1,
       trade_log=True,
       invest_start='20230101',
       invest_end='20230301',
       backtest_price_adj='none',
      )
print()

回测的结果如下:

     ====================================
     |                                  |
     |       BACK TESTING RESULT        |
     |                                  |
     ====================================

qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 0.0 ms
time consumption for operation back looping:  839.9 ms

investment starts on      2023-01-03 09:30:00
ends on                   2023-02-28 15:00:00
Total looped periods:     0.2 years.

-------------operation summary:------------
Only non-empty shares are displayed, call 
"loop_result["oper_count"]" for complete operation summary

          Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000651.SZ    13       8      21   93.0%      0.0%      7.0%   

Total operation fee:     ¥       63.36
total investment amount: ¥  100,000.00
final value:              ¥  104,070.64
Total return:                      inf% 
Avg Yearly return:                 inf%
Skewness:                          3.79
Kurtosis:                         52.19
Benchmark return:                 9.23% 
Benchmark Yearly return:         77.74%

------strategy loop_results indicators------ 
alpha:                              inf
Beta:                               inf
Sharp ratio:                       -inf
Info ratio:                       0.005
250 day volatility:               0.003
Max drawdown:                     0.80% 
    peak / valley:        2023-01-30 / 2023-02-06
    recovered on:         2023-02-20

===========END OF REPORT=============

回测结果可视化图表如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值