跳至内容

Freqtrade 策略入门:策略开发快速上手

在本快速入门中,我们假设您已熟悉交易基础知识,并且已阅读 Freqtrade 基础 页面。

必备知识

Freqtrade 中的策略是一个 Python 类,用于定义买卖加密货币资产的逻辑。

资产被定义为交易对,表示代币计价货币。代币是你用另一种货币作为计价货币进行交易的资产。

交易所以蜡烛图(K 线)的形式提供数据,每根 K 线包含六个值:日期开盘价最高价最低价收盘价成交量

技术分析函数使用各种计算和统计公式分析 K 线数据,并生成称为指标的衍生数值。

通过分析交易对的 K 线数据中的指标来生成信号

信号被转换为加密货币交易所上的订单,即交易

我们使用入场退出这两个术语,而不是买入卖出,因为 Freqtrade 支持做多做空交易。

  • 做多:你使用计价货币购买代币,例如使用 USDT 作为计价货币购买 BTC,通过以高于买入价的价格卖出代币来获利。在做多交易中,当币价相对于计价货币上涨时盈利。
  • 做空:你从交易所借入代币形式的资金,之后偿还该代币的计价货币价值。在做空交易中,当币价相对于计价货币下跌时盈利(你可以以更低的价格偿还贷款)。

尽管 Freqtrade 支持某些交易所的现货和期货市场,但为了简化说明,我们将仅关注现货(做多)交易。

基础策略的结构

主数据框

Freqtrade 策略使用一种称为dataframe的表格数据结构(由行和列组成)来生成交易的入场和出场信号。

您配置的交易对列表中的每个交易对都有其独立的 dataframe。dataframe 通过 date 列进行索引,例如:2024-06-31 12:00

接下来的 5 列代表 开盘价(open)最高价(high)最低价(low)收盘价(close)成交量(volume)(OHLCV 数据)。

填充指标值

populate_indicators 函数会向 dataframe 中添加代表技术分析指标值的新列。

常见的指标示例包括相对强弱指数(RSI)、布林带(Bollinger Bands)、资金流量指数(MFI)、移动平均线(MA)和平均真实波幅(ATR)。

通过调用技术分析函数(例如 ta-lib 的 RSI 函数 ta.RSI())并将结果赋值给某一列名(例如 rsi),即可向 dataframe 中添加新列。

dataframe['rsi'] = ta.RSI(dataframe)
技术分析库

不同的库在生成指标值时的工作方式各不相同。请查阅各个库的文档以了解如何将其集成到您的策略中。您也可以参考 Freqtrade 示例策略 获取灵感。

填充入场信号

populate_entry_trend 函数用于定义入场信号的条件。

dataframe 中会添加一个名为 enter_long 的列,当该列中某个值为 1 时,Freqtrade 会将其识别为一个入场信号。

做空

要进行做空交易,请使用 enter_short 列。

填充出场信号

populate_exit_trend 函数用于定义出场信号的条件。

dataframe 中会添加一个名为 exit_long 的列,当该列中某个值为 1 时,Freqtrade 会将其识别为一个出场信号。

做空

要退出做空交易,请使用 exit_short 列。

一个简单的策略

以下是一个 Freqtrade 策略的最小化示例:

from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta

class MyStrategy(IStrategy):

    timeframe = '15m'

    # set the initial stoploss to -10%
    stoploss = -0.10

    # exit profitable positions at any time when the profit is greater than 1%
    minimal_roi = {"0": 0.01}

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # generate values for technical analysis indicators
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # generate entry signals based on indicator values
        dataframe.loc[
            (dataframe['rsi'] < 30),
            'enter_long'] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # generate exit signals based on indicator values
        dataframe.loc[
            (dataframe['rsi'] > 70),
            'exit_long'] = 1

        return dataframe

执行交易

当发现信号时(入场或出场列中出现值 1),Freqtrade 将尝试下单,即创建一笔 交易持仓

每个新交易头寸将占用一个 仓位(slot)。仓位表示可同时新开仓的最大交易数量。

仓位数量由 max_open_trades 配置 选项定义。

然而,在某些情况下,即使生成了信号,也不一定会创建交易订单。这些情况包括:

  • 剩余的投注金额不足以买入资产,或钱包中没有足够的资金来卖出资产(包括任何手续费)
  • 没有足够的空闲仓位来开立新交易(当前持仓数量已达到 max_open_trades 限制)
  • 该交易对已存在一个未平仓的交易(Freqtrade 不能叠加头寸——但可以 调整现有头寸
  • 如果在同一根 K 线同时出现入场和出场信号,则被视为 冲突,不会发出任何订单
  • 该策略由于您通过使用相关的 入场出场 回调函数指定的逻辑,主动拒绝交易订单

更多详细信息,请阅读 策略自定义 文档。

回测与前向测试

策略开发可能是一个漫长且令人沮丧的过程,因为将我们人类的“直觉”转化为有效的计算机控制(“算法”)策略并不总是那么简单直接。

因此,应测试策略以验证其是否能按预期运行。

Freqtrade 提供两种测试模式:

  • 回测:使用从交易所下载的历史数据,回测是一种快速评估策略表现的方法。然而,结果很容易被扭曲,导致策略看起来比实际更盈利。更多信息请参阅回测文档
  • 模拟运行:通常称为前向测试,模拟运行使用来自交易所的实时数据。虽然任何可能导致交易的信号都会被 Freqtrade 正常跟踪,但不会在交易所实际下单。前向测试是实时进行的,因此尽管获取结果所需时间更长,但它比回测更能可靠地反映策略的潜在表现。

通过在您的 配置 中将 dry_run 设置为 true 来启用模拟运行。

回测结果可能非常不准确

回测结果与实际情况不符的原因有很多。请查阅 回测假设常见策略错误 文档。一些列出并排名 Freqtrade 策略的网站展示了令人印象深刻的回测结果,但请不要认为这些结果是可以实现或现实的。

有用的命令

Freqtrade 包含两个有用的命令,用于检查策略中的基本缺陷:前瞻分析(lookahead-analysis)递归分析(recursive-analysis)

评估回测与模拟运行结果

在完成回测后,务必对策略进行模拟运行,以查看回测和模拟运行的结果是否足够接近。

如果两者存在显著差异,请验证您的入场和出场信号是否一致,并且在两种模式下出现在相同的 K 线中。不过,模拟运行和回测之间总会存在一些差异:

  • 回测假设所有订单都能成交。但在模拟运行中,如果使用限价单或交易所缺乏交易量,则可能无法成交。
  • 在 K 线收盘后触发入场信号的情况下,回测假设交易会在下一根 K 线的开盘价入场(除非您的策略中包含自定义定价回调)。而在模拟运行中,信号生成与实际开仓之间通常会有延迟。这是因为当主周期的新 K 线到来时(例如每 5 分钟),Freqtrade 需要时间来分析所有交易对的数据帧。因此,Freqtrade 会在 K 线开盘后几秒钟(理想情况下延迟尽可能小)尝试开仓。
  • 由于模拟运行中的入场价格可能与回测不同,利润计算也会有所差异。因此,ROI、止损、移动止损以及回调出场等指标不完全一致是正常的。
  • 新的 K 线数据到来与你的信号生成及交易开仓之间存在的计算“延迟”越长,价格的不可预测性就越大。请确保你的计算机足够强大,能够在合理的时间内处理你在交易对列表中设置的所有交易对的数据。如果数据处理存在显著延迟,Freqtrade 会在日志中向你发出警告。

控制或监控正在运行的机器人

一旦你的机器人以模拟或实盘模式运行,Freqtrade 提供了六种机制来控制或监控正在运行的机器人:

  • FreqUI:最容易上手的方式,FreqUI 是一个网页界面,可用于查看和控制机器人的当前活动。
  • Telegram:在移动设备上,可通过 Telegram 集成接收机器人活动的提醒,并控制某些功能。
  • FTUI:FTUI 是 Freqtrade 的终端(命令行)界面,仅支持对正在运行的机器人进行监控。
  • freqtrade-client:REST API 的 Python 实现,便于从 Python 应用程序或命令行发送请求并接收机器人的响应。
  • REST API 接口:REST API 允许开发者自行开发工具,以与 Freqtrade 机器人进行交互。
  • Webhooks:Freqtrade 可通过 Webhook 将信息发送到其他服务,例如 Discord。

日志

Freqtrade 会生成详尽的调试日志,帮助你了解当前发生的情况。请熟悉你的机器人日志中可能出现的信息和错误消息。

默认情况下,日志输出到标准输出(命令行)。如果你想改为写入文件,许多 freqtrade 命令(包括 trade 命令)都支持使用 --logfile 选项将日志写入文件。

请查看 常见问题解答 获取示例。

最后的思考

算法交易非常困难,大多数公开的策略表现不佳,因为要让一个策略在多种场景下持续盈利需要大量的时间和精力。

因此,直接采用公开策略并通过回测来评估其表现通常存在问题。不过,Freqtrade 提供了多种有用的方法,帮助你做出决策并完成应有的分析。

实现盈利的方法有很多,不存在某个单一的技巧、窍门或配置选项能够修复一个表现差劲的策略。

Freqtrade 是一个开源平台,拥有庞大且乐于助人的社区——请务必访问我们的 Discord 频道,与其他用户讨论你的策略!

一如既往,请只投入你愿意承担损失的资金。

总结

在 Freqtrade 中开发策略涉及基于技术指标定义入场和出场信号。通过遵循上述结构和方法,你可以创建并测试自己的交易策略。

常见问题及解答可在我们的 FAQ 中找到。

如需进一步学习,请参考更深入的 Freqtrade 策略自定义文档