Pandasで時系列データのOHLC(四本値)を効率的に算出・ダウンサンプリング


 

Pandasは時系列データ分析に不可欠なライブラリであり、特に金融データ分析では**OHLC(四本値:Open, High, Low, Close)**の算出が頻繁に求められます。OHLCは、ある期間における株価や為替レートの始まり(Open)、高値(High)、安値(Low)、終わり(Close)を示す重要な指標です。

この記事では、Pandasを使って高頻度データからOHLCを算出し、同時にデータをより粗い時間間隔に集約する(ダウンサンプリングする)方法を、具体的なコード例を交えて丁寧に解説します。


 

OHLC(四本値)とは?📊

 

OHLCは以下の4つの価格で構成されます。

  • Open (始値): ある期間の最初の価格

  • High (高値): ある期間の最高価格

  • Low (安値): ある期間の最低価格

  • Close (終値): ある期間の最後の価格

これらの値は、金融市場の動きを理解し、トレンドを分析する上で非常に重要です。例えば、1分足のデータから1時間足のOHLCを算出することで、より長期的な視点で価格変動を捉えることができます。


 

Pandas resampleと集計関数でOHLCを算出

 

OHLCの算出とダウンサンプリングは、Pandasの**resample**メソッドと、それに続く集計関数を組み合わせることで実現できます。resampleは、時系列データを指定した時間間隔でグループ化し、そのグループに対して様々な集計操作を適用できます。

 

サンプルデータの準備

 

まず、秒単位のサンプル価格データを用意しましょう。これをダウンサンプリングして、より長い期間のOHLCを計算します。

Python
 
import pandas as pd
import numpy as np

# サンプル価格データの作成
# 1秒間隔で100個のデータ
idx = pd.date_range('2024-07-01 09:00:00', periods=100, freq='S')
prices = pd.Series(np.random.normal(100, 1, 100).cumsum() + 500, index=idx)

# DataFrameに変換 (実際のデータは'timestamp'と'price'列などを持つことが多い)
df = pd.DataFrame({'price': prices})

print("元のデータ (一部):\n", df.head())

 

1分足のOHLCを算出する

 

秒足データから1分足のOHLCを計算してみましょう。resampleに続けて、ohlc()メソッドを使うのが最もシンプルです。

Python
 
# 1分足のOHLCを算出
ohlc_1min = df['price'].resample('1min').ohlc()

print("\n1分足OHLC (一部):\n", ohlc_1min.head())
  • df['price'].resample('1min'): price列を1分間隔でリサンプリング(グループ化)します。

  • .ohlc(): リサンプリングされた各期間に対して、自動的にOpen (始値)、High (高値)、Low (安値)、Close (終値) を算出します。

 

カスタム集計でOHLCを算出する

 

ohlc()メソッドが便利な一方で、各値の集計方法をより細かく制御したい場合は、agg()メソッドを使って個別の集計関数を指定できます。

Python
 
# agg()を使って1分足OHLCを算出
ohlc_1min_agg = df['price'].resample('1min').agg({
    'Open': 'first',  # 各期間の最初の値
    'High': 'max',    # 各期間の最大値
    'Low': 'min',     # 各期間の最小値
    'Close': 'last'   # 各期間の最後の値
})

print("\nagg()による1分足OHLC (一部):\n", ohlc_1min_agg.head())

first(), max(), min(), last()は、それぞれ始値、高値、安値、終値に対応します。この方法は、例えば特定の条件を満たす高値/安値だけを抽出したいなど、より複雑な集計が必要な場合に柔軟に対応できます。


 

resampleの便利な引数

 

 

label引数: 期間のラベル位置

 

集計されたOHLCのインデックス(タイムスタンプ)を、その期間の開始日または終了日のどちらにするかを指定できます。

  • 'left' (デフォルト): 期間の開始時刻をラベルにする

  • 'right' : 期間の終了時刻をラベルにする

Python
 
# ラベルを期間の終了時刻に設定した1分足OHLC
ohlc_1min_label_right = df['price'].resample('1min', label='right').ohlc()

print("\n1分足OHLC (ラベル終了時刻):\n", ohlc_1min_label_right.head())

 

closed引数: 期間の境界線の扱い

 

各期間の境界線を「含むか含まないか」を指定できます。

  • 'left' (デフォルト): 期間の左側(開始時刻)を含む

  • 'right' : 期間の右側(終了時刻)を含む

例えば、closed='right'とすると、09:00:00から09:00:59までのデータは09:00:00の期間に含まれず、09:01:00の期間に含まれるようになります(通常はleftで問題ないケースが多いです)。

Python
 
# 期間の右側を閉区間にした1分足OHLC (通常はデフォルトでOK)
# ohlc_1min_closed_right = df['price'].resample('1min', closed='right').ohlc()
# print("\n1分足OHLC (closed='right'):\n", ohlc_1min_closed_right.head())

 

origin引数: リサンプリングの基準点

 

リサンプリングの期間をどこから始めるか、つまり「バケット」の区切りをどこに合わせるかを指定できます。これは、特定の時刻や特定の曜日から期間を開始したい場合に便利です。

  • 'start_day', 'start_day_of_week', 'start_time' などの文字列

  • pd.Timestamp オブジェクト

Python
 
# 例: 厳密に毎時0分0秒から始まるようにする(既にそうなっていることが多いが、確認のために)
# origin='start_day_of_week'などを指定すると、週の始まりを調整できます
ohlc_1min_origin = df['price'].resample('1min', origin='start_day').ohlc()
print("\n1分足OHLC (origin='start_day'):\n", ohlc_1min_origin.head())

 

OHLCデータの活用方法

 

算出されたOHLCデータは、様々な金融分析や可視化に利用できます。

 

ローソク足チャートの作成 📈

 

OHLCデータは、株価分析で広く使われるローソク足チャートの描画に直接使用できます。Pandasのデータは、matplotlibやplotlyなどのライブラリと組み合わせて簡単に描画できます。

 

テクニカル指標の算出

 

移動平均 (MA)、ボリンジャーバンド、RSI (Relative Strength Index) など、多くのテクニカル指標はOHLCデータに基づいて計算されます。例えば、終値(Close)に対して移動平均を適用することが一般的です。

Python
 
# 終値の5期間移動平均を算出
ohlc_1min['Close_MA5'] = ohlc_1min['Close'].rolling(window=5).mean()

print("\nOHLCに5期間移動平均を追加 (一部):\n", ohlc_1min.head())

 

まとめ

 

Pandasのresampleメソッドは、時系列データからOHLC(四本値)を効率的に算出し、同時にダウンサンプリングを行うための非常に強力なツールです。

  • df.resample(rule).ohlc(): 最もシンプルにOHLCを算出する方法。

  • df.resample(rule).agg({'Open':'first', ...}): 集計方法を柔軟に制御したい場合に使う方法。

  • label, closed, originなどの引数で、リサンプリングの挙動を細かく調整可能。

これらの機能を使いこなすことで、金融データの分析や可視化が格段にスムーズになります。ぜひ、ご自身の時系列データでOHLCの算出に挑戦してみてください。