リバランスの税金コストを計算する:頻繁な売買が複利を削る仕組み


バックテストで「年率20%」と出たとき、20年後の資産を計算していませんか。実際に手元に残る金額は、それよりかなり少なくなります。

理由は 税金 です。しかも影響は「利益の20%が引かれる」という単純な話では終わりません。複利の効き方そのものが変わるからです。

⚠️ 本記事は教育目的の情報共有です。税務の取り扱いは個別事情や制度改正で変わるため、実際の判断は税理士等の専門家にご確認ください。

目次

  1. 「利益の20%」では済まない理由
  2. Pythonで税引前後を比較する
  3. 回転率が高い戦略ほど不利になる
  4. 到達年数で見るとインパクトが分かる
  5. 対策の考え方
  6. まとめ

1. 「利益の20%」では済まない理由

日本の上場株式等の譲渡益には、約20%(所得税・住民税・復興特別所得税を合わせて20.315%) が課税されます。

ここで重要なのは課税のタイミングです。

  • 長期保有(バイ&ホールド):売るまで課税されない → 利益がそのまま再投資され続ける(課税の繰り延べ)
  • 月次リバランス:毎年のように売買が発生 → 毎年利益が確定して課税 → 税金分だけ元本が減った状態で翌年を迎える

つまり頻繁に売買する戦略は、毎年、複利の土台を削られながら走ることになります。同じ「年率20%」でも、手残りは大きく変わります。

2. Pythonで税引前後を比較する

シンプルなシミュレーションで確認します。

def simulate(cagr: float, years: int, initial: float = 1_000_000,
             tax_rate: float = 0.0) -> float:
    """毎年利益が確定して課税されるケースの資産推移

    tax_rate=0 なら課税なし(=繰り延べされる長期保有の近似)
    """
    value = initial
    for _ in range(years):
        gain = value * cagr
        gain_after_tax = gain * (1 - tax_rate)
        value += gain_after_tax
    return value

TAX = 0.20315

for years in (10, 20, 30):
    gross = simulate(0.20, years)
    net = simulate(0.20, years, tax_rate=TAX)
    print(f"{years}年: 税引前 {gross/1e6:.1f}倍 → 税引後 {net/1e6:.1f}倍 "
          f"({(1 - net/gross)*100:.0f}% 目減り)")

出力の傾向はこうなります(年率20%・初期100万円の場合)。

期間税引前毎年課税目減り
10年約6.2倍約4.2倍約32%
20年約38倍約17倍約55%
30年約237倍約71倍約70%

期間が長いほど差が開きます。 毎年削られた分が「複利で増えるはずだった分」を失い続けるからです。税率は20%なのに、30年後の差は70%——これが課税繰り延べの威力です。

3. 回転率が高い戦略ほど不利になる

同じことは取引コストでも起きますが、税金はさらに影響が大きくなります。

戦略タイプ年間の利益確定税の影響
バイ&ホールドほぼゼロ(売るまで課税されない)極小
年1回リバランス一部中
月次リバランスほぼ全部大
デイトレード全部最大

バックテストで「モメンタム戦略がバイ&ホールドに年3%勝った」としても、税引後では逆転している可能性があります。比較するなら同じ土俵で——税引後同士で比べるべきです。

# 戦略比較は税引後で行う
strategy_net = simulate(0.20, 20, tax_rate=TAX)   # 高回転戦略
buyhold_net  = simulate(0.10, 20, tax_rate=0.0)   # 長期保有(繰り延べ)
print(f"高回転20%: {strategy_net/1e6:.1f}倍 / 長期保有10%: {buyhold_net/1e6:.1f}倍")

「バックテストで勝っていた戦略が、税引後では市場平均に負ける」——珍しくない結末です。

4. 到達年数で見るとインパクトが分かる

目標金額までの年数で見ると、体感しやすくなります。

def years_to_target(cagr, target=10_000_000, initial=1_000_000,
                    monthly=0, tax_rate=0.0, cap=50):
    value = initial
    for y in range(1, cap + 1):
        value += value * cagr * (1 - tax_rate) + monthly * 12
        if value >= target:
            return y
    return None

for c in (0.15, 0.20, 0.25):
    a = years_to_target(c)
    b = years_to_target(c, tax_rate=TAX)
    print(f"CAGR {c:.0%}: 税引前 {a}年 → 税引後 {b}年")

年率20%なら、目標到達が税引前より3年ほど遅れる、といった結果になります。3年は小さくありません。

5. 対策の考え方

制度や状況によって最適解は変わりますが、一般的な方向性としては:

① 非課税制度を使えるか確認する 日本のNISAのように、非課税で運用できる制度があります。ただし対象商品・口座に制約があるため、自分の戦略がその枠で実行できるかの確認が要ります(例:海外証券会社のAPIで個別株を自動売買する運用は対象外)。

② コア・サテライト構成 資産の大部分(コア)は非課税枠で長期保有のインデックス、一部(サテライト)を課税口座でアクティブ戦略——という分け方。税の繰り延べ効果を最大化しつつ、戦略の実験もできます。

③ 回転率そのものを下げる 月次を四半期に変えるだけで、課税機会も取引コストも減ります。バックテストで「リバランス頻度を落としても成績がほぼ変わらない」なら、落とした方が税引後で有利です。

④ 損益通算を意識する 含み損の銘柄を年内に確定させて利益と相殺する手法もありますが、戦略の売買ルールを税都合で歪めると本末転倒です。

💡 私自身は、この計算をした結果「バックテストのCAGRをそのまま将来資産に当てはめてはいけない」と考えを改めました。評価は必ず税引後で、というのが実運用の視点です。

6. まとめ

  • 譲渡益への課税(日本の上場株式等は約20%)は、取られる額よりも「複利が削られる」影響が大きい
  • 毎年課税されると、30年で7割近くの差になりうる
  • 高回転戦略ほど不利。バイ&ホールドは課税繰り延べという見えない優位を持つ
  • 戦略比較は税引後同士で行う。そうしないと結論が逆転する
  • 対策:非課税制度の活用、コア・サテライト、リバランス頻度を下げる

バックテストの数字を将来資産に換算するときは、必ず税引後で計算してみてください。想像より現実は厳しく、そして回転率を下げるだけで改善することも多いです。

関連記事 → 取引コストとスリッページ / シャープレシオと最大ドローダウン


質問や感想は X (@QuantNobu) までどうぞ。

⚠️ 免責:本記事は教育目的の情報共有であり、投資助言・税務助言ではありません。実際の投資・税務判断はご自身の責任と専門家への確認のうえで行ってください。