※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
Pythonで株価分析を始め、日足や分足のデータは自由に扱えるようになった段階にいる方は多いはずです。
そこから一歩進んで「歩み値(ティックデータ)を使った分析がしたい」と考えるのは自然な流れです。約定1件1件の粒度でマーケットの動きを捉えられれば、分析の精度は格段に上がります。
しかし、いざティックデータを取得しようとすると壁にぶつかります。「yfinanceで取れないのか」「無料APIはないのか」という疑問が次々と湧き、情報を探しても明確な答えが見つかりません。
その原因は、データの粒度(Granularity)の違いと、取引所のデータ配信ポリシーが正しく理解されていない点にあります。無料ツールの限界と有料データの境界線が曖昧なまま、時間だけが過ぎていくケースが大半です。
本記事では、ティックデータの定義と他の時間足との違いを整理したうえで、無料ツールで取得できるデータの限界を明示します。さらに、有料APIの具体的な選択肢とPythonでの取得コードまでを一貫して解説します。
自分の分析に本当にティックデータが必要なのか、判断するための材料として活用してください。
データ粒度の基礎知識
ティックデータとは何か
ティックデータ(Tick Data)とは、取引所で成立した約定(やくじょう)1件ごとの記録です。1つのティックには、約定時刻・約定価格・約定数量・売買区分といった情報が含まれます。
日足(Daily)が1日1本、1分足(1-Minute Bar)が1分1本のローソク足を生成するのに対し、ティックデータは時間で区切りません。1秒間に数十〜数百件の約定が発生する銘柄では、1秒あたり数十〜数百行のデータが生まれます。
時間足との違いを数値で理解する
データ粒度の違いは、1日あたりのデータ量で比較すると明確になります。以下は東証プライム市場の流動性が高い銘柄を想定した概算値です。
| データ種別 | 1日あたりの行数(目安) | 1年あたりの容量(目安) |
|---|---|---|
| 日足 | 1行 | 数KB |
| 1分足 | 約300行(前場+後場) | 数MB |
| ティックデータ | 数千〜数万行 | 数百MB〜数GB |
| 板情報(フルデプス) | 数十万行以上 | 数十GB以上 |
ティックデータは1分足の数十倍から数百倍の情報量を持ちます。この圧倒的なデータ量が、無料配信を困難にしている根本的な理由です。
ティックデータが必要になる場面
すべての分析にティックデータが必要なわけではありません。必要になる代表的なケースを整理します。
* 高頻度取引(HFT)の検証:ミリ秒単位の約定タイミングを再現する必要がある
* VWAP(出来高加重平均価格)の正確な計算:分足VWAPとティックVWAPでは精度が異なる
* スプレッド分析・マーケットマイクロストラクチャー研究:板の変動と約定の関係を調べる
* スリッページの推定:実際の約定価格のばらつきをシミュレーションする
スイングトレードや日足ベースの分析であれば、1分足データで十分対応できます。ティックデータの取得にコストをかける前に、本当に必要かを冷静に判断してください。
無料ツールで取得できるデータの限界
yfinanceの対応範囲
yfinanceはYahoo Financeからデータを取得する定番ライブラリです。対応する最小時間足は1分足であり、ティックデータには対応していません。
さらに、1分足データにも制約があります。
* 取得可能期間:直近7日間(7日を超えるとデータが返らない)
* 対象市場:米国株は安定して取得できるが、日本株(.T銘柄)は欠損が発生しやすい
* データ遅延:リアルタイムではなく15〜20分の遅延がある場合がある
7日分の1分足は検証用としても心もとない量です。長期バックテストには使えないと考えてください。
その他の無料データソース
yfinance以外の無料手段も、ティックデータの提供には至りません。
| ツール・サービス | 最小時間足 | 日本株対応 | 制約 |
|---|---|---|---|
yfinance |
1分足 | △(不安定) | 直近7日間のみ |
| Alpha Vantage(無料枠) | 1分足 | × | 25リクエスト/日 |
pandas-datareader |
日足 | △ | データソースに依存 |
| Stooq | 日足 | ○ | 分足以下は非対応 |
| JPX(日本取引所)公開データ | 日足 | ○ | 歩み値は有償配信のみ |
結論として、ティックデータを無料で継続的に取得できる汎用的な手段は存在しません。一部の証券会社がAPI経由でリアルタイムティックを提供していますが、口座開設と一定の取引実績が条件になる場合がほとんどです。
【コピペOK】無料で取れる範囲を確認するPythonコード
無料の限界を「体感」するために、yfinanceで1分足データを取得し、データ量と期間の制約を確認するコードを用意しました。
pip install yfinance pandas
import sys
from datetime import datetime, timedelta
from typing import Optional
import yfinance as yf
import pandas as pd
# ==============================
# 設定エリア
# ==============================
TICKER_SYMBOL: str = "7203.T" # トヨタ自動車(Yahoo Finance形式)
TICKER_LABEL: str = "トヨタ自動車(7203)"
INTERVAL: str = "1m" # 最小取得間隔(1分足)
LOOKBACK_DAYS: int = 7 # yfinance 1分足の最大取得期間
OUTPUT_CSV: Optional[str] = None # CSVに保存する場合はファイル名を指定
# ==============================
# データ取得
# ==============================
def fetch_intraday_data(
ticker: str, interval: str, days: int
) -> pd.DataFrame:
'指定銘柄のイントラデイデータを取得する'
end_date: datetime = datetime.now()
start_date: datetime = end_date - timedelta(days=days)
df: pd.DataFrame = yf.download(
ticker,
start=start_date.strftime("%Y-%m-%d"),
end=end_date.strftime("%Y-%m-%d"),
interval=interval,
progress=False,
)
return df
# ==============================
# データ集計・表示
# ==============================
def summarize_data(df: pd.DataFrame, label: str, interval: str) -> None:
'取得データの概要をコンソールに表示する'
if df.empty:
print(f"[WARN] {label}: データが取得できませんでした。")
return
total_rows: int = len(df)
first_ts: str = str(df.index[0])
last_ts: str = str(df.index[-1])
trading_days: int = df.index.normalize().nunique()
print("=" * 50)
print(f"銘柄 : {label}")
print(f"取得間隔 : {interval}")
print(f"総行数 : {total_rows:,} 行")
print(f"取得開始 : {first_ts}")
print(f"取得終了 : {last_ts}")
print(f"営業日数 : {trading_days} 日")
print(f"1日平均行数 : {total_rows // max(trading_days, 1):,} 行")
print("=" * 50)
print("n[INFO] ティックデータとの比較(推定):")
estimated_ticks: int = total_rows * 50
print(f" 1分足 {total_rows:,} 行 → ティック推定 {estimated_ticks:,} 行以上")
print(" ※流動性の高い銘柄では1分あたり50〜200ティック発生")
def save_to_csv(df: pd.DataFrame, filepath: str) -> None:
'DataFrameをCSVファイルに保存する'
df.to_csv(filepath)
print(f"[INFO] CSV保存完了: {filepath}")
# ==============================
# メイン処理
# ==============================
if __name__ == "__main__":
print(f"[INFO] {TICKER_LABEL} の{INTERVAL}データを取得中...")
intraday_df: pd.DataFrame = fetch_intraday_data(
TICKER_SYMBOL, INTERVAL, LOOKBACK_DAYS
)
summarize_data(intraday_df, TICKER_LABEL, INTERVAL)
if OUTPUT_CSV and not intraday_df.empty:
save_to_csv(intraday_df, OUTPUT_CSV)
if intraday_df.empty:
sys.exit(1)
コードの処理フロー解説
上記のコードは、以下の3ステップで構成されています。
* ステップ1 データ取得:yf.downloadで指定銘柄の1分足データを直近7日分リクエストする
* ステップ2 集計・表示:総行数・期間・1日平均行数を算出し、ティックデータとの推定行数比較を表示する
* ステップ3 CSV保存(任意):OUTPUT_CSVにファイル名を設定すれば、取得データをローカルに保存する
INTERVALを"5m"や"1h"に変更すれば、他の時間足との行数差も確認できます。
有料APIとデータプロバイダーの選択肢
主要なティックデータ提供サービス
ティックデータを取得するには、有料のデータプロバイダーと契約する必要があります。主要なサービスを比較します。
| サービス名 | 対象市場 | ティックデータ | 月額費用(目安) | Python SDK |
|---|---|---|---|---|
| Polygon.io | 米国株・オプション | ○ | $29〜$199 | ○(公式) |
| Alpaca Markets(有料プラン) | 米国株 | ○(SIP) | $99〜 | ○(公式) |
| Databento | 米国・欧州先物 | ○(L3対応) | 従量課金 | ○(公式) |
| 楽天RSSまたはkabuステーションAPI | 日本株 | △(リアルタイムのみ) | 口座開設で無料 | △(非公式) |
| 日経NEEDS-Tick | 日本株 | ○(ヒストリカル) | 要問合せ(学術利用可) | × |
米国株であればPolygon.ioの月額$29プランが個人開発者の定番です。日本株のヒストリカルティックデータは選択肢が極端に少なく、学術利用の日経NEEDS-Tickか、証券会社APIでリアルタイム取得して自前で蓄積する方法が現実的です。
証券会社APIを使う選択肢
日本株のティックデータを無料に近い形で得るには、証券会社のAPIを利用する方法があります。
* auカブコム証券 kabuステーションAPI:PUSH配信でリアルタイムティックを受信できる。口座開設は無料だが、APIキーの発行に一定条件がある
* 楽天証券 RSS(Realtime Spread Sheet):Excelアドイン経由でリアルタイムデータを取得し、Pythonに橋渡しする。ただしExcel連携が前提のため、サーバー運用には不向き
* SBI証券:2025年時点でティックレベルの個人向けAPIは未提供
いずれもリアルタイム配信であり、過去のヒストリカルティックデータは提供されません。ヒストリカルデータが必要な場合は、リアルタイムデータを自前のデータベースに蓄積し続ける仕組みが必要です。この蓄積にはVPS(Virtual Private Server:仮想専用サーバー)と常時稼働のスクリプトが不可欠であり、インフラコストも考慮してください。
現実的な判断基準
ティックデータの導入可否は、以下の基準で判断してください。
* 年間コスト1万円以下で済ませたい → 1分足(yfinance等)で十分か再検討する
* 米国株が対象 → Polygon.ioの$29/月プランを検討する
* 日本株が対象でリアルタイムのみ必要 → kabuステーションAPIを検討する
* 日本株のヒストリカルティックが必要 → 日経NEEDS-Tickか自前蓄積を検討する
多くの個人投資家にとって、1分足データで分析を完結させる方がコスト対効果は高いです。ティックデータは「明確な用途が定まってから」導入しても遅くありません。
よくあるエラーと対処法
yfinanceで1分足が0行しか返らない
日本株(.T銘柄)の1分足リクエストで空のDataFrameが返るケースです。Yahoo Finance側のデータ欠損や、市場が閉まっている時間帯のリクエストが原因です。
以下を試してください。
* LOOKBACK_DAYSを5〜6に短縮して再実行する
* 東証の営業時間(9:00〜15:30 JST)を過ぎてからリクエストする
* 米国株(例:AAPL)で同じコードを実行し、ライブラリ自体が動作するか切り分ける
Polygon.ioで403 Forbiddenが返る
APIキーの権限不足またはプランの制約が原因です。無料プランではティックデータのエンドポイントにアクセスできません。
以下を試してください。
* ダッシュボードで契約プランを確認し、Starter($29/月)以上であることを確認する
* APIキーをリジェネレート(再発行)して再設定する
* リクエストURLのパスが/v3/trades/形式であることを確認する(旧APIの/v2/は非推奨)
データ量が大きすぎてメモリエラーになる
ティックデータを一括でDataFrameに読み込むと、数GB規模のデータでメモリ不足が発生します。個人PCのメモリが16GB未満の場合は特に危険です。
以下を試してください。
* pandas.read_csvのchunksizeパラメータを設定し、分割読み込みする
* dtypeを明示的に指定し、float64をfloat32に、object型をcategory型に変換する
* 分析対象を特定の日付範囲や銘柄に絞り、全量ロードを避ける
まとめ
この記事では、ティックデータの定義・無料ツールの限界・有料APIの選択肢を体系的に解説しました。
要点を整理します。
* ティックデータは約定1件ごとの記録であり、1分足の数十〜数百倍のデータ量を持つ
* yfinanceで取得できる最小粒度は1分足であり、取得期間は直近7日間に限られる
* 無料でティックデータを継続的に取得できる汎用的な手段は存在しない
* 米国株はPolygon.io(月額$29〜)、日本株はkabuステーションAPIまたは日経NEEDS-Tickが現実的な選択肢
* スイングトレードや日足分析には1分足で十分であり、ティックデータは明確な用途が定まってから導入すべき
次のステップとして、まず本記事のコードで1分足データの行数と期間制約を体感してください。そのうえで、自分の分析手法にティックレベルの粒度が本当に必要かを判断してください。
必要と判断した場合は、Polygon.io等の有料APIの無料トライアルで小規模なデータを取得し、分析パイプラインを構築することを推奨します。いきなり大量データを契約するのではなく、段階的にデータ粒度を細かくしていくアプローチが、コスト面でもスキル面でも安全です。

