yfinance [1] [2] は、Yahoo Inc. が公開している API を利用した、Yahoo Finance の株価などの金融情報にアクセスしてデータを取得するために開発されたオープンソースの Python ライブラリです。
本ブログで yfinance を利用して1分足の為替データを取得、mplfinance でローソク足チャートを作成する方法を紹介しました [3]。今回は、紹介したスクリプトをベースにして、PySide6 で GUI 化しました。
- Python で yfinance パッケージを利用して、3時間前から現在までの、ドル・円の為替レートの1分足のデータを取得してチャートにし、1分間隔で更新する GUI アプリを作ります。
下記の OS 環境で動作確認をしています。
RHEL 9.4 | x86_64 | |
Python | 3.12.1 | |
PySide6 | 6.7.2 | |
mplfinance | 0.12.10b0 | |
yfinance | 0.2.41 |
サンプルを以下に示しました。
以下に実行例を示しました。
サンプルの説明
最初の MyChart クラスは、PySide6 で Matplotlib のチャートを PySide6 側でウィジェットとして扱えるようにする FigureCanvas を継承したクラスです。
class MyChart(FigureCanvas): def __init__(self): self.fig = Figure() self.fig.subplots_adjust(left=0.2, right=0.95, top=0.9, bottom=0.15) self.ax = self.fig.add_subplot(111) super().__init__(self.fig) def clearAxes(self): axs = self.fig.axes for ax in axs: ax.cla() def refreshDraw(self): self.fig.canvas.draw() def removeAxes(self): axs = self.fig.axes for ax in axs: ax.remove()
次の Example クラスは、ドル・円の為替レートの1分足のデータを取得してチャートに表示するメインプログラムです。
クラスの初期化メソッド(コンストラクタ)では、次の処理をしています。
- ウィンドウのタイトル、サイズを設定
- yfinance の Ticker クラスのインスタンス self.ticker を定義
- 60,000 ミリ秒(= 1分)毎に self.draw_chart メソッドを実行するタイマーを起動
class Example(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Exchange') self.setFixedSize(400, 400) self.ticker = yf.Ticker('USDJPY=X') self.chart = MyChart() self.setCentralWidget(self.chart) self.draw_chart() timer = QTimer(self) timer.timeout.connect(self.draw_chart) timer.start(60000)
self.draw_chart メソッドでは、self.get_exchange メソッドでドル・円の為替レートの1分足のデータフレームを取得して、mplfinance パッケージ (= mpf) でローソク足チャートを描画しています。
def draw_chart(self): df = self.get_exchange() if len(df) == 0: return self.chart.clearAxes() mpf.plot(df, type='candle', style='binance', ax=self.chart.ax, ) df0 = df.tail(1) title = '%.3f JPY at %s' % (df0['Close'].iloc[0], str(df0.index[0].time())) self.chart.ax.set_title(title) self.chart.ax.set_ylabel('USD - JPY') self.chart.ax.grid() self.chart.refreshDraw()
self.draw_chart メソッドでは、現在時刻と3時間前の時刻から、Ticker クラスのインスタンス self.ticker の history メソッドで過去3時間のドル・円の為替レートの1分足のデータフレームを取得して、インデクスの時刻データのタイムゾーンを日本に変換して返します。
取引時間外で取得したデータフレームが空の場合は何もせずにそのまま空のデータフレームを返します。
def get_exchange(self) -> pd.DataFrame: end = dt.datetime.now(dt.timezone(dt.timedelta(hours=9))) delta = dt.timedelta(hours=3) start = end - delta df = self.ticker.history(start=start, end=end, interval='1m') if len(df) > 0: df.index = df.index.tz_convert('Asia/Tokyo') return df
取得するデータ量を最小限にする工夫をするべきですが、ここではアプリ側の処理をシンプルにするため。毎回、過去3時間のデータを全て取ってきてしまっています。
参考サイト
- ranaroussi/yfinance: Download market data from Yahoo! Finance's API
- yfinance · PyPI
- bitWalk's: yfinance で1分足の為替データを取得 [2024-08-01]
- QTimer - Qt for Python
にほんブログ村
#オープンソース
0 件のコメント:
コメントを投稿