notes_works/new notes/freqtrade 策略 demo 代码拆解.md
2025-04-10 11:13:22 +08:00

9.7 KiB
Raw Permalink Blame History

date tags title
2025-04-09 09:27:15
量化
freqtrade
策略

😐: 以下是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

我将详细解释这个FreqTrade策略示例代码逐步分解每个部分的功能和作用。

整体概述

这是一个基于FreqTrade框架的最小交易策略示例使用RSI相对强弱指数作为技术指标来生成买入和卖出信号。它是一个简单的超买/超卖策略适用于15分钟时间框架。


代码分解

  1. 导入部分

python

from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta
  • IStrategy: FreqTrade提供的一个基类所有自定义策略都需要继承它。

  • DataFrame: 使用Pandas库的DataFrame来处理和操作市场数据如价格、指标等

  • ta: TALib库技术分析库的抽象接口用于计算技术指标比如RSI。


  1. 策略类定义

python

class MyStrategy(IStrategy):
  • 定义了一个名为MyStrategy的类继承自IStrategy。

  • 你需要实现一些特定的方法如populate_indicators、populate_entry_trend和populate_exit_trend来告诉FreqTrade如何计算指标和生成交易信号。


  1. 策略参数

python

timeframe = '15m'
stoploss = -0.10
minimal_roi = {"0": 0.01}
  • timeframe = '15m':

    • 设置策略使用的数据时间框架为15分钟K线。这意味着策略会基于每15分钟的OHLCV开盘、最高、最低、收盘、成交量数据进行分析。
  • stoploss = -0.10:

    • 设置止损为-10%。如果持仓亏损达到10%,策略会自动平仓以限制损失。
  • minimal_roi = {"0": 0.01}:

    • 定义了最小投资回报率ROI。这里的意思是只要持仓利润超过1%0.01),就可以随时平仓获利。

    • {"0": 0.01}表示从持仓开始的第0分钟即任何时候只要利润达到1%,就允许退出。


  1. populate_indicators 方法 (填充指标)

python

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
    return dataframe
  • 作用: 计算技术指标并将其添加到数据框架中。

  • 输入:

    • dataframe: 包含市场数据的Pandas DataFrame默认有open、high、low、close、volume等列。

    • metadata: 一个字典,包含额外信息(如交易对),这里未使用。

  • 实现:

    • ta.RSI(dataframe, timeperiod=14): 使用TALib计算14周期的RSI指标并将其存储在dataframe['rsi']列中。

    • RSI是一个衡量价格动能的指标范围在0到100之间通常用于判断超买>70和超卖<30状态。

  • 输出: 返回添加了RSI列的dataframe。


  1. populate_entry_trend 方法 (填充入场趋势)

python

def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (dataframe['rsi'] < 30),
        'enter_long'] = 1
    return dataframe
  • 作用: 定义买入(做多)信号。

  • 逻辑:

    • dataframe['rsi'] < 30: 检查RSI是否低于30超卖区域

    • dataframe.loc[..., 'enter_long'] = 1: 如果条件满足在enter_long列中标记为1表示这是一个买入信号。

    • FreqTrade会根据enter_long列的值决定是否开多仓。

  • 输出: 返回更新后的dataframe包含买入信号。


  1. populate_exit_trend 方法 (填充退场趋势)

python

def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (dataframe['rsi'] > 70),
        'exit_long'] = 1
    return dataframe
  • 作用: 定义卖出(平仓)信号。

  • 逻辑:

    • dataframe['rsi'] > 70: 检查RSI是否高于70超买区域

    • dataframe.loc[..., 'exit_long'] = 1: 如果条件满足在exit_long列中标记为1表示这是一个卖出信号。

    • FreqTrade会根据exit_long列的值决定是否平仓。

  • 输出: 返回更新后的dataframe包含卖出信号。


策略工作原理

  1. 数据准备:

    • FreqTrade会为指定的交易对如BTC/USDT加载15分钟K线数据并将其传递给策略。
  2. 指标计算:

    • populate_indicators方法计算RSI并添加到数据中。
  3. 信号生成:

    • populate_entry_trend检查RSI是否低于30若是则生成买入信号。

    • populate_exit_trend检查RSI是否高于70若是则生成卖出信号。

  4. 交易执行:

    • 当enter_long = 1时FreqTrade开多仓。

    • 当exit_long = 1或达到minimal_roi1%利润或触发stoploss-10%亏损)时,平仓。


策略特点

  • 简单性: 这是一个基础的RSI超买超卖策略易于理解和修改。

  • 风险管理:

    • 有10%的止损保护。

    • 1%的最小盈利目标确保小幅盈利时也能退出。

  • 局限性:

    • 只使用单一指标RSI可能在震荡市场中产生较多假信号。

    • 未考虑趋势过滤或其他确认条件。


如何改进

  1. 添加更多指标: 如MACD、布林带等与RSI结合以提高信号准确性。

  2. 动态止损: 根据市场波动调整止损,而不是固定的-10%。

  3. 趋势过滤: 加入移动平均线如50周期均线判断大趋势避免逆势交易。

  4. 优化参数: 测试不同的RSI周期如7或21或超买/超卖阈值如25/75

如果你有具体问题或想深入探讨某部分,请告诉我!

😯: 也就是说实现一个策略,主要要做的就是给某几个阈值进行设置,并给几个回调函数给出代码具体实现, 然后让系统加载并在需要的时候调用

是的你总结得很到位在FreqTrade中实现一个交易策略核心任务确实可以归纳为以下几点

  1. 设置关键参数(阈值)

    • 定义策略的基本规则比如时间框架timeframe、止损stoploss、最小盈利目标minimal_roi等。这些参数是策略运行的“全局设置”直接影响交易行为。
  2. 实现回调函数

    • FreqTrade通过几个关键的回调函数来让用户自定义策略逻辑

      • populate_indicators: 计算技术指标并准备数据。

      • populate_entry_trend: 定义买入(或做空)信号。

      • populate_exit_trend: 定义卖出(或平空)信号。

    • 这些函数的具体实现决定了策略如何分析市场数据并生成交易信号。

  3. 系统加载和调用

    • 一旦策略代码编写完成并符合FreqTrade的要求你只需要将它放入策略文件夹FreqTrade会在运行时加载并根据市场数据按顺序调用这些回调函数。系统会自动处理数据获取、信号执行、订单管理等后台工作。

工作流程(以你的示例为例)

  1. 参数设置:

    • timeframe = '15m'15分钟K线

    • stoploss = -0.10-10%止损)

    • minimal_roi = {"0": 0.01}1%盈利目标)

  2. 回调函数实现:

    • populate_indicators: 计算RSI指标。

    • populate_entry_trend: 当RSI < 30时标记买入信号。

    • populate_exit_trend: 当RSI > 70时标记卖出信号。

  3. 系统执行:

    • FreqTrade加载你的MyStrategy类。

    • 每隔15分钟获取新的K线数据调用populate_indicators计算RSI。

    • 然后调用populate_entry_trend检查是否买入再调用populate_exit_trend检查是否卖出。

    • 根据信号、止损和ROI规则执行交易。


扩展理解

  • 灵活性: 你可以在回调函数中加入任意复杂的逻辑,比如多指标组合、机器学习模型,甚至外部数据(如新闻情绪)。

  • 模块化: FreqTrade将数据处理、信号生成和交易执行分离你只需专注于策略逻辑不用操心底层实现。

  • 调试与优化: 写好策略后可以用FreqTrade的回测功能freqtrade backtesting测试效果调整参数或逻辑。

简单来说FreqTrade提供了一个框架你的任务是用参数和回调函数“填空”告诉系统“什么时候买、什么时候卖、如何管理风险”。如果需要更复杂的策略只需在这些函数中扩展代码即可。

有什么具体的实现想法或问题想讨论吗?我可以帮你进一步细化!