摩擦のある金融市場での最適投資戦略

# まずはお約束（ディスクレーマー）
私は経済学者でも物理学者でもなく、ただのゆるふわデータサイエンティストです。
ここに書いてあることは「ふーんそんな考え方もあるのかな」くらいの気持ちで玄米茶でも飲みながら読んでください。
本記事は何らかの行動を促すものでは全くありません。
あくまでも、数理モデルとPythonプログラミングに関する資料の一環としてご覧ください。

# モチベーション

## 摩擦なしが許されるのは高校生までだよね
物理でもファイナンスでも、特に初学者向けの教科書では摩擦を無視したがります[^1]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/688df2a9-0f62-35b3-9a03-8c7136cb1d62.png)
もちろんその方が話がわかりやすいからですし、定量的に摩擦の影響が十分小さく無視して差し支えない場合もあるからですが、現実はそう甘くありません。
今回は、読者の皆様の関心も（物理よりは）高い方が多いであろう投資（金融市場）の世界で、教科書から一歩進んでみた議論をしてみたいと思います。

## 金融市場での摩擦＝取引コスト
株式にしろ、FXにしろ、買った後すぐ売ると確実にコスト分だけ損しますし、たとえ買って少し値上がりしても、その値幅がコスト以上でないとやはり利益が出ません。
たとえばFXの世界では取引コストはビッド・アスク・スプレッドと呼ばれていて、以下の図のように常に売値と買値が提示されています[^2]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/0d9b7e44-11a3-3654-2aaf-7dba3867c155.png)
この図の場合、1ドルを135.057円で買ってすぐ売ると135.055円なので、レートに一切値動きが無くても1ドルあたり0.002円の損失が確定します。

## どんな投資家が摩擦を注意すべきか
+ 中短期投資家
長期投資の場合は、その値幅がコストに比べて十分大きいので無視しても大した影響にはならないケースがありますが、中短期スパンの場合、コストをしっかり考慮に入れていないと、値幅がコストに満たずコスト負けするリスクが無視できなくなります。
+ 定期的にリバランス（ポートフォリオの見直し）をする投資家
一回きりの投資案件であればコストも一回で済みますが、定期的にリバランスをしてポートフォリオを組みかえながら投資を継続する場合、ポートフォリオは回せば回すほどコストは確実に積みあがっていきます。
+ **アルゴリズム取引をする投資家**
コンピュータを使って自動売買する場合、定期的にリバランスをする中短期スパンの戦略が多いと思います。

# 思考実験
最も単純なケースとして、投資対象は２つの銘柄$i=1,2$しかなく、時点も$t=1,2$の２時点しかない世界を考えましょう。
また、投資戦略としてはショート（空売り）もレバレッジ（手持ち金額以上の投資）もなくフル・インベストメント（全額投資）とします。
すなわち投資ウェイト$w_t=(w_t^1,w_t^2)$について、
```math
\displaylines{
0\leq w_t^i \leq 1 \\
w_t^1+w_t^2=1
}
```
とします。この期間において利益を最大化する投資戦略$w=(w_{t=1}, w_{t=2})$を考えてみましょう。
まず、最も肝心な摩擦である取引コストはどの銘柄も売却時に売買金額あたり$s (\geq 0)$かかるものとし、ここでは具体的に$s=2％$としておきましょう。
そしていま、貴方は各時点での全ての銘柄のリターンを完全に（＝リスク無く）予測できる神様であったとして、$t=1$時点における銘柄$i$のリターン$r_{t=1}^i$について、
```math
\displaylines{
r_1^1=3\%,~r_1^2=1\%
}
```
であることがわかったとします。
このとき、$t=1$時点における最適ポートフォリオは簡単です。銘柄$i=1$の方が儲かるのですから
```math
\displaylines{
w_{1}=(w_1^1,w_1^2)=(1, 0)
}
```
でいいはずです[^3]。
さて、次に時刻が$t=2$に進んで、神様である貴方は両銘柄のリターンに変化が発生したことを知ります。
```math
\displaylines{
r_2^1=2\%,~r_2^2=3\%
}
```
この場合、どのようにリバランスをするのが最適なのでしょうか？$t=1$のときと同様、リターンの大きい銘柄$i=2$に全振りして
```math
\displaylines{
w_2=(w_2^1,w_2^2)=(0, 1)
}
```
とすればよいのでしょうか？
このとき、$t=1\rightarrow2$でのリバランスによって、銘柄$i=1$は以下の通り回転し、したがってコストが発生します。
```math
\displaylines{
\Delta w_{1\rightarrow2}^1=w_2^1-w_1^1=-1~\therefore|\Delta w_{1\rightarrow2}^1|*s=2\%\\
}
```
したがって、銘柄$i=1$の投資によって得たコスト控除前リターン$3％$は、リバランスのコスト$2％$によりコスト控除後は$1％$になります。
さらに、$t=2$時点の投資を完了する際、銘柄$i=2$から得られるコスト控除前リターンは$3％$ですが、銘柄$i=2$を売却するために再びコストが$2％$かかるので（銘柄$i=1$は非保有だったのでコストはかからない）、コストを控除後は$1％$です。
結局、$t=1$で$1％$の利益、$t=2$で$1％$の利益だったので、トータルでは$2％$の利益でした。利益は利益ですが、これが果たして利益を最大化する戦略だったのでしょうか？
賢明な読者の方ならお気づきでしょうが、$t=2$時点でのリバランスに失敗していて、このときリバランスをすべきではなかったのです。もしリバランスをしなければ、$t=1\rightarrow2$では取引コストが発生せず$3％$の利益、$t=2$ではコスト控除前リターンが$2％$、銘柄$i=1$の売却コストが$2％$でコスト控除後リターンが$0％$だったので、トータルでは$3％$の利益で終われていたのです。
つまり、複数時点にわたりリバランスを伴う投資戦略には**経路依存性**があることがわかります。
次節では、どのようにコストを考慮して投資戦略をモデリングすべきか、ありがちな**間違った例**[^4]と共に解説します。

# 数理モデル
## まずは初歩のおさらい
まず、摩擦もリスクも無い場合の効用関数$U$[^5]からおさらいしましょう。ここからは数学的便宜上、ウェイト$w$もリターン$r$も縦ベクトルであるとし、2資産に限る必要もないので一般にN資産としましょう。
```math
\displaylines{
U_t=\sum_{i=1}^Nw_t^ir_t^i=w'_tr_t
}
```
つまり、各銘柄のウェイトとリターンの単なる加重和ですね。
これを最大化する$w$は、当然ながらリターンが最大である銘柄100%です。
```math
w_t^i = \left\{
\begin{array}{ll}
1 & r_t^i=\max\{r_t^i\}_{i=1,\cdots,N}\\
0 & otherwise
\end{array}
\right.
```
こんな単純な関数の場合は微分するまでもないですが、これから摩擦のある市場で考えるときのために練習として微分もしてみましょう。尚、今後は時刻$t$が見た目煩わしいときは省いていきます。
```math
\displaylines{
\frac{dU}{dw}=\frac{d}{dw}w'r=r
}
```
これはベクトルの微分であることに注意してください。したがって微分係数$dU/dw$もN次元ベクトルです。物理屋さん的にはナブラ記号を使って$\nabla{U}$と書いたほうがわかりやすいかもしれません。

## 間違ったモデル
ここから本題です。といっても最初は間違った例からいきます。
余談ですが、世の中の多くの教科書はいきなり正解を見せてしまう[^6]ので読者から考える力を奪っていると思います。全ての問題は試行錯誤の末に正解に辿り着きますし、思考力は試行錯誤から身に付きます。
さて、摩擦のある市場では額面通りのリターンではなくコストが引かれるわけだから、最初から各銘柄のコスト控除後のリターンを期待値にすればいいのではないかと思って、以下のように効用関数$U$を定式化したとします。尚、ここからはコスト$s$も銘柄毎、時点毎に異なる値をとってよいベクトルだとしましょう。
```math
\displaylines{
U_t=\sum_{i=1}^Nw_t^i(r_t^i-s_t^i)=w_t'(r_t-s_t)
}
```
これだけだと前節からほとんど変わらないので、更に問題を一般化し、ショートやレバレッジも可能としましょう。この場合、コストの取り扱いに少し注意が必要です。
```math
\displaylines{
U_t=\sum_{i=1}^Nw_t^i*\max\{|r_t^i|-s_t^i,0\}*\mbox{sign}(r_t^i)
}
```
急に複雑になりましたね（といっても結局間違っているわけですが）。実際に数値例で挙動をみていきましょう。
最初の思考実験の例で、$r_{t=1}^{i=2}=1％$、$s_1^2=2％$でした。ここで素朴に両者の差をとると、$r_1^2-s_1^2=-1％$となり、期待リターンがマイナスでショートすればいいように見えてしまいますが、たとえば$w_1^2=-1$とすれば
```math
\displaylines{
w_1^2(r_1^2-s_1^2)=(-1)*(-1\%)=+1\%
}
```
となって利益を得られるでしょうか？もちろん違います。
正しくは、ショートに伴ってコストの符号が逆転し、
```math
\displaylines{
w_1^2(r_1^2+s_1^2)=(-1)*(+1\%)=-1\%
}
```
となって、やはり損失になるため、ロングでもショートでもコスト負けします。
したがって、$t=1$時点において銘柄$i=2$に投資しても何も嬉しくない（効用が増えない）ということになります。これを先ほどの修正後効用関数$U$に代入すると、
```math
\displaylines{
\max\{|r_1^2|-s_1^2,0\}=\max\{-1％,0\}=0
}
```
となるため、銘柄$i=2$の項は0となり、ウェイト$w_1^2$の値をどうとっても効用にはプラスに働かない寸法です。
一方、たとえば新しい銘柄$i=3$があって、コスト控除前リターンが$r_1^3=-3％$の場合、これはコストの$2％$を上回って値下がりするため、ショートする価値があります。
これを修正後効用関数$U$に代入すると、
```math
\displaylines{
\max\{|r_1^3|-s_1^3,0\}*\mbox{sign}(r_1^3)=\max\{|-3\%|-2\%,0\}*(-1)=-1\%
}
```
となるため、ウェイト$w_1^3$を負値すなわちショートすることによって利益を上げられ、効用にプラスに働きます。
さて、この効用関数を用いて、先ほどの思考実験の例の正解に辿り着くことはできるでしょうか。
まず、$t=1$の場合（%記号が煩わしいので省きます）、
```math
\begin{eqnarray*}
U_1&=&w_1^1*\max\{|r_1^1|-s_1^1,0\}*\mbox{sign}(r_1^1)+w_1^2*\max\{|r_1^2|-s_1^2,0\}*\mbox{sign}(r_1^2)\\
&=&w_1^1*\max\{|3|-2,0\}*\mbox{sign}(3)+w_1^2*\max\{|1|-2,0\}*\mbox{sign}(1)\\
&=&2w_1^1
\end{eqnarray*}
```
したがって$U_1$は$(w_1^1,w_1^2)=(1,0)$のとき最大値$2(％)$をとります。
次に$t=2$の場合、
```math
\begin{eqnarray*}
U_2&=&w_2^1*\max\{|r_2^1|-s_2^1,0\}*\mbox{sign}(r_2^1)+w_2^2*\max\{|r_2^2|-s_2^2,0\}*\mbox{sign}(r_2^2)\\
&=&w_1^1*\max\{|2|-2,0\}*\mbox{sign}(2)+w_1^2*\max\{|3|-2,0\}*\mbox{sign}(3)\\
&=&w_2^2
\end{eqnarray*}
```
したがって$U_2$は$(w_2^1,w_2^2)=(0,1)$のとき最大値$1(％)$をとります。
はい、駄目でしたね。$t=2$における選択を誤っているだけでなく、そのときの効用関数の合計が$U_1+U_2=3％$となっており、ポートフォリオの利益$2％$とも一致しません。
これは投資戦略の経路依存性を無視し、ポートフォリオに与えるコストの勘定を誤っていることが原因です。

## 正しいモデル
最初の思考実験における損益計算を忠実に定式化しましょう。
ただし、取引コストが「購入後の売却時のみ」発生する想定は数学的に取り扱いづらいので、ポジションを開いた時でも閉じた時でもコストが発生するものとします[^7]。
まず、$t=t'-1\rightarrow t'$におけるウェイトの回転$\Delta w_{t'}$を以下の通り定義します。
```math
\displaylines{
\Delta w_{t'}=w_{t'}-w_{t'-1}
}
```
これを用いれば、リバランスを伴うポートフォリオの損益は以下の通り計算できます。
```math
\begin{eqnarray*}
U_t&=&\sum_{i=1}^Nw_t^ir_t^i-\sum_{i=1}^N|\Delta{w_t^i}|s_t^i \\
&=&w'_tr_t-\sum_{i=1}^N|\Delta{w_t^i}|s_t^i
\end{eqnarray*}
```
ここで終わりにして後はマシンパワーに任せて数値計算でも良いのですが、元物理屋としては多少雑でも近似的に解析解を求めたいところです。また、ポートフォリオの資産数が多い場合は数千銘柄に及ぶので、高頻度のアルゴリズム取引で計算スピードを求めたい場合にもやはりもう少し解析的に扱いやすい形に変形したほうがよいでしょう。
機械学習の評価関数でもお馴染みですが、絶対値$|x|$の代わりとしては二乗数$x^2$がよく使われるので、変更後の効用関数$\tilde{U}$を次のように改めて定式化します。ついでにネットポジション100%の制約もつけてラグランジュの未定乗数法が使えるようにしておきます。
```math
\begin{align}
&\tilde U_t=w'_tr_t-\frac{\mu}{2}\sum_{i=1}^N(\Delta{w_t^i})^2s_t^i-\lambda(w'_t1-1)\\
&w'_t1=1
\end{align}
```
ここで定数$\mu$は好みで適当に選びます[^8]。$\mu$が大きいほどコストに対して慎重になります。
また$\lambda$はラグランジュの未定乗数です。
$\tilde{U}$は二次関数ですから、微分して極大値を求めることができます。
```math
\begin{eqnarray*}
\frac{d\tilde{U}}{dw^i}&=&r^i-\mu s_t^i\Delta{w_t^i}-\lambda \\
\therefore \frac{d\tilde{U}}{dw}&=&r-\mu*\mbox{diag}\{s\}(w_t-w_{t-1})-\lambda1=0 \\
\end{eqnarray*}
```
ラグランジュの未定乗数法によって、ウェイト$w_t$と未定乗数$\lambda$を同時に求めます。
```math
\begin{eqnarray*}
\left(
\begin{array}{c|c} 
  \mu*\mbox{diag}\{s\} & 1 \\ \hline
  1' & 0 \\
\end{array} 
\right)\left(
\begin{array}{} 
  w_t\\ \hline
  \lambda\\
\end{array} 
\right)&=&\left(
\begin{array}{} 
  r+\mu*\mbox{diag}\{s\}w_{t-1}\\ \hline
  1\\
\end{array} 
\right)\\
\therefore \left(
\begin{array}{} 
  w_t\\ \hline
  \lambda\\
\end{array} 
\right)&=&\left(
\begin{array}{c|c} 
  \mu*\mbox{diag}\{s\} & 1 \\ \hline
  1' & 0 \\
\end{array} 
\right)^{-1}\left(
\begin{array}{} 
  r+\mu*\mbox{diag}\{s\}w_{t-1}\\ \hline
  1\\
\end{array} 
\right)
\end{eqnarray*}
```
ここで、線で仕切った行列の左上は$N\*N$行列、右上は$N\*1$縦ベクトル、左下は$1\*N$横ベクトル、右下は$1\*1$のスカラー$(=0)$です。
この式から定性的な直観を確認することができます。
まず、右辺第一項から、コストにかかる重み係数$\mu$が大きいほど、またコスト$s$が大きいほど、ウェイト$w$は小さくなります。
そして、第二項から、コスト控除前リターン$r$が大きいほど、また前時点に投下したコスト$\mbox{diag}\(s\)w_{t-1}$が大きいほど、ウェイト$w$は大きくなります。
最初の思考実験での数値例を代入して検証してみましょう。ExcelのMINVERSE（逆行列）関数やMMULT（行列積）関数を使えば簡単に計算することができます。
ただし、取引コストは片道化しているので$s=1％$、またコストに対する重み係数は$\mu=2.5$としています。
私の手元のExcelで計算した結果、以下の通りの結果になりました。
```math
\begin{eqnarray*}
w_{t=1}=(90\%, 10\%)\\
w_{t=2}=(70\%, 30\%)\\
\end{eqnarray*}
```
このとき、ポートフォリオの損益$R_t$は、
```math
\begin{eqnarray*}
R_{t=1}&=&90\%*3\%+10\%*1\%-(|90\%-0\%|*1\%+|10\%-0\%|*1\%)\\
&=&1.8\%\\
R_{t=2}&=&70\%*2\%+30\%*3\%-(|70\%-90\%|*1\%+|30\%-10\%|*1\%)\\
&=&1.9\%\\
R_{end}&=&-(|0\%-70\%|*1\%+|0\%-30\%|*1\%)\\
&=&-1.0\%\\
\therefore R_{total}&=&R_1+R_2+R_{end}\\
&=&2.7\%
\end{eqnarray*}
```
最初の思考実験での真の最適解における利益$3％$[^9]に比べれば$0.3％$わずかに劣後しますが、これは厳密な効用関数$U$を解析しやすいよう$\tilde{U}$に変更した影響です。しかし、取り扱いの簡便さや計算の高速性という意味では、変更後の$\tilde{U}$の方が優れていると思います。

# 実際にやってみた。
<iframe width="560" height="315" src="https://www.youtube.com/embed/5KdoDP4OtOQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
せっかくPythonでやるので、時点を$0\leq t\leq100$、資産を$0\leq i \leq 10$に増やし、仮想リターンを平均$0％$、標準偏差$1.25％$に従う正規乱数で生成して、間違ったモデル（数値解）、正しいモデル（解析解）の両方での投資成果を計算しました。

尚、取引コストは片道$1％$で据え置きです。1時点での値動きは約7割の確率で$\pm1.25％$の範囲内に収まるので、値幅がコストに勝てるかどうかギリギリのラインです。
さて、結果は以下の通りでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/ef444ab2-241e-569d-6af0-62436ab8b4f9.png)
注意すべきは、正しいモデル$\tilde{U}$も間違ったモデル$U$もどちらもリターンは正確に予測できている前提であるということです。すなわち、間違ったモデル$U$は値動きの予想に失敗して負けたのではなく、ポートフォリオの回転によって発生する取引コストの勘定を誤って負けているのです。

# まとめ
+ 取引コストが値幅に対して無視できない場合、たとえ将来発生するリターンを完全に正確に予測することができていたとしてもコスト負けして損失になってしまう場合があることが確認しました。
+ 取引コストを考慮して投資戦略を検討する際、単に各銘柄のコスト控除後リターンを期待値にするのは不適切で、経路依存性を考慮し直前のポジションからの回転コストを計算する方がよいことを確認しました。

# Pythonコード
Google Colabで作ったので適宜ご覧ください。

https://colab.research.google.com/drive/1_USwRHAYmaXNyLCXm9uaJR3l5P92yq-s?usp=sharing

[^1]: https://note.com/y__hiroyuki/n/n743912b1bcfb から拝借しました🙇
[^2]: https://www.central-tanshifx.com/study/bidask/ から拝借しました🙇
[^3]: 普通はリスクを考慮して分散させますが、今回はリスクが無い（リターンが期待値の通りに実現する）と仮定しているため分散の必要がありません。そして、**摩擦に注意しないとリスク無しでも利益を最大化できない恐れがある**ということです。
[^4]: かくいう私が最初その間違えたモデルを組んでバックテストしてみたらコスト負けしまくるので何じゃこりゃと頭を抱えていました。お恥ずかしい。
[^5]: 最大化したい目的関数。今回は要するに「ポートフォリオの期待リターン」だと読み替えればよいですが、リスクを考慮し始めると両者は一致しません。
[^6]: 高校や大学の数学の教科書に至ってはいきなり定理を見せてしまうので教育上大変よろしくないと思います。その定理を見つけ出すのが学問の醍醐味であるはずなのに、ただ証明をなぞるだけで面白くないと思う学生がいるのは当然です。
[^7]: ファイナンスの世界では、前者を往復手数料、後者を片道手数料と呼んでいます。
[^8]: $\Delta w\sim0$では$\mu=2.5$くらいで元の$U$に近い値になります。
[^9]: 片道手数料で計算しても結果は変わりません（確かめてみてください）。