Python实现网格交易策略的过程

2025-07-31 20:50

本文主要是介绍Python实现网格交易策略的过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一...

网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买入或卖出操作,以低买高卖赚取区间波动收益。

最近开始接触python量化交易,记录一个简单的策略实现和回测的完整框架,不包含实盘。

量化框架是ccxt和backtrader。backtrader用来做策略和回测,ccxt用来调用交易所的API用来获取数据或日后的实盘。ccxt主要是用来调加密货币交易所的,因为现在加密货币对量化比较友好,首先它获取数据就比传统的股票方便,直接调交易所的API就行,甚至不需要注册账号,我之前看过很多股票的量化教程,获取数据还是比较有门槛的。其次他是7x24小时全年无休的,交易也比较方便。

好的接下来进入正题,看看我们的第一个量化策略是怎么实现的吧。

我们使用的网格交易策略,是一种基于市场波动的自动化交易策略,核心逻辑是通过在特定价格区间内设置一系列 “网格节点”,当价格波动触及节点时自动执行买入或卖出操作,利用价格的上下震荡实现 “低买高卖” 的循环获利。其本质是将市场波动转化为盈利机会,尤其适合震荡行情。风险就是在持续向下的行情可能在高网格持续买入,越跌越买导致资金耗尽 。

下面是策略的实现,继承bt.Strategy,策略的执行放在next函数中。

import backtrader as bt
import math
# 1. 网格策略核心类
class GridStrategy(bt.Strategy):
    params = (
        ('number', 10),  # 网格总数
        ('open_percent', 0.5),  # 初始建仓比例(50%)
        ('distance', 0.01),  # 网格间距(1%)
        ('base_price', 5.0)  # 基准价格
    )
    def __init__(self):
        self.open_flag = False  # 初始建仓标记
        self.last_index = 0  # 上次网格位置
        self.per_size = 0  # 每格交易量
        self.max_index = 0  # 网格上边界
        self.min_index = 0  # 网格下边界
    def next(self):
        # 初始建仓逻辑(价格接近基准价时触发)
        if not self.open_flag and math.fabs(self.data.close[0] - self.p.base_price) / self.p.base_price < 0.01:
            # 计算初始仓位(50%资金)
            buy_size = self.broker.getvalue() * self.p.open_percent / self.data.close[0]
            self.buy(size=buy_size)
            # 初始化网格参数
            self.last_index = 0
            self.per_size = self.broker.getvalue() / self.data.close[0] / self.p.number
            self.max_index = int(self.p.number * self.p.open_percent)
            self.min_index = -int(self.p.number * (1 - self.p.open_percent))
            self.open_flag = True
        # 网格调仓逻辑
        if self.open_flag:
            # 计算当前网格位置(按间距归一化)
            current_index = int((self.data.close[0] - self.p.base_price) / self.p.distance)
            # 边界保护(防止破网)
            current_ijsndex = max(min(current_index, self.max_index), self.min_index)
            # 网格变化时交易
            change = current_index - self.last_index
            if change > 0:  # 价格上涨→卖出
                self.sell(size=abs(change) * self.per_size)
            elif change < 0:  # 价格下跌→买入
                self.buy(size=abs(change) * self.per_size)
            self.last_index = current_index  # 更新网格位置
    # 2. 订单状态跟踪(调试用)
    def notify_order(self, order):
        if order.status in [order.Completed]:
            action = '买入' if order.isbuy() else '卖出'
            print(f'{action}成交: 价格={order.executed.price:.2f}, 数量={order.executed.size}')

然后在另一个脚本中使用这个策略:

import backtrader as bt
from GridStrategy import GridStrategy
from backtrader.feeds import PandasData
import ccxt
import pandas as pd
python# 连接交易所(以币安为例)
exchange = ccxt.binance({
    'enableRateLimit': True,  # 启用频率限制[6](@ref)
    'options': {'defaultType': 'spot'}  # 现货数据
})
# 获取ETH/USDT历史K线(1小时周期)
def fetch_eth_data(days=30, timeframe='1h'):
    since = exchange.parse8601((pd.Timestamp.utcnow() - pd.Timedelta(days=days)).javascriptisoformat())
    ohlcv = exchange.fetch_ohlcv('ETH/USDT', timeframe, since=since)
    df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['timestamp'] = pd.to_datetime(dpythonf['timestamp'], unit='ms')
    df.set_index('timestamp', inplace=True)
    return df
eth_data = fetch_eth_data(days=90, timeframe='1h')  # 获取90天1小时数据
print(eth_data)
class CCXTData(PandasData):
    lines = ('volume',)  # 声明额外数据列
    params = (
        ('datetime', None),  # 使用索引作为时间列
        ('open', 'open'),
        ('high', 'high'),
        ('low', 'low'),
        ('close', 'close'),
        ('volume', 'volume'),
    )
# 数据实例化
data_feed = CCXTData(dataname=eth_data)
# 初始化引擎
cerebro = bt.Cerebro()
cerebro.addstrategy(
    GridStrategy,
    base_price=1803.70,  # 设置标的基准价
    phpdistance=10,  # 网格间距5%(按价格波动调整)
    number=100  # 增加网格密度
)
cerebro.adddata(data_feed)
cerebro.broker.setcash(10000.0)  # 初始资金
cerebro.broker.setcommission(commission=0.001)  # 手续费0.1%[3](@ref)
# 运行回测
print('初始资金:', cerebro.broker.getvalue())
cerebro.run()
print('最终资金:', cerebro.broker.getvalue())
# 可视化结果
cerebro.plot(style='candlestick')

执行上面的脚本,可以看到回测结果,我们投入10000块,经过差不多一个月的时间最终受益有870块之多,实在是太赚了XD。

Python实现网格交易策略的过程

backtrader比较厉害的是它能把所有的操作都标记出来:

Python实现网格交易策略的过程

到此这篇关于Python实现网格交易策略的文章就介绍到这了,更多相关python网格交易策略内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Python实现网格交易策略的过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参