金融時系列データの基礎 — OHLCV(Open, High, Low, Close, Volume)は、株式・暗号資産・FXなどあらゆるマーケット分析の出発点です。本記事では、Python を使って OHLCV データを取得し、前処理、集計、可視化、さらに簡単なテクニカル指標の計算までを “エンジニア向け” に網羅します。データ取得の手段、ライブラリ、コード例、落とし穴、ベストプラクティスを含め、実践に即した内容を提供します。
1. OHLCVとは? — 用語と意味
| 項目 | 内容 |
|---|---|
| Open | 期間の開始時点の価格(始値) |
| High | 期間中の最高価格 |
| Low | 期間中の最低価格 |
| Close | 期間の終了時点の価格(終値) |
| Volume | 期間中の取引量/出来高 |
この5つの値をひとまとめにしたのが OHLCV で、株式も暗号資産も共通の “ローソク足データ + 出来高” の形式。マーケットの動きを示す基礎データとして、チャート描画、テクニカル分析、バックテストなどの土台となります。
2. データソースと取得方法の選択肢
- 暗号資産取引所の公式 API(例: Binance, Bybit など) — 取引ペアごとのローソク足 (OHLCV) を取得。
- 汎用ラッパーライブラリ/パッケージ(例: CCXT) — 多数の取引所に対して統一インターフェースで OHLCV を取得可能。
- 歴史データ提供サービス/API(例: CoinAPI, CoinGecko, サードパーティのデータ提供会社など) — 過去データをまとめて取得する用途に便利。
- CSV/ファイル形式のデータ (例: 過去のヒストリカルデータを配布しているサービス) — 手軽だが、更新性や最新性で API には劣る。
3. Python による基本取得コード
import ccxt
import pandas as pd
from datetime import datetime
例: Binance から BTC/USDT の 1時間足を取得
exchange = ccxt.binance()
symbol = 'BTC/USDT'
timeframe = '1h'
limit = 500 # 最近 500 本のローソク足
candles = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
df = pd.DataFrame(candles, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
タイムスタンプを datetime に変換
df['datetime'] = df['timestamp'].apply(lambda t: datetime.utcfromtimestamp(t/1000))
df.set_index('datetime', inplace=True)
df = df.drop(columns=['timestamp'])
print(df.head())
このように、fetch_ohlcv() を使えば簡潔にデータ取得が可能です。対応取引所かどうかは、exchange.has['fetchOHLCV'] プロパティで確認できます。また、他のライブラリや専用スクリプトとして、crypto-ohlcv のようなものもあり、こちらを使うと pandas DataFrame 形式であらかじめ整形されたデータを取得できます。
4. データ前処理と時系列整形
取得したままのデータは「リストのリスト + UNIX タイムスタンプ(ms)」という raw フォーマットです。実用につかうには、以下のような前処理が必要です:
- タイムスタンプを
datetimeに変換 - インデックスを日時 (datetime) に設定
- カラムの名前を意味のあるものに変更 (open, high, low, close, volume)
- データの昇順並び替え (必要に応じて)
これにより、時系列データとして扱いやすくなり、Pandas の時間ベース操作 (リサンプリング、スライシング、統計処理など) にスムーズに入力できます。
5. 集計・リサンプリング(時間足変換)
# 例: 1分足データ df_1m を 15分足に変換
df_15m = df_1m.resample('15T').agg({
'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum'
})
このように、任意の時間足への集約が可能です。バックテストや異なる戦略の比較には非常に強力です。
6. 可視化と技術分析の基本
ローソク足チャートや出来高付きグラフ、移動平均線 (MA)、ボリンジャーバンド、RSI などのテクニカル指標は、データ分析や戦略設計において非常に重要です。Python では以下のような方法が一般的です:
- 可視化ライブラリ: matplotlib/mplfinance/plotly など
- テクニカル指標ライブラリ: 独自計算、または TA-Lib や Pandas を使ったカスタム実装
簡単な例として、移動平均 (EMA) を加えてチャートを描画するコードは以下のようになります:
import matplotlib.pyplot as plt
df['EMA10'] = df['close'].ewm(span=10).mean()
df['EMA50'] = df['close'].ewm(span=50).mean()
plt.figure(figsize=(12,6))
plt.plot(df.index, df['close'], label='Close')
plt.plot(df.index, df['EMA10'], label='EMA10')
plt.plot(df.index, df['EMA50'], label='EMA50')
plt.legend()
plt.show()
ローソク足チャートなら mplfinance などを使うと簡単に見栄えのよいチャートが作成できます。
7. 拡張: 非同期取得・大規模データ保存・バックテスト準備
非同期取得 & 高頻度データ
大量銘柄、多数時間足を取得する場合、同期的に API 呼び出しを並列で回すとレート制限に詰まりやすくなります。非同期プログラミングを利用して並列取得し、効率的にダウンロードする方法も現実的です。たとえば「Asynchronous OHLCV Downloader」を使うと、取得効率と信頼性が向上します。
データ検証とギャップ検出
大量データを取り込む際は、欠損 (ギャップ) やデータの不整合に注意が必要です。特に自分で保存・管理する場合、日時の重複・抜け、ボリュームの異常などをチェックする仕組みを入れるとよいでしょう。最近では、複数取引所に対応し、ギャップ検知機能などを備えたライブラリも公開されています。
バックテストへの活用
整形した OHLCV データは、そのまま backtesting.py のようなフレームワークに取り込んで、戦略のバックテストに使えます。backtesting.py は Pandas 時系列 + OHLC データを前提に設計されており、効率よく手軽にテストが可能です。
8. 次のステップ
本記事では、OHLCV データの基礎から、Python による取得、前処理、可視化、そして応用までを体系的に解説しました。エンジニアとして以下のステップをおすすめします:
- まずは CCXT + Pandas でシンプルな取得と可視化を試す
- 必要に応じてリサンプリングやテクニカル指標を追加
- 高頻度や多銘柄なら非同期取得 + データ検証 + ローカル保存の仕組みを構築
- 最終的にバックテスト環境を整備し、仮説検証を容易に
このガイドが、あなたのデータ分析、アルゴリズム取引、学術的研究、どのような用途であっても、強力な “OHLCV の起点” となることを願います。