skip to content
End of Dev
Table of Contents

这个策略最初是从方舟基金(ARK)里提取出来的资金管理模块(这里的 ARK 只是同名,并非木头姐的 Ark Invest),后来被独立成“底舱策略”。它并不是为了替代主策略,而是为了解决资金利用率问题:主策略在多数时间并不满足开仓条件,导致大量资金闲置。于是,我们让这部分闲置资金在不干扰主策略风险框架的前提下,持续套取一部分波动利润,用来缓解整体资金成本压力。

基本原理

这套策略是一个“双层结构”:

  1. 底层是套期保值层,核心任务是把方向性风险压低,尽量让账户价值稳定。
  2. 上层是交易执行层,核心任务是在震荡中反复做小价差闭环,把波动转化为现金流。

换句话说,它不依赖“预测下一步涨跌”,而是依赖两件事: 先把净暴露控制住,再把市场噪声做成可重复兑现的利润单元。

套期保值

套期保值是这套策略的地基。

在币本位账户里,资产和保证金都以币计价。 这意味着只要你持有币,哪怕不交易,账户法币价值也会随币价剧烈波动。 所以第一目标不是“赚钱”,而是先把净方向暴露压下来。

这套策略采用的是最直接的组合:现货多头 + 合约空头(约 1x 等值)

可以把它理解成一个 Delta 对冲:

  1. 现货腿提供正 Delta(价格涨,现货价值上升;价格跌,现货价值下降)。
  2. 空头腿提供负 Delta(价格涨,空头亏损;价格跌,空头盈利)。
  3. 两条腿名义价值尽量相等时,净 Delta 接近 0,组合法币价值波动明显收敛。

直观示例:

  1. 初始:1 BTC 现货,价格 50,000;同时开等值 1x 空单。
  2. 若价格跌到 25,000:现货缩水,但空单盈利,二者在法币口径上相互抵消。
  3. 若价格涨到 100,000:现货增值,但空单亏损,二者同样相互抵消。

所以它的核心价值不是“放大收益”,而是把账户从单边暴露,改造成近似“合成美元仓位”。

资金费率套利

什么是资金费率

资金费率(Funding Rate)是永续合约市场里的周期性结算机制,目的是让永续合约价格尽量贴近现货价格。 因为永续合约没有到期交割日,交易所需要通过“多空之间的资金交换”去约束价格偏离。

它有几个关键特征:

  1. 资金费不是交易所额外收走的手续费,而是多头和空头之间相互支付。
  2. 结算按固定周期发生(例如 8 小时一次,具体以交易所规则为准)。
  3. 结算金额近似等于:持仓名义价值 × 当期资金费率
  4. 只有在结算时点仍持有仓位,才会产生资金费收付。

方向规则如下:

  1. 资金费率为正:通常多头付费给空头。
  2. 资金费率为负:通常空头付费给多头。

它之所以能把永续价格往现货价格拉回,核心在于“偏离就会产生额外持仓成本/收益”,从而触发套利资金介入:

  1. 当永续价格高于现货(市场偏多)时,资金费率通常转正,多头需要持续付费,做多成本上升;同时会激励“做空永续 + 做多现货”的套利盘入场,推动永续下行、现货上行,价差收敛。
  2. 当永续价格低于现货(市场偏空)时,资金费率通常转负,空头需要持续付费;同时会激励“做多永续 + 做空现货”的套利盘入场,推动永续上行、现货下行,价差收敛。

因此,资金费率本质上是一种动态反馈机制:偏离越明显,套利激励通常越强,价格回归动力越大。

费率套利

费率套利的核心,不是预测涨跌,而是在尽量中性的持仓结构下,赚取资金费结算带来的现金流。 在这套策略里,对应的是“现货多头 + 永续空头”的组合。

资金费率

资金费率常见写法为:

Ft=Pt+Clamp(ItPt, L, U)F_t = P_t + \mathrm{Clamp}(I_t - P_t,\ L,\ U)

其中:

  1. FtF_t:第 tt 个结算周期的资金费率。
  2. PtP_t:溢价指数(可近似理解为合约价格相对现货指数价格的偏离)。
  3. ItI_t:利率项(由交易所规则给定或动态调整)。
  4. Clamp()\mathrm{Clamp}(\cdot):夹限函数,把结果限制在区间 [L,U][L,U] 内,避免单周期费率失真过大。

这条公式表达的意思是: 资金费率由“价格偏离(溢价)”和“利率基准”共同决定,并通过上下限控制极端值。

这里需要单独解释利率项 ItI_t 是什么。 它不是“市场情绪项”,而是资金时间价值的基准项,可以理解为“计价货币与标的货币之间的持有成本差”的简化表达。 常见写法可以近似理解为:

It(rquoterbase)×ΔtI_t \approx (r_{\mathrm{quote}} - r_{\mathrm{base}})\times \Delta t

其中 rquoter_{\mathrm{quote}} 是计价货币资金成本,rbaser_{\mathrm{base}} 是标的资产资金收益/成本,Δt\Delta t 是结算周期。

以币安常见默认口径为例,利率项 ItI_t 采用固定值:0.03%/天。 按 8 小时结算折算后,就是 0.01%/8小时(即 0.03%÷30.03\% \div 3)。

可写成:

  1. Idaily=0.03%=0.0003I_{\mathrm{daily}} = 0.03\% = 0.0003
  2. I8h=0.01%=0.0001I_{8h} = 0.01\% = 0.0001

为什么它通常是“固定且为正”:

  1. 固定:交易所用固定基准替代实时利率曲线,简化结算并降低噪声。
  2. 为正:在长期假设下,计价货币资金成本通常高于标的资产收益,基准差值倾向为正。
  3. 作用:给资金费率一个稳定锚点,防止在溢价接近 0 时缺乏回归约束。

资金费用

在得到 FtF_t 后,再计算资金费金额。对空头视角,在每个结算时点 tt

CtNt×FtC_t \approx N_t \times F_t

其中:

  1. 资金费率为正,空头收钱。
  2. 资金费率为负,空头付钱。
  3. 其中 NtN_t 表示该时点空头名义价值,通常可按 合约张数 × 合约面值 近似(本项目里 1 张约等于 100 USD 名义)。

一个周期内的资金费累计可以写成:

Ctotalt(Nt×Ft)C_{\mathrm{total}} \approx \sum_t \left(N_t \times F_t\right)

为什么资金费率长期为正

假设溢价长期总和为 0(也就是合约价格长期围绕现货上下对称波动),为什么资金费率长期仍可能为正。

设结算周期总数为 NN,并假设:

limN1Nt=1NPt=0,It=I>0\lim_{N\to\infty}\frac{1}{N}\sum_{t=1}^{N}P_t = 0,\quad I_t = I > 0
  1. 情形 A:夹限不触发(最常见的近似推导)

    如果每个周期都满足 IPt[L,U]I-P_t\in[L,U],则:

    Clamp(IPt,L,U)=IPt\mathrm{Clamp}(I-P_t,L,U)=I-P_t

    代回资金费率公式:

    Ft=Pt+(IPt)=IF_t = P_t + (I-P_t) = I

    因此长期平均资金费率为:

    Fˉ=limN1Nt=1NFt=limN1Nt=1NI=I>0\bar F = \lim_{N\to\infty}\frac{1}{N}\sum_{t=1}^{N}F_t = \lim_{N\to\infty}\frac{1}{N}\sum_{t=1}^{N}I = I > 0

    这说明在“溢价长期均值为 0”且“夹限未触发”的条件下,资金费率长期由正的利率项直接主导,结论就是长期为正。

  2. 情形 B:夹限偶尔触发(更贴近实盘)

    定义夹限修正项:

    ϵt=Clamp(IPt,L,U)(IPt)\epsilon_t=\mathrm{Clamp}(I-P_t,L,U)-(I-P_t)

    则有:

    Ft=I+ϵtF_t = I + \epsilon_t

    长期平均变为:

    Fˉ=I+ϵˉ,ϵˉ=limN1Nt=1Nϵt\bar F = I + \bar\epsilon,\quad \bar\epsilon=\lim_{N\to\infty}\frac{1}{N}\sum_{t=1}^{N}\epsilon_t

    所以只要 ϵˉ>I\bar\epsilon > -I,长期平均资金费率依然为正。 当溢价围绕 0 对称波动且极端偏离不频繁时,ϵˉ\bar\epsilon 通常接近 0,此时 Fˉ\bar F 仍近似等于 II 并保持正值。

基于上面的 A/B 推导,可以得到一个策略结论:在给定假设下,长期平均资金费率保持正值。 这时再结合套期保值结构(现货多头 + 等值永续空头),价格方向带来的主要波动被对冲掉,收益重心就会转移到资金费现金流上。

把这一点写成收益分解,可以近似表示为:

Πt(Nt×Ft)Cost\Pi \approx \sum_t (N_t \times F_t) - \mathrm{Cost}

其中 Π\Pi 是阶段总收益,Cost\mathrm{Cost} 包括手续费、滑点和调仓成本。 因此,当长期资金费收入稳定为正,且成本可控时,套保结构就能解释我们为什么可以持续做费率套利。

高密度网格策略

什么是高密度网格

高密度网格的核心,不是追求单笔大利润,而是把一个价格区间拆成大量更细的小区间,让交易触发更连续、闭环更频繁。

它有三个关键特征:

  1. 网格间距小:单格目标通常是很小的百分比利润,强调高周转而不是厚利润。
  2. 单格独立:每一格都有独立的触发与止盈,不需要等整条网格联动才能结算。
  3. 区间内重复:只要价格在区间内来回波动,就能不断重复“触发 -> 闭环 -> 再触发”。

所以高密度网格本质上是在做“波动切片”:把原本粗颗粒的行情波动拆成大量可重复兑现的小利润单元。

等比网格 + 独立空腔的构建

这一套网格不是等差分层,而是“等比买入 + 固定百分比卖出”的组合。

先定义参数:

  1. LL:网格下界(low_price
  2. HH:网格上界(high_price
  3. NN:网格数量(count
  4. pp:单格目标利润率(profit,小数形式)

第一步,先算最高买入价(保证最上层卖出不超过上界):

Bmax=H1+pB_{\max}=\frac{H}{1+p}

第二步,把 LBmaxL \to B_{\max} 按等比分成 NN 个买入点:

r=(BmaxL)1N11r=\left(\frac{B_{\max}}{L}\right)^{\frac{1}{N-1}}-1 Bi=L(1+r)i, i=0,,N1B_i=L(1+r)^i,\ i=0,\dots,N-1

第三步,给每个买入点配置独立卖出目标:

Si=Bi(1+p)S_i=B_i(1+p)

这就是“独立空腔”的核心: 每个网格都有自己的买入触发价和卖出目标价,单格闭环后即可独立结算,不需要等待其他网格同步完成。

参数化示例

为了让上面的构建过程更直观,我们假设如下参数:

  1. low_price = 105000
  2. high_price = 120000
  3. count = 50
  4. profit = 0.5%(即 p=0.005p=0.005

先得到:

Bmax=1200001+0.005119402.99B_{\max}=\frac{120000}{1+0.005}\approx 119402.99 r=(119402.99105000)14910.0026268 (0.26268%)r=\left(\frac{119402.99}{105000}\right)^{\frac{1}{49}}-1\approx 0.0026268 \ (\approx 0.26268\%)

这意味着相邻网格买入价之间的相对步进约为 0.26268%,而每一格的卖出目标固定为买入价上浮 0.5%。

抽几档网格可以看到结构:

  1. Grid 0:B0=105000.0, S0=105525.0B_0=105000.0,\ S_0=105525.0
  2. Grid 1:B1=105275.8, S1=105802.2B_1=105275.8,\ S_1=105802.2
  3. Grid 2:B2=105552.3, S2=106080.1B_2=105552.3,\ S_2=106080.1
  4. Grid 10:B10=107791.0, S10=108329.9B_{10}=107791.0,\ S_{10}=108329.9
  5. Grid 20:B20=110656.1, S20=111209.4B_{20}=110656.1,\ S_{20}=111209.4
  6. Grid 30:B30=113597.4, S30=114165.4B_{30}=113597.4,\ S_{30}=114165.4
  7. Grid 40:B40=116616.9, S40=117200.0B_{40}=116616.9,\ S_{40}=117200.0
  8. Grid 49:B49=119403.0, S49=120000.0B_{49}=119403.0,\ S_{49}=120000.0

可以用一张简化的图理解这组参数下的网格形态:

价格轴(上高下低)
^
| S49 120000.0
| S40 117200.0
| S30 114165.4
| S20 111209.4
| S10 108329.9 <- 离当前最近的卖出(开空)目标
|
| ---------- 当前价格附近 ----------
|
| B10 107791.0 <- 离当前最近的买入(平空)触发
| B2 105552.3
| B1 105275.8
| B0 105000.0
v
说明:
1. B_i 与 S_i 一一对应,单格利润固定为 p=0.5%。
2. 价格下探触发 B_i(平空),反弹触发 S_i(开空),完成单格闭环。
3. 网格是等比分布,相对间距稳定,越往上绝对价差越大。

从这个示例可以看出两件事:

  1. 网格买入价是等比分布,越往上绝对价差越大,但相对步进保持稳定。
  2. 每格卖出价都由同一个利润率 pp 决定,单格闭环标准完全一致,便于规模化执行。

和传统网格的差别

和传统网格相比,它的差别主要在三个地方:

  1. 密度不同:传统网格间距更大,追求单笔利润;高密度网格间距更小,追求成交频次。
  2. 结算方式不同:传统网格常见“阶梯接力”感更强;高密度网格强调单格独立闭环,局部可先结算。
  3. 收益结构不同:传统网格更依赖较大波段;高密度网格更依赖持续震荡中的微小来回。

从长期执行结果看,高密度网格的收益曲线通常会比传统网格更平滑,也会略高一些。 可以把两者理解为同一条目标曲线的两种离散化方式:

  1. 传统网格更像“台阶”,触发点稀疏,很多中间波动没有被充分利用。
  2. 高密度网格更像“滑滑梯”,触发点更密,能把中间波动切得更细。

如果把传统网格看成必须使用阶梯函数近似,那么高密度网格相当于用更细的分段去逼近连续曲线。 两者之间“多出来的那部分”,可以近似理解为把每个台阶上方/旁侧未覆盖的小三角形逐步填满后的总和。

用近似表达写就是:

ΔRi12ΔPiΔQi\Delta R \approx \sum_i \frac{1}{2}\,\Delta P_i\,\Delta Q_i

其中 ΔPi\Delta P_i 是第 ii 段价格步长,ΔQi\Delta Q_i 是对应的仓位/收益响应步长。 网格越密,步长越小,离散误差越小,执行曲线越接近连续曲线,长期表现通常也越平滑。

网格买卖与开空平空

在这套策略里,底层本来就持有对冲空单,因此网格里的“买/卖”并不是去加减现货,而是映射为空单的平仓与开仓:

  1. 网格“买入”对应平空:价格下行触发 BiB_i 时,回补(平掉)一部分空单。
  2. 网格“卖出”对应开空:价格反弹触发 SiS_i 时,再开回同等数量的空单。
  3. 单格闭环保持一致:同一格里先平空、后开空,数量一致,就完成一次网格利润兑现。

可以写成一格的执行流程:

触发 Bi:平空 q触发 Si=Bi(1+p):开空 q\begin{aligned} \text{触发 }B_i &: \text{平空 }q \\ \text{触发 }S_i=B_i(1+p) &: \text{开空 }q \end{aligned}

忽略手续费和滑点时,单格收益近似为:

Πiq(SiBi)\Pi_i \approx q\,(S_i-B_i)

还有一个实盘层面的核心点是交易磨损。以币安常见费率档位举例(Regular User,具体以费率页实时显示为准):

  1. 现货:Maker/Taker 常见为 0.10% / 0.10%
  2. 币本位合约:Maker/Taker 常见为 0.02% / 0.05%

这套网格的订单都是挂单,因此按 Maker 口径估算。单格闭环需要两笔成交(平空一次 + 开空一次):

  1. 走现货双边(Maker+Maker):手续费约 0.20%
  2. 走合约双边(Maker+Maker):手续费约 0.04%

也就是说,同样的成交名义下,手续费磨损大约可以下降 80%。

伪代码示例

当前代码在 GitHub 托管,暂时没有开源计划;如果有需要请邮箱联系我。下面是部分伪代码示例:

# 执行网格
def execute_grids(exit_handler: ExitHandler, tg_sender: TelegramSender, config: Configuration):
logging.info("开始执行网格交易")
# 币安客户端
client = create_client(config.api_key, config.api_secret, config.testnet)
# 获取仓位模式
hedge_position_mode = client.get_position_mode()["dualSidePosition"]
if hedge_position_mode:
logging.info("启用双向持仓模式")
# 获取交易对信息和单张合约的价值
symbol_info = get_symbol_info(client, config.symbol)
contract_size = float(symbol_info["contractSize"])
# 计算网格
grids = compute_grids(config)
# 获取之前的状态
state = get_state()
# 重新计算激活的网格
# 复用之前的网格
# 其他的全是算作过期的网格
# 省略:active/expired 合并细节
state = reconcile_state(state, grids)
# 保存状态
save_state(state)
# 输出信息
tg_sender.send(f"""{config.symbol} 网格交易启动
价格范围: {config.low_price} - {config.high_price}
网格数量: {config.count}
每格利润: {config.profit} %
每格数量: {config.quantity}
总交易量: {config.quantity * config.count}""")
# 订单缓存
order_cache = OrderCache(client, symbol=config.symbol)
# 开始进入主循环
while exit_handler.is_running:
# 刷新订单缓存
order_cache.refresh()
# 同步订单信息,只同步状态还有可能发生改变的订单
# 不会再发生改变的订单也可能被交易所清理而查询不到
# 省略:买入单/卖出单逐笔同步细节
sync_orders(state, order_cache)
# 清理过期的网格的买入订单
# 省略:逐单 cancel + 异常处理细节
cancel_expired_buy_orders(client, config, state)
# 长期订单刷新,防止被交易所自动取消(币安对超过1年的订单执行自动取消)
# 买入单刷新
# 只刷新完全没有成交的,且挂单时间超过7天的
# 卖出单刷新
# 只刷新完全没有成交的
# 省略:撤旧单 -> 落新单 -> 持久化细节
refresh_old_orders(client, config, state, hedge_position_mode)
# 根据已经买入的数量同步挂出卖出单
# 已经卖出或者即将卖出的数量
# 还需要补充多少卖单,才能保持买卖平衡
# 省略:数量差计算与通知细节
sync_sell_orders(client, config, state, hedge_position_mode, tg_sender)
# 获取当前价格
price = get_price(client, symbol=config.symbol)
# 同步买入卖出单的状态
# 订单已经全部执行完成
# 拷贝一份放入历史记录中,只保留最近的100次
# 统计今日
# 发送TG通知
# 因为我们是轮询获取当前最新价格
# 有可能会出现一种情况,卖出单成功了,但是在下次获取价格的时候,当前价格低于本网格的卖出价格
# 从而导致这个网格的买入单无法重新挂入
# 所以这里使用两者最大值来作为当前价格(曾经达到的最大价格)
# 省略:成交汇总消息拼装细节
price = settle_completed_grids(state, config, contract_size, tg_sender, price)
# 买入挂单
# 如果当前价格小于网格的卖出价格
# 表示当前价格在网格之下或者正处于网格之中
# 这种情况不买入
# 如果该网格的买入价格在已过期的网格内,则不开单
# 存在买入挂单,且订单状态正常(没有过期/取消),则不用管
# 如果买入挂单不存在,或者状态异常,则需要新建买入挂单
# 省略:下单参数与日志细节
place_buy_orders(client, config, state, hedge_position_mode, price)
# 清理过期的网格数据
state.expired = list(filter(lambda g: g.buy_order is not None, state.expired))
# 保存状态
save_state(state)
time.sleep(1)
# 保存状态
logging.info("准备退出网格执行,保存状态")
save_state(state)

风险因子

这套方法的收益来源虽然清晰,但并不等于低风险或无风险。实盘里真正决定长期结果的,往往不是“策略是否有效”,而是能否持续控制下面这些风险因子。

单边行情破网风险

网格依赖的是区间内往复波动,一旦行情持续单边并走出网格区间(上破 HH 或下破 LL),就会发生“破网”:

  1. 原本的“触发 BiB_i -> 触发 SiS_i”闭环节奏被打断,成交频率明显下降。
  2. 收益来源从可重复的小价差,转向被动持仓与等待区间重建。

ADL(自动减仓)风险

主流中心化合约交易所通常都有 ADL(Auto-Deleveraging,自动减仓)机制。它的核心不是“正常平仓”,而是系统在极端情况下的被动风险转移机制。

ADL 的典型触发链路可以理解为:

  1. 市场单边快速波动,大量对手盘仓位被强平。
  2. 强平仓位无法在市场上以理想价格完全成交,出现穿仓压力。
  3. 保险基金不足以覆盖全部损失时,系统会启动 ADL。
  4. 系统从对手方向的持仓里,按优先队列(通常与盈利水平、杠杆水平等有关)选择账户,执行强制减仓。
  5. 被选中的仓位会被动减少或平掉,哪怕用户并没有主动下单。

为什么会存在这个风险:

  1. 极端行情下,价格跳跃和流动性蒸发会让爆仓仓位难以及时成交,风险无法只靠撮合自然消化。
  2. 保险基金是有限缓冲,不可能无限覆盖所有穿仓损失。
  3. 为了避免系统性坏账扩散到平台整体,交易所需要用 ADL 把尾部损失快速出清。

对这套“现货 + 合约空单 + 网格”的影响在于:如果空头腿处于高盈利且高优先级,可能在你不想平仓的时候被 ADL 强制减仓,导致对冲结构被动失衡,后续网格执行与净暴露管理都会被打乱。

交易所与执行风险

  1. API 延迟、断连、限频或下单失败会造成网格断层,出现“该平未平、该开未开”。
  2. 极端行情下可能出现风控限制、临时参数调整或流动性异常,执行结果与预期偏离。
  3. 还需要考虑交易所信用与托管风险:如果交易所出现严重经营问题甚至“跑路”,账户内持有的是中心化平台上的合约空单与保证金,而不是去中心化自托管资产,存在资产受限或无法兑付的尾部风险。

资金费率风险

  1. 资金费率可能阶段性转负,空头腿会从“收资金费”变成“付资金费”。
  2. 费率在极端情绪时可能短期剧烈波动,单日现金流会明显偏离长期均值。
  3. 如果策略收益过度依赖正费率,遇到连续负费率阶段时,净收益会被快速侵蚀。

基差与对冲偏离风险

  1. 现货与永续并非严格同步,基差扩张/收敛会带来额外盈亏波动。
  2. 空头名义与现货名义若长期不等值(例如部分成交、仓位漂移),净 Delta 会偏离 0。
  3. 在快速单边行情中,这种偏离会被放大,导致组合不再“中性”。

总结

这个策略的核心可以归纳为三点:

  1. 先通过“现货 + 等值空头”构建套期保值底座,把主要方向风险压低。
  2. 再利用资金费率机制,在中性结构下获取长期资金费现金流。
  3. 最后叠加高密度网格,把震荡行情切成更细的可重复利润单元。

这套方法本质上是一个“对冲底座 + 费率套利 + 高频网格执行”的组合框架。其风险和收益基本等同于资金的无风险收益(利率)+ 流动性提供者收益(做市商收益)。 如果你想看完整实现细节、参数配置和代码逻辑, 请邮箱联系我索取仓库权限.

最后提醒:任何策略都不保证盈利。实盘仍然存在行情波动、执行与平台稳定性、以及杠杆和流动性等风险。请务必在充分理解风险并做好仓位控制的前提下参与交易。