はじめに:予測だけでは勝てないと気づいてから、その先の話
これまで、Qiitaで一貫して「クオンツで最初に大事なのは、未来の価格を当てることではない」という主張を書き続けてきました。以前の記事「クオンツトレード入門者のための確率過程――価格予測ではなく、分布・リスク・エッジを見るために」では、価格をノイズを含んで確率的に揺れる時系列として捉え、分布・リスク・エッジを見る視点を整理しました。
では、その視点でエッジらしきものを見つけたあと、次に何をすればいいのか。ここに断絶があります。「エッジがある」ことと「そのエッジで実際に資産を増やせる」ことは、まったく別の問題なのです。勝率60%の優れたシグナルを持っていても、毎回全資金を1銘柄に突っ込めば、いずれ大きなドローダウンで退場します。予測できても、賭け方を間違えれば破綻する——バックテストでは美しく見えた戦略が実運用で崩れていくのを何度も見てきた、私の正直な実感です。
この記事は、その「市場を理解したあと」の続き、つまり**「賭け方の数学」である凸最適化(Convex Optimization)**の話です。前回が「市場をどう見るか」なら、今回は「見えたあと、資金をどう動かすか」。地味ですが、このレイヤーこそ長く生き残るクオンツと退場するクオンツを分ける分水嶺だと考えています。
この記事で一貫して伝えたい主張は、次の一文に集約されます。
市場そのものは非線形・非定常・ノイズ過多であり、単純な凸最適化問題としてそのまま解けるものではない。しかし、クオンツ実務では、ポートフォリオ配分・リスク制約・取引コスト管理という重要な部分を凸最適化として切り出せる。だから凸最適化は、予測ではなく「理解できる範囲のリスクに制約をかけ、資金配分に規律を与える」ための数学として重要である。
なお、本記事は数学的な厳密さよりも実務的な直感を優先します。数式は最小限にとどめ、必ず日本語で意味を説明します。
第1章:3資産ポートフォリオで考える資金配分問題
資金配分は「予測モデルのおまけの後処理」のように扱われがちですが、私は逆だと考えています。配分は予測の下流にある作業ではなく、予測と並ぶ——場合によっては予測以上に中核的な——意思決定です。どんなに良いシグナルも、配分の設計を通ってはじめて損益になります。プロの運用会社がシグナル生成と同等以上のリソースをポートフォリオ構築に割いているのはこのためです。
数学に入る前に、具体的な配分問題を考えてみましょう。手元に100万円あり、次の3資産に配分するとします。
| 資産 | 期待リターン(年率・仮定) | リスク(年率ボラティリティ・仮定) |
|---|---|---|
| 米国株 | 7% | 18% |
| 米国債券 | 3% | 6% |
| 金 | 4% | 15% |
さらに資産間の相関も考慮します。株と債券は逆相関になりやすい局面がある一方、金は両者と相関が低め——といった性質です(あくまで過去データ上の傾向であり、2022年のように株と債券が同時に下落する局面もあります)。
ここでの問いはシンプルです。「各資産に何%ずつ配分すればよいのか?」
米国株100%なら期待リターンは最大ですが暴落時のダメージも最大。債券100%なら安定するがリターンは物足りない。では 50%/30%/20% は? その根拠は? さらに実務では「1資産あたり最大50%まで」「空売りしない」「全体リスクは年率10%以内」といった制約も加わります。
この問題、たった3資産なのに、いざ真剣に答えようとすると手が止まりませんか。「なんとなく株を多めに」までは言えても、「具体的に何%か、その数字の根拠は」と問われると途端に曖昧になる。資産が30個に増え、制約が絡めば、直感で一貫した答えを出すのは不可能です。一見単純に見えて、実は驚くほど奥が深い——これが資金配分問題の正体であり、「期待リターン・リスク・相関・制約を全部考慮して、納得できる配分を機械的に求めたい」というこの問題こそ、凸最適化が最も得意とする領域です。
第2章:凸最適化とは何か — 迷子になりにくい最適化
凸最適化を一言でいえば、**「迷子になりにくい最適化」**です。
最適化とは、目的(リスク最小化など)を制約条件のもとで最も良くする解を探すことです。このとき探索空間の「地形」が問題になります。
- 凸関数は、お椀型の谷。どこからボールを転がしても、必ず同じ谷底(最小値)に到達します。
- 非凸関数は、谷がいくつもある山道。転がす場所によってたどり着く谷が変わります。
ここで「迷子になる」とは何か。それは、浅い谷(局所最適解)にたどり着いたソルバーが、そこを「最適解」として返し、すぐ隣にもっと良い配分(大域最適解)が存在していたのに気づかないまま「これが最善だ」と信じ込んでしまう状態です。厄介なのは、返ってきた解に「これは局所解にすぎません」という札はついておらず、迷子になったこと自体に気づけないことです。深層学習の学習が典型で、初期値や学習率によって結果が変わり、「本当に一番良い解か?」は原理的に保証できません。
一方、凸最適化では、条件が整えば局所最適解=大域最適解が保証されます。谷が一つしかないので、どこで止まってもそれが本当の谷底。「解けたなら、それがその問題設定における最良の答え」と言い切れるのです。この「気づけない機会損失」を構造的に避けられることが、凸最適化を使う大きな動機です。
第3章:なぜ凸最適化はクオンツの配分問題で強いのか
凸最適化がクオンツの資金配分問題で強い理由は4つあります。
1. 大域最適性の保証:「この制約とこの前提のもとでは、これがベストの配分」と言い切れる。
2. 計算の安定性と速さ:成熟したソルバーが多数あり、数百〜数千資産規模でも安定して高速に解ける。同じ入力なら同じ答えが返る再現性も実運用に効きます。
3. 制約の扱いやすさ:ポジション上限・下限、レバレッジ制約、リスク上限、セクター制約——実務の制約の多くを自然に組み込め、「制約を追加したら解けなくなった」が起きにくい。
4. 説明可能性:「ブラックボックスが出した数字」ではなく、「リスク上限10%とレバレッジ制約のもとで期待リターンを最大化した結果」と、目的関数と制約から配分の理由を説明できる。
ただし、凸最適化が「他の手法より常に優れている」わけではありません。正確には**「凸として定式化できる問題においては、非常に信頼できる」**という限定付きの強さです。シグナル探索や深層学習のような非凸の世界には、この保証は及びません。
第4章:平均分散ポートフォリオ最適化
凸最適化とクオンツの接点として最も有名なのが、Markowitzの平均分散最適化(Mean-Variance Optimization)(1952年)です。考え方はシンプルで、リターンとリスクのトレードオフを1つの目的関数にまとめます。
maximize: 期待リターン − λ × リスク(分散)
λ(ラムダ)は「リスクをどれだけ嫌うか」を表すパラメータで、大きいほどリスク回避的な(債券寄りの)配分になります。この問題は、共分散行列が適切であれば凸問題(二次計画問題)として解け、第1章の3資産の例なら最適配分が一意に求まります。
ただし重大な注意点があります。 入力である期待リターンの推定は極めて不安定で、わずかに変えただけで最適配分が劇的に変わることが知られています。「最適化は正しく解けているのに、入力が間違っているせいで出力が使い物にならない」——これは平均分散最適化の実務上最大の弱点です(第8章で詳述)。この弱点ゆえに、実務では期待リターンの推定を諦めてリスクだけ最適化する最小分散ポートフォリオやリスクパリティも広く使われています。
第5章:ポジションサイズとレバレッジ制約
多くの初心者は「シグナルが出たら買う」で止まってしまいますが、実務ではその後に決めるべきことが残っています。「で、いくら買うのか?」——ポジションサイジングの問題です。重要なのは、シグナル生成と資金配分を分けて考えることです。
- シグナル生成:「この資産は上がりそうだ」という方向・強さの判断
- 資金配分:そのシグナルを、リスク制約のもとでどれだけのポジションに変換するかの判断
複数の戦略を並行して動かす場合、考慮すべき制約はさらに増えます。各戦略のリスク上限、全体のボラティリティ上限、最大レバレッジ、そして相関の高い戦略への集中回避(独立に見える3戦略が実は全部「実質ドル円ロング」だった、というのはよくある事故です)。
これらの制約はいずれも凸最適化に自然に組み込めます。逆に「なんとなく等分」「シグナルが強いから多めに」で配分していると、気づかないうちに特定のリスクファクターに集中しがちです。これらの制約は単体では地味で、むしろ好調時のリターンを削る方向に働きます。それでも入れるのは、リターンを最大化するためではなく、想定外が起きたときに壊れないためです。
第6章:取引コストとターンオーバー制約
バックテストでは美しい右肩上がりだった戦略が実運用で崩れる——最も多い原因の一つが取引コストです。コストには複数の層があります。
- 手数料:明示的なコスト
- スプレッド:買値と売値の差。取引のたびに必ず払う
- スリッページ:想定価格と約定価格のズレ
- マーケットインパクト:自分の注文が価格を動かすコスト。サイズが大きいほど効く
これらすべての増幅要因が**売買のしすぎ(過剰ターンオーバー)**です。最適化を毎日回して「理論上の最適配分」に完全に合わせようとすると、わずかな入力変化のたびに大量の売買が発生し、コストで利益が溶けます。凸最適化なら、この対処を目的関数に直接組み込めます。
maximize: 期待リターン − λ × リスク − γ × 売買量
γ(ガンマ)は売買ペナルティの強さです。「現在の配分から動かすこと自体にコストがかかる」と明示することで、最適化は「動かす価値が本当にあるときだけ動かす」解を返すようになります。
第5章のリスク・レバレッジ制約と、この章のターンオーバー抑制。どちらも派手さはなく、「純粋にリターンを最大化するだけ」の欲張りな最適化と比べれば、リターンをいくらか諦める方向の工夫です。しかし、私が訴えたいのはまさにその点です。**クオンツで目指すべきは「リターン最大化を狙う最適化」ではなく、「堅牢性を組み込んだ最適化」**だということ。素朴なリターン最大化は推定ノイズ・コスト・レジーム変化に脆く、バックテストの中でしか輝きません。凸最適化の本当の価値は、この「壊れにくさ」を後付けの気休めではなく、最適化問題そのものの構造として組み込める点にあります。地味な工夫の積み重ねが、実運用で生き残る「壊れにくいエッジ」を作るのです。
第7章:CVaRでテールリスクを扱う(発展)
第4章では、リスクを「分散(ボラティリティ)」で測りました。しかし分散は上振れも下振れも等しくリスクとして扱う指標です。トレーダーが本当に恐れているのは、日々の細かい上下動ではなく、めったに起きないが起きたら致命的な大損失——テールリスクです。
これを扱う代表的な指標が VaR と CVaR です。
- VaR(Value at Risk):「95%の確率で、損失はこのライン以内に収まる」という損失ライン
- CVaR(Conditional VaR / Expected Shortfall):そのラインを超えてしまった悪いケースにおける平均損失
VaRは「ラインの位置」しか教えてくれず、超えたときの酷さは語りません。CVaRは最悪ケース側の平均を見るため、テールの厚さを反映できます。そして重要なのが、CVaR最小化はシナリオベースで定式化すれば凸問題(線形計画問題)として解けるという事実です(Rockafellar & Uryasev, 2000)。
ただし限界も明確です。 CVaRの計算は過去データやシナリオの作り方に強く依存します。過去10年に暴落が含まれていなければ、CVaR最適化は暴落を「知らない」まま配分を決めます。CVaRでテールリスクが消えるのではなく、「手持ちのシナリオの範囲内で」テールに配慮した配分になる、という理解が正確です。
第8章:推定誤差とロバスト最適化
本記事で最も強調したい実務上の落とし穴がこの章です。
ここまで登場した最適化の入力——期待リターン、ボラティリティ、相関、取引コスト——は、すべて推定値です。そして厄介なことに、最適化は入力の誤差を増幅する性質があります。ソルバーは入力データの中の「わずかに有利に見える資産」を目ざとく見つけて資金を集中させようとします。その「有利さ」が単なる推定ノイズだった場合、最適化はノイズに全力で賭けるポートフォリオを自信満々に返してきます。これは "error maximization"(誤差最大化)と揶揄される、平均分散最適化の古典的な問題です。
実務での対処法:
- 正則化:極端な配分にペナルティを課し、解をマイルドにする
- ポジション上限:どんなに有利に見えても1資産あたりの上限を設ける。素朴ですが強力
- ロバスト最適化:入力を「一点の推定値」ではなく「不確実性の範囲」と考え、範囲内の最悪ケースでも大崩れしない解を求める
- 複数シナリオ検証:期待リターンや相関を少しずつ変えて最適化を回し、結果が激変するなら、その結果を信用しない
共通する思想は、**「最適化の出力を過信せず、壊れにくさを優先する」**こと。皮肉なことに、「凸最適化」と名前がついていながら、実運用で目指すべきは"最適"そのものではありません。実運用で重要なのは、過去データ上で最も美しい配分ではなく、多少前提が間違っていても破綻しにくい配分です。理論上の最適解より、多少非効率でも頑健な解のほうが実運用では長生きします。最適化は、その頑健な解を「制約付きで」探すための計算装置として使う——これが実務的な位置づけです。
第9章:機械学習との関係(発展)
「機械学習と凸最適化はどちらを学ぶべきか?」——実務ではこの2つは競合ではなく分業の関係にあります。
- 機械学習の役割:各資産・各戦略の期待リターンやリスクを推定する。つまりシグナルを作る
- 凸最適化の役割:そのシグナルを、リスク・レバレッジ・コスト制約のもとで実際のポジションに変換する
MLのスコアをそのままポジションにするのは危険です。スコアの信頼度、他資産との相関、現在保有との差分コスト、全体のリスクバジェット——これらを整合的に処理するのが凸最適化レイヤーの仕事であり、言い換えれば**「予測をどれだけ信じて、どれだけ賭けるか」を規律づける仕組み**です。
ただし、AIの予測が間違っていれば、最適化はその間違いを忠実に、時には増幅して実行します(第8章の問題は入力がML由来でも消えません)。MLモデルは過学習で「自信過剰な予測」を出しがちなので、最適化側の制約設計の重要性はむしろ増します。
第10章:凸最適化の限界
最後に限界を整理します。凸最適化は利益を保証しません。
1. 入力が間違えば、出力も間違う:凸最適化が保証するのは「与えられた問題設定における最適性」だけ。問題設定が現実とズレていれば、最適解は「間違った問題の正しい答え」にすぎません。
2. 市場は非定常である:過去データから推定した相関やボラティリティが将来も続くとは限りません。特に危機時には「平時は低相関だった資産が一斉に下落する」相関の崩壊が起きがちです。
3. 実務制約の一部は非凸になる:銘柄数制限(選ぶ/選ばないの離散選択)、最低売買単位(ロット単位の整数制約)、固定手数料(売買する/しないの不連続)などは凸の枠組みに収まりません。混合整数計画法などで対処できますが、大域最適の保証は失われます。実務では「まず凸問題として解き、丸め処理で実務制約に合わせる」近似も使われます。
4. 「未知の未知」はモデルの外にある:第7章のCVaRも第8章のロバスト最適化も、有効なのは既知のリスク——つまり、シナリオとして書き出せる、あるいは不確実性の範囲として想定できるリスク——に対してです。どれほど精密にCVaRやロバスト最適化を使っても、未知の制度変更、流動性の蒸発、取引停止、まだ一度も観測されていない極端事象を完全に織り込むことはできません。モデルに入力できるのは「想定できたこと」だけであり、本当に破滅的な損失はしばしば「想定リストの外」からやってきます。ここに、タレブが強調するモデルリスクの本質があります。だからこそ実務では、最適化の内側の工夫(制約・正則化)に加えて、最適化の外側の備え——そもそも失っても致命傷にならないサイズでしか賭けない、レバレッジを構造的に抑える——が最後の防衛線になります。
凸最適化との相性 早見表
| 問題 | 凸最適化との相性 | 説明 |
|---|---|---|
| ポートフォリオのリスク最小化 | ◎ 高い | 分散やリスク制約を扱いやすい |
| レバレッジ制約付き資産配分 | ◎ 高い | 総エクスポージャー上限を制約として入れやすい |
| ターンオーバー制約付きリバランス | ◎ 高い | 売買量をペナルティや制約として扱いやすい |
| CVaR最小化 | ○ 条件次第 | シナリオベースなら凸問題として扱える |
| 売買シグナルの発見 | △ 限定的 | シグナル探索は非凸・非線形・過剰最適化になりやすい |
| 深層学習モデルの学習 | × 低い | 通常は非凸最適化の世界 |
| 銘柄数を10個以内に限定 | × 低い | 整数制約が入り非凸になりやすい |
どこまでが凸で、どこから非凸になりやすいか
| 実務上の制約 | 凸/非凸の傾向 | コメント |
|---|---|---|
| 各資産の比率を0%以上にする | 凸 | ロングオンリー制約として扱いやすい |
| 各資産の比率を20%以下にする | 凸 | 上限制約として扱いやすい |
| レバレッジを2倍以下にする | 凸にしやすい | 定式化次第で扱いやすい |
| 分散リスクを一定以下にする | 凸にしやすい | 共分散行列が適切なら扱いやすい |
| 売買量に比例したコストを入れる | 凸にしやすい | 線形・L1型ペナルティとして入れやすい |
| 銘柄数を10個以内にする | 非凸になりやすい | 選ぶ/選ばないの離散選択が入る |
| 最低売買単位を厳密に守る | 整数制約になりやすい | ロット単位の問題になる |
| 固定手数料を厳密に入れる | 非凸になりやすい | 売買する/しないの切り替えが入る |
おまけ:CVXPYで3資産最適化を書いてみる
概念を実務に接続するために、Pythonの凸最適化ライブラリ CVXPY による最小限の実装例を載せます。本格実装ではなく、「凸最適化の考え方をコードで見る」ためのおもちゃです。解いているのは本記事の要素を全部盛りにした問題です。
maximize: 期待リターン − λ × リスク − γ × 売買量
制約: 合計比率 = 1、各資産比率 >= 0、各資産比率 <= 上限、全体リスク <= 上限
import cvxpy as cp
import numpy as np
# ==============================
# 入力データ(すべて「仮定した推定値」です)
# ==============================
# 3資産: 米国株、米国債券、金
mu = np.array([0.07, 0.03, 0.04]) # 期待リターン(年率)
# 共分散行列(ボラティリティと相関から仮に構成)
vols = np.array([0.18, 0.06, 0.15])
corr = np.array([
[1.0, -0.2, 0.1],
[-0.2, 1.0, 0.2],
[0.1, 0.2, 1.0],
])
Sigma = np.outer(vols, vols) * corr
w_current = np.array([0.40, 0.40, 0.20]) # 現在の保有比率
# ==============================
# パラメータ
# ==============================
lam = 4.0 # リスク回避度
gamma = 0.5 # 売買ペナルティの強さ
w_max = 0.50 # 各資産の上限(50%)
risk_max = 0.12 # ポートフォリオ全体のボラ上限(年率12%)
# ==============================
# 凸最適化問題の定義
# ==============================
w = cp.Variable(3)
ret = mu @ w # 期待リターン
risk = cp.quad_form(w, Sigma) # リスク(分散)
turnover = cp.norm1(w - w_current) # 売買量(現在比率からの変化)
objective = cp.Maximize(ret - lam * risk - gamma * turnover)
constraints = [
cp.sum(w) == 1, # フルインベスト
w >= 0, # ロングオンリー
w <= w_max, # 各資産の上限
cp.quad_form(w, Sigma) <= risk_max**2, # 全体リスク上限
]
prob = cp.Problem(objective, constraints)
prob.solve()
# ==============================
# 結果表示
# ==============================
assets = ["米国株", "米国債券", "金"]
print(f"status: {prob.status}")
for name, cur, opt in zip(assets, w_current, w.value):
print(f"{name}: 現在 {cur:.1%} -> 最適 {opt:.1%}")
print(f"ポートフォリオ期待リターン: {mu @ w.value:.2%}")
print(f"ポートフォリオボラティリティ: {np.sqrt(w.value @ Sigma @ w.value):.2%}")
遊んでみてほしい実験:
-
mu(期待リターン)を1%だけ変えて、最適配分がどれだけ動くか見る → 第8章の「推定誤差の増幅」を体感できます -
gammaを 0 にして、売買ペナルティなしの場合と配分を比較する → 第6章のターンオーバー制御の効果が見えます -
lamを大きく/小さくして、リスク回避度による配分の変化を見る
注意書き: 期待リターン・共分散はすべて説明用の仮定値です。実データで動かす場合も入力はあくまで推定値であり、出力を過信しないでください。本記事のコードおよび内容は投資助言ではなく、実際の投資判断はご自身の責任で行ってください。
結論:凸最適化は「エッジを損益に変える」数学
冒頭の問題提起に戻ります。分布を見てリスクを測り、運よくエッジらしきものを見つけたとして——その先に、資金をどう配分し、リスクにどう制約をかけ、どうコストを抑えるかという工程が残っています。エッジを見つけることと、そのエッジを実際の損益に変えることは、まったく別の仕事なのです。
誤解のないように、あらためて言葉を選び直しておきます。**凸最適化は、市場リスクを消す道具でも、制御しきる道具でもありません。それは、自分が理解している範囲のリスクに制約をかけ、資金配分を規律づける道具です。**制約の外側には、常にモデルが知らないリスクが残ります。
凸最適化が重要なのは、市場を完全に読み切れるからではありません。むしろ逆で、市場が不確実で、ノイズが多く、非定常だからこそ、資金配分・リスク制約・取引コスト管理といった部分だけでも、数学的に安定した形で扱う必要があります。せっかく見つけたエッジを、雑な配分や過剰な売買で自分から潰してしまわないための工程——それが凸最適化の担う役割です。
凸最適化は利益を保証する魔法ではありません。入力の推定誤差には脆く、非定常な市場の前では前提ごと崩れることもあります。それでも、「凸として切り出せる部分」に限れば、大域最適性・安定性・説明可能性を備えた極めて信頼できる実務の道具です。エッジ探索やAIの華やかさに比べると地味なテーマですが、長く生き残るクオンツになるためには、この「エッジを損益に変える数学」こそ体系的に学ぶ価値があると考えています。
もっと学びたい人へ:無償で読める決定版テキスト
凸最適化を本格的に学びたくなったら、この一冊を強くおすすめします。
Stephen Boyd & Lieven Vandenberghe, Convex Optimization (Cambridge University Press)
📖 https://stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf(著者自身によって全文が無償公開されています)
スタンフォード大学のBoyd教授らによる、この分野の事実上の標準テキストです。いきなり通読する必要はありません。本記事と接続しやすいのは、前半の凸集合・凸関数(なぜ「迷子にならない」のかの理論的裏づけ)と、応用編のポートフォリオ最適化の例です。手を動かすなら、本記事のミニコードで使った CVXPY がこの教科書の理論をそのままPythonコードにできる公式ツールになっています。理論と実装を行き来しながら、自分の3資産最適化を少しずつ育てていくのが、遠回りに見えて一番の近道だと考えています。
参考文献・キーワード
- Markowitz, H. (1952). "Portfolio Selection." Journal of Finance.
- Rockafellar, R.T. & Uryasev, S. (2000). "Optimization of Conditional Value-at-Risk." Journal of Risk.
- Boyd, S. & Vandenberghe, L. Convex Optimization. Cambridge University Press.(全文無料PDF: https://stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf )
- CVXPY: https://www.cvxpy.org/
本記事は情報提供を目的としたものであり、特定の投資手法や金融商品を推奨するものではありません。












