Skip to content

Freqtrade 策略入门:策略开发快速指南

本快速入门指南假设您已熟悉交易基础知识,并已阅读 Freqtrade 基础 页面。

必备知识

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

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

交易所以 K线 形式提供数据,每条 K线包含六个数值:日期开盘价最高价最低价收盘价成交量

技术分析 函数通过各类计算和统计公式分析 K线数据,并生成称为 指标 的次级数值。

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

信号在加密货币 交易所 转化为 订单,即 交易

我们使用 入场离场 而非 买入卖出,因为 Freqtrade 同时支持 做多做空 交易。

  • 做多(long):您基于抵押资产购买代币,例如使用 USDT 作为抵押资产购买 BTC 代币,通过以高于买入价的价格卖出代币来获利。在做多交易中,利润来自代币价值相对于抵押资产的上涨。
  • 做空(short):您以代币形式从交易所借入资金,并在之后偿还代币的抵押资产价值。在做空交易中,利润来自代币价值相对于抵押资产的下跌(您以更低的价格偿还贷款)。

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

基础策略结构

主数据框

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

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

紧随其后的 5 列分别代表 开盘价最高价最低价收盘价成交量(OHLCV)数据。

填充指标数值

populate_indicators 函数会向数据框添加代表技术分析指标数值的列。

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

通过调用技术分析函数(例如 ta-lib 的 RSI 函数 ta.RSI())并将其赋值给列名(例如 rsi),可以将列添加到数据框中。

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

不同的库以不同的方式生成指标值。请查阅每个库的文档以了解如何将其集成到您的策略中。您也可以查看 Freqtrade 示例策略 来获取灵感。

填充入场信号

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

数据框列 enter_long 被添加到数据框中,当该列中出现值 1 时,Freqtrade 会将其视为入场信号。

做空

要进入空头交易,请使用 enter_short 列。

填充离场信号

populate_exit_trend 函数定义了离场信号的条件。

数据框列 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 将尝试下单,即进行一笔 交易 或建立 头寸

每个新的交易头寸都会占用一个槽位。槽位代表可以同时开启的最大新交易数量。

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

但在某些情况下,生成信号并不总是会创建交易订单。这些情况包括:

  • 没有足够的剩余资金购买资产,或钱包中的资金不足以出售资产(包括任何费用)
  • 没有足够的剩余空闲槽位来开启新交易(已开启的头寸数量等于max_open_trades选项)
  • 某个交易对已有未平仓交易(Freqtrade无法堆叠头寸 - 但可以调整现有头寸
  • 如果在同一根K线上同时出现入场和出场信号,它们被视为冲突信号,不会产生任何订单
  • 策略通过使用相关的入场出场回调函数中的逻辑主动拒绝交易订单

请阅读策略定制文档以获取更多详细信息。

回测与正向测试

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

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

Freqtrade 提供两种测试模式:

  • 回测:使用您从交易所下载的历史数据,回测是评估策略性能的快速方法。然而,很容易扭曲结果,使策略看起来比实际盈利性高得多。更多信息请查阅回测文档
  • 模拟运行:通常称为_前向测试_,模拟运行使用来自交易所的实时数据。然而,任何可能导致交易的信号都会被 Freqtrade 正常跟踪,但不会在交易所本身实际开仓。前向测试实时运行,因此虽然获得结果需要更长时间,但它是比回测更可靠的潜在性能指标。

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

回测结果可能极不准确

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

实用命令

Freqtrade包含两个用于检查策略基本缺陷的实用命令:前瞻性分析递归分析

评估回测和模拟运行结果

完成策略回测后务必进行模拟运行,以确认回测与模拟运行结果是否足够接近。

若存在显著差异,请验证您的入场和出场信号是否一致,并在两种模式下出现在相同的K线上。但需注意,模拟运行与回测之间始终存在差异:

  • 回测假设所有订单都能成交。在模拟运行中,如果使用限价单或交易所缺乏流动性,情况可能并非如此。
  • 在K线收盘时跟随入场信号,回测假设交易会在下一根K线的开盘价入场(除非策略中使用了自定义价格回调)。而在模拟运行中,信号发出与交易开仓之间通常存在延迟。 这是因为当主时间框架(例如每5分钟)的新K线数据传入时,Freqtrade需要时间分析所有交易对的数据框。因此,Freqtrade会尝试在K线开盘后几秒内(理想情况下延迟尽可能小)开仓交易。
  • 由于模拟运行中的入场价格可能与回测不符,这意味着盈利计算也会存在差异。因此,投资回报率(ROI)、止损、移动止损和回调退出等指标不完全一致是正常现象。
  • 新K线数据传入与信号产生、交易开仓之间的计算"延迟"越大,价格不可预测性就越高。请确保您的计算机性能足够强大,能在合理时间内处理交易对列表中的所有交易对数据。如果出现显著的数据处理延迟,Freqtrade会在日志中发出警告。

控制或监控运行中的机器人

当机器人在模拟或实盘模式下运行时,Freqtrade提供六种机制来控制或监控运行中的机器人:

  • FreqUI: 最易上手的界面,FreqUI 是一个网页界面,用于查看和控制机器人的当前活动。
  • Telegram: 在移动设备上,可使用 Telegram 集成来接收机器人活动警报并控制某些方面。
  • FTUI: FTUI 是 Freqtrade 的终端(命令行)界面,仅允许监控运行中的机器人。
  • freqtrade-client: REST API 的 Python 实现,便于从您的 Python 应用程序或命令行发出请求并处理机器人响应。
  • REST API endpoints: REST API 允许程序员开发自己的工具与 Freqtrade 机器人交互。
  • Webhooks: Freqtrade 可以通过 Webhook 向其他服务(例如 Discord)发送信息。

日志记录

Freqtrade 生成广泛的调试日志,以帮助您了解正在发生的情况。请熟悉您可能在机器人日志中看到的信息和错误消息。

默认情况下,日志记录发生在标准输出(命令行)上。如果您希望改为写入文件,许多 freqtrade 命令(包括 trade 命令)接受 --logfile 选项以写入文件。

查看 FAQ 以获取示例。

最后说明

算法交易难度很高,由于需要投入大量时间和精力才能使策略在多种场景下实现盈利,大多数公开策略的表现并不理想。

因此,直接采用公开策略并依赖回测来评估性能往往存在问题。不过,Freqtrade 提供了实用工具来协助您做出决策并完成尽职调查。

实现盈利的途径多种多样,并不存在某个单一技巧或配置选项能够彻底扭转表现不佳的策略。

Freqtrade 是一个拥有庞大互助社区的开源平台——欢迎访问我们的 Discord 频道与其他用户交流策略心得!

请始终谨记:只投入您愿意承担损失的资金。

结语

在 Freqtrade 中开发策略需要基于技术指标定义入场和离场信号。通过遵循上述框架和方法,您可以创建并测试自己的交易策略。

常见问题解答请参阅 FAQ 文档。

如需深入探索,请参考更详细的 Freqtrade 策略定制文档