Files

39 KiB
Raw Permalink Blame History

预测市场策略与套利

预测市场概述

预测市场(Prediction Markets)是交易与未来事件结果挂钩的合约的市场,合约价格可解读为市场聚合的预测概率 [*1*]。著名的平台包括 Polymarket、Iowa Electronic Markets、TradeSports 等。

主要交易策略

1. 做市策略(Market-Making

做市商同时在买卖两侧挂单,通过赚取买卖价差获利。研究表明,做市商在预测市场中至关重要——他们提供流动性,使连续交易成为可能。在 STOCCER 世界杯预测市场中,做市商参与了 81% 的合约交易,贡献了 85% 的交易量,且其最终资产价值显著高于普通交易者 [*2*]

2. 信息优势策略

顶级交易者通过识别定价错误的合约获利。Polymarket 最新数据显示,前 1% 的用户掌握了 84% 的总利润,这些收益几乎全部来自能够"跑赢"市场隐含概率的成熟交易者。而 70.8% 的用户亏损 [*3*]

3. 跨市场套利

不同平台之间或同一平台的不同合约之间可能存在套利机会:

  • 基本组合套利:当所有合约的卖出价之和低于基本组合价格(所有合约 payoff 之和)时,买入所有合约并卖出基本组合可获利;反之亦然。研究显示,在 STOCCER 市场中大幅套利机会极少且被快速修正(10% 阈值的套利机会仅出现 7 次,平均持续 11 分钟) [*2*]
  • 跨平台套利:不同预测市场对同一事件的价格可能存在差异。例如在足球博彩市场中,通过在不同博彩公司之间组合投注可以产生有限但高利润的套利机会 [*4*]
  • 博彩公司与博彩交易所之间的套利:研究表明,在顶级欧洲足球联赛中,19.2% 的比赛可通过在博彩公司和博彩交易所之间组合投注获得确定性正回报 [*5*]

亏损的行为预测因子

根据 Polymarket 的数百万用户数据分析 [*3*]

因子 对亏损概率的影响
极端价格交易(<10¢ 或 >90¢) 亏损概率增加 3 个百分点
纯流动性提取者(Taker 相比纯做市商,亏损概率高 36 个百分点
过度交易 亏损概率增加 5 个百分点
品类集中 亏损概率增加 13.6 个百分点

关键结论

  1. 预测市场总体价格有效:价格为 p 的合约约有 $p$% 的概率正确结算,说明市场整体效率高 [*3*]
  2. 长期偏误(Favorite-Longshot Bias:低概率事件往往被高估,高概率事件被低估,这与期权市场的"波动率微笑"类似 [*1*]
  3. 普通投资者预期回报接近于零(扣除费用后为负),财富从大量非成熟投资者转移给少数成熟做市商和信息交易者 [*3*]

基于你提供的 Polymarket API 文档和研究文献,以下是可实际构建的盈利机器人方案,按盈利潜力从高到低排列:


1. 🏆 做市商机器人(最推荐,证据最强)

核心策略:在订单簿两侧挂限价单,赚取买卖价差。

为什么最赚钱:研究显示,从纯吃单者(Taker)转变为纯做市商(Maker),亏损概率降低 36 个百分点——这是所有策略中效果最强的单一因子 [*3*]。做市商占据了 Polymarket 绝大部分利润。

API 使用

  • GET /book?token_id=... → 获取订单簿快照
  • POST /books → 批量获取多个 token 的订单簿
  • GET /spread?token_id=... → 监控价差
  • 鉴权写入端点 → 挂限价单(Maker)和撤单
  • WebSocket → 实时订单簿更新

实现要点

  • 计算最优买卖报价(参考当前价差 + 历史波动率)
  • 库存管理:控制 Yes/No 双边净敞口
  • 动态调整:高波动时放宽价差,低波动时收紧
  • 关注 Maker Rebate 返佣机制(部分市场返还 20-25% 费用)

2. 套利机器人

2.1 组合套利(Combinatorial Arbitrage

同一事件下多个互斥市场的价格之和应 ≈ 1,如果偏离则存在套利。

公式

  • P(Yes) + P(No) > 1 → 卖出 Yes 和 No,买入基本组合(获利 = 总和 - 1)
  • P(Yes) + P(No) < 1 → 买入 Yes 和 No,卖出基本组合(获利 = 1 - 总和)

API 使用

  • GET /marketsGamma)→ 获取同一 event 下的所有 market
  • GET /price?token_id=...&side=BUY|SELL → 获取最优买卖价
  • POST /prices → 批量获取价格

注意:研究表明套利机会极少且平均持续仅 11 分钟,需要高速自动化 [*2*]

2.2 跨市场/跨平台套利

  • 监控 Polymarket 和 Kalshi 等不同平台对同一事件的定价差异
  • 在价格低的平台买入,价格高的平台卖出
  • 需考虑跨链转账成本和时间差

2.3 多结果市场套利

对于 negRisk=true 的多结果市场,所有结果合约价格之和应 ≤ 1。若 sum < 1,买入所有结果可保证正回报。


3. 📊 信息优势交易机器人

策略:识别价格偏离合理概率的合约,低买高卖。

核心数据来源

  • GET /events?active=true&closed=false&order=volume24hr → 高流动性事件
  • GET /prices-history?market=...&interval=... → 历史价格序列
  • GET /markets → 市场元数据(到期日、状态等)
  • GET /trades → 成交历史(识别大额订单)

实现方式

  • 机器学习模型:用历史价格、成交量、持仓量等特征预测价格走向
  • 参考信息聚合:将外部数据(民调、新闻情绪)与市场隐含概率对比
  • 均值回归:价格短期内大幅偏离历史均线时反向交易

注意Polymarket 价格整体有效(校准度接近 45 度线),意味着跑赢市场需要真正的信息优势,而非简单策略 [*3*]


4. 💰 流动性挖矿/返佣机器人

策略:利用 Polymarket 的 Maker Rebate 机制,挂单赚取返佣。

适用市场(有费用和返佣的市场):

  • 加密市场:费率 = 0.25 × 价格²,Maker 返佣 20%
  • 体育市场:费率 = 0.0175 × 价格,Maker 返佣 25%

API 使用

  • GET /events?tag_id=...&active=true → 按标签筛选目标市场
  • 鉴权写入端点 → 挂 Maker 限价单
  • WebSocket → 监控成交和返佣

盈利模式:即使做市本身不赚钱,返佣收入也可覆盖成本并产生正收益。


5. 🔍 持仓监控/跟单机器人

策略:追踪顶级交易者的持仓变化,跟随其交易。

API 使用

  • GET /v1/market-positions?market={conditionId}&sortBy=TOKENS&sortDirection=DESC → 按持仓量排序的 top 持仓人
  • GET /positions?user=... → 特定用户的持仓明细
  • GET /activity?user=...&type=TRADE → 用户的交易活动
  • GET /holders?market={conditionId} → 市场 top 持仓人

实现方式

  • 识别持续盈利的地址(通过 Data API 的 cashPnl 字段)
  • 监控其开仓/平仓行为
  • 延迟跟随(注意:顶级交易者可能已知晓价格发现)

6. 📈 事件驱动交易机器人

策略:在事件临近结算时交易,利用结算前的价格发现和流动性集中。

典型场景

  • 选举结果公布前几小时的价格波动
  • 体育比赛进行中的实时价格变动
  • 经济数据发布前后的波动

API 使用

  • GET /events?closed=false&end_date_min={now}&end_date_max={+7d} → 即将到期的事件
  • WebSocket RTDS → 实时价格和成交数据
  • GET /midpoint?token_id=... → 实时中间价

📋 各策略对比总结

策略 盈利潜力 技术难度 所需资本 核心风险 研究支持
做市商 中高 库存风险、逆向选择 最强 [*3*]
组合套利 机会稀缺、速度竞争 [*2*]
信息交易 需要真正信息优势 [*3*]
返佣挖矿 价格不利变动 [*3*]
跟单 延迟成本、被操纵 间接
事件驱动 波动风险 一般

⚠️ 关键风险提示

  1. 70.8% 用户亏损,预期收益为负(扣除费用后) [*3*]
  2. 价格整体有效,系统性跑赢需要真正的信息优势
  3. 极端价格交易(<10¢ 或 >90¢)增加亏损概率 3 个百分点
  4. 过度交易(高频)增加亏损概率 5 个百分点
  5. 品类集中(只做体育或只做政治)增加亏损概率 13.6 个百分点
  6. 25% 的历史成交量可能是刷量交易wash trading),需注意数据质量

建议从做市商机器人开始,这是研究证据最充分、盈利能力最强的策略,且 Polymarket 的 API 和返佣机制为此提供了良好支持。

持仓监控/跟单机器人具体讲讲

持仓监控/跟单机器人 — 完整设计指南

核心原理

跟单机器人的目标是:识别 Polymarket 上持续盈利的顶级交易者,监控其持仓变化,并自动跟随其交易

研究显示,Polymarket 上 前 1% 的用户掌握了 84% 的总利润,这些收益来自他们识别定价错误合约的能力 [*3*]。这意味着跟对"聪明钱"可以大幅提高胜率。


一、如何识别"聪明钱"地址

方法 1:按累积 PnL 筛选(最直接)

使用 Data API 的 /positions 端点,遍历用户地址并查看 cashPnl 字段:

GET /positions?user=0x...&sortBy=CASHPNL&sortDirection=DESC

关键字段:

  • cashPnl — 已实现盈亏(美元)
  • percentPnl — 盈亏百分比
  • realizedPnl — 已结算的盈亏
  • totalBought — 总买入量

筛选条件建议

指标 入选门槛 原因
cashPnl > $10,000 排除运气成分 研究显示前 1% 用户获得 84% 利润 [*3*]
交易次数 > 100 排除小样本偏差 中位数用户仅 24 笔交易 [*3*]
持仓品种数 > 5 排除品类集中风险 品类集中增加亏损概率 13.6% [*3*]
做市交易占比 > 20% 排除纯吃单者 做市降低亏损概率 36 个百分点 [*3*]

方法 2:按市场持仓量排序(Top Holders)

GET /v1/market-positions?market={conditionId}&sortBy=TOKENS&sortDirection=DESC&limit=50

返回某市场持仓量最大的用户。研究显示,知情交易者的特征包括:

  • 持仓量更大(比普通交易者大 58% [*6*]
  • 交易更活跃(比普通交易者活跃 39% [*6*]
  • 经验更丰富(比普通交易者多 15% 经验) [*6*]
  • 同时做多和做空(不偏向单边) [*6*]

方法 3:用 Data API 获取全市场活跃用户

GET /activity?type=TRADE&limit=500&sortBy=TOKENS&sortDirection=DESC

通过成交活动量发现活跃交易者,再追踪其 PnL。


二、监控体系架构

数据流设计

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  定时扫描       │     │  WebSocket 实时  │     │  信号处理       │
│  Data API       │ ──▶ │  持仓变化       │ ──▶ │  风控/决策      │
│  识别目标地址   │     │  监控成交       │     │  执行交易       │
└─────────────────┘     └─────────────────┘     └─────────────────┘

组件 1:目标地址池更新(每日/每小时)

# 伪代码
def update_target_addresses():
    # 1. 获取所有活跃市场的 top holders
    for market in active_markets:
        holders = get(f"/v1/market-positions?market={market.conditionId}&sortBy=TOKENS&limit=50")
        for holder in holders:
            address_pool[holder.user] += 1  # 累计出现次数
    
    # 2. 对候选地址查询 PnL
    for addr in address_pool:
        positions = get(f"/positions?user={addr}")
        if positions.cashPnl > 10000 and len(positions) > 20:
            targets.append(addr)
    
    # 3. 按 PnL 排序,保留前 N 个
    return sorted(targets, key=lambda x: x.cashPnl, reverse=True)[:100]

组件 2:实时持仓监控(WebSocket)

使用 Polymarket 的 RTDS WebSocket 订阅用户事件:

wss://ws-subscriptions-clob.polymarket.com/ws/user

或者轮询 Data API

GET /positions?user=0x...&sortBy=CURRENT&sortDirection=DESC

关键监控指标

指标 含义 跟单决策
size 变化 某合约持仓量变化 跟买/跟卖
avgPrice 平均入场价 判断是否有利可图
curPrice 当前市场价格 判断盈亏状态
cashPnl 变化 累计盈亏变化 评估该地址是否仍有效

组件 3:信号生成与执行

跟单规则示例

def should_copy_trade(target_addr, market, side, size, price):
    # 1. 风控:检查该地址过去 30 天 PnL 是否为正
    if get_pnl_30d(target_addr) < 0:
        return False  # 近期表现不佳,不跟
    
    # 2. 风控:单笔跟单金额不超过总资金 5%
    if size * price > total_capital * 0.05:
        return False
    
    # 3. 风控:不跟极端价格交易(<10¢ 或 >90¢)
    if price < 0.10 or price > 0.90:
        return False  # 极端价格增加亏损概率 3% [3]
    
    # 4. 延迟跟随:等待 2-5 秒,观察价格是否继续朝同一方向
    price_before = get_midpoint(market)
    time.sleep(2)
    price_after = get_midpoint(market)
    if (side == "BUY" and price_after < price_before) or \
       (side == "SELL" and price_after > price_before):
        return False  # 价格反转,不跟
    
    return True

三、跟单策略的三种变体

方案 A:精确跟单(复制每笔交易)

优点:完全复制目标地址的持仓 缺点:延迟导致滑点,容易被反向狙击

技术实现

  • 通过 Data API /activity 轮询或 WebSocket 实时获取目标地址的每笔交易
  • 解析 type=TRADEside=BUY/SELLasset_idsizeprice
  • 以相同方向、相同比例执行

方案 B:持仓对齐(周期性同步)

优点:成本更低,延迟容忍度高 缺点:无法捕捉短线机会

技术实现

def sync_positions():
    for target in target_addresses:
        target_positions = get(f"/positions?user={target}")
        my_positions = get(f"/positions?user={MY_ADDRESS}")
        
        # 计算每个市场的持仓差异
        for market in target_positions:
            target_size = target_positions[market].size
            my_size = my_positions.get(market, 0)
            gap = target_size * COPY_RATIO - my_size
            
            if abs(gap) > MIN_TRADE_SIZE:
                execute_trade(market, gap)

方案 C:信号聚合(多地址共识)

优点:减少单一地址被操纵或失效的风险 缺点:信号延迟更大

技术实现

  • 监控 N 个顶级交易者(建议 N ≥ 10)
  • 当 ≥ 70% 的地址在同一方向交易同一市场时,才执行
  • 加权:按 cashPnlpercentPnl 加权

四、风控系统(最关键)

风险规则矩阵

规则 具体实现 研究依据
最大持仓集中度 单一市场不超过总资金 20% 品类集中增加亏损概率 13.6% [*3*]
禁止极端价格 不跟价格 < 10¢ 或 > 90¢ 的交易 极端价格交易增加亏损概率 3% [*3*]
做市商偏好 优先跟单做市商(Maker 占比 > 30% 做市降低亏损概率 36 个百分点 [*3*]
交易频率限制 每小时最多 10 笔 过度交易增加亏损概率 5% [*3*]
目标地址淘汰 连续 7 天 PnL 为负则淘汰 技能持续性检验
延迟执行 收到信号后等待 2-10 秒 防止被反向狙击
最大跟单金额 单笔不超过总资金 5% 资金管理基本规则

目标地址健康度评分

def health_score(address):
    score = 0
    positions = get(f"/positions?user={address}")
    
    # 1. PnL 正向(权重 40%
    cash_pnl = sum(p.cashPnl for p in positions)
    score += min(cash_pnl / 10000, 1) * 40
    
    # 2. 做市商占比(权重 30%
    maker_ratio = get_maker_ratio(address)
    score += maker_ratio * 30  # 越高越好
    
    # 3. 品类分散度(权重 20%
    category_hhi = get_category_hhi(address)
    score += (1 - category_hhi) * 20  # HHI 越低越好
    
    # 4. 近期表现(权重 10%
    recent_pnl = get_pnl_30d(address)
    score += max(min(recent_pnl / 1000, 1), 0) * 10
    
    return score

五、完整实现流程

步骤 1:初始化目标地址池

# 每天运行一次
candidates = []

# 方法 A:从 top holders 中挖掘
for market in top_volume_markets(limit=200):
    holders = get(f"/v1/market-positions?market={market.conditionId}&sortBy=TOKENS&limit=50")
    for h in holders:
        candidates.append(h.user)

# 方法 B:从历史交易中挖掘活跃地址
for trade in get("/trades?limit=10000"):
    candidates.append(trade.maker_address)
    candidates.append(trade.owner)

# 去重并筛选
candidates = list(set(candidates))
for addr in candidates:
    info = get(f"/positions?user={addr}")
    if info.cashPnl > 5000 and len(info) > 10:
        target_pool.add(addr)

步骤 2:实时监控循环

while True:
    for target in target_pool:
        # 每隔 30 秒拉取一次持仓
        positions = get(f"/positions?user={target}")
        for pos in positions:
            if pos.conditionId not in my_positions:
                # 新开仓,执行跟单
                if should_copy_trade(target, pos):
                    execute_trade(pos.conditionId, pos.side, 
                                  pos.size * COPY_RATIO)
            else:
                # 持仓变化
                diff = pos.size - my_positions[pos.conditionId]
                if abs(diff) > MIN_DELTA:
                    adjust_position(pos.conditionId, diff * COPY_RATIO)
    
    # 更新目标地址评分
    for target in target_pool:
        target.score = health_score(target)
    
    # 淘汰低分地址
    target_pool = [t for t in target_pool if t.score > 50]
    
    time.sleep(30)  # 轮询间隔

步骤 3:执行交易(CLOB API

def execute_trade(condition_id, side, size):
    # 获取 token_id
    market = get(f"/markets/{condition_id}")
    token_id = market.token_id if side == "BUY" else market.no_token_id
    
    # 获取最优价格
    price = get(f"/price?token_id={token_id}&side=SELL" if side == "BUY" else "BUY")
    
    # 挂限价单(Maker),获取返佣
    order = {
        "token_id": token_id,
        "side": "BUY" if side == "BUY" else "SELL",
        "size": str(size),
        "price": str(price),
        "signature": sign_message(...)
    }
    response = post("/order", order, headers=auth_headers)

六、关键注意事项

1. 延迟问题

跟单天然存在延迟。研究表明,知情交易者的信息优势可能在几分钟内被市场消化 [*6*]。建议:

  • 低流动性市场:延迟 5-10 秒,观察价格是否稳定
  • 高流动性市场:延迟 2-3 秒,快速执行
  • 使用 WebSocket 而非轮询,减少延迟

2. 目标地址失效

研究显示,顶级交易者的技能可能随时间衰减 [*6*]。建议:

  • 持续监控目标地址的近期 PnL
  • 每周重新评估目标地址池
  • 保持至少 20-50 个目标地址以分散风险

3. 被反向操纵的风险

公开的地址可能被恶意操纵。防范措施:

  • 不跟单仅 1-2 个地址,至少 10 个以上
  • 使用信号聚合(多地址共识)
  • 加入价格验证(检查交易是否合理)

4. 费用考虑

  • 部分市场有 Taker 费用(加密市场 0.25 × 价格²,体育市场 0.0175 × 价格)
  • 尽量使用 Maker 限价单执行,可获得 20-25% 返佣
  • 高频跟单可能因费用侵蚀利润

七、预期收益与现实

现实数据

  • 70.8% 的用户亏损 [*3*]
  • 预期收益为 0(扣除费用后为负) [*3*]
  • 前 1% 用户获得 84% 利润 [*3*]

跟单机器人的优势

  • 避免了"极端价格交易"(63% 的普通用户犯此错误) [*3*]
  • 避免了"过度交易"(增加亏损概率 5%) [*3*]
  • 避免了"品类集中"(增加亏损概率 13.6%) [*3*]

跟单机器人的局限

  • 无法完全消除延迟滑点
  • 顶级交易者的交易量可能很大,小资金跟单效果有限
  • 无法复制做市商策略(做市需要实时双边报价,难以跟单)

建议组合策略:跟单 + 做市商混合。将 70% 资金用于做市商策略(被证明最赚钱),30% 用于跟单(捕捉信息优势交易)。

你懂这么多,能不能使用数学/统计学,可量化行为学等等角度优化跟单策略吗

跟单策略的数学与统计优化框架

这是一个很好的问题。跟单本质上是信号跟踪问题,可以从多个数学角度系统性地优化。下面我从五个层面构建优化框架。


一、信号提取:从持仓数据中提取知情交易信号

1.1 持仓变化信号 vs 交易事件信号

跟单面临一个核心问题:顶级交易者可能是做市商(Maker)而非吃单者(Taker)。做市商的持仓变化是被动产生的,而非主动信号。

统计分解

设目标地址 u 在时间 t 对合约 i 的持仓量为 $Q_{u,i,t}$。持仓变化可分解为:

\Delta Q_{u,i,t} = \underbrace{\Delta Q_{u,i,t}^{\text{主动}}}*{\text{信号}} + \underbrace{\Delta Q*{u,i,t}^{\text{做市}}}_{\text{噪音}}

其中做市部分可通过分析交易对手方向来识别——如果该地址同时存在同一合约的 Yes 和 No 持仓,则更可能在做市。

优化方案:使用 Data API 的 /activity 端点,筛选 type=TRADE,仅关注目标地址主动开仓的交易(非被动成交)。主动开仓的特征是:

  • trader_side 与持仓方向一致
  • 交易后该方向的持仓占比显著增加

1.2 持仓变化率与持仓水平信号

传统跟单只关注 $\Delta Q$(持仓变化),但更优的信号是持仓偏离历史均值的程度

定义标准化持仓偏离度:

Z_{u,i,t} = \frac{Q_{u,i,t} - \mu_{u,i}}{\sigma_{u,i}}

其中 \mu_{u,i}\sigma_{u,i} 是该地址在此合约上的历史持仓均值和标准差。

决策规则:只有当 $|Z_{u,i,t}| > \theta$(阈值,建议 1.5-2.0)时才跟单。这过滤了做市导致的微小持仓波动。


二、信号聚合:多地址加权共识模型

2.1 贝叶斯加权聚合

假设有 K 个目标地址,每个地址 k 对合约 i 的净方向信号为 $s_{k,i} \in {-1, 0, +1}$(卖、中性、买),地址的"信噪比"为 $\alpha_k$(可通过历史 PnL 和预测准确度估计)。

贝叶斯聚合信号:

S_i = \frac{\sum_{k=1}^{K} w_k \cdot s_{k,i}}{\sum_{k=1}^{K} w_k}

其中权重 w_k 由多个维度决定:

w_k = \underbrace{\frac{1}{1 + e^{-\gamma \cdot \text{PnL}*k}}}*{\text{PnL 权重}} \times \underbrace{\frac{1}{1 + \lambda \cdot \text{延迟}*k}}*{\text{延迟惩罚}} \times \underbrace{\min\left(\frac{N_k}{N_0}, 1\right)}_{\text{样本量校正}}
  • $\text{PnL}_k$:该地址累计盈亏(美元)
  • $\text{延迟}_k$:该地址信号到我们的平均延迟(秒)
  • $N_k$:该地址交易次数
  • $\gamma, \lambda, N_0$:可调超参数

决策规则

  • S_i > \tau → 跟买
  • S_i < -\tau → 跟卖
  • |S_i| \leq \tau → 不行动

阈值 \tau 优化:通过历史回测最小化夏普比率或最大化卡玛比率。

2.2 隐马尔可夫模型(HMM)信号提取

顶级交易者的交易行为可能呈现状态切换(如"积极建仓期"→"持仓期"→"平仓期")。

定义可观测变量 $O_t = {\Delta Q_{u,t}, \text{成交频率}, \text{方向一致性}}$,隐含状态 $Z_t \in {\text{建仓}, \text{持有}, \text{减仓}, \text{观望}}$。

参数估计:用 Baum-Welch 算法从历史数据学习转移矩阵 A 和发射概率 $B$。

实时滤波:用前向算法计算 $P(Z_t = \text{建仓} | O_{1:t})$,当概率 > 0.7 时触发跟单。


三、执行优化:最优跟单规模和时机

3.1 凯利公式优化仓位

假设信号 S_i 对应的预期收益率为 $r$,胜率为 $p$,则凯利最优仓位为:

f^* = \frac{p \cdot r - (1-p) \cdot 1}{r} = \frac{p \cdot (1 + r) - 1}{r}

在 Polymarket 环境中,由于价格 P 可视为概率,预期收益可近似为:

r = \frac{P_{\text{结算}} - P_{\text{入场}}}{P_{\text{入场}}}

但由于我们不知道真实结算概率,只能用信号强度 S_i 来近似 $p$

\hat{p} = \frac{1}{1 + e^{-\beta S_i}}

其中 \beta 通过历史数据校准。

实际仓位(安全凯利):

f = \min\left(\frac{f^*}{2}, f_{\max}\right)

3.2 延迟优化:最优等待时间

延迟是一把双刃剑——等待越久信号越可靠,但执行价格越差。

定义延迟-价格影响函数:通过历史数据拟合目标地址交易后 t 秒的价格变化:

\Delta P(t) = \mathbb{E}[P_{\text{post}}(t) - P_{\text{pre}}]

最优等待时间

t^* = \arg\max_t \left[ \underbrace{\Delta P(t)}*{\text{价格变化}} - \underbrace{\kappa \cdot \sigma \cdot \sqrt{t}}*{\text{价格风险}} \right]

其中 \kappa 是风险厌恶系数,\sigma 是价格波动率。

经验值:高流动性市场(如 NFL 比赛)t^* \approx 2-5 秒;低流动性市场 t^* \approx 10-30 秒。

3.3 最优跟单比率

并非所有信号都值得 1:1 跟单。定义信号质量评分

\text{SignalScore}*{u,i,t} = \underbrace{|Z*{u,i,t}|}_{\text{偏离度}} \times \underbrace{\text{MakerRatio}^{-1}*u}*{\text{主动交易概率}} \times \underbrace{\text{Recency}*u}*{\text{近期表现}}

跟单比率:

\lambda_{u,i,t} = \min\left( \frac{\text{SignalScore}*{u,i,t}}{\text{SignalScore}*{\max}}, 1 \right)

执行规模 = \lambda \times \Delta Q_u \times \text{资金比例因子}


四、行为金融学:识别并规避认知偏差

4.1 Favorite-Longshot Bias 校正

研究显示,预测市场存在偏好-冷门偏误:低概率事件被高估,高概率事件被低估 [*1*]。这意味着:

  • 跟买低概率合约(价格 < 20¢)的预期收益为负
  • 跟卖高概率合约(价格 > 80¢)的预期收益也为负

校正模型:对信号方向施加价格惩罚因子:

\text{AdjustedSignal}*{i} = S_i \times \underbrace{\left(1 - 2 \cdot |P_i - 0.5|\right)^{\beta}}*{\text{偏误校正因子}}

其中 \beta > 0 控制校正强度。当 P_i = 0.5 时因子最大(1.0),当 P_i \to 01 时因子趋近于 0。

4.2 过度自信校正

研究显示,63% 的普通用户交易极端价格合约 [*3*]。顶级交易者也难免过度自信。

过度自信检测:统计目标地址在连续亏损后是否加大仓位("翻本效应")。定义:

\text{OverconfidenceScore}*u = \mathbb{E}\left[\frac{\Delta Q*{u,t+1}}{\text{std}(\Delta Q_u)} \Bigg| \text{PnL}_{u,t} < 0\right]

若该分数 > 1.5,说明该地址有显著翻本倾向,其信号应降低权重。

4.3 处置效应(Disposition Effect)识别

投资者倾向于过早卖出盈利头寸持有亏损头寸过久

处置效应检测:统计目标地址在盈利状态下的平仓概率 vs 亏损状态下的平仓概率:

\text{DispositionRatio}_u = \frac{P(\text{卖出} | \text{盈利})}{P(\text{卖出} | \text{亏损})}

若该比率 > 1.5,说明该地址存在显著处置效应。优化策略:当该地址卖出盈利头寸时,我们不跟卖(因为可能是过早卖出);当该地址卖出亏损头寸时,我们更积极地跟卖(因为克服了持有偏见)。


五、完整数学优化框架

5.1 信号-执行-风控三阶段模型

阶段 1:信号生成

\hat{S}*{i,t} = \sum*{k=1}^{K} \underbrace{\frac{e^{\eta \cdot \text{Score}*{k,t}}}{\sum*{j} e^{\eta \cdot \text{Score}*{j,t}}}}*{\text{Softmax 权重}} \cdot \underbrace{\tanh\left(\alpha \cdot \frac{\Delta Q_{k,i,t}}{\sigma_{k,i} + \epsilon}\right)}*{\text{持仓变化信号}} + \underbrace{\beta \cdot \text{PriceDeviation}*{i,t}}_{\text{价格偏差信号}}

阶段 2:执行决策

f_{i,t}^* = \underbrace{\frac{\hat{S}*{i,t} \cdot \text{Edge}*{i,t} - (1 - \text{Edge}*{i,t})}{\text{Edge}*{i,t}}}_{\text{凯利公式}} \times \underbrace{\left(1 - \frac{\text{当前持仓}*i}{\text{最大持仓}}\right)}*{\text{分散化惩罚}}

阶段 3:风控约束

\text{最终仓位} = \min\left(f^* \times \text{资本}, \text{仓位上限}\right) \times \mathbb{1}{\text{HHI} < 0.3} \times \mathbb{1}{\text{最近信号数} > 3}

其中 HHI(赫芬达尔指数)= $\sum_i (\text{仓位}_i / \text{总仓位})^2$,约束集中度。

5.2 超参数优化框架

可优化的超参数向量 $\Theta = {\tau, \beta, \eta, \alpha, \kappa, f_{\max}, \text{延迟}, N_0}$。

优化目标

\Theta^* = \arg\max_{\Theta} \left[ \underbrace{\text{夏普比率}}*{\text{风险调整收益}} - \lambda_1 \cdot \underbrace{\text{最大回撤}}*{\text{下行风险}} - \lambda_2 \cdot \underbrace{\text{换手率}}_{\text{交易成本}} \right]

优化方法:使用贝叶斯优化(因参数空间小、目标函数评估成本高)或网格搜索(如果计算资源充足)。

5.3 在线学习:贝叶斯更新地址权重

随着新数据到来,持续更新每个目标地址的后验可信度

P(\text{地址}*k \text{有效} | D*{1:t}) = \frac{P(D_{1:t} | \text{有效}) \cdot P(\text{有效})}{P(D_{1:t})}

假设收益服从正态分布:

P(D_{1:t} | \text{有效}) = \prod_{s=1}^{t} \frac{1}{\sqrt{2\pi\sigma_k^2}} \exp\left(-\frac{(\text{PnL}_{k,s} - \mu_k)^2}{2\sigma_k^2}\right)

当后验概率低于阈值(如 0.1)时,将该地址从池中移除。


六、实战代码框架

import numpy as np
from scipy.stats import norm
from hmmlearn import hmm  # 隐马尔可夫模型

class MathCopyTrader:
    def __init__(self, capital=10000, max_targets=50):
        self.capital = capital
        self.max_targets = max_targets
        self.targets = {}  # address -> {positions, pnl, maker_ratio, ...}
        self.params = {
            'tau': 0.3,        # 信号阈值
            'beta': 1.5,       # Favorite-Longshot 校正强度
            'eta': 2.0,        # Softmax 温度参数
            'kappa': 0.5,      # 风险厌恶
            'delay': 5,        # 等待秒数
            'f_max': 0.2,      # 单笔最大仓位
            'hhi_max': 0.3,    # 集中度上限
        }
    
    def z_score_position(self, addr, contract_id, Q):
        """标准化持仓偏离度"""
        history = self.targets[addr]['history'][contract_id]
        mu = np.mean(history)
        sigma = np.std(history) + 1e-8
        return (Q - mu) / sigma
    
    def favorite_longshot_correction(self, price, signal):
        """偏好-冷门偏误校正"""
        factor = (1 - 2 * abs(price - 0.5)) ** self.params['beta']
        return signal * factor
    
    def softmax_weight(self, scores):
        """Softmax 归一化权重"""
        scores = np.array(scores)
        exp_s = np.exp(self.params['eta'] * scores)
        return exp_s / exp_s.sum()
    
    def aggregate_signal(self, contract_id, price):
        """多地址信号聚合"""
        signals = []
        weights = []
        
        for addr, data in self.targets.items():
            # 持仓变化信号
            pos = data['positions'].get(contract_id)
            if pos:
                z = self.z_score_position(addr, contract_id, pos['size'])
                
                # 主动交易概率(1 - maker_ratio
                active_prob = 1 - data.get('maker_ratio', 0.5)
                
                # 近期表现
                recency = data.get('pnl_30d', 0) / 1000
                
                signal = np.tanh(z * active_prob)
                weight = data.get('health_score', 50) * (1 + recency)
                
                signals.append(signal)
                weights.append(max(weight, 0))
        
        if not signals:
            return 0
        
        # 加权聚合
        w = self.softmax_weight(weights)
        aggregated = np.dot(w, signals)
        
        # Favorite-Longshot 校正
        adjusted = self.favorite_longshot_correction(price, aggregated)
        
        return adjusted
    
    def kelly_fraction(self, signal, price, target_price=1.0):
        """凯利最优仓位"""
        # 用信号强度估计胜率
        p = 1 / (1 + np.exp(-self.params['kappa'] * signal))
        p = np.clip(p, 0.01, 0.99)
        
        # 赔率
        b = (target_price - price) / price if signal > 0 else price / (1 - price)
        
        # 凯利公式
        f_star = (p * b - (1 - p)) / b
        return np.clip(f_star, 0, self.params['f_max']) / 2  # 半凯利
    
    def should_execute(self, signal, current_positions, contract_id):
        """风控检查"""
        # 1. 信号强度检查
        if abs(signal) < self.params['tau']:
            return False
        
        # 2. 集中度检查
        total_pos = sum(abs(p) for p in current_positions.values())
        if total_pos > 0:
            new_pos_ratio = abs(signal) / total_pos
            hhi = sum((p / total_pos)**2 for p in current_positions.values())
            if hhi > self.params['hhi_max'] and new_pos_ratio > 0.1:
                return False
        
        # 3. 信号一致性检查(过去3个信号方向是否一致)
        recent_signals = [s for s in self.signal_history.get(contract_id, [])[-3:]]
        if len(recent_signals) >= 2:
            if sum(1 for s in recent_signals if np.sign(s) == np.sign(signal)) < 2:
                return False  # 信号不一致,不跟
        
        return True
    
    def execute_trade(self, contract_id, signal, price):
        """执行交易"""
        if not self.should_execute(signal, self.current_positions, contract_id):
            return
        
        # 凯利仓位
        f = self.kelly_fraction(signal, price)
        amount = f * self.capital
        
        # 延迟执行
        time.sleep(self.params['delay'])
        
        # 检查延迟后的价格是否仍有利
        new_price = get_midpoint(contract_id)
        if signal > 0 and new_price > price * 1.02:  # 价格已上涨2%
            return  # 滑点太大,放弃
        if signal < 0 and new_price < price * 0.98:  # 价格已下跌2%
            return
        
        # 执行
        side = "BUY" if signal > 0 else "SELL"
        place_order(contract_id, side, amount, new_price)
    
    def update_target_beliefs(self):
        """贝叶斯更新地址可信度(在线学习)"""
        for addr, data in self.targets.items():
            # 获取近期 PnL 序列
            pnls = data.get('daily_pnl', [])[-30:]
            if len(pnls) < 10:
                continue
            
            mu = np.mean(pnls)
            sigma = np.std(pnls) + 1e-8
            
            # 似然:观察到的 PnL 来自"有效"分布的概率
            likelihood = norm.pdf(mu, loc=0.01, scale=0.05)  # 有效分布均值 > 0
            
            # 后验
            prior = data.get('prior_skill', 0.5)
            posterior = (likelihood * prior) / (likelihood * prior + (1 - likelihood) * (1 - prior))
            
            data['prior_skill'] = posterior
            
            # 淘汰低分地址
            if posterior < 0.1 and len(self.targets) > 10:
                del self.targets[addr]

七、回测与验证框架

7.1 回测设计

数据需求

  • 至少 3-6 个月的完整交易历史
  • 包含所有地址的持仓快照(分钟级)
  • 价格数据(分钟级 tick data

评估指标

指标 公式 目标值
夏普比率 \frac{\mu_R - r_f}{\sigma_R} > 1.0
卡玛比率 \frac{\mu_R - r_f}{\text{MaxDrawdown}} > 0.5
胜率 \frac{\text{盈利交易}}{\text{总交易}} > 55%
盈亏比 \frac{\text{平均盈利}}{\text{平均亏损}} > 1.5
信息比率 $\frac{\alpha}{\sigma_\epsilon}$(相对基准) > 0.5

7.2 反事实分析

对于每个未被跟单的信号,计算放弃收益(如果跟了会赚/亏多少)。这用于评估风控规则是否过于保守。

7.3 蒙特卡洛模拟

对超参数 \Theta 进行随机采样(1000+ 次),观察目标函数分布,确保优化结果不是过拟合的产物。


总结:数学优化的边际收益估计

优化层 预期夏普提升 难度 优先级
信号聚合(Softmax + HMM +0.3-0.5
凯利仓位管理 +0.2-0.4
Favorite-Longshot 校正 +0.1-0.3
延迟优化 +0.1-0.2
贝叶斯地址淘汰 +0.1-0.2
处置效应检测 +0.05-0.15
HMM 状态识别 +0.05-0.15

建议优先实现:信号聚合 + 凯利仓位 + Favorite-Longshot 校正,这三项性价比最高。