网格交易策略:从原理、应用到实战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
判断一家网建公司的好坏,第一是看公司背景,包括成立时间,工商注册信息等,第二可以去看看建站公司做的案例,例如,网站开发、设计、引流等等的以往案例,了解清楚具体的业务流程。 一、公司背景 …...
TDesign组件库+vue3+ts 如何视觉上合并相同内容的table列?(自定义合并table列)
背景 当table的某一列的某些内容相同时,需要在视觉上合并这一部分的内容为同个单元格 如上图所示,比如需要合并当申请人为同个字段的列。 解决代码 <t-table:data"filteredData":columns"columns":rowspan-and-colspan"…...
BACnet协议-(基于ISO 8802-3 UDP)(2)
1、模拟设备的工具界面如下: 2、使用yet another bacnet explorer 用作服务,用于发现设备,界面如下: 3、通过wireshark 抓包如下: (1)、整体包如下: (2)、m…...
android 根据公历日期准确节气计算年月日时天干地支 四柱八字
1 年柱 判断当前日期是否超过本年的立春 未超过年份-1 已超过按当前年份计算 2月柱 当前日期是否超过当月的第一个节气 未超过-1 超过当前月份计算 节气对日柱时柱没影响。 获取某年某月第一个节气的准确日期 private int sTerm(int y, int n) {int[] sTermInfo…...
VMware虚拟机连接公网,和WindTerm
一、项目名称 vmware虚拟机连接公网和windterm 二、项目背景 需求1:windows物理机,安装了vmware虚拟机,需要访问公网资源,比如云服务商的yum仓库,国内镜像加速站的容器镜像,http/https资源。 需求2…...
游戏盾SDK真的能无视攻击吗
游戏盾SDK真的能无视攻击吗?在当今的互联网环境中,游戏行业蓬勃发展,但同时也面临着日益严峻的安全挑战。DDoS攻击、CC攻击、外挂作弊等恶意行为频发,不仅威胁着游戏的稳定性和公平性,也严重影响了玩家的游戏体验。为了…...
【QT】亲测有效:“生成的目标文件包含了过多的段,超出了编译器或链接器允许的最大数量”错误的解决方案
在使用dlib开发人脸对齐功能时,出现了”生成的目标文件包含了过多的段,超出了编译器或链接器允许的最大数量的错误“。 主要功能代码如下: #include <QApplication> #include <QImage> #include <QDebug>#include <dlib…...
什么是 Apache Ingress
Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量,并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群,确保它们的高可用性和可扩展性,同时还提供自动化…...
SpringBoot助力墙绘艺术市场创新
3 系统分析 当用户确定开发一款程序时,是需要遵循下面的顺序进行工作,概括为:系统分析–>系统设计–>系统开发–>系统测试,无论这个过程是否有变更或者迭代,都是按照这样的顺序开展工作的。系统分析就是分析系…...
Antlr的使用
概念 ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成工具,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR通过定义文法(grammar)来识别、构建和访问语言中的元素。 ANTLR为包括Jav…...
HealChat心理大语言模型 丨OPENAIGC开发者大赛高校组AI创作力奖
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...
php网站开发示例/市场推广和销售的区别
非阻塞Connect对于select时应注意问题 http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html 对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建soc…...
wordpress广告从哪获取/网络营销方式与工具有哪些
https://blog.csdn.net/hanchao5272/article/details/79435730 git log 退出方法: 英文状态下按Q...
java 框架用来做网站/最新军事头条
项目中原始数据都是DWG格式,里面只有两个层,一个0层,一个TX层,0层存储了图廓信息,所有其他要素信息全部存在TX层中,包括房屋,植被,道路,水系,独立地物等等。没…...
使用flash做网站/世界比分榜
7转载于:https://www.cnblogs.com/wuguangzong/p/10925016.html...
龙岩做网站开发价格/挖掘关键词工具
最近在学习在windows平台用flask框架提供Restful API服务,需要使得flask的windows应用能够开机自动运行,并且后台运行,所以通过service来实现。 首先尝试的是在自己派生的serivice类的中直接调用 create_app(debugTrue).run(host0.0.0.0, po…...
欧莱雅的网络营销策划方案/合肥seo代理商
7:30:起床。英国威斯敏斯特大学的研究人员发现,那些在早上5:22―7:21 分起床的人,其血液中有一种能引起心脏病的物质含量较高,因此,在7:21之后起床对身体健康更加有益。 打开台灯。“一醒来,就将灯打开&…...