网格交易策略:从原理、应用到实战Python回测

01
引言
随着金融市场的快速发展,量化交易成为投资者追求收益的一种重要手段。在众多的量化交易策略中,网格交易策略(Grid Trading Strategy)因其简单易用、风险控制灵活等优点而备受青睐。网格交易策略的核心思想是“低买高卖”,通过分段买卖来赚取市场波动中的差价。在不同的市场环境下,网格交易都展现出了独特的魅力。然而,尽管网格策略在震荡市场中表现优异,但在趋势行情或极端市场波动中也存在一定的局限性。
本文将详细介绍网格交易策略的基本原理和核心逻辑,分析其优缺点,结合实战案例展示其应用场景,并通过Python代码演示如何基于股票指数在Backtrader平台上进行回测,以帮助读者更好地理解和运用这一策略。

02
基本原理
网格交易策略是一种基于价格波动的量化交易策略。其基本原理是将市场价格按照一定的间隔划分为多个价格层,并在这些价格层之间进行买卖操作。在价格较低的层次买入,在价格较高的层次卖出,从而在震荡市场中通过波动获利。
网格交易策略首先是设定价格区间的上限和下限,并根据该区间划分出多个等距的价格层(网格)。例如,如果价格区间为10元到12元,可以将其划分为0.2元为单位的多个网格(10, 10.2, 10.4,…, 12)。当价格跌破某个网格时买入,当价格上涨超过网格时卖出。例如,价格从10.4下跌到10.2时买入,从10.2上涨到10.4时卖出。该过程重复进行,持续捕捉每个网格内的波动收益。网格交易策略的核心在于不预测市场的具体趋势,而是基于市场的波动性进行操作。只要价格在设定的网格范围内上下波动,策略便能够盈利。
网格交易策略适用于波动性较强的市场,尤其是震荡市或无明显趋势的市场。在这些市场环境下,网格策略能够通过频繁交易赚取差价。而在单边上涨或下跌的市场中,网格策略的表现则相对较差,因为此时价格可能会持续向单一方向偏移,导致买入订单积累而无法卖出获利。
网格交易策略的优点在于无需预测市场方向,只依赖于价格的波动性,且很容易地被程序化,交易者只需设定好网格区间和规则,便可自动进行买卖操作,有助于减少情绪波动带来的主观决策失误。
缺点则表现在:
(1)适应性差。网格交易策略的最大风险在于市场趋势性强烈时效果不佳,尤其在单边上涨或下跌的行情中,可能会造成买单无法及时卖出,或者卖单没有买回的机会。
(2)资金占用高。为了在不同的价格区间内进行操作,网格策略通常要求较高的资金量。尤其是在价格大幅下跌时,可能需要更多的资金进行补仓操作。
(3)交易频繁,手续费高。由于网格策略依赖频繁的买卖操作,手续费和滑点可能会对收益产生较大影响,特别是在交易成本较高的市场环境下。

03
策略回测
在网格交易策略中,寻找合适的网格间距、最低价、最高价等参数,是提高策略效果的关键。手动设置这些参数可能不适合所有市场环境,因此自动化调整这些参数有助于提升策略的灵活性和适应性。自动化寻找这些参数的方法可以通过历史数据的统计分析、技术指标、机器学习优化等手段实现。以下是一些常见的自动化方法和步骤。
自动寻找网格参数的基本思路
要自动化确定网格间距、最低价和最高价,通常需要考虑以下几个关键步骤:
(1)确定价格波动区间:
使用历史价格数据的最大值和最小值作为初步参考,从而确定网格的最低价和最高价。
(2)确定网格间距:
使用市场波动率、历史价格数据的均值和标准差,或根据技术指标如ATR(平均真实波幅)来计算合适的网格间距。
(3)网格优化:
可以使用回测优化技术(如网格搜索或遗传算法)来自动调整这些参数,最大化策略的收益率或某个其他性能指标(如夏普比率)。
import qstock as qs
import pandas as pd
import backtrader as bt # 创建自定义网格交易策略
classGridStrategy(bt.Strategy):params =(('grid_size',0.03), # 网格间距('grid_min',2.23), # 网格最低价('grid_max',3.89), # 网格最高价('order_pct',0.1), # 每次买入卖出的仓位比例)def __init__(self):self.buy_orders =[]self.sell_orders =[]self.grid_levels =[]# 生成网格层次self.grid_levels =[self.p.grid_min + i * self.p.grid_size for i in range(int((self.p.grid_max - self.p.grid_min)/ self.p.grid_size)+1)]def next(self):current_price = self.data.close[0]# 买入条件:当前价格低于某个网格层次且未持有该层次买单for level in self.grid_levels:if current_price <= level andnot any([order for order in self.buy_orders if order.price == level]):size = self.broker.getcash()* self.p.order_pct / current_priceorder = self.buy(price=level, size=size)self.buy_orders.append(order)# 卖出条件:当前价格高于某个网格层次且未持有该层次卖单for level in self.grid_levels:if current_price >= level andnot any([order for order in self.sell_orders if order.price == level]):size = self.broker.getvalue()* self.p.order_pct / current_priceorder = self.sell(price=level, size=size)self.sell_orders.append(order) qs.bt_result(code='上证50ETF',start='20200101',end='20240927',strategy=GridStrategy,startcash=1000000.0,commission=0.0001,
) 

回测期间买入持有该指数ETF的收益如下,该回测样本期间,网格交易策略要远远优于买入持有策略:
df0=qs.data_feed('上证50ETF',index='sz50',start='20200101',end='20240927')
qs.start_backtest(df0) 

上述网格交易策略的网格间距、最低价、最高价等参数均是手动指定的,实际交易中,可能需要自动化寻找这些参数,下面提供两种方法仅供参考,由于篇幅有限,完整代码略(见知识星球)。
方法一:基于历史数据的统计分析
通过分析历史价格数据的统计特征,可以较为直观地确定网格策略的参数。使用历史数据的最大值和最小值,也可以使用一定的历史窗口,比如最近一年的最高和最低价,来动态调整最低价和最高价。将网格参数与时间窗口相结合,根据一定的窗口期(例如过去30天、60天等)的统计特征动态调整网格参数。
classDynamicGridStrategy(bt.Strategy):params =(('lookback',250), # 回看250天确定历史区间('grid_multiple',1.5), # 网格间距倍数,乘以标准差('order_pct',0.1), # 每次买卖的仓位比例)pass qs.bt_result(code='上证50ETF',start='20200101',end='20240929',strategy=DynamicGridStrategy,startcash=1000000.0,commission=0.0001,
) 方法二:基于技术指标(ATR)的网格间距
ATR(平均真实波幅)是衡量市场波动性的技术指标,适合作为动态调整网格间距的工具。在市场波动较大时,ATR值会升高,反之则会降低。因此,ATR可以帮助我们动态调整网格的间距。使用ATR作为网格间距,ATR反映了市场的波动性,可以自适应调整网格间距,使得在波动较大时增大间距,波动较小时减小间距。当ATR值变大时,网格间距随之增大,反之当ATR值减小时,网格间距变小。
classATRGridStrategy(bt.Strategy):params =(('atr_period',20), # ATR的计算周期('grid_multiple',1.5), # 网格间距倍数('lookback',90), # 回看60天确定历史区间('order_pct',0.1), # 每次买卖的仓位比例)pass qs.bt_result(code='上证50ETF',start='20200101',end='20240929',strategy=ATRGridStrategy,startcash=1000000.0,commission=0.0001,
) 
04
结语
网格交易策略以其简洁、适用性广的特点吸引了众多投资者,尤其在震荡行情中有着较为出色的表现。本文介绍了网格交易的基本原理和应用场景,并通过Python代码展示了如何在Backtrader上对股票指数ETF基金进行回测。尽管网格策略有一定的局限性,但通过合理的资金管理和对市场行情的适应性调整,网格策略依然可以为投资者带来稳定的收益。在实际操作中,投资者需结合自己的风险偏好与市场环境,灵活应用网格策略。

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2可获取相关优惠。

相关文章:
网格交易策略:从原理、应用到实战Python回测
01 引言 随着金融市场的快速发展,量化交易成为投资者追求收益的一种重要手段。在众多的量化交易策略中,网格交易策略(Grid Trading Strategy)因其简单易用、风险控制灵活等优点而备受青睐。网格交易策略的核心思想是“低买高卖”&…...
软考论文《论大数据处理架构及其应用》精选试读
论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法,以模型构造、模型转换和精化为核心,提供了一套软件设计的指导规范。在模型驱动架构环境下,通过创建出机器可读和高度抽象的模型实现对不同问题域的描述,这些模型…...
fatfs API使用手册
配置 /*---------------------------------------------------------------------------/ / Configurations of FatFs Module /---------------------------------------------------------------------------*/#define FFCONF_DEF 80286 /* Revision ID *//*---------------…...
9.23作业
仿照string类,自己手动实现 My_string 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_H #include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; …...
Unity3D 房间去重叠化算法详解
前言 在Unity3D游戏开发中,经常需要生成和处理多个房间的场景,特别是在地牢生成、房屋布局或迷宫设计等应用中。为了确保生成的房间不会重叠,我们需要一种有效的去重叠化算法。以下将详细介绍该算法的原理和代码实现。 对惹,这里有…...
mybatis 配置文件完成增删改查(五) :单条件 动态sql查询,相当于switch
文章目录 单条件 动态sql查询写测试方法 疑问总结 单条件 动态sql查询 <select id"selectByConditionBySingle" resultMap"brandResultMap">.select *from tb_brandwhere<choose>/*相当于switch*/<when test"status ! null">…...
全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口
IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点:支持IPv4 提供高精版、…...
Vue3+FastAPI中Token的刷新机制(含代码示例)
在Vue3和FastAPI的应用中,token刷新机制通常涉及以下几个步骤: 登录过程:用户登录时,后端FastAPI验证用户信息,验证通过后生成一个访问令牌(access token)和一个刷新令牌(refresh t…...
【GAN 图像生成】
理论知识学习: PART 1: 生成对抗网络GAN 深度学习模型,用于生成数据 对抗式训练,生成器v判别器 DCGAN>WGAN>StyleGAN技术不断进化 GAN在艺术创作。数据增强领域应用越来越广泛 应用: GAN在图像合成&#x…...
【自然语言处理】词嵌入模型
词嵌入(Word Embedding) 是一种将词汇表示为实数向量的技术,通常是低维度的连续向量。这些向量被设计为捕捉词汇之间的语义相似性,使得语义相似的词在嵌入空间中的距离也更近。词嵌入可以看作是将离散的语言符号(如单词…...
了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 随着自然语言处理(NLP)技术的飞速进步,基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构,如 GPT 系列模型&…...
cmake如何在编译时区分-std=c++17和-std=gnu++17?检查宏
如何在编译时区分-stdc17和-stdgnu17?检查宏?-腾讯云开发者社区-腾讯云 我正在使用__int128扩展的g。-stdc17的问题是,一些C库不具备对该扩展的全部支持(即std::make_unsigned<>失败)。当使用-stdgnu17时,它工作得很好。 我…...
速通数据结构与算法第七站 排序
系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 4 速通…...
灵当CRM index.php接口SQL注入漏洞复现 [附POC]
文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…...
修复: Flux女生脸不再油光满面, 屁股下巴 -- 超实用Comfyui小技巧
ComfyUI上目前最强画图模型公认为Flux. 初次用Flux基础模型画真实的女生时, 和SD比起来, 会觉得画出来细节更多, 更真实. 但是当画多了, 就会觉得画出来的女生总是似曾相识. 仔细观察, 会发现一些共同的特征. 人偏老气, 像30~50的女生. 改了提示词也效果不大. 颧骨凸起, 嘴…...
Actions Speak Louder than Words Meta史诗级的端到端推荐大模型落地
发现好久之前整理的推荐系统被遗忘在了草稿箱,让它出来见见世面。。。后续空了持续更新 文章目录 1.Background2.Related works2.1 典型推荐模型2.1.1 DIN2.1.2 DIEN2.1.3 SIM2.1.4 MMoE2.1.5 其他 2.2. 生成式推荐 3.Method3.1 统一特征空间3.2 重塑召回排序模型3.…...
金智维KRPA之Excel自动化
Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化,Excel自动化是可以从单元格、列、行或范围中读取数据,向其他电子表格或工作簿写入数据等活动。 通过相关命令,还可以对数据进行排序、进行格式…...
哪款宠物空气净化器能有效去除浮毛?希喂、352实测分享
你是否曾经站在家电卖场里,面对琳琅满目的宠物空气净化器产品而感到无所适从?或者在浏览网上商城时,被海量的参数和功能描述搞得头晕眼花?别担心,你不是一个人。在这个科技飞速发展的时代,选择一台既能满足…...
2024.9.28更换启辰R30汽车火花塞
2024.9.28周六汽车跑了11万公里,实在加速肉,起步顿挫,油耗在8个,决定更换火花塞。第一个火花塞要拆掉进气歧管。第二和第三个可以直接换。打开第二个火花塞一看电极都被打成深坑,针电极都被打凸。我有两个旧的火花塞&a…...
2024上海网站建设公司哪家比较好TOP3
判断一家网建公司的好坏,第一是看公司背景,包括成立时间,工商注册信息等,第二可以去看看建站公司做的案例,例如,网站开发、设计、引流等等的以往案例,了解清楚具体的业务流程。 一、公司背景 …...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
