position-sizer

star 2

精确计算每笔交易的仓位大小,整合两套独立框架: 埃尔德的2%/6%原则(简单保护性上限)和撒普的风险/波动率百分比模型(复利增长导向)。 当用户说"帮我算仓位"、"这笔交易能买多少"、"计算仓位"、"我有X万,止损在Y,能买多少股"、 "检查一下6%原则"、"还有多少可用风险额度"、"这笔交易风险多大"、"期望收益是多少"时触发。 通常由 elder-system 在确认交易信号后调用,也可以单独使用。 输出精确的仓位数量、风险金额、月度可用风险余额,以及是否符合风险原则的判断。

chess99 By chess99 schedule Updated 5/19/2026

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. 将交易规模降至正常水平的最小单位(1/3 或更少)
  2. 必须连续两个时间单位(周或月)盈利,才能提升一个档次
  3. 某时间单位内亏损,退回前一档次规模
  4. 绝不因"想赚回来"而加大仓位

回撤恢复的数学现实:

  • 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 层计算 + 代码层强制执行。

Install via CLI
npx skills add https://github.com/chess99/trading-os --skill position-sizer
Repository Details
star Stars 2
call_split Forks 1
navigation Branch main
article Path SKILL.md
More from Creator