投資のためのデータサイエンス

個人の投資活動に役立つデータ分析にまつわる話題を綴ります。

テクニカル分析パターンの自動選別

8月下旬の本ブログの記事以降に、Pythonの代表的テクニカル分析ライブラリであるTA-Libに関する記事を掲載し、TA-Libのパターン識別機能についても取り上げました。しかし、このパターン識別機能が対象とするパターンは60以上あり、実際どれが有効なのかは判断しづらいところです。

最近、そのTA-Libのパターンのバックテストとしてのデータから機械学習を用いて有効なパターンを探り出す記事を見つけました。ただしMediumの記事なので、有料購読していないと閲覧回数に制限があります。
medium.datadriveninvestor.com

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())