8月下旬の本ブログの記事以降に、Pythonの代表的テクニカル分析ライブラリであるTA-Libに関する記事を掲載し、TA-Libのパターン識別機能についても取り上げました。しかし、このパターン識別機能が対象とするパターンは60以上あり、実際どれが有効なのかは判断しづらいところです。
最近、そのTA-Libのパターンのバックテストとしてのデータから機械学習を用いて有効なパターンを探り出す記事を見つけました。ただしMediumの記事なので、有料購読していないと閲覧回数に制限があります。
medium.datadriveninvestor.com
このうちの二つ目の記事の終わりに、この著者が開発した関数の全コードが掲載されています。二つ目の記事の本文の機械学習の適用の部分には一部手続きを省略している部分がありますが、基盤となる関数は全て網羅されており、可読性も高く非常に品質が高いコードです。ここでは、これらの関数を用いて、回帰分析により各指標の有効性を分析してみることとしました。
まず、必要なライブラリをインポートします。ここでは使いませんが、機械学習ライブラリPyCaretもインポートします。尚、現時点でPyCaretはPython3.8より後のバージョンには対応しておらず、機械学習も行うためには別途Python3.8の環境を構築する必要があります。その環境でのTA-Libのインストールは、Python3.8対応のwhlファイルをTA-Libのサイトからダウンロードして、pipによりインストールします。またGoogle Colabでは環境構築の必要はありませんが、TA-Libのインストールが特殊で手間がかかります。
# ライブラリのインポート import pandas as pd import datetime from datetime import date from datetime import timedelta import matplotlib.pyplot as plt import yahoo_fin.stock_info as si import talib import numpy as np import mplfinance as mpf from talib import abstract import warnings warnings.filterwarnings('ignore') from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error import statsmodels.api as sm from pycaret.classification import *
次に、分析対象の銘柄コードのリストを用意します(デモ用に銘柄数を絞っています)。
top_100 = ['AAPL','MSFT','GOOGL','AMZN','NVDA','TSLA','META','V','XOM','JPM',\ 'WMT','JNJ','MA','AVGO','PG','ORCL','COST','ADBE','KO','SHEL','CSCO',\ 'BAC','AZN','NVS','CRM','PFE','MCD','NFLX','DIS','INTC','NKE']
以下の関数の呼び出しにより、2000日前から10日前までの株価データを獲得します。
data = get_hist_data(tickers=top_100, time_window=2000, delta=10)
次に、バックテスト評価に用いる指標を現データに追加して、compiled_dataというデータフレームに格納します。
print(data.shape) compiled_data = compile_data(data=data, mute=True) print(compiled_data.shape)
ここで列数が増えたのはパターン識別結果の列と株価変化の列を追加したためであり、行数が減ったのは移動平均で該当データがないために計算できない時点のケースを除外したためです。
次に、機械学習や統計分析等に用いるために、元の株価データの列を削除します。
df1 = compiled_data.drop(["open","high","low","close","adjclose","volume","ticker"],axis=1) df1 = df1.reset_index(drop=True)
以下ではこのデータをもとに回帰分析を実施して、有効な指標を探っています。尚、ここではオリジナルの関数を一部修正して、二値データに加工する前の応答変数を用いています。機械学習の場合には元のコードのままで実行します。
X = df1.drop('Change', axis=1) y = df1['Change'] X = sm.add_constant(X) model = sm.OLS(y, X).fit() print(model.summary())