关于 trader-risk
trader-risk 是交易工作流中的 Python 风险检查 Skill,会按配置限制评估拟议订单并记录结果,但不会下单。
主要功能
- 01检查订单格式、资产和卖空
- 02执行仓位、现金及亏损限制
- 03应用交易时段和每日次数规则
- 04区分平仓与新开仓检查
- 05记录与订单指纹关联的结果
适用场景
- 01展示拟议开仓前进行检查
- 02查明订单超出限制的原因
- 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 模式;以数字而非字符串形式传入数值;止损仅存在于计划中,而未设置在经纪商处;价格已过期,无法使用;今天提前收盘。
步骤
- 如果价格可能已偏离计划中的价格,请先刷新
(trader-alerts:
alerts.py quote TSLA --write)。 - 运行
check.py。退出代码为 0 表示所有订单均已通过,1 表示至少有一个订单被拦截。 - 逐笔用通俗语言告知用户结果:止损时的最大亏损、收益风险比,以及占用今日限额的比例。对于 BLOCK,说明原因和解决办法(减少股数、使用 trader-exit 设置更近的止损、等到交易时段,或跳过这笔交易)。绝不要自行更改限额。
- 如果订单有任何变动,请重新运行检查。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 配置中,绝不放在聊天里。