Saber2pr's Blog

Freqtrade如何正确DCA

Freqtrade DCA(Dollar-Cost Averaging)技巧介绍

在数字货币交易中,Dollar-Cost Averaging(DCA) 是一种常见的资金管理策略,旨在通过分批购买资产来减少市场波动的影响。freqtrade 作为一款开源的加密货币交易机器人,支持多种策略和资金管理技巧,其中包括 DCA(分批加仓) 策略。

提高胜率的关键是加仓的逻辑,每次加多少,什么时候加仓,下面将使用数学计算的方式来讨论这个问题。

什么是 DCA(Dollar-Cost Averaging)?

DCA 是一种分批购买资产的策略,投资者将资金分成若干批次,在固定的时间间隔或特定市场条件下购买。这种方式能够在市场波动较大的时候,避免一次性投资的风险。例如,当市场价格较低时,分批买入可以帮助平均成本,从而降低整体投资的波动性。

freqtrade 中的 DCA 策略

freqtrade 中,DCA 策略通过配置 加仓position adjustment)来实现。加仓的基本思想是,当市场价格下跌时,机器人会自动增加仓位,以平均成本并减少持仓的亏损。这种策略特别适用于波动性较大的市场。

1. 启用加仓功能

freqtrade 中,启用加仓功能非常简单,主要依赖于以下两个参数:

  • position_adjustment_enable:控制是否启用仓位调整。如果设置为 Truefreqtrade 会在已有仓位的基础上增加更多的资金进行买入。
"position_adjustment_enable": true
  • max_entry_position_adjustment :控制每次加仓时最多可以增加多少仓位。假设设置为 10,那么每次加仓时最多增加 10 单位的资产。
"max_entry_position_adjustment": 10

2. 设置资金分配比例

为了确保每次加仓时不会超出账户的可用资金,freqtrade 提供了以下参数来设置资金分配比例:

  • tradable_balance_ratio :控制每次交易时可用于加仓的资金比例。如果设置为 0.99,则表示每次交易时最多使用 99% 的账户余额进行买入。
"tradable_balance_ratio": 0.99
  • stake_amount :控制每次交易使用的资金量。如果设置为 "unlimited",表示不限制每次交易的最大金额,系统会根据余额和资金比例来动态计算。
"stake_amount": "unlimited"

3. 递增加仓的金额

在 DCA 策略中,每次加仓的资金往往是递增的。您可以设定每次加仓的资金量基于上一次的加仓进行递增,这样可以通过逐步增加仓位来平摊成本。 例如,假设初始加仓金额为 1.6,然后每次加仓金额增加 1.5 倍。具体来说:

  • 第一次加仓:$1.6$

  • 第二次加仓:$1.6 + 1.6 \times 1.5 = 4$

  • 第三次加仓:$1.6 + 1.6 \times 1.5 + 1.6 \times 1.5 \times 1.5 = 10$

可以通过如下递推公式计算第 n 次加仓的总金额: $ \text{第n次加仓金额} = 1.6 \times \left( 1 + 1.5 + 1.5^2 + \cdots + 1.5^{n-1} \right) $

这个公式是一个等比数列求和的过程,因此可以使用公式简化计算: $ S_n = 1.6 \times \frac{1.5^n - 1}{0.5} $

4. 示例:第10次加仓后的总金额

假设我们使用上述递推公式来计算第 10 次加仓后的总金额。我们设定初始加仓金额为 1.6,每次加仓金额递增 1.5 倍:

$ S_{10} = 1.6 \times \frac{1.5^{10} - 1}{0.5} $

通过计算,得出第 10 次加仓后的总金额为 181.33

所以你可以使用首次资金量为 1.6U,总资金量为 181.33U,按照每次加仓为上一次 1.5 倍进行 DCA,可以加仓10次,这样可以极大提高胜率。

初始资金可以这样计算,总资金 / 杠杆倍数 / 分割系数,例如:

max_open_trades = 1
max_entry_position_adjustment = 10
max_dca_multiplier = 10
leverage_num = 5
last_stake_amount = None

def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float,
                        proposed_stake: float, min_stake: Optional[float], max_stake: float,
                        leverage: float, entry_tag: Optional[str], side: str,
                        **kwargs) -> float:
    proposed_stake = proposed_stake / self.leverage_num / self.max_dca_multiplier
    return proposed_stake

def adjust_trade_position(self, trade: Trade, current_time: datetime, 
                          current_rate: float, current_profit: float, 
                          min_stake: Optional[float], max_stake: float, 
                          current_entry_rate: float, current_exit_rate: float, 
                          current_entry_profit: float, current_exit_profit: float, 
                          **kwargs) -> Optional[float]:
    filled_entries = trade.select_filled_orders(trade.entry_side) 
    stake_amount = filled_entries[0].cost 

    last_stake_amount = self.last_stake_amount 
    if last_stake_amount is None:
      last_stake_amount = stake_amount

    next_stake_amount = last_stake_amount * 1.6
    self.last_stake_amount  = next_stake_amount

    return next_stake_amount

DCA 策略的优势

  1. 降低风险 :通过分批买入,DCA 策略能够有效地分散风险,避免在市场高点一次性投资。

  2. 适应市场波动 :市场价格的波动较大时,DCA 可以通过加仓的方式平摊成本,减少被动持仓的风险。

  3. 更好的资金管理 :通过 freqtrade 中的资金管理配置,您可以灵活地控制每次交易的资金量,确保资金的高效利用。

小结

freqtrade 提供了强大的配置选项来实现 DCA 策略,使交易者能够在波动的市场中通过加仓技巧降低投资风险。通过启用 仓位调整position adjustment)功能并设置合理的资金分配比例,您可以实现灵活的资金管理,确保在市场下跌时有效地平摊成本,提高投资回报。如果您希望在 freqtrade 中实践 DCA 策略,只需调整相关参数并配合适合的交易策略,就能最大化利用这一技巧来提升您的交易表现。