なぜ今、日本株APIが注目されているのか
NISAの拡充や個人投資家の増加を背景に、日本でも「APIで株を自動売買する」という文化が急速に広まっています。2026年現在、無料・低コストで使える日本株のリアルタイムAPIが充実しており、PythonとAPIさえあれば個人でも本格的な自動売買システムを構築できる環境が整いました。本記事では、日本株対応APIの選び方から、Pythonでの実装、リスク管理まで実践的に解説します。
日本株リアルタイムAPI比較(2026年版)
1. 立花証券e支店API(無料)
口座開設するだけで利用可能。リアルタイム株価・板情報・20年分の日足データが無料で取得できます。Python + Linux環境に対応しており、個人投資家に最も人気の選択肢です。
2. Moomoo API(米国株も対応)
日本株と米国株の両方に対応したOpenAPIで、リアルタイムクォートと自動発注が可能。デモ取引機能があるため、実資金を使わずにロジックのテストができます。
3. kabu.com API(auカブコム証券)
REST APIとWebSocketに対応。注文・約定情報のリアルタイム取得が可能で、日本株自動売買の定番APIです。
環境構築とライブラリのインストール
# 必要ライブラリのインストール
# pip install requests websocket-client pandas schedule yfinance
import requests
import json
import pandas as pd
import time
import schedule
from datetime import datetime, time as dtime
株価データの取得(yfinanceで日本株)
まずはyfinanceを使って日本株データを取得する基本実装から始めましょう。
import yfinance as yf
import pandas as pd
from datetime import datetime
class JapanStockDataFetcher:
"""日本株データ取得クラス"""
def __init__(self, tickers: list):
self.tickers = tickers
def get_realtime_quote(self, ticker: str) -> dict:
"""最新の株価情報を取得"""
stock = yf.Ticker(ticker)
info = stock.info
hist = stock.history(period="1d", interval="1m")
if hist.empty:
return {}
latest = hist.iloc[-1]
return {
'ticker': ticker,
'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'current_price': float(latest['Close']),
'volume': int(latest['Volume']),
'open': float(hist.iloc[0]['Open']),
'high': float(hist['High'].max()),
'low': float(hist['Low'].min()),
'name': info.get('longName', ticker)
}
def get_multi_quotes(self) -> pd.DataFrame:
"""複数銘柄の株価を一括取得"""
quotes = []
for ticker in self.tickers:
try:
quote = self.get_realtime_quote(ticker)
if quote:
quotes.append(quote)
except Exception as e:
print(f"{ticker} の取得エラー: {e}")
return pd.DataFrame(quotes)
# 使用例
watchlist = ['7203.T', '6758.T', '9984.T', '6861.T', '8306.T']
fetcher = JapanStockDataFetcher(watchlist)
df = fetcher.get_multi_quotes()
print(df[['ticker', 'name', 'current_price', 'volume']].to_string())
シンプルな自動売買ロジックの実装
import yfinance as yf
import pandas as pd
import numpy as np
from datetime import datetime
class SimpleAutoTrader:
"""
移動平均クロス戦略の自動売買クラス
※ 本番運用前に必ずペーパートレードで検証してください
"""
def __init__(self, ticker: str, short_window: int = 5, long_window: int = 25):
self.ticker = ticker
self.short_window = short_window
self.long_window = long_window
self.position = 0
self.trade_log = []
def get_signal(self) -> str:
"""移動平均クロスのシグナルを判定"""
stock = yf.Ticker(self.ticker)
hist = stock.history(period="3mo")
if len(hist) < self.long_window:
return "hold"
short_ma = hist['Close'].rolling(self.short_window).mean()
long_ma = hist['Close'].rolling(self.long_window).mean()
current_cross = short_ma.iloc[-1] > long_ma.iloc[-1]
prev_cross = short_ma.iloc[-2] > long_ma.iloc[-2]
current_price = hist['Close'].iloc[-1]
if current_cross and not prev_cross:
print(f"[{datetime.now()}] 買いシグナル: {self.ticker} @ {current_price:.0f}円")
return "buy"
elif not current_cross and prev_cross:
print(f"[{datetime.now()}] 売りシグナル: {self.ticker} @ {current_price:.0f}円")
return "sell"
return "hold"
def execute_signal(self, dry_run: bool = True):
"""シグナルに基づいてトレードを実行(dry_run=Trueでペーパートレード)"""
signal = self.get_signal()
stock = yf.Ticker(self.ticker)
price = stock.history(period="1d")['Close'].iloc[-1]
if signal == "buy" and self.position == 0:
if dry_run:
print(f"[DRY RUN] 買い注文: {self.ticker} 100株 @ {price:.0f}円")
self.position = 100
self.trade_log.append({'action': 'buy', 'price': price, 'time': datetime.now()})
elif signal == "sell" and self.position > 0:
if dry_run:
entry_price = self.trade_log[-1]['price']
pnl = (price - entry_price) * self.position
print(f"[DRY RUN] 売り注文: {self.ticker} {self.position}株 @ {price:.0f}円")
print(f"損益: {pnl:+,.0f}円")
self.position = 0
self.trade_log.append({'action': 'sell', 'price': price, 'pnl': pnl, 'time': datetime.now()})
# ペーパートレードの実行
trader = SimpleAutoTrader('7203.T', short_window=5, long_window=25)
trader.execute_signal(dry_run=True)
スケジューリングで定期実行する
import schedule
import time
from datetime import datetime, time as dtime
def is_trading_time() -> bool:
"""東証の取引時間かどうか判定(9:00〜11:30, 12:30〜15:30)"""
now = datetime.now()
if now.weekday() >= 5: # 土日は除外
return False
current_time = now.time()
morning = dtime(9, 0) <= current_time <= dtime(11, 30)
afternoon = dtime(12, 30) <= current_time <= dtime(15, 30)
return morning or afternoon
def run_trading_logic():
"""取引時間中のみ実行"""
if not is_trading_time():
return
print(f"[{datetime.now()}] 自動売買チェック実行")
trader = SimpleAutoTrader('7203.T')
trader.execute_signal(dry_run=True)
# 5分ごとにシグナルチェック
schedule.every(5).minutes.do(run_trading_logic)
print("自動売買システム起動。Ctrl+Cで停止。")
while True:
schedule.run_pending()
time.sleep(1)
リスク管理の重要ポイント
自動売買システムを本番運用する前に、必ず以下のリスク管理を実装してください:
- ストップロス:エントリー価格から-3〜5%で自動損切り
- ポジションサイジング:1銘柄への集中投資を避け、総資産の10〜20%以内に抑える
- 最大損失額の設定:1日の損失が設定額を超えたら自動停止
- ペーパートレード期間:最低1〜3ヶ月は実資金を使わずに検証する
まとめ・次のステップ
PythonとリアルタイムAPIを使った日本株自動売買の基礎を解説しました。2026年現在、無料で使えるAPIが充実しており、個人投資家でも本格的なシステムを構築できます。ただし、自動売買は「設定して放置」ではなく、定期的なモニタリングとチューニングが欠かせません。まずはペーパートレードで十分に検証し、自分の戦略の優位性を確認してから実資金での運用を始めてください。次のステップとして、kabu.com APIやSBI証券のAPIを使った実際の発注システムの構築にチャレンジしてみましょう。
