金融予測ラベリング応用編：　米雇用統計タートルズ戦略

# 雇用統計とは
米雇用統計とは、米国労働省（U.S. Department of Labor Bureau of Labor Statistics）が毎月発表する、米国の雇用情勢を調べた景気関連の経済指標の事です。全米の企業や政府機関などに対してサンプル調査を行い、10数項目の統計が発表されます（失業率、非農業部門就業者数、建設業就業者数、製造業就業者数、小売業就業者数、金融機関就業者数、週労働時間、平均時給など）。雇用情勢の推移は、個人所得・個人消費などにも関係し、また今後の景気動向にも大きな影響を与えます。この統計の中でも「非農業部門就業者数」と「失業率」の２項目が特に注目されていて、FOMC（連邦公開市場委員会）の金融政策の決定にも大きな影響を与えると言われています。FXにおいては、最大の経済指標と言われており、数字の推移に関係なく変動する場合も多く、イベント化していると言えます。 [参照元:YahooJapanファイナンス](https://info.finance.yahoo.co.jp/fx/marketcalendar/detail/9031)

# 2020年の5月8日発表の雇用統計
米国では4月、労働市場が急激に悪化。非農業部門雇用者数は前月から2050万人減少し、失業率は前月の3倍余りとなる14.7％に上昇した。 [参照元:Bloomberg](https://www.bloomberg.co.jp/news/articles/2020-05-08/QA0ITRT1UM0W01)

# 投資対象インデックス
ダウ平均に着目する。アメリカの経済を代表する株価指数で、上場している中でも特に一流の企業たちの株価に基づいて計算されている。

# マクロ分析
アメリカの失業者数が増えれば、政府の税収はほとんど個人の所得税からなので、コロナからの大幅な失業者数は政府にとって大損失になる。コロナショックの影響で、ひたすら金融緩和を続けているが、政府の資金で債券や株を大量に購入する状況が続く中、政府の収入も減れば、例えるなら、家族の大黒柱が家族全員失業しても一人で家庭を支えなければいけない状況と一緒で、家庭崩壊する危険性がある。つまり、大家族が15%も失業したら、大黒柱一人では大変だろうから、残りの85%の家族にも付けが回らざるを得ない状況になる。

# 投資戦略
毎月発表される雇用統計で、マクロ的な観点からも影響はあると見受けられるが、発表後の一か月間にトレンドが実際に存在していたら、前回の記事の[タートルズ手法](https://qiita.com/cryptrader/items/6507fa6bc9da03a94410)でトレンドに乗ることが出来るはずである。

# データセット
データは[ここ:ダウ平均](https://stooq.com/q/d/?s=%5Edji&c=0&d1=19480101&d2=20200508)と[ここ:失業率](https://www.kaggle.com/tunguz/us-monthly-unemployment-rate-1948-present/version/2)からダウンロードする。
ただ、曜日の設定は難易度が高い。というのも、基本的に米雇用統計の発表日は第一金曜日だが、問題は、その日が祝日だと第二金曜日になるということであり、祝日かどうかも米国の祝日なので、ここは大雑把に変更した。取引自体は第二月曜日から日足ベースで行うことにした。
<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>rate</th>    </tr>  </thead>  <tbody>    <tr>      <th>2019-06-10</th>      <td>3.6</td>    </tr>    <tr>      <th>2019-07-08</th>      <td>3.7</td>    </tr>    <tr>      <th>2019-08-12</th>      <td>3.7</td>    </tr>    <tr>      <th>2019-09-09</th>      <td>3.7</td>    </tr>    <tr>      <th>2019-10-14</th>      <td>3.5</td>    </tr>    <tr>      <th>2019-11-11</th>      <td>3.6</td>    </tr>    <tr>      <th>2019-12-09</th>      <td>3.5</td>    </tr>    <tr>      <th>2020-01-13</th>      <td>3.5</td>    </tr>    <tr>      <th>2020-02-10</th>      <td>3.6</td>    </tr>    <tr>      <th>2020-03-09</th>      <td>3.5</td>    </tr>    <tr>      <th>2020-04-13</th>      <td>4.4</td>    </tr>    <tr>      <th>2020-05-11</th>      <td>14.7</td>    </tr>  </tbody></table>

次にダウ平均のデータセットである。ここは特に曖昧な点はないと思われる。

<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>open</th>      <th>high</th>      <th>low</th>      <th>close</th>    </tr>    <tr>      <th>date</th>      <th></th>      <th></th>      <th></th>      <th></th>    </tr>  </thead>  <tbody>    <tr>      <th>2020-05-08</th>      <td>24107.82</td>      <td>24349.90</td>      <td>24107.05</td>      <td>24331.32</td>    </tr>    <tr>      <th>2020-05-07</th>      <td>23837.21</td>      <td>24094.62</td>      <td>23834.39</td>      <td>23875.89</td>    </tr>    <tr>      <th>2020-05-06</th>      <td>23978.88</td>      <td>24054.59</td>      <td>23661.14</td>      <td>23664.64</td>    </tr>    <tr>      <th>2020-05-05</th>      <td>23958.88</td>      <td>24169.72</td>      <td>23868.91</td>      <td>23883.09</td>    </tr>    <tr>      <th>2020-05-04</th>      <td>23581.55</td>      <td>23769.56</td>      <td>23361.16</td>      <td>23749.76</td>    </tr>    <tr>      <th>2020-05-01</th>      <td>24120.78</td>      <td>24120.78</td>      <td>23645.30</td>      <td>23723.69</td>    </tr>    <tr>      <th>2020-04-30</th>      <td>24585.57</td>      <td>24585.57</td>      <td>24186.90</td>      <td>24345.72</td>    </tr>    <tr>      <th>2020-04-29</th>      <td>24490.37</td>      <td>24764.77</td>      <td>24453.99</td>      <td>24633.86</td>    </tr>    <tr>      <th>2020-04-28</th>      <td>24357.17</td>      <td>24512.24</td>      <td>24031.20</td>      <td>24101.55</td>    </tr>    <tr>      <th>2020-04-27</th>      <td>23866.15</td>      <td>24207.65</td>      <td>23840.61</td>      <td>24133.78</td>    </tr>    <tr>      <th>2020-04-24</th>      <td>23628.24</td>      <td>23826.00</td>      <td>23417.68</td>      <td>23775.27</td>    </tr>    <tr>      <th>2020-04-23</th>      <td>23543.09</td>      <td>23885.36</td>      <td>23483.35</td>      <td>23515.26</td>    </tr>  </tbody></table>

# データセットの分析
![Dow_versus_umemployment_rate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/e19362cb-211a-b911-4445-e556ee45d464.png)
まずは純粋に過去70年間の失業率とダウ平均について見ていこう。これだけ見ても、正直ダウが強すぎて、むしろ失業率が高くなってもダウは永遠に上がるのではないかと思われるかもしれない。だが、失業率が特に歴史的に高い水準(8%超え)などの場所では、全然違う風景が見えるかもしれない。

![scatters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/185d588a-1bce-0108-3d1c-49a4a236cbe2.png)

これは、全体の散布図である。失業率が高い部分ではむしろ価格が上がる傾向がみられる。株価が上がり続けているのでそういう傾向なのだろうか。しかし、ほとんどランダムではある。この特徴量では正直トレンド予測は出来なさそうだが、一応タートルズ投資戦略を実行してみる。

# 戦略の実装
戦略のパフォーマンスの実験するために、まずは失業率でフィルタリングせずに、そのまま適用してみよう。今回はあまりにも期間が長く、より一般性を持たせるため、エントリーしてから清算するまでの価格変化率でみることにした。また、ロングもショートも許容している。

```python
T = 20
long_entry = df["High"] > df["High"].rolling(T).max().shift(1)
short_entry = df["Low"] < df["Low"].rolling(T).min().shift(1)
close_long = df["Low"] < df["Low"].rolling(T//5).min().shift(1)
close_short = df["High"] > df["High"].rolling(T//5).max().shift(1)

X = df["Close"].values
N = len(X)
label = [np.nan]*N
long = long_entry.values
short = short_entry.values
l_close = close_long.values
s_close = close_short.values
for n in range(N):
    if long[n]:
        for m in range(n, N):
            if l_close[m]:
                label[n] = (X[m]-X[n])/X[n]
                break
    if short[n]:
        for m in range(n, N):
            if s_close[m]:
                label[n] = (X[n]-X[m])/X[n]
                break
labels = pd.DataFrame(label, index=df.index, columns=["bin"])
labels
```

なので、パフォーマンスの計測は以下のようになる。
```python
(1+labels.fillna(0)).cumprod()
```

![turtles_strategy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/de7279f0-fd37-a17d-57bc-48d35eaa95a3.png)

今回のタートルズ戦略では、確かに1960年代、1970年代で物凄い利益率を叩き出していた。アメリカでこの手法を用いて伝説的な存在になったトレーダーも大体この時期に取引している。途中で資産が200倍以上になり、最終的には2倍になっている。ただ、こちらはシグナルが連続で出ているときは何度もポジションを保有するため、もしかしたら、めちゃくちゃ賭けているのかもしれない。ただ、1960年代、1970年代で、利益的であったことには間違いない。

# 失業率でフィルタリングしたときの戦略
今回は失業率が8%以上のときのみ取引しようと思う。そして、失業率が高い時は、ショートのみで戦おうと思う。

```python
import numpy as np
from tqdm import tqdm
T = 20
short_entry = (df["Low"] < df["Low"].rolling(T).min().shift(1)) | (df["unemployment_rate"] > 8)
close_short = df["High"] > df["High"].rolling(T//5).max().shift(1)

X = df["Close"].values
N = len(X)
label = [np.nan]*N
long = long_entry.values
short = short_entry.values
l_close = close_long.values
s_close = close_short.values
for n in tqdm(range(N)):
    if short[n]:
        for m in range(n, N):
            if s_close[m]:
                label[n] = (X[n]-X[m])/X[n]
                break
labels = pd.DataFrame(label, index=df.index, columns=["bin"])
labels
```

![turtles_strategy_with_ur.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/704100b1-55c1-58bb-25a3-3a51a8f91aaa.png)

残念ながら、途中で破産してしまった。

# 結論
実際、失業率でトレンドを検知することは難しそうである。また、ダウ平均が強すぎて、失業率が高くなってもここでショートするのは極めて危険である。また今回のタートルズ手法では、損切ラインを儲けていないため、損失がかなり大きくなりやすく、リスク管理を含めたラベリングをする必要がある。