Matplotlibを使用したFXチャートの作成
これまで、lightweight-chartsを使用してFXのチャートを作成してきましたが、今回はmatplotlibを使って新たなチャートを作成する方法を紹介します。matplotlibはPythonの強力な描画ライブラリで、カスタマイズ性が高く、様々な種類のグラフやチャートを作成することができます。
目的
今回の目的は、matplotlibを使用して以下の要件を満たすFXチャートを作成することです。
アニメーションで表示
MACDやRSIなどのテクニカル指標を表示
実装コード
まず、必要なライブラリをインポートします。matplotlibの他にpandasやmplfinanceも使用します。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import pandas as pd
import mplfinance as mpf
import datetime
データの読み込み
CSVファイルからデータを読み込む関数を定義します。ここでは、日時をインデックスとして設定します。
def load_data(filename, skiprows=0):
data = pd.read_csv(filename, skiprows=skiprows)
data['datetime'] = pd.to_datetime(data['datetime'])
data.set_index('datetime', inplace=True)
return data
アニメーションの更新
アニメーションを更新するための関数を定義します。ここで、グローバル変数end_timeを使用して、表示するデータの範囲を調整します。
def animate(i, data, ax):
global end_time
if i == 0:
return
processed_data = process_data(data, end_time, range_length)
ax.clear()
mpf.plot(processed_data, ax=ax, type='candle', style='charles')
end_time = end_time + datetime.timedelta(minutes=1)
データの加工
データを加工する関数を定義します。特定の時間範囲のデータを取得します。
def process_data(data, end_time, range_length):
range_start = end_time - pd.Timedelta(minutes=range_length)
return data[range_start:end_time]
アニメーションの設定と実行
初期設定を行い、アニメーションを開始します。
end_time = datetime.datetime(2023, 11, 8, 6, 0)
range_length = 100
fig, ax = plt.subplots()
ax.set_xlim([datetime.datetime(2023, 11, 8, 0, 0), datetime.datetime(2023, 11, 8, 23, 59)])
ax.set_ylim([150, 151]) # Y軸の範囲を適宜調整
data = load_data('2023-11-08.csv')
ani = animation.FuncAnimation(fig, animate, fargs=(data, ax), frames=len(data) + 1, interval=300)
plt.show()
まとめ
このようにして、matplotlibを使用してFXチャートをアニメーションで表示することができます。
次回はMACDやRSIなどのテクニカル指標を表示してみます。
その他
今回使用したデータ形式です
datetime,symbol,open,high,low,close
2023-11-08 00:00, USDJPY, 150.597, 150.598, 150.57, 150.587
2023-11-08 00:01, USDJPY, 150.587, 150.592, 150.574, 150.585
2023-11-08 00:02, USDJPY, 150.586, 150.599, 150.576, 150.597
2023-11-08 00:03, USDJPY, 150.597, 150.597, 150.584, 150.586
2023-11-08 00:04, USDJPY, 150.586, 150.596, 150.565, 150.574
:
:
この記事が気に入ったらサポートをしてみませんか?