金融に興味のある方ならば、AI(機械学習)を金融に応用できないかと気になった経験が一度はありますよね。実際、金融相場の先の価格が上がるか下がるか等の市場分析(主に時系列データ分析)に機械学習がよく用いられています。
私は過去7年間トレードディングの仕事をしてきましたが、ヒョンなことからAIに興味を持って今はAI開発会社で働いているグロッグロキラッキラな会社1年目です。
私の紹介はこの辺にして、本記事では時系列データを分析をする上で知っておくと役立つPythonライブラリや金融相場そのものに対する経験から得た私の見解、考え方をざっくりとお伝えしていきます。
みなさまの参考の一つになれば幸甚です。
※金融の知識を持っていることを前提に話を進めていきますのでご注意ください
(Pythonの各ライブラリを利用する際は”$pip install <ライブラリ名>” 等でライブラリをインストールしておく必要があります。)
ohlcデータが格納されたcsvファイルをローソク足で表示する
まずはohlcデータが格納されたcsvファイルをローソク足にして表示したいと思います。ローソク足のグラフを表示させることで後々の分析が行いやすくなります。グラフを作成する際には、作成したグラフをグリグリ動かせるPlotlyというモジュールがとても便利です。
ここではビットコインの価格データを使用します。
(ファイル名:btc_ohlc.csv
カラム: date日時, open始値, high高値, low安値, close終値と仮定します。)
import pandas as pd import plotly import plotly.graph_objs as go df = pd.read_csv(‘btc_ohlc.csv’, index_col=’date’) #pandas というライブラリを用いてcsvファイルを読み込みます。 fig = go.Figure(data=[go.Candlestick(x=df.index, open=df.open, high=df.high, low=df.low, close=df.close)]) plotly.offline.plot(fig)
以上です。簡単にローソク足を表示することができましたよね。
グラフ画面上でポインタを合わせると価格データが表示されます。
またチャートの拡大縮小もすることができます。
価格分析に有用なモジュールTA-Lib
そして価格分析をする際に有用なモジュールにTA-Libというものがあります。
TA-LibはSMAやEMA, ボリンジャーバンドなどの移動平均線や、RSIやMACDなどのオシレーター系指標まで簡単に算出できる関数が豊富に用意されています。
Windowsの方は少しインストールが面倒なので簡単にまとめておきます。
以下のリンクから
https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
32bitOS なら TA_Lib-0.4.17-cp37-cp37m-win32.whl
64bitOSなら TA_Lib-0.4.17-cp37-cp37m-win_amd64.whlをダウンロードして
コマンドプロンプトを起動しcdコマンドでファイルをダウンロードしたディレクトリに移動して以下のようにインストールしてください。
$cd <whlファイルをダウンロードしたディレクトリ> $pip install TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl ※64bitOSの場合
ちなみに
$python >>from pip._internal.pep425tags import get_supported >>get_supported()
で対応するcpを確認することができます。
以下はTA-Libのサンプルコードになります。例えばpandasのSeries型を渡してあげるだけで簡単に算出してくれます。
import talib SMA20 = talib.SMA(df["close"], timeperiod=20) #期間20の単純移動平均線 RSI = talib.RSI(df["close"], timeperiod=14) #期間14のRSI
先程作成したPlotlyのグラフ上に描画したい場合は
ローソク足の部分のコードを少し修正して
trace0 = go.Candlestick(x=df.index, open=df.open, high=df.high, low=df.low, close=df.close, name="candle") trace1 = go.Scatter(x=df.index, y=SMA20, xaxis="x1", yaxis="y1",name="SMA", marker=dict(color="blue")) trace2 = go.Scatter(x=df.index, y=RSI, name="RSI", xaxis="x1", yaxis="y2",marker=dict(color="yellow")) layout = go.Layout( title="BTC chart", showlegend=True, xaxis={"title": "date"}, yaxis1={"title": "Price", 'domain': [0.3, 1]}, yaxis2={"title": "RSI", "side": "right", 'domain': [0, 0.3]}, ) fig = go.Figure(data=[trace0, trace1, trace2], layout=layout) plotly.offline.plot(fig)
とすると以下のように表示できます。
TA-Libは価格分析をする際にとても便利なので、まだ使ったことがない方にはぜひともオススメしたいモジュールです。時系列データ分析の強力な味方になってくれるでしょう。
高度な数値解析を頼れる味方 SciPy
次に信号処理や確率分布を用いた統計など高度な数値解析が可能なSciPyというライブラリがあります。ここではサンプルとして時系列データのピーク点検出をするためのコードを紹介します。
import numpy as np import matplotlib.pyplot as plt from scipy import signal x = df.index.values y = df.close.values #ピーク点のインデックスを取得 maxid = signal.argrelmax(y, order=2) #最大値(orderの値が小さいほど細かい波動のピーク点を捉える) minid = signal.argrelmin(y, order=2) #最小値 plt.figure(figsize=(12, 7)) plt.plot(x,y, label='close') plt.plot(x[maxid],y[maxid],'ro',label='peak-max') plt.plot(x[minid],y[minid],'bo',label='peak-min') plt.xticks(x[::5], rotation=90, size="small") plt.grid(True) plt.legend() plt.show() print(f"maxid: {maxid}") print(f"minid: {minid}")
イメージとしてはこんな感じです。
ここまで紹介してきた時系列データのピーク点検出以外にも、SciPyには分析で使える関数が豊富に揃っていますので、ぜひご自身でも色々と調べてみてください。
状態空間モデルを実装できるPyStan
次にMCMCサンプラーであるStanをPython上で利用できるPyStanというライブラリがあります。MCMCとはマルコフ連鎖モンテカルロ法を指します。
イメージを掴む上でこちらの記事がとてもわかりやすいです。
Pystanを用いれば汎用性の高い時系列分析モデルである状態空間モデルも実装することができます。
状態空間モデルではARMAやARIMAモデルよりも複雑な時系列モデルを構成することができます。少し難しいですが興味がありましたらぜひ試してみてください。
まずは分析対象を知ることから始めるべし!
ここまで時系列データ分析をする際に役立つツールについて触れてきましたが、ただまずは分析をする上では最初に分析対象なるものをよく知るということが非常に重要です。相場の知識が全くない状態でデータを分析し、安定して儲かるストラテジーを作ることができるかといってもそれは少し無茶なことだからです。
金融相場は互いが互いを騙し合い参加者の欲望が介在する以上、他の時系列データとは一線を画し予測は容易なことではありません。
例えばある地域の平均気温の時系列データから来年、再来年の値をある範囲内で予測することはそこまで難しいことではないでしょう。来年が今より10度気温が上昇すると予測するなんてことはどんなモデルを用いてもあり得ないことですよね。しかし金融相場ではそうした考えられない(予想がつかない)ことが頻繁に起きます。
そのためテールリスクは十分に認識しておかなければなりません。スイスフランショックみたいなことが起きれば、どんな理論もストラテジーも意味をなしませんから。
金融相場はよくランダムウォークと言われますが、もし仮に本当にランダムであるとしたら市場予測は不可能という結論になります。(理屈的に莫大な投資資金を所持している人であれば市場操作をすることは可能ではありますが。)しかし相場には時としてひずみが生まれることがしばしばあります。そのひずみ(優位性)を検知し適切な手法を組み込めるかがポイントになるはずです。
またシステムだけでなく人間にもアルゴリズムではできないようなことを手法に取り入れることによって勝てるストラテジーを確立することは可能です。相場は脈動を止めることはありません。プライスアクションを観察し価格の動きを感覚に身につければ、高速アルゴリズムなど全く関係なく安定した利益を得ることができるでしょう。
まとめ
さて、今回は時系列データ分析に役立つPythonツールと私の金融相場そのものに対する見解についてお伝えしてきました。
価格分析に役立つ関数が多数用意されているTA-Lib、高度な数値解析が可能なSciPy、StanをPython上で利用できるPyStanといったように、Pythonには時系列データだけでなく他のデータなど分析するために有用なライブラリがたくさん存在しています。
一方で、ツールを使うことを目的化せず分析対象をよく知った上でファットテールなどを十分に認識しておくことが注意しておきたい点でしたね。
ここまで役立つツールや見解を色々と述べてきましたが、結論としてはやはり市場予測はとても難しいものです。ですが、要はある行動パターンを学習できればそれでいいのかもしれません。
例えば『地震がいつ起こるか』を予測することは困難ですが、もし起きた場合どう行動し対処するかを事前に学習しておくことは可能ですし大事なことです。価格が上がるか下がるかを予測することも大事ですが、実際起きた事象においてどうアクションを起こすかをあらかじめ学習しておく方が、この金融という土俵で勝つためには理にかなっていると言えるでしょう。
みなさんのトレーディングがうまくいくことを願っています。