反向Beta套利策略设计方案

反向Beta套利策略设计方案

做空ETH + 做多BTC,与现有策略(做多ETH + 做空BTC)互为镜像

1. 策略概述

1.1 核心思想

现有策略捕捉的是 ETH下跌弹性收敛(负收益beta EMA下降 → 做多ETH等待弹性恢复)。

反向策略捕捉的是 ETH上涨弹性收敛(正收益beta EMA下降 → 做空ETH,因上涨放大效应减弱意味着ETH相对BTC走弱)。

1.2 策略对比

维度 现有策略(做多) 反向策略(做空)
方向 Long ETH + Short BTC Short ETH + Long BTC
主要beta 负收益beta(ETH下跌时的放大倍数) 正收益beta(ETH上涨时的放大倍数)
条件1 负收益EMA < 负收益Mean 正收益EMA < 正收益Mean
条件2 负收益EMA < 正收益EMA 正收益EMA < 负收益EMA
经济含义 下跌放大效应减弱 → 做多 上涨放大效应减弱 → 做空
BTC仓位倍数 负收益beta Mean 正收益beta Mean
direction "long" "short"

2. 信号条件详解

2.1 开仓条件

取最近10根 正收益率 ETH K线(eth_return > 0)对应的beta值:

beta = eth_return / btc_return    (同涨:ETH涨 & BTC涨)
beta = 3.0                        (背离:ETH涨 & BTC跌,惩罚性封顶)
跳过:BTC波动 < min_btc_return_abs (分母不可靠)

条件1:正收益beta序列的 EMA(span=5) < 正收益beta序列的 Mean

  • 含义:近期正收益beta呈下降趋势,ETH上涨放大效应正在减弱

条件2:正收益beta EMA < 负收益beta EMA

  • 含义:上涨放大效应 < 下跌放大效应,ETH相对BTC的正向弹性弱于负向弹性
  • 注:若负收益K线不足10根,此条件默认通过(与现有策略的容错逻辑对称)

2.2 仓位比例

ETH仓位(做空)= eth_position_usd(固定,如1000 USD)
BTC仓位(做多)= positive_mean_beta × eth_position_usd

positive_mean_beta 为正收益beta序列的算术均值,代表ETH上涨时相对BTC的平均放大倍数,用作BTC的对冲倍数。

2.3 平仓逻辑

完全复用现有风控框架,无需新增逻辑:

平仓类型 条件 说明
止损 PnL < -3% 与现有相同
移动止盈 峰值PnL ≥ 5% 后回撤 0.5% 与现有相同
持仓超时 持仓 > 72h 与现有相同
信号消退 PnL > 2% 且反向开仓条件不满足 使用反向条件复查

信号消退的反向条件复查

  • 复查条件1: 正收益EMA 是否仍 < 正收益Mean
  • 复查条件2: 正收益EMA 是否仍 < 负收益EMA
  • 任一不满足 + PnL > 阈值 → 触发平仓

3. 代码改动设计

3.1 涉及文件

文件 改动类型 改动量
src/trading/strategy.py 新增方法 ~180行
src/trading/risk_manager.py 修改pre_trade_check ~10行
src/trading/position_manager.py 内部key扩展 ~30行
src/trading/orchestrator.py 新增反向流程 ~150行

3.2 strategy.py 改动

BetaArbitrageStrategy 类中新增:

新增状态字段

self._has_reverse_position: bool = False
self._reverse_cooldown_until: datetime | None = None

新增方法

方法 用途
check_reverse_signal() -> EntrySignal | None 检查反向开仓信号
check_reverse_entry_conditions_met() -> (bool, str) 反向信号消退复查
get_reverse_signal_snapshot() -> dict | None 反向信号日志快照
on_reverse_position_opened() 反向持仓状态更新
on_reverse_position_closed() 反向平仓状态更新
has_reverse_position (property) 反向持仓查询

check_reverse_signal 核心逻辑

def check_reverse_signal(self) -> EntrySignal | None:
    # 1. 冷却/持仓检查
    if self._has_reverse_position: return None

    # 2. 计算正收益beta序列 (复用 _calculate_positive_beta_series)
    positive_betas = self._calculate_positive_beta_series()
    if positive_betas is None: return None

    positive_ema = EMA(positive_betas, span=5)
    positive_mean = mean(positive_betas)

    # 3. 条件1: 正收益EMA < 正收益Mean
    cond1 = positive_ema < positive_mean

    # 4. 条件2: 正收益EMA < 负收益EMA
    negative_betas = self._calculate_beta_series()
    if negative_betas is not None:
        negative_ema = EMA(negative_betas, span=5)
        cond2 = positive_ema < negative_ema
    else:
        cond2 = True  # 负收益不足时默认通过

    # 5. 信号触发
    if cond1 and cond2:
        return EntrySignal(
            ema_beta=positive_ema,      # 用于记录
            mean_beta=positive_mean,    # 用于BTC仓位计算
            eth_price=..., btc_price=...
        )

设计要点

  • 复用 _calculate_positive_beta_series()_calculate_beta_series(),不新增beta计算逻辑
  • EntrySignal.mean_beta 放入 positive_mean,这样 calculate_position_size()btc_notional = signal.beta_mean * eth_position_usd 直接生效

3.3 risk_manager.py 改动

当前 pre_trade_check() 的重复仓位检查:

# 现有逻辑:有任何仓位就拒绝
if open_positions:
    return False, "已有活跃仓位"

改为 方向感知

# 新逻辑:仅同方向仓位才拒绝
for pos in open_positions:
    if pos.direction == signal.direction:
        return False, f"已有同方向({signal.direction})活跃仓位"

保证金检查:无需改动。available_balance 已扣除现有仓位占用的保证金,自动处理两个仓位并存的情况。

3.4 position_manager.py 改动

问题

当前仓位字典以 PairKey = (symbol, base_symbol) 为key:

self._positions: dict[PairKey, PairPosition] = {}

做多和做空都是 (ETH, BTC),key相同会互相覆盖。

方案:内部key扩展为3元组

# 改前
def _pair_key(pos: PairPosition) -> PairKey:
    return (pos.symbol, pos.base_symbol)

# 改后
def _pair_key(pos: PairPosition) -> tuple[str, str, str]:
    return (pos.symbol, pos.base_symbol, pos.direction)

影响范围:

  • _positions, _opening_pairs, _close_cooldown, _ghost_strike_count 的key类型
  • has_position(symbol, base_symbol) → 新增 direction 参数
  • close_position(symbol, base_symbol, ...) → 新增 direction 参数
  • open_position() 中的key构造加入 signal.direction
  • sync_with_exchange() 返回值扩展为3元组
  • _pair_label() 兼容2元组和3元组
def _pair_label(key) -> str:
    if len(key) >= 3 and key[2]:
        dir_str = "做多" if key[2] == "long" else "做空"
        return f"{key[0]}|{key[1]}|{dir_str}" if key[1] else f"{key[0]}|{dir_str}"
    return f"{key[0]}|{key[1]}" if len(key) >= 2 and key[1] else str(key[0])

3.5 orchestrator.py 改动

启动阶段

# 恢复反向仓位状态
if any(
    p.pair_mode == "pair"
    and p.symbol == ba.eth_symbol
    and p.base_symbol == ba.btc_symbol
    and p.direction == "short"
    for p in self._position_manager.open_positions
):
    self._strategy.on_reverse_position_opened()

K线更新入口

def on_kline_update(self, ...):
    self._strategy.update_kline(...)

    # 现有策略信号检测
    if not self._strategy.has_position:
        signal = self._strategy.check_signal()
        if signal:
            self._try_open_position(signal)

    # 反向策略信号检测(独立于现有策略)
    if not self._strategy.has_reverse_position:
        reverse_signal = self._strategy.check_reverse_signal()
        if reverse_signal:
            self._try_open_reverse_position(reverse_signal)

新增 _try_open_reverse_position

_try_open_position 结构相同,差异:

  • signal.direction = "short"
  • signal.beta_mean = entry.mean_beta(即 positive_mean,用于BTC仓位计算)
  • 日志标记为"ETH空 + BTC多"
  • 开仓成功后调用 self._strategy.on_reverse_position_opened()

监控线程改动

def _stop_loss_monitor(self):
    for pos in self._position_manager.open_positions:
        # ... 止损/移动止盈/超时检查(无需修改,已方向无关)

        # 信号消退平仓:根据仓位方向选择对应的条件复查
        elif pnl_pct > 0 and self._strategy:
            if pos.direction == "short":
                entry_met, detail = self._strategy.check_reverse_entry_conditions_met()
            else:
                entry_met, detail = self._strategy.check_entry_conditions_met()

            if self._risk_manager.check_signal_exit(pos, entry_met):
                close_reason = ...

平仓回调

def _close_with_retry(self, pos, reason):
    # ... 平仓执行
    if close_result:
        # 根据方向调用对应的策略状态更新
        if pos.direction == "short":
            self._strategy.on_reverse_position_closed()
        else:
            self._strategy.on_position_closed()

仓位同步

def _position_sync(self):
    closed_pairs, adopted_pairs, ... = self._position_manager.sync_with_exchange()

    for pair in closed_pairs:
        if pair[:2] == beta_pair:
            if len(pair) >= 3 and pair[2] == "short":
                self._strategy.on_reverse_position_closed()
            else:
                self._strategy.on_position_closed()

4. 数据流图

WebSocket K线 (1h ETH/BTC)
    │
    ▼
strategy.update_kline()     ← 共用同一份K线缓冲区
    │
    ├──▶ check_signal()              [现有:做多ETH做空BTC]
    │       └── 负收益beta EMA/Mean
    │           条件1: 负EMA < 负Mean
    │           条件2: 负EMA < 正EMA
    │               │
    │               ▼ EntrySignal (direction=long)
    │           _try_open_position()
    │               └── signal.beta_mean = negative_mean
    │
    └──▶ check_reverse_signal()      [新增:做空ETH做多BTC]
            └── 正收益beta EMA/Mean
                条件1: 正EMA < 正Mean
                条件2: 正EMA < 负EMA
                    │
                    ▼ EntrySignal (direction=short)
                _try_open_reverse_position()
                    └── signal.beta_mean = positive_mean
监控线程 (每3秒)
    │
    ├── 止损:      PnL < -3%                          ← 方向无关
    ├── 移动止盈:  峰值 ≥ 5% 后回撤 0.5%              ← 方向无关
    ├── 超时:      持仓 > 72h                          ← 方向无关
    └── 信号消退:  PnL > 2% 且条件不满足               ← 根据 direction 分派
                     ├── direction=long  → check_entry_conditions_met()
                     └── direction=short → check_reverse_entry_conditions_met()

5. 仓位并存规则

  • 做多仓位和做空仓位 可以同时存在(不同方向,互不影响)
  • 同方向 不允许 重复开仓(做多最多1个,做空最多1个)
  • 两个仓位共用同一份K线缓冲区,共用同一个策略实例
  • 独立的冷却期、持仓状态、峰值PnL追踪
  • 风控保证金检查自动处理(available_balance已扣除现有仓位占用)

6. 不需要改动的模块

模块 原因
executor.py 已支持 buy/sell 双向,无需改动
risk_manager.calculate_pnl() 基于 alt_side/base_side 计算,方向无关
risk_manager.check_stop_loss() 基于 PnL 百分比,方向无关
risk_manager.check_trailing_stop() 基于 PnL 百分比,方向无关
risk_manager.check_signal_exit() 接收外部传入的 entry_conditions_met
risk_manager.calculate_position_size() 使用 signal.beta_mean,通过传参适配
trade_repository.py 通用存储,无方向耦合
realtime_kline_service_base.py K线推送层,与策略无关
config.py (BetaArbConfig) 两个策略共用相同参数

7. 风险与注意事项

7.1 同时开仓场景

理论上两个信号可能在同一根K线同时触发。由于共用 available_balance,第二个开仓的保证金检查会自动考虑第一个已占用的保证金。

7.2 对冲效果

做多+做空同时开仓时,ETH的多空会部分对冲,但BTC也是多空部分对冲。整体收益取决于两组beta值的差异。

7.3 配置共享

两个策略共用相同的 BetaArbConfig 参数(止损、止盈、杠杆、仓位金额等)。如未来需要差异化配置,可扩展 BetaArbConfig 添加 reverse_ 前缀字段。

7.4 日志区分

所有反向策略日志加"反向"前缀,Lark告警标注"ETH空+BTC多"以区分方向。

Read more

AMI的优越性

世界模型(World Models)的具体例子 如下,我按类型分类,便于理解。每类都附带实际实现、演示效果和应用场景。 1. Yann LeCun / Meta 的 JEPA 系列(最直接对应“世界模型”概念) 这些是 LeCun 主张的非生成式抽象预测世界模型代表。 * I-JEPA(Image JEPA,2023) 输入一张图像,模型把不同区域(context 和 target)编码成抽象表示,然后预测 target 的表示(不在像素级别重建)。 例子:给定一张遮挡了部分物体的图片,模型能预测“被遮挡物体的大致位置和属性”,构建对物体持久性和空间关系的理解。 这是一个“原始世界模型”,能学习物理常识(如物体不会凭空消失)。 * V-JEPA / V-JEPA 2(Video JEPA,

By SHI XIAOLONG

什么是:“世界模型(World Models)”

世界模型(World Models) 是人工智能领域的一个核心概念,尤其在 Yann LeCun 等研究者推动的下一代 AI 架构中占据中心位置。它指的是 AI 系统在内部构建的对现实世界的抽象模拟或内部表示,让机器能够像人类或动物一样“理解”物理世界、预测未来、规划行动。 简单比喻 想象你闭上眼睛也能“看到”房间里的物体会如何移动、碰撞或掉落——这就是你大脑里的世界模型。AI 的世界模型就是类似的“数字孪生”(digital twin)或“内部模拟器”:它不是简单记住数据,而是学习世界的动态、因果关系和物理直觉(如重力、物体持久性、遮挡、因果等)。 为什么需要世界模型? 当前主流的大型语言模型(LLM) 擅长处理文本(统计模式预测),但存在根本局限: * 缺乏对物理世界的真正理解 → 容易“幻觉”、无法可靠规划。 * 样本效率低 → 人类/

By SHI XIAOLONG

K线周期可配置化设计方案

K线周期可配置化设计方案 1. 背景与目标 当前 Beta 套利策略的 K 线周期硬编码为 "1h",分散在多个文件中。需要: 1. 将 K 线周期从 1h 改为 2h 2. 提取为环境变量 BETA_ARB_KLINE_INTERVAL,使其可在 .env 中配置 2. 影响范围分析 2.1 需要修改的文件(共 6 个) 文件 硬编码位置 修改内容 src/trading/config.py BetaArbConfig dataclass 新增 kline_interval 字段,

By SHI XIAOLONG

对于空间环境、“信息/逻辑”(比如代码、结构、表达)秩序追求的心理特征分析

一、为什么是“空间 + 信息”同时强化? 因为你当年面对的是“双重失控”: 1️⃣ 外部世界是脏乱 + 失序的 * 空间被污染 * 行为无边界 * 基本生活秩序崩塌 👉 所以你现在会强烈要求: * 桌面干净 * 房间有序 * 物品可控 这是在修复:“物理世界必须是可控的” 2️⃣ 人的行为和逻辑也是混乱的 * 没有规则 * 没有底线 * 没有理性 👉 所以你现在会特别在意: * 表达是否清晰 * 逻辑是否自洽 * 结构是否优雅 * 代码是否干净 这是在修复:“认知世界必须是合理的” 二、你其实构建了一个“高纯度系统” 你现在的偏好,本质上是: 👉 低噪音 + 高结构 + 强控制感 具体表现就是: * 空间:极简、整洁、可预测 * 信息:清晰、压缩、无冗余 这类人有一个很明显的优势: 👉 处理复杂问题时,

By SHI XIAOLONG