mcpField
T
trader-risk

trader-risk

github.com/jakeschincariol其他3.2k133 次安装1 周前更新
代码仓库

关于 trader-risk

trader-risk 是交易工作流中的 Python 风险检查 Skill,会按配置限制评估拟议订单并记录结果,但不会下单。

主要功能

  1. 01检查订单格式、资产和卖空
  2. 02执行仓位、现金及亏损限制
  3. 03应用交易时段和每日次数规则
  4. 04区分平仓与新开仓检查
  5. 05记录与订单指纹关联的结果

适用场景

  1. 01展示拟议开仓前进行检查
  2. 02查明订单超出限制的原因
  3. 03在开仓限制不满足时仍允许平仓

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jakeschincariol/day-trader-skill --skill trader-risk

安装后在 Claude Code 中输入/trader-risk确认已加载。

附带文件check.py

详细介绍

trader-risk

Risk Manager 是提案与经纪商之间的关卡。trader-budget 写入的每笔订单,或 trader-broker 的平仓操作,都会经过它。对于该订单,BLOCK 是最终结果:不会把订单交给用户确认,也不会交给经纪商。大多数日内交易者都会亏钱。这些限制旨在控制每笔亏损和每日亏损的规模,但不能保证交易盈利。

下文的 ${CLAUDE_SKILL_DIR} 是此技能所在的文件夹(即 SKILL.md 所在的位置)。

python3 "${CLAUDE_SKILL_DIR}/check.py"                           # trader/ files; writes trader/state/risk.json
python3 "${CLAUDE_SKILL_DIR}/check.py" --json
python3 "${CLAUDE_SKILL_DIR}/check.py" --no-write                # look without recording
python3 "${CLAUDE_SKILL_DIR}/check.py" --now "2026-10-19 10:15"  # pin the clock (New York time)

读取和写入的内容

文件内容
trader/orders.json提议的订单(来自 trader-budget,或 trader-broker 的平仓操作)
trader/config.json限额(trader-budget 附带 config.example.json)
trader/portfolio.json现金和持仓;若文件不存在,则创建一个注入预算资金的新账户
trader/prices.json最新价格会更新计算风险所依据的入场价格;也用于评估持仓价值
trader/state/broker.json当日已下单记录:重复订单、每日交易次数、每日亏损、日内交易
trader/state/risk.json写入的判定结果,以及每笔确切订单的指纹

入场和退出

入场会开启或增加持仓:买入,或会导致做空的卖出。退出只会减少已有持仓。必须始终允许平仓,因此退出操作只检查格式、资产和卖空。其他所有规则(每日限额、入场时段、亏损、收益风险比、屏蔽列表、规模、重复订单)对退出操作只会产生警告,不会触发 BLOCK。

检查项

系统按文件中的顺序检查订单,并假定每个已通过的订单均已成交,因此,即使单笔订单都符合要求,但批量下单会突破限制,也会被拦截。

检查项拦截条件
格式未填写交易代码;方向不是 buy 或 sell;数量和名义金额同时填写或都未填写;名义金额订单不是 market + day(Alpaca 的规则);限价单未填写限价;bracket 订单不是整股、有效期不是 day 或 gtc,或未填写止损或止盈
资产allow_options 为 false 时,交易代码是期权;交易对象是加密货币,或不是美国股票或 ETF 交易代码
做空卖出数量超过持仓数量(allow_short 为 false)
屏蔽(开仓)交易代码在 blocked 列表中
规模(开仓)低于 min_order_usd 或高于 max_order_usd
持仓(开仓)该股票的持仓占账户比例将超过 max_position_pct
现金(开仓)买入后现金将低于现金缓冲额,或需要使用保证金
止损(开仓)require_stop 为 true 时未设置止损(bracket 订单的 stop_loss_stop_price,或订单计划中的止损);止损位于入场价错误的一侧
损失(开仓)数量 ×(入场价 − 止损价)超过 max_loss_per_trade_usd
奖励:风险(开仓)(目标价 − 入场价)/(入场价 − 止损价)低于 min_reward_risk
每日亏损(开仓)今天已下单的入场订单在止损位的最大亏损,加上本次订单的最大亏损,超过 max_daily_loss_usd
交易次数(开仓)今天已下单的入场订单达到 max_trades_per_day
时间窗口(开仓)早于 no_entries_before 或晚于 no_entries_after,或市场已关闭
pdt(开仓,仅当 pdt_guard 为 true 时)过去 5 个工作日内已有 3 次日内交易
重复(开仓)同一批次中有两笔相同交易代码和方向的订单,或今天已下过该订单
每日限额(开仓)今天已下单的订单达到 max_orders_per_day

数字的计算方式:

  • 用于计算的入场价:限价单使用限价。市价单使用计划中的入场价和 trader/prices.json 中的最新价格(未超过 15 分钟)两者中的较高值。10:15 编写的计划,不能在价格上涨后的 10:55 低估风险。超过时限的价格不会使用,并会说明原因。
  • 每日亏损:按 trader-broker 的记录,计算今天每笔入场订单的最大亏损,不论盈亏。三笔满额交易会用完 150 美元的每日亏损额度。
  • 时间窗口:使用纽约时间,由工具计算(包括夏令时),不使用计算机的时区。周末和 NYSE 假日市场关闭。如果当天提前于下午 1:00 收盘,时间窗口也会提前 3 小时结束。将 no_entries_* 都设为 null 可关闭时间窗口。
  • pdt_guard(默认关闭):根据日志,将同一天买入并卖出的交易代码计为一次日内交易,并加上今天下单的任何入场订单(这意味着这些订单应在收盘前平仓)。FINRA 已取消 25,000 美元的模式日内交易者最低资金要求(Regulatory Notice 26-10,自 2026 年 6 月 4 日起生效;公司可分阶段实施,最迟至 2027 年 10 月 20 日),因此一些经纪商仍会执行旧规则:如果你的经纪商仍执行旧规则,请开启 pdt_guard。

警告不会拦截订单,但要告知用户:账户处于 LIVE 模式;以数字而非字符串形式传入数值;止损仅存在于计划中,而未设置在经纪商处;价格已过期,无法使用;今天提前收盘。

步骤

  1. 如果价格可能已偏离计划中的价格,请先刷新 (trader-alerts:alerts.py quote TSLA --write)。
  2. 运行 check.py。退出代码为 0 表示所有订单均已通过,1 表示至少有一个订单被拦截。
  3. 逐笔用通俗语言告知用户结果:止损时的最大亏损、收益风险比,以及占用今日限额的比例。对于 BLOCK,说明原因和解决办法(减少股数、使用 trader-exit 设置更近的止损、等到交易时段,或跳过这笔交易)。绝不要自行更改限额。
  4. 如果订单有任何变动,请重新运行检查。trader-broker 会通过指纹将每笔订单与其判定对应,因此,编辑过的订单必须再次通过检查才算就绪,昨天的判定今天不算数。

示例:连续示例

在新开设的 $5,000 模拟账户中,使用示例配置,于 2026-10-19(星期一)上午 10:15,通过 trader-budget 生成的 TSLA 条件单:

PASS  #1 buy TSLA 8 shares, entry
          entry 364.18 (the plan's entry), stop 358.32, target 370.04: risk 5.86 a share
          max loss $46.88 (limit $50), reward:risk 1.00 (min 1)
          today before this: 0 of 3 trades, $0 of $150 daily loss

1 passed, 0 blocked at 2026-10-19 10:15 New York. Cash after the passed orders: $2,086.56 (paper account).

再多买一股就会被拦截:

BLOCK #1 buy TSLA 9 shares, entry
          entry 364.18 (the plan's entry), stop 358.32, target 370.04: risk 5.86 a share
          max loss $52.74 (limit $50), reward:risk 1.00 (min 1)
          today before this: 0 of 3 trades, $0 of $150 daily loss
        - loss: 9 shares x 5.86 risk a share = $52.74 at the stop, over your $50 max loss per trade

同样的 8 股,在上午 10:55 使用 trader/prices.json 中上午 10:52 的实时行情(366.48)进行检查,会被拦截两次:止损时亏损金额为 8 x 8.16 = $65.28,收益风险比为 0.44。上午 9:40 检查时,则因交易时段限制被拦截(上午 9:45 前不能开新仓)。下午 3:55 平仓的卖出订单会通过检查,即使此时已过下午 3:30 的入场截止时间:因为这是平仓操作。

规则

  • PASS 仅表示允许向用户展示该订单,并不代表同意下单。
  • 每个数字都来自配置、订单、投资组合、价格或券商日志。
  • Yahoo 免费行情未经官方认证,且可能滞后;实际成交价格由券商提供,在快速变动的市场中,止损单的成交价可能比设定价格更差。

它绝不会做什么

它绝不会下单,绝不会编辑订单以使其通过检查,绝不会放宽限额,绝不会拦截仅用于让用户退出持仓的卖出订单,也绝不会将 PASS 视为用户同意下单。

安全

  • 用于教育和工具支持,不构成财务建议。PASS 表示通过规则检查,不是投资建议。
  • 默认使用模拟交易("paper": true)。是否启用实盘由用户自行决定,并在自己的配置中设置。
  • 此套件中只有 trader-broker 会下单,且必须同时满足以下三项条件:trader-risk 当天已通过该笔确切订单的检查;用户在聊天中明确输入了针对该笔订单的同意;用户在 Claude 自带的卡片上点击了 Allow 一次,因为订单工具设置为“需要审批”(Customize > Connectors > tool permissions)。绝不要将订单工具设为“始终允许”。
  • 除非配置允许且用户确认,否则不使用期权、保证金、卖空或杠杆。
  • 券商密钥保存在环境变量或 Claude Desktop 配置中,绝不放在聊天里。

评论

支持 Markdown