こんにちは。システムトレーダーの卵ことKenKenです。本日も「トレンド」について、「Python3ではじめるシステムトレード ──環境構築と売買戦略」で勉強したことやそれに関連することを調べたのでまとめていきたいと思います。
トレンド判定に必要なデータの事前処理
トレンドを判断するとき、価格自体の変化に着目する以外に、価格データを加工して判断することがある。加工の仕方としては、以下がある。
- 価格の対数(lnp)
- 価格の変化率(r)
- 価格の対数の差(lndp)
- 価格の差(dp)
対数をとることで変化率がどの価格帯でも同じスケールにすることができるため、価格の動きを長期で見るときには対数をとってみる必要があるみたい。価格の差(dp)については、スケールの影響を受けやすい為、注意が必要。例えば、1000円の株価が前日比で100円上昇したというのと10000円の株価が100円上昇したのとでは、まったく意味合いが異なる。価格で見たら同じ価格だが、%表記で比較したら一目瞭然である。(10%の上昇と1%の上昇)。
変化率の対数をとったものを対数収益率という。対数収益率は、ブラックショールズの価格モデルで用いられていることで有名である。対数収益率は、スケールの変化の自動平均補正機能を持っているのが特徴である。一般的には、この対数収益率が利用されている。
日経平均株価の分析:価格変化の落とし穴!
前回の記事では、過去の日経平均株価のグラフを書きました。今回は、対数収益率に変換してグラフを書いてみます。コードは、以下の通り。
import pandas_datareader.data as pdr import pandas as pd import numpy as np import matplotlib.pyplot as plt N225 = pdr.DataReader('NIKKEI225', 'fred', '1949/5/15').dropna() # 日経平均株価取得 states = ['recover', 'growth', 'stable', 'bubble', 'reform', 'covid-19'] dates = ['1949/5/16', '1954/12/1', '1972/1/1', '1986/12/1', '1993/11/1', '2019/12/1', '2020/11/25'] # グラフを表示 fig = plt.figure() ax = fig.add_subplot(1, 1, 1) colors = ["m", "b", "c", "g", "r", "k"] # 対数価格を計算 ln_N225 = np.log(N225) for i in range(len(dates)-1): ax.plot(ln_N225[dates[i]:dates[i+1]], color=colors[i]) ax.annotate(states[i], xy=(pd.to_datetime(dates[i]), ln_N225.asof(dates[i])-0.5), color=colors[i])


書けたグラフが左側(右は、価格ベースで図示したもの)。スケールの違いからグラフの形状が少し異なるのがわかる。日経平均株価はバブル崩壊まで安定的にリターンを達成していることがわかる。ほぼ同一のグラフにも見てとれるが、対数に変換することでグラフが緩やかにやり安定している様子が見て取れる。右側のチャートだけ見たら、かなり価格変化の激しいものと見受けられる。こういったことから長期チャートを対数表示にする必要があるのがわかる。
日中リターンとオーバナイトリターンの比較
株式市場は24時間取引されているわけではない。経済指標や政府の決定などは市場が閉じているときに行われることも少なくない。また、投資家は市場が閉じている際も分析をしたり、タイムリーなニュースなどを参考に次の投資判断などを検討している。そのような市場参加者の行動をつかむ方法として、市場の寄り付きから引けまでの日中の価格変化と、市場の引けから翌日の寄り付きまでのオーバーナイトの価格の変化を比べることがある。実際に、日経平均株価についてみてみた。データは、USA Yahooファイナンスから取得している。データ取得については、こちらにまとめてある。
# リターンを計算 R_interday = np.log(N225.Close / N225.Open[1:]) # 日中リターン R_overnight = np.log(N225.Open[1:] / N225.Close) # オーバナイトリターン # 図示 fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax2 = ax.twinx() ax.plot(N225.Close, label='Close', linewidth=1, color='gray') ax2.plot(R_interday.cumsum(), label='interday', linestyle=':', color='r') ax2.plot(R_overnight.cumsum(), label='overnight', linestyle='--', color='b') plt.legend()

青がオーバナイトリターン、赤が日中リターンになる。バブル崩壊後、次のような特徴が見られる。
- 終値の下落
- オーバナイトでの指数は上昇
原因は定かになっていないが、短期の投資家が寄り付きでポジションを立て、引けでポジションを閉じることが要因として考えられる。他の指数についても同じような特徴が見られるか確認してみる。


左がS&P500、右がダウ工業株価連動ETFである。指数ごとに特徴が異なる。S&P500では、日中リターンとオーバーナイトリターンの差が解消されている。一方、ダウ工業株連動ETFでは、日中リターンとオーバーナイトリターンが逆転している。これを見たところ、日中の終わりに買って、翌日の寄り付きで売るといった単純な戦略は機能しなさそうである。
日経平均株価についてもう少し詳しく。。。
他の指数については、オーバナイトリターンは狙えなさそうだったが、日経平均株価については、可能性が残されているようにも見える。期間を短くして、日中リターンとオーバーナイトリターンの様子を見てみることにした。



期間が長くなれば日中リターンとオーバナイトリターンに差が見られるが、期間を短くすると差がなくなるどころか日中リターンの方がプラスに転じている様子が見れられる。一番左のグラフについてみてみると、2020年2月~3月頃から日中リターンとオーバナイトリターンが逆転している。新型コロナウイルスをWHOが確認したのが2020年1月14日で、1月30日にWHOが国際的な緊急事態宣言を発令。2月には国内で初の死亡者が出たりしている。他にも様々な出来事はあったが、新型コロナウイルスの拡大に伴い、投資家は慎重になったことがこのグラフからも読み取れる。寄り付き後、不安材料が無いことを確認しポジションを立てるように行動する投資家が増えているのかもしれない。
とまぁ、話が少し逸れたけど、日経平均株価についても、日中の終わりに買って、翌日の寄り付きで売るといった単純な戦略はダメそう。市場が効率的でない場合には、うまくいくのかも。他の個別銘柄単位などで見てみると面白いかもしれない。
まとめ
今回は、日中リターンとオーバーナイトリターンについて簡単に分析してみた。直近についてみてみると、新型コロナウイルスのイベントをきっかけに両リターンが逆転しているのは面白い発見であった。新型コロナウイルスの感染者数と株価の関係や、新型コロナウイルスのニュースとの関係性などお分析してみるのも面白いかもしれない。前回の記事でもふれたが、新型コロナウイルスによる確定的トレンドがあるように見える。
以上