name: position-sizer description: | 精确计算每笔交易的仓位大小,整合两套独立框架: 埃尔德的2%/6%原则(简单保护性上限)和撒普的风险/波动率百分比模型(复利增长导向)。 当用户说"帮我算仓位"、"这笔交易能买多少"、"计算仓位"、"我有X万,止损在Y,能买多少股"、 "检查一下6%原则"、"还有多少可用风险额度"、"这笔交易风险多大"、"期望收益是多少"时触发。 通常由 elder-system 在确认交易信号后调用,也可以单独使用。 输出精确的仓位数量、风险金额、月度可用风险余额,以及是否符合风险原则的判断。
Position Sizer — 仓位计算器
两套框架,各有侧重:
Elder 2%/6% 原则(《以交易为生》):简单、严格的保护性上限,适合日常波段交易。 Tharp 风险/波动率百分比模型(《通向金融王国的自由之路》):基于期望值和复利逻辑,适合系统化趋势跟踪。
核心共识:大多数交易者毁于仓位过重,而不是方向判断错误。
核心规则(原书精确定义)
2% 原则(单笔上限)
- 定义:任意单笔交易,若触及止损,账户本金亏损不超过 2%
- 计算基准:每月第一天的账户总值(每月重新计算,不用当日最新值)
- 这是风险金额上限,不是仓位大小
- 专业人士通常用 0.5%~1%,2% 是绝对上限
最大风险金额 = 月初账户总值 × 2%
最大仓位 = 最大风险金额 ÷ (入场价 - 止损价)
示例(股票):
- 月初账户 100,000 元,2% = 2,000 元
- 入场价 50 元,止损价 48 元,每股风险 2 元
- 最大仓位 = 2,000 ÷ 2 = 1,000 股
示例(期货):
- 月初账户 500,000 元,2% = 10,000 元
- 入场 1810 点,止损 1816 点,风险 6 点,每点 50 元
- 合约风险 = 6 × 50 = 300 元
- 最大合约数 = 10,000 ÷ 300 = 33 份
- 若 A ÷ B < 1(连一份合约都承担不起),该品种不能交易
6% 原则(月度上限)
- 定义:本月已实现亏损 + 所有持仓的当前风险敞口之和 ≥ 月初账户总值的 6% 时,本月剩余时间停止开新仓
- 持仓风险敞口计算:(入场价 - 当前止损价) × 持仓数量
- 重要:若止损已移到成本线以上,该持仓风险敞口为 0
月度可用风险 = 月初账户总值 × 6%
已用风险 = 本月已亏损 + 所有持仓风险敞口之和
剩余可用 = 月度可用风险 - 已用风险
若剩余可用 < 本次交易的 2% 风险额,禁止开仓。
6% 原则协同举例(账户 50 万):
- 月度可用风险 = 30,000 元
- 建仓 A(10,000 元风险)→ 建仓 B(10,000 元风险)→ 建仓 C(10,000 元风险)
- 风险敞口 = 30,000 = 6%,禁止新开仓
- 若 A 上涨,止损移至成本线:敞口降到 20,000,可再开一仓 D
- 若 B 被止损亏损 10,000:已亏 10,000 + 持仓 C/D 风险 20,000 = 30,000 = 6%,继续禁止
顶级交易员的风险参数参考(《市场奇才》)
| 参数 | 数值 | 来源 |
|---|---|---|
| 单笔最大风险(保守) | 总资金的 1% | Bruce Kovner, Larry Hite |
| 单笔最大风险(激进上限) | 总资金的 5% | Michael Marcus |
| 新手实际风险(过大) | 5%~10%(应减半) | Kovner 观察 |
| 应有比例 | 1%~2% | Kovner 建议 |
| 股票最大止损 | 7%~8% | O'Neil, David Ryan |
| 连续亏损时缩减至 | 正常仓位的 1/5~1/10 | Marty Schwartz |
| 三重确认时放大至 | 常规仓位的 5~6 倍 | Michael Marcus |
Kovner 的核心建议:"少交易,少交易,少交易。把你认为应该持有的仓位至少减半。"
仓位分级策略
账户增大后,不必每笔都用满额:
| 信心程度 | 建议仓位 |
|---|---|
| 普通交易(阿氏评分 7~8 分) | 最大限额的 1/3 |
| 较有信心(阿氏评分 8~9 分) | 最大限额的 2/3 |
| 高信心(阿氏评分 9~10 分) | 满额(不超过铁三角上限) |
计算流程
第一步:收集必要信息
账户信息:
- 月初账户总值(不是今日市值)
- 本月已实现亏损金额
现有持仓(每个):
- 入场价、当前止损价、持仓数量
→ 持仓风险 = (入场价 - 止损价) × 数量
→ 止损已在成本线以上:风险 = 0
本次交易:
- 标的名称
- 计划入场价
- 计划止损价
- 交易品种(股票/期货)及合约乘数
- 阿氏评分(来自 elder-screen)
第二步:计算最大仓位
max_risk = account_capital * 0.02 # 2% 上限
risk_per_unit = entry_price - stop_price # 每股/每份风险
max_position = max_risk / risk_per_unit # 最大仓位
第三步:检查 6% 原则
monthly_loss = 本月已亏损
existing_risk = sum(每个持仓的风险敞口)
new_trade_risk = risk_per_unit * max_position
total_risk = monthly_loss + existing_risk + new_trade_risk
risk_limit = account_capital * 0.06
if total_risk > risk_limit:
available = risk_limit - monthly_loss - existing_risk
if available <= 0:
# 本月不能开新仓
else:
# 按剩余额度缩减仓位
adjusted_position = available / risk_per_unit
第四步:止损位建议
- 避开整数价格:整数附近止损单密集,容易被扫(如 50 元改为 49.90 元)
- 止损距离至少 1 倍 ATR,避免被市场噪音触发
- 做多止损设在近期次低点下方(不是最低点)
- 做空止损设在近期次高点上方(不是最高点)
第五步:收益风险比评估
- 最低要求:盈利潜力 ≥ 风险的 2 倍(2:1)
- 低于 2:1 时,建议寻找更好的入场点或跳过
止损移动规则
| 浮盈状态 | 止损操作 |
|---|---|
| 浮盈达到 1 倍风险金额 | 将止损移到成本线(保护本金) |
| 浮盈达到目标的 30% | 止损必须移至成本线 |
| 浮盈进一步增加 | 保护至少 1/3 的浮盈(止损提升至浮盈的 2/3 处) |
铁律:绝对禁止将止损向亏损方向移动。
从亏损中恢复(资金管理关键规则)
遭遇大亏损后:
- 将交易规模降至正常水平的最小单位(1/3 或更少)
- 必须连续两个时间单位(周或月)盈利,才能提升一个档次
- 某时间单位内亏损,退回前一档次规模
- 绝不因"想赚回来"而加大仓位
回撤恢复的数学现实:
- 20% 回撤 → 需 25% 反弹才能恢复
- 40% 回撤 → 需 66.7% 反弹
- 50% 回撤 → 需 100% 反弹
- 结论:绝对不能让账户回撤超过 25%~30%
Tharp 框架:四种仓位模型(高级)
以下来自撒普《通向金融王国的自由之路》,与 Elder 框架互补,适合系统化交易。
R 倍数与期望值
R 倍数:交易盈亏金额 / 初始风险金额(1R)
- 初始风险(1R)= 入场价 - 止损价(每单位)
- 盈利 2R = 盈利为初始风险的 2 倍
- 典型亏损 = -1R(止损触发)
期望值公式:
期望收益 = PW × AW - PL × AL
- PW = 盈利概率,AW = 平均盈利(以 R 倍数计)
- PL = 亏损概率,AL = 平均亏损(以 R 倍数计)
- 结果 = 每 1 元风险的期望收益
评估标准(需至少 100 次交易样本):
- 期望收益 ≥ 0.5R = 优质系统
- 期望收益 < 0 = 即使胜率 90% 也会破产
四种仓位模型对比
| 模型 | 公式 | 5.5年收益 | 最大回撤 | 适用场景 |
|---|---|---|---|---|
| 固定金额 | 每X元资本交易1单位 | 5.75% | 7.13% | 不推荐 |
| 等价值 | 账户净值 / 头寸数量 | 3.86% | 3.72% | 未加杠杆股票组合 |
| 风险百分比 | 允许风险 / 每单位1R | 20.92% | 14.14% | 首选,趋势跟踪 |
| 波动率百分比 | 允许波动 / 每单位ATR | 22.93% | 16.61% | 紧密止损策略 |
(测试基于道琼斯30股,1992-1997,100万美元起始)
模型3:风险百分比(推荐)
允许风险金额 = 账户净值 × 风险百分比
仓位规模 = 允许风险金额 / (入场价 - 止损价)
风险百分比推荐值(撒普原书):
- 管理他人资金:< 1%(专业趋势跟踪者典型值 0.8%~1.0%)
- 自有资金保守:1%~2%
- 自有资金激进:2%~3%(超过 3% 视为"职业枪手")
- 止损较紧(< 1 倍 ATR)时:使用推荐值的一半
与 Elder 2% 的关系:Elder 的 2% 对应撒普框架中"自有资金保守"档位,两者兼容。 管理他人资金时,应降至 1% 以下。
模型4:波动率百分比(进阶)
允许波动金额 = 账户净值 × 波动率百分比
仓位规模 = 允许波动金额 / (ATR × 合约乘数)
波动率百分比推荐值:
- 保守:0.5%
- 标准:1%
- 激进:2%(期货系统会产生 70%+ 回撤,不可接受)
关键换算:5% 风险(基于21日极值点)≈ 1% 波动率(基于20日ATR)
代码实现
def position_size_risk_pct(equity, risk_pct, entry, stop, multiplier=1):
"""风险百分比模型(推荐)"""
dollar_risk = equity * risk_pct
risk_per_unit = abs(entry - stop) * multiplier
return dollar_risk / risk_per_unit
def position_size_vol_pct(equity, vol_pct, atr, multiplier=1):
"""波动率百分比模型"""
dollar_vol = equity * vol_pct
vol_per_unit = atr * multiplier
return dollar_vol / vol_per_unit
def expectancy(trades_r):
"""期望值计算(trades_r 为 R 倍数列表)"""
wins = [r for r in trades_r if r > 0]
losses = [abs(r) for r in trades_r if r < 0]
if not trades_r:
return 0
pw = len(wins) / len(trades_r)
pl = len(losses) / len(trades_r)
aw = sum(wins) / len(wins) if wins else 0
al = sum(losses) / len(losses) if losses else 0
return pw * aw - pl * al
输出格式
# 仓位计算结果
## 账户状态({月份})
- 月初账户总值:{X} 元
- 本月已亏损:{X} 元({X}%)
- 现有持仓风险:{X} 元({X}%)
- 已用风险额度:{X} 元({X}%)
- 剩余可用额度:{X} 元({X}%,距6%上限)
## 本次交易
- 标的:{代码 名称}
- 计划入场价:{X}
- 止损价:{X}({设置方法})
- 每股/份风险:{X}
- 阿氏评分:{X}/10
## 计算结果
- 2% 原则上限:{X} 元 → 最多 {X} 股
- 6% 原则约束:剩余额度 {X} 元 → 最多 {X} 股
- 信心分级({评分}分):{1/3 / 2/3 / 满额}
- **建议仓位:{X} 股**
- 实际风险:{X} 元({X}%)
{如达到月度上限:⚠️ 执行此交易后,本月不能再开新仓}
## 收益风险评估
- 止损距离:{X}({X}%)
- 第一目标(上通道线):{X} → 盈利 {X} 元/股
- 第二目标(前期阻力):{X} → 盈利 {X} 元/股
- 收益风险比:{X:1} / {X:1}
{如低于2:1:⚠️ 收益风险比不足,建议重新评估入场点}
特殊情况处理
6% 额度已满:
⛔ 本月可用风险额度已耗尽(已用 X%,上限 6%)
本月剩余时间禁止开新仓。
可以:管理现有持仓(调整止损、部分止盈)
等待:下月重置,或现有持仓止损上移释放额度
止损太近(< 1 倍 ATR):
⚠️ 止损距离(X元)小于 1 倍 ATR(Y元)
过紧的止损容易被市场噪音触发
建议将止损移至 Z 元,调整后仓位:N 股
收益风险比不足:
⚠️ 当前收益风险比 1.2:1,低于建议的 2:1
建议:寻找更好的入场点 / 调整目标价 / 跳过此交易
Trading OS 集成
仓位计算结果对应 Signal.size(占 NAV 的比例):
# 示例:账户 100 万,止损 5%,单笔风险 2% = 2 万
# 仓位 = 2 万 / (入场价 × 5%)
# Signal.size = 仓位股数 × 入场价 / 100 万 NAV
Signal("SSE:600000", "BUY", size=0.08) # 8% NAV
代码层的 RiskManager 会再次校验:单股上限 10%,月度总风险 6%。 两层保护:skill 层计算 + 代码层强制执行。