💡 国内提示:Binance 官网在中国大陆无法直连,访问需自备网络工具;法币入金不支持银行卡,主要走 C2C(USDT↔CNY)通道完成。

Claude 写 Binance 风控脚本

加密圈有句话:“爆仓不是突然的事,是慢慢恶化的结果”。爆仓前 2-4 小时维持保证金率(MMR)通常已经很危险了,但很多人因为手机没通知,等看到时已经被强平。

这篇用 Claude Code 写了一个小脚本监控 Binance U 本位合约账户的保证金健康度,低于阈值时立即 Telegram 推送。完整代码 + 部署。

需求描述(给 Claude)

写一个 Python 脚本监控 Binance 合约账户:

1. 用 Binance API Key(只勾"读取"权限)查 U 本位合约账户
2. 算每个开仓的 "维持保证金率"
   维持保证金率 = 维持保证金 / 账户余额
3. 整个账户的健康度:
   - 安全:账户余额/总维持保证金 > 5
   - 警戒:2-5
   - 危险:< 2(大概率爆仓进程启动)
4. 危险时立即 Telegram 推送(含仓位明细 + 当前 MMR)
5. 每 10 分钟跑一次
6. 用环境变量存 API key,不写死在代码里

一稿即可用的代码

binance_risk_monitor.py:

import os, time, hmac, hashlib, json, urllib.request, urllib.parse
from datetime import datetime

API_KEY = os.environ["BINANCE_API_KEY"]
API_SECRET = os.environ["BINANCE_API_SECRET"].encode()
TG_TOKEN = os.environ["TG_TOKEN"]
TG_CHAT_ID = os.environ["TG_CHAT_ID"]

BASE = "https://fapi.binance.com"

# 阈值
SAFE = 5.0    # 账户余额 / 维持保证金
WARN = 2.0
DANGER = 1.2  # 低于这个立刻警报


def sign(params):
    ts = int(time.time() * 1000)
    params["timestamp"] = ts
    query = urllib.parse.urlencode(params)
    sig = hmac.new(API_SECRET, query.encode(), hashlib.sha256).hexdigest()
    return query + "&signature=" + sig


def api_get(path, params=None):
    query = sign(params or {})
    req = urllib.request.Request(f"{BASE}{path}?{query}",
                                 headers={"X-MBX-APIKEY": API_KEY})
    with urllib.request.urlopen(req, timeout=10) as r:
        return json.loads(r.read())


def send_tg(text):
    url = f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage"
    data = json.dumps({"chat_id": TG_CHAT_ID, "text": text, "parse_mode": "Markdown"}).encode()
    req = urllib.request.Request(url, data=data,
                                 headers={"Content-Type": "application/json"})
    try: urllib.request.urlopen(req, timeout=5)
    except: pass


def check():
    """查账户 + 仓位"""
    account = api_get("/fapi/v2/account")
    wallet = float(account["totalWalletBalance"])
    maint = float(account["totalMaintMargin"])
    pnl = float(account["totalUnrealizedProfit"])
    
    if maint == 0:
        return  # 没开仓
    
    ratio = (wallet + pnl) / maint
    status = "🟢 安全" if ratio > SAFE else ("🟡 警戒" if ratio > WARN else "🔴 危险")
    
    # 构造仓位明细
    positions = [p for p in account["positions"] if float(p.get("positionAmt", 0)) != 0]
    lines = []
    for p in positions:
        sym = p["symbol"]
        amt = float(p["positionAmt"])
        entry = float(p["entryPrice"])
        mark = float(p.get("markPrice", entry))
        unr = float(p.get("unrealizedProfit", 0))
        lev = p.get("leverage", "?")
        lines.append(f"`{sym}` x{lev} · {amt:+.4f} @ ${entry:,.2f} · 现价 ${mark:,.2f} · {unr:+.2f}")
    
    msg = f"""*{status}* · 合约账户健康度
账户余额: `${wallet:,.2f}` ({pnl:+,.2f} 未实现)
总维持保证金: `${maint:,.2f}`
健康比率: `{ratio:.2f}x` (> {SAFE:.0f} 安全)

*仓位* ({len(positions)} 个):
""" + "\n".join(lines)
    
    # 只在警戒/危险时发,或者每天一次常规汇报(8:00)
    now = datetime.now()
    is_report_time = now.hour == 8 and now.minute < 10
    
    if ratio < WARN:
        send_tg(msg)
    elif ratio < DANGER:
        send_tg("🚨 *紧急* 3 小时内可能爆仓!\n\n" + msg)
    elif is_report_time:
        send_tg("📊 日报\n\n" + msg)


if __name__ == "__main__":
    try: check()
    except Exception as e:
        send_tg(f"⚠️ 监控脚本报错: {e}")

部署(同 Mac 本机)

LaunchAgent com.as.binance-risk.plist:

<key>StartInterval</key><integer>600</integer>
<key>EnvironmentVariables</key>
<dict>
    <key>BINANCE_API_KEY</key><string>YOUR_KEY</string>
    <key>BINANCE_API_SECRET</key><string>YOUR_SECRET</string>
    <key>TG_TOKEN</key><string>...</string>
    <key>TG_CHAT_ID</key><string>...</string>
</dict>

⚠️ API Key 创建时只勾"读取"权限,永远不要勾"交易"或"提现"。读取权限足够监控。

详见 Binance API 安全配置指南。

实际消息长啥样

常规(日报):

📊 日报
🟢 安全 · 合约账户健康度
账户余额: $2,340.50 (+45.20 未实现)
总维持保证金: $160.20
健康比率: 14.58x (> 5 安全)

仓位 (2 个):
  BTCUSDT x10 · +0.0250 @ $65,200 · 现价 $66,800 · +40.00
  ETHUSDT x5 · +0.5000 @ $3,400 · 现价 $3,450 · +5.20

警戒:

🟡 警戒 · 合约账户健康度
账户余额: $890.50 (-120.00 未实现)
总维持保证金: $340.80
健康比率: 2.61x  ← 低于 5 的警戒线
(消息正文)

紧急:

🚨 紧急 3 小时内可能爆仓!
🔴 危险 · 合约账户健康度
健康比率: 1.15x
...

预警的阈值怎么设

Binance 爆仓阈值是健康比率 < 1(即余额刚好等于维持保证金),但爆仓通常是一连串强平,真正触发 < 1 时已经晚了。

所以我的三档:

  • 5x(警戒线):还有缓冲,抓紧决策
  • 2x(危险线):最多 2 小时不采取措施就爆仓
  • 1.2x(紧急线):马上平仓或补保证金

这三档的意义:5x 的时候你还有充足时间做决定,2x 就必须立刻行动,1.2x 是最后的"救命线"。

什么时候需要这个脚本

一定要用:

  • 同时开多个合约仓位
  • 用了 > 5x 杠杆
  • 不是 24 小时盯盘
  • 情绪化操作容易(愤怒加仓、报复性扛单)

可能不用:

  • 只玩 1-2x 低杠杆(风险天然低)
  • 专业量化员(自己有完整风控框架)

延伸:更复杂的风控场景

这个脚本能扩展:

  • 时间段敏感:美联储决议前 2 小时阈值提升,自动警报更严
  • 单币种专门监控:某个币最大仓位 > $X 立即警告
  • 止损关联:检测没设止损的持仓
  • 多账户监控:不同账户同时监控(配置成 list)

Claude 帮我在 1 个月里迭代了 4 个版本,每次扩展新需求只要跟它说话:

“加一个功能:当单个仓位的未实现亏损超过账户余额 20% 时发警报”

10 分钟就 OK 了。

总结

  • Binance API + Python 实现实时风控警报门槛极低
  • Claude Code 帮你处理 90% 的代码工作
  • 阈值 5x / 2x / 1.2x 三档实战好用
  • 可以持续迭代,永远不嫌贵

做合约不戴头盔(没风控监控)不是勇敢,是赌。这脚本 1 小时能写完,每个搞合约的都应该有。

→ 合约风控体系完整教程 · 开 Binance 账户


延伸阅读: