用Python自动化网格交易

在本文中,我们将实现一个 Python 脚本来模拟网格交易并使用历史数据回测其有效性。让我们开始吧。

用Python自动化网格交易
一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK

欢迎来到今天的网格交易探索——一种简单且可能有利可图的交易策略,它避开了传统的技术指标。这种方法高度适应算法交易,当使用 Python 进行测试时,它在两个月的 5 分钟时间内显示出令人印象深刻的股权增长。值得注意的是,夏普比率达到了接近 5.7 的值。

1、什么是网格交易?

网格交易涉及在图表上构建预定义价格水平的网格。每当价格触及其中一个水平时,就会执行多头和空头头寸。这些交易的利润目标被分配给后续的网格水平。这种策略在震荡市场中蓬勃发展,尤其是在价格频繁波动的较低时间范围内。

在本文中,我们将实现一个 Python 脚本来模拟网格交易并使用历史数据回测其有效性。让我们开始吧。

2、设置 Python 环境

在实施我们的策略之前,让我们导入必要的 Python 库并检索历史 EUR/USD 数据:

import yfinance as yf
import pandas as pd
import numpy as np
import pandas_ta as ta

# Download the EUR/USD data for the last 59 days with a 5-minute interval
dataF = yf.download("EURUSD=X",
                     start=pd.Timestamp.today() - pd.DateOffset(days=59),
                     end=pd.Timestamp.today(),
                     interval='5m')

使用的库:

  • yfinance (yf):从 Yahoo Finance 下载金融市场数据。
  • andas (pd):提供强大的数据处理功能。
  • numpy (np):支持高效的数值计算。
  • pandas_ta (ta):提供技术分析指标。

通过使用 yfinance 下载高频数据,我们创建了一个详细的数据集,非常适合回测我们的网格交易策略。

3、创建网格

网格”是一系列均匀分布的价格水平,构成交易策略的支柱。我们可以根据不同的市场条件进行调整的参数生成网格值:

grid_distance = 0.005  # Distance between grid levels
midprice = 1.065       # Central reference price

def generate_grid(midprice, grid_distance, grid_range):
    return np.arange(midprice - grid_range, midprice + grid_range, grid_distance)
grid = generate_grid(midprice=midprice, grid_distance=grid_distance, grid_range=0.1)
  • grid_distance (0.005):网格线之间的增量价格差距。
  • midprice (1.065):充当网格的中点。
  • grid_range (0.1):确定中间价格上方和下方网格水平的总范围。

可以根据资产及其市场条件动态调整这些参数。 generate_grid 函数可自动创建网格,从而促进交易策略的结构化方法。

4、生成交易信号

每当价格跨越网格级别时,就会生成信号。这会触发多头和空头交易:

signal = [0] * len(dataF)
i = 0
for index, row in dataF.iterrows():
    for p in grid:
        if min(row.Low, row.High) < p and max(row.Low, row.High) > p:
            signal[i] = 1
    i += 1
dataF["signal"] = signal
dataF[dataF["signal"] == 1]

信号逻辑:

  • 如果一行的最高价和最低价跨越网格线,则会生成交易信号。
  • 信号列附加到数据集以进行回溯测试。

5、准备回测

在运行回测之前,我们通过计算平均真实波动范围 (ATR) 来增强我们的数据集,这有助于优化交易参数。

dfpl = dataF[:].copy()

def SIGNAL():
    return dfpl.signal
dfpl['ATR'] = ta.atr(high=dfpl.High, low=dfpl.Low, close=dfpl.Close, length=16)
dfpl.dropna(inplace=True)

ATR 是一种波动性度量,它允许我们动态调整止损和止盈水平。

6、运行回测

在这里,我们定义一个自定义网格交易策略并使用回测库评估其性能:

from backtesting import Strategy, Backtest
import backtesting

class MyStrat(Strategy):
    mysize = 50
    def init(self):
        super().init()
        self.signal1 = self.I(SIGNAL)
    def next(self):
        super().next()
        slatr = 1.5 * grid_distance  # Stop-loss distance
        TPSLRatio = 0.5              # Take profit:stop loss ratio
        if self.signal1 == 1 and len(self.trades) <= 10000:
            # Short Trade
            sl1 = self.data.Close[-1] + slatr
            tp1 = self.data.Close[-1] - slatr * TPSLRatio
            self.sell(sl=sl1, tp=tp1, size=self.mysize)
            # Long Trade
            sl1 = self.data.Close[-1] - slatr
            tp1 = self.data.Close[-1] + slatr * TPSLRatio
            self.buy(sl=sl1, tp=tp1, size=self.mysize)
# Execute the backtest
bt = Backtest(dfpl, MyStrat, cash=50, margin=1/100, hedging=True, exclusive_orders=False)
stat = bt.run()

关键见解:

  • mysize:确定交易规模。
  • slatr 和 TPSLRatio:自定义止损和止盈水平。
  • 回测库:简化测试流程,确保详细的性能分析。

7、分析结果

回测结果展示了该策略的稳健性,尤其是在 57 天的时间段内:

  • 回报率:172.04%
  • 年化回报率:37,364.62%
  • 夏普比率:0.81
  • 交易次数:1,698
  • 胜率:73.03%
  • 最大回撤:-17.03%

尽管偶尔会出现回撤,但该策略的绩效指标证实了其在短期交易中的可行性。

8、结束语

正如这里所展示的,网格交易是一种很有前途的算法策略。它的系统性和适应性使其成为交易者武器库中的宝贵工具。通过利用 Python 强大的库,即使是初学者也可以实施和改进这种方法以获得有利可图的结果。


原文链接:Automated Grid Trading in Python: A Beginner’s Guide to Algorithmic Profitability

DefiPlot翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。
通过 NowPayments 打赏