name: mm description: “做市 - 带库存管理的双边报价” emoji: “📊” gates: envs: anyOf: - POLY_API_KEY - KALSHI_API_KEY
做市技能
在预测市场上进行自动化的双边报价,包含库存偏斜、波动率调整价差和风险控制。
支持平台
- Polymarket(仅限挂单,零吃单费用)
- Kalshi
聊天命令
生命周期
/mm start <平台> <市场ID> <代币ID> [标志] 启动做市
/mm stop <ID> 停止并取消所有订单
/mm list 列出活跃的做市商
监控
/mm status 所有活跃做市商概览
/mm status <ID> 单个做市商的详细状态
配置
/mm config <ID> 以JSON格式查看当前配置
/mm config <ID> --spread 3 更新配置(下次重新报价时生效)
启动标志
| 标志 | 默认值 | 描述 |
|---|---|---|
--spread N |
2 | 基础半价差(美分) |
--min-spread N |
1 | 最小价差下限(美分) |
--max-spread N |
10 | 最大价差上限(美分) |
--size N |
50 | 每边订单规模(份额) |
--max-inventory N |
500 | 开始积极偏斜前的最大库存 |
--skew N |
0.5 | 库存偏斜因子(0-1) |
--vol-mult N |
10 | 用于价差扩大的波动率乘数 |
--alpha N |
0.3 | 公允价值平滑的EMA alpha值(0-1) |
--fv-method M |
weighted_mid | 公允价值计算方法:mid_price, weighted_mid, vwap, ema |
--interval N |
5000 | 重新报价间隔(毫秒) |
--threshold N |
1 | 触发重新报价的最小价格变动(美分) |
--max-pos N |
1000 | 最大头寸价值(美元) |
--max-loss N |
100 | 自动停止前的最大亏损(美元) |
--max-orders N |
1 | 每边订单数(层级) |
--level-spacing N |
(=spread) | 价格层级之间的美分差 |
--level-decay N |
0.5 | 每层级规模衰减(0-1,例如0.5 = 每层级是前一层级的一半) |
--neg-risk true |
false | 启用负风险模式(Polymarket加密货币) |
--name "名称" |
auto | 结果的显示名称 |
示例
# 使用默认值启动
/mm start polymarket 0xabc123 98765
# 自定义价差和规模
/mm start polymarket 0xabc123 98765 --spread 3 --size 100 --max-inventory 1000
# 为流动性市场设置紧密价差
/mm start polymarket 0xabc123 98765 --spread 1 --min-spread 1 --max-spread 5 --interval 2000
# 3级报价:L1=50份额,L2=25,L3=12 — 间隔2美分
/mm start polymarket 0xabc123 98765 --max-orders 3 --level-spacing 2 --level-decay 0.5 --size 50
# 检查所有正在运行的做市商
/mm status
# 动态扩大价差
/mm config polymarket_98765678 --spread 4
# 关闭
/mm stop polymarket_98765678
工作原理
- 公允价值 根据订单簿计算(加权中间价、VWAP或EMA)
- 价差 根据近期波动率调整(波动市场价差更大)
- 偏斜 将报价从超重的一侧移开以管理库存
- 报价 作为仅挂单的做市订单(买价和卖价)下达
- 重新报价 周期:取消所有订单,重新计算,下达新订单
- 自动停止 如果已实现盈亏超过最大亏损阈值
API 使用
import { createMMStrategy, type MMConfig } from '../trading/market-making';
const config: MMConfig = {
id: 'btc-yes',
platform: 'polymarket',
marketId: '0x...',
tokenId: '12345',
outcomeName: 'BTC > 100k',
baseSpreadCents: 2,
minSpreadCents: 1,
maxSpreadCents: 10,
orderSize: 50,
maxInventory: 500,
skewFactor: 0.5,
volatilityMultiplier: 10,
fairValueAlpha: 0.3,
fairValueMethod: 'weighted_mid',
requoteIntervalMs: 5000,
requoteThresholdCents: 1,
maxPositionValueUsd: 1000,
maxLossUsd: 100,
maxOrdersPerSide: 1,
};
const strategy = createMMStrategy(config, { execution, feeds });
botManager.registerStrategy(strategy);
await botManager.startBot(strategy.config.id);