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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法