リスク・税金

ポジションサイズの計算式とは?1トレードのリスクから逆算する考え方


※本記事にはアフィリエイト広告(プロモーション)が含まれています。

自動売買ボットのロジックを書いていると、多くの人はエントリー条件や利確・損切りの設定に時間をかけます。しかし実際に資金を守るのは、その手前にある「1回のトレードでいくら賭けるか」というポジションサイズの決め方です。この記事では、感覚ではなく計算式でポジションサイズを決める方法を整理します。

なぜポジションサイズが重要なのか

同じ勝率・同じ損切り幅の戦略でも、ポジション量の決め方次第で資金の減り方はまったく変わります。1トレードごとの賭け金が資金に対して大きすぎると、連敗が数回続くだけで再起不能な水準まで資金が減ってしまいます。逆に小さすぎると、せっかく戦略が機能していても資金が増えるスピードが遅くなります。

ポジションサイズを決める目的は「儲けを最大化すること」ではなく、**「連敗しても退場しない範囲に損失を収めること」**です。守りの仕組み全体の考え方は資金管理の記事でも触れていますが、ここでは実際の計算式に絞って掘り下げます。

基本の発想:「いくら儲かるか」ではなく「いくら失うか」から逆算する

ポジションサイズを決めるときによくある誤りは、「資金の何%を投入するか」を先に決めてしまうことです。これだと、損切りラインまでの距離(ボラティリティ)が違う銘柄・相場環境で、実際に失う金額がトレードごとにバラバラになります。

正しい順番は逆です。

  1. 1トレードで失ってよい金額(資金に対する一定割合)を先に決める
  2. エントリー価格から損切り価格までの距離を決める
  3. その2つから発注数量を逆算する

この考え方を数式にすると、次のようになります。

発注数量 = (資金 × 1トレードのリスク許容率) / |エントリー価格 - 損切り価格|

計算式1: 固定リスク%法(Fixed Fractional)

もっとも基本的な方法です。資金に対して「1トレードで失ってよい割合」を固定し、損切り幅に応じて発注数量を毎回計算し直します。

def calc_position_size(
    balance: float,
    risk_pct: float,
    entry_price: float,
    stop_price: float,
) -> float:
    """固定リスク%法でポジションサイズ(数量)を計算する"""
    risk_amount = balance * risk_pct
    stop_distance = abs(entry_price - stop_price)
    if stop_distance == 0:
        raise ValueError("エントリー価格と損切り価格が同じです")
    return risk_amount / stop_distance


# 例: 資金100万円、1トレードのリスク許容率1%
# エントリー700万円、損切り688万円(距離12万円)の場合
qty = calc_position_size(
    balance=1_000_000,
    risk_pct=0.01,
    entry_price=7_000_000,
    stop_price=6_880_000,
)
print(round(qty, 6))  # BTC建ての発注数量

このやり方の利点は、資金が増えれば発注サイズも自動で大きくなり、資金が減れば自動で小さくなることです。固定額(常に10万円分など)で発注するより、資金規模に対して一貫したリスク水準を保てます。

計算式2: ATRベースの損切り距離を使う

固定リスク%法の弱点は、「損切り距離」を何で決めるかが曖昧なことです。実務でよく使われるのが、ATR(平均真の値幅)を使って損切り距離をボラティリティに連動させる方法です。

def calc_stop_distance_by_atr(atr: float, multiplier: float = 2.0) -> float:
    """ATRの倍数を損切り距離として使う"""
    return atr * multiplier


def calc_position_size_atr(
    balance: float,
    risk_pct: float,
    atr: float,
    atr_multiplier: float = 2.0,
) -> float:
    stop_distance = calc_stop_distance_by_atr(atr, atr_multiplier)
    risk_amount = balance * risk_pct
    return risk_amount / stop_distance


# 例: ATRが8万円、損切りをATRの2倍に設定
qty = calc_position_size_atr(
    balance=1_000_000,
    risk_pct=0.01,
    atr=80_000,
    atr_multiplier=2.0,
)
print(round(qty, 6))

ボラティリティが高い相場では損切り距離が自動的に広がり、その分だけ発注数量が小さくなります。逆に値動きが穏やかな相場では、より大きめのサイズでエントリーできます。**「相場の荒さに応じてサイズを調整する」**という発想は、手動裁量では感覚に頼りがちな部分を、ボットでは数式として一貫させられる利点です。

先物取引ではレバレッジと混同しない

無期限先物を使う場合、「レバレッジを何倍にするか」と「ポジションサイズをいくらにするか」は別の話です。レバレッジは証拠金に対する建玉の倍率を決めるだけで、実際に失う金額を決めるのは上記の計算式で出した発注数量と損切り距離です。レバレッジを上げても、損切り位置とサイズの計算をきちんと連動させていれば、1トレードのリスク量そのものは変わりません。逆に言えば、レバレッジだけを見て「これくらい賭けても大丈夫」と判断するのは危険です。

リスク許容率は何%にすべきか

「1トレードのリスク許容率」に絶対的な正解はありませんが、一般的には資金の0.5%〜2%程度に収める考え方が多く紹介されています。この数値を大きくするほど、勝っているときの資金増加は速くなりますが、連敗時のダメージも大きくなります。実際にどの水準が適切かは、戦略の勝率やペイオフレシオ、許容できる最大ドローダウンによって変わるため、バックテストで複数のリスク許容率を試して比較するのが現実的です。ただし、バックテストの結果を鵜呑みにするのも危険で、過去のデータに対して最適化しすぎる罠には注意が必要です。

この計算式にも限界がある

この記事で紹介した式は、あくまで「1トレード単独」を前提にしています。実際の運用では次のような要素も考慮が必要です。

  • 複数銘柄・複数戦略を同時に動かす場合、ポジション同士の相関(同じ方向に動きやすいか)
  • 板が薄い銘柄では、計算上の数量通りに約定できない(スリッページ)
  • 取引所ごとの最小発注単位・最小証拠金による丸め誤差

これらは戦略の複雑さや運用規模によって影響度が変わるため、まずはシンプルな固定リスク%法から始め、必要に応じて調整していくのが無理のない進め方です。

まとめ

  • ポジションサイズは「儲け」ではなく「1トレードで失ってよい金額」から逆算する
  • 基本式は 発注数量 = (資金 × リスク許容率) / 損切り距離
  • 損切り距離をATRなどボラティリティ指標に連動させると、相場の荒さに応じてサイズが自動調整される
  • レバレッジと発注サイズは別物として扱い、レバレッジの高さだけで安心しない
  • リスク許容率に絶対解はなく、バックテストで比較しながら自分の許容できる水準を探る

ポジションサイズの計算式は地味ですが、戦略のロジックそのものより資金の生存率に直結する部分です。エントリーロジックを磨く前に、まずはこの計算をボットに組み込むところから見直してみてください。