Ta-Libの指数関連の指標で必要なデータ長を調査
Ta-LibにはEMAなどの指数関連の指標を使ったものがあります。
これらはデータ長によってバックテストでの値とズレが生じるので14期間のデータが欲しいときには60位のデータ長が必要となり、実際に使うデータの大体4~5倍程度のデータが必要となりますが、実運用ではメモリを圧迫する原因にもなるので少しでも小さくしたいところです。
なぜそのようなデータ長が必要になるかはryotaさんのブログでよく解説しているのでそちらをご覧ください。
ただ具体的にどの程度のデータ長が必要なのかはstackoverflowにあったので一部抜粋してここに備忘録として残しておきます。
※stackoverflowではSTOCHRSIを使った事例でしたがこちらでは違いを見ていただくためEMAを使用しました。
期間は違いが分かりやすいように350とかにしてみました。
このコードは、以下のように動作します。
CSVファイルからデータを読み込みます。talib.EMA関数を使用して、期間350のEMAを計算します。
ストリーミングアプローチを使用して最新のEMA値を計算します。
計算されたEMAとストリーミングEMAの差が0.00001未満であることを確認します。
EMAを正しく計算するために必要な最小データ量を決定します。
必要なデータ長が見つかった場合、その値を出力します。そうでない場合、メッセージを出力して処理を終了します。
このコードは、期間350のEMAを計算するために必要な最小データ量を見つけることができます。必要なデータ量は、range()関数の引数で調整できます。ただし、データ量が大きくなるほど処理時間が長くなることに注意してください。
import talib
# Load data from CSV file
data = df.copy()
period = 350
# Compute EMA with period 350 using talib.EMA function
ema = talib.EMA(data['Close'], timeperiod=period)
# Calculate latest EMA value using a streaming approach
latest_ema = talib.EMA(data['Close'], timeperiod=period)[-1]
# Check that the difference between the computed EMA and the streaming EMA is less than 0.00001
assert abs(ema[-1] - latest_ema) < 0.00001
# Determine the minimum length of data required for correct calculation of the EMA
x = len(data['Close'])
required_length = None
for depth in range(10, 10000, 10):
ema_depth = talib.EMA(data['Close'][x - depth:], timeperiod=period)
if abs(ema[-1] - ema_depth[-1]) < 0.01:
required_length = depth
break
if required_length is not None:
print(f"Minimum data length required: {required_length}")
else:
print("Could not find a required data length within the given range")
これを実行すると下のような結果となりました。
Minimum data length required: 1640
大体5倍程度の期間となりました。
他に応用したい場合は
talib.EMAで指標の変更
for depth in range(10, 10000, 10):の変更
をします。
流行のchatGPTで変更してと1行書けばすぐ出来上がります。