第 9 章 · 02 现货与合约杠杆 本节摘要:freqtrade 支持现货和合约两种交易模式,靠 和 两个配置项切换。本节讲清三件事:一是现货与合约的本质区别(有无杠杆、有无强平、有无资金费率);二是保证金模式的两种选择——isolated(逐仓,每个交易对独立保证金)与 cross(全仓,共享保证金,风险更大);三是杠杆的设置方式——通过策略里的 回调按交易对动态决定,以及杠杆如何放大盈亏、如何让止损更容易触发。读完你会理解为什么官方反复强调「没在现货验证盈利前别碰杠杆」。 内容来源:原项目文档 、 ,汉化并套用体系化模板。 ⚠️ 风险提示:杠杆交易极高风险。杠杆 2 倍意味着 50% 的止损可能来不及触发就被强平。切勿在未充分验证策略前使用杠杆,永远不要冒超出承受能力的损失。
本节摘要:freqtrade 支持现货和合约两种交易模式,靠
trading_mode和margin_mode两个配置项切换。本节讲清三件事:一是现货与合约的本质区别(有无杠杆、有无强平、有无资金费率);二是保证金模式的两种选择——isolated(逐仓,每个交易对独立保证金)与 cross(全仓,共享保证金,风险更大);三是杠杆的设置方式——通过策略里的leverage()回调按交易对动态决定,以及杠杆如何放大盈亏、如何让止损更容易触发。读完你会理解为什么官方反复强调「没在现货验证盈利前别碰杠杆」。
内容来源:原项目文档
docs/leverage.md、docs/strategy-callbacks.md,汉化并套用体系化模板。
⚠️ 风险提示:杠杆交易极高风险。杠杆 2 倍意味着 50% 的止损可能来不及触发就被强平。切勿在未充分验证策略前使用杠杆,永远不要冒超出承受能力的损失。
阅读完本节,你应当能够:
trading_mode 决定你在哪种市场交易,可选值:
| 模式 | 状态 | 特点 |
|---|---|---|
spot(默认) |
可用 | 只做多、无杠杆、无强平,盈亏=资产价值变动-手续费 |
margin |
不可用 | 现货市场+交易所借币,目前未开放 |
futures |
可用 | 永续合约(衍生品),支持杠杆、做空、强平、资金费率 |
现货(spot) 是最简单的:用自有资金买币,涨了卖掉赚差价。没有杠杆,不会爆仓,最多亏掉本金。这是新手的起点。
合约(futures) 交易的是「永续合约」——一种紧密追踪标的资产价格的衍生品合约,可以无限期持有。与现货的关键区别:
合约配置:
"trading_mode": "futures", "margin_mode": "isolated"
⚠️ 合约命名:freqtrade 遵循 ccxt 的合约命名规范,格式为
base/quote:settle,如ETH/USDT:USDT(以 USDT 结算的 ETH 永续合约)。
合约模式下还要选保证金模式:
isolated(逐仓):每个交易对(市场)的保证金独立账户。一个仓位被强平,不影响其他仓位。
"margin_mode": "isolated"
cross(全仓):所有交易对共享一个保证金账户。某个仓位亏损时,会从总余额借保证金来避免强平。
"margin_mode": "cross"
⚠️ cross 风险更大:全仓模式下,一个仓位的亏损会拉低所有仓位的强平价,可能引发连锁强平,导致整个账户被清零。而且 freqtrade 提醒:cross 模式的仓位互相影响在 dry-run 和回测中可能无法完整模拟,回测结果可能与实盘有偏差。新手建议从 isolated 起步。
杠杆不必写死。freqtrade 提供策略回调 leverage(),让你按交易对、按方向、按入场标签动态决定杠杆:
def leverage(self, pair: str, current_time, current_rate: float, proposed_leverage: float, max_leverage: float, entry_tag: str | None, side: str, **kwargs) -> float: """ 只在合约模式下调用。返回值必须在 1.0 到 max_leverage 之间。 """ # 保守:BTC 用 2 倍,其他用 1 倍(无杠杆) if pair == "BTC/USDT:USDT": return 2.0 return 1.0
参数说明:
| 参数 | 含义 |
|---|---|
pair |
当前交易对 |
current_rate |
当前价格(按定价设置算出) |
proposed_leverage |
机器人建议的杠杆(通常 1.0) |
max_leverage |
该交易对允许的最大杠杆 |
entry_tag |
入场标签(来自 enter_tag) |
side |
方向,long 或 short |
返回值会被自动钳制到 [1.0, max_leverage]。不实现这个回调则默认 1 倍(无杠杆)。
💡 杠杆的影响是全方位的:假设本金 500 USDT、杠杆 3 倍,仓位价值 = 500 × 3 = 1500 USDT。所有盈亏计算、ROI、止损都把杠杆算进去。比如 10 倍杠杆下配 10% 止损,价格反向走 1% 就触发止损。
合约交易有强平(liquidation) 风险——亏损到保证金不足以维持仓位时,交易所强制平仓,还要收强平手续费。freqtrade 用 liquidation_buffer(默认 0.05)在真实强平价和你的止损之间留一道安全网:
freqtrade_强平价 = 真实强平价 ± |开仓价 - 真实强平价| × liquidation_buffer (+ 做多,- 做空)
举例:开仓价 10、真实强平价 8、liquidation_buffer=0.05:
freqtrade强平价 = 8 + (10 - 8) × 0.05 = 8 + 0.1 = 8.1
freqtrade 会在价格跌到 8.1(而非 8)时就视为强平,提前平仓,避免触及交易所真实强平(否则要付强平手续费)。
⚠️ freqtrade 不追踪强平手续费。如果
liquidation_buffer设 0 或太低,仓位真的被交易所强平,盈亏统计会不准(漏算强平费)。建议:buffer 别低于默认的 0.05,且配合stoploss_on_exchange使用。
合约还有资金费率(funding fee)——多空双方每隔一段时间(通常 8 小时)互付费用,源于合约价与现货价的偏差。这部分会加到或从交易总额里扣。
回测合约时要注意数据完整性:
No data found. Terminating。futures_funding_rate,建议设 0(除非你知道具体费率)。"futures_funding_rate": 0
⚠️ 设非真实资金费率会让回测不准。这只影响资金费率缺失的时段,交易所提供的真实费率不会被覆盖。
如果你已有一个现货策略想迁移到合约:
can_short = True(下一节细讲做空)。trading_mode: "futures"、margin_mode: "isolated"。leverage() 回调(不实现默认 1 倍,等于无杠杆)。💡 官方的核心建议:不要在没于现货市场跑出正向结果的策略上直接用杠杆。杠杆放大的是已有的(亏损或盈利),不是把烂策略变好。
杠杆开启后,freqtrade 的盈亏计算、ROI 表、止损都会自动把杠杆倍数算进去,不需要你在策略里手动乘。理解这个交互很重要,否则容易误判风险。
盈亏放大:设杠杆 L,价格变动 p%,仓位的实际盈亏 ≈ p% × L。例如 3 倍杠杆、价格涨 2%,盈利约 6%(扣除手续费和资金费率)。
ROI 与止损是按「价格变动」还是「账户盈亏」算? freqtrade 的 minimal_roi 和 stoploss 都是相对于入场价的收益率,已包含杠杆效应。换句话说:
stoploss = -0.10(10%)在 1 倍杠杆下,价格跌 10% 触发。-0.10 在 5 倍杠杆下,价格跌约 2% 就触发(因为 2% × 5 = 10%)。这就是为什么官方反复强调「杠杆 2 倍时 50% 的止损太松」——2 倍杠杆下价格跌 25% 就亏 50%,而很多合约在跌到 25% 前就已经强平了。开杠杆必须同步收紧止损,否则止损形同虚设。
⚠️ 实战检查清单:开杠杆前确认——① 策略在现货已验证正期望;②
stoploss已按杠杆倍数收紧(如 3 倍杠杆下止损不超过 -15% 对应价格跌 5%);③ 用 isolated 保证金隔离风险;④ 开启stoploss_on_exchange防止掉线漏止损;⑤liquidation_buffer不低于 0.05。
spot(默认,只做多无杠杆无强平)、margin(未开放)、futures(永续合约,有杠杆做空强平资金费率)。合约对格式 base/quote:settle。isolated(逐仓,仓位独立,新手推荐)、cross(全仓,共享保证金,连锁强平风险大,回测可能不准)。[1.0, max_leverage],不实现默认 1 倍。liquidation_buffer(默认 0.05)在真实强平价前留缓冲;freqtrade 不追踪强平费,buffer 太低会真被强平且统计不准。futures_funding_rate: 0(会让回测不准);现货策略迁移到合约要重估止损、重回测、先 Dry-Run。下一节,我们看做空交易——做空信号的约定、现货做空(杠杆代币)与合约做空的差异、做空的风控要点。