alpaca-trading について
alpaca-trading は Alpaca API を通じて株式、暗号資産、オプションを取引するスキルで、口座、資産、注文、ポジションを扱います。paper trading と live trading の例を含み、市場時間やポートフォリオの確認にも対応します。
主な機能
- 01口座、資産、ポジションの照会
- 02注文の発注、変更、キャンセル
- 03株式、暗号資産、オプションの取引
- 04市場時間とポートフォリオ履歴の確認
- 05WebSocket による取引更新の受信
活用シーン
- 01paper trading で注文をテスト
- 02口座残高と保有ポジションの確認
- 03株式や暗号資産の注文管理
- 04取引状況の更新を受信
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gauss314/ skills --skill alpaca-tradingインストール後、Claude Code で/alpaca-tradingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/check_account.pycheck_positions.pyplace_order.py詳細
Alpaca Trading — Trading API
株式、暗号資産、オプションの取引 API です。ペーパートレーディング(無料)とライブトレーディングに対応しています。
ベース URL:
- ペーパー:
https://paper-api.alpaca.markets - ライブ:
https://api.alpaca.markets - SDK:
pip install alpaca-py
ドキュメント: docs.alpaca.markets
認証
API キーの取得
- app.alpaca.markets にアクセスします
- アカウントを作成します(ペーパートレーディングは無料です)
- 「API Keys」→「Generate New Keys」に進みます
設定
import os
from alpaca.trading.client import TradingClient
# Para paper trading
API_KEY = os.getenv("APCA_API_KEY_ID")
SECRET_KEY = os.getenv("APCA_API_SECRET_KEY")
BASE_URL = "https://paper-api.alpaca.markets" # Paper
# Para live trading
# BASE_URL = "https://api.alpaca.markets"
client = TradingClient(API_KEY, SECRET_KEY, paper=True)
⚠️ キーをハードコードしないでください。環境変数を使用してください。
レート制限
| API | 制限 |
|---|---|
| Orders | 200 リクエスト/分 |
| Account/Positions | 200 リクエスト/分 |
| Account Activities | 200 リクエスト/分 |
推奨事項
- リアルタイム更新には WebSocket を使用する — ポーリングより効率的です
- アカウント情報/ポジションをキャッシュする — 頻繁に問い合わせないでください
- 429 エラーに対して指数バックオフによるリトライを実装する
アカウント
アカウント情報の取得
account = client.get_account()
print(f"Buying Power: ${account.buying_power}")
print(f"Cash: ${account.cash}")
print(f"Portfolio Value: ${account.portfolio_value}")
print(f"Status: {account.status}")
アカウント設定
from alpaca.trading.requests import AccountConfigurationsRequest
config_request = AccountConfigurationsRequest(
trade_confirmation_email=True,
susi_transfer_email=True
)
client.update_account_configuration(config_request)
資産
すべての資産を一覧表示
from alpaca.trading.requests import GetAssetsRequest
from alpaca.trading.enums import AssetClass, AssetStatus
request = GetAssetsRequest(
asset_class=AssetClass.US_EQUITY,
status=AssetStatus.ACTIVE
)
assets = client.get_all_assets(request)
# Filtrar symbols tradables
tradable = [a for a in assets if a.tradable]
print(f"Assets tradables: {len(tradable)}")
特定の資産を取得
asset = client.get_asset("AAPL")
print(f"AAPL tradable: {asset.tradable}")
print(f"AAPL class: {asset.asset_class}")
注文
注文タイプ
| タイプ | 説明 |
|---|---|
market | 現在の価格で執行します |
limit | 最高価格(買い)または最低価格(売り) |
stop | stop_price に達すると成行注文を有効にします |
stop_limit | stop と limit を組み合わせます |
trailing_stop | 価格に対する相対的なストップ注文 |
有効期間
| TIF | 説明 |
|---|---|
day | 当日限り |
gtc | 取消されるまで有効 |
opg | 市場の寄り付き時に執行 |
cls | 市場の引け時に執行 |
ioc | 即時執行または取消 |
fok | 全量執行または取消 |
成行注文の作成
from alpaca.trading.requests import MarketOrderRequest
from alpaca.trading.enums import OrderSide, TimeInForce
order_request = MarketOrderRequest(
symbol="AAPL",
qty=10,
side=OrderSide.BUY,
time_in_force=TimeInForce.DAY
)
order = client.submit_order(order_request)
print(f"Order ID: {order.id}")
print(f"Status: {order.status}")
指値注文の作成
from alpaca.trading.requests import LimitOrderRequest
order_request = LimitOrderRequest(
symbol="AAPL",
qty=10,
side=OrderSide.BUY,
limit_price=150.00, # Máximo a pagar
time_in_force=TimeInForce.GTC
)
order = client.submit_order(order_request)
ストップ注文の作成
from alpaca.trading.requests import StopOrderRequest
order_request = StopOrderRequest(
symbol="AAPL",
qty=10,
side=OrderSide.SELL,
stop_price=145.00, # Vende cuando caiga a este precio
time_in_force=TimeInForce.GTC
)
注文の取得
# Todas las órdenes abiertas
open_orders = client.get_orders(status="open")
print(f"Órdenes abiertas: {len(open_orders)}")
# Órdenes filladas hoy
from datetime import datetime
filled_orders = client.get_orders(
status="fill",
start=datetime(2024, 1, 15)
)
# Orden por ID
order = client.get_order_by_id(order_id)
注文のキャンセル
# Cancelar una orden
client.cancel_order(order_id)
# Cancelar todas las órdenes abiertas
client.cancel_orders()
注文の置き換え
from alpaca.trading.requests import ReplaceOrderRequest
replace_request = ReplaceOrderRequest(
limit_price=155.00, # Nuevo precio límite
qty=15 # Nueva cantidad
)
client.replace_order(order_id, replace_request)
ポジション
オープンポジションの取得
positions = client.get_all_positions()
for pos in positions:
print(f"{pos.symbol}: {pos.qty} shares")
print(f" Avg Entry: ${pos.avg_entry_price}")
print(f" Market Value: ${pos.market_value}")
print(f" P/L: ${pos.unrealized_pl}")
特定のポジションの取得
position = client.get_position("AAPL")
print(f"AAPL: {position.qty} shares @ ${position.avg_entry_price}")
ポジションの決済
# Cerrar toda la posición
client.close_position("AAPL")
# Cerrar posición parcialmente (qty=5)
client.close_position("AAPL", qty=5)
すべてのポジションの決済
client.close_all_positions()
オプション取引
取引レベル
| レベル | 説明 |
|---|---|
| 0 | オプション取引なし |
| 1 | カバードコール、キャッシュセキュアードプット |
| 2 | コールとプットの買い/売り |
| 3 | スプレッド |
オプション契約の取得
from alpaca.trading.requests import GetOptionContractsRequest
from datetime import datetime, timedelta
request = GetOptionContractsRequest(
underlying_symbols=["AAPL"],
expiration_date_gte=datetime.now().strftime("%Y-%m-%d"),
expiration_date_lte=(datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d"),
strike_price_gte=100,
strike_price_lte=200,
limit=100
)
contracts = client.get_option_contracts(request)
contract = contracts.option_contracts[0]
# Trade con contract ID
order_request = MarketOrderRequest(
symbol=contract.id, # Usar ID del contract
qty=1,
side=OrderSide.BUY,
time_in_force=TimeInForce.DAY
)
オプションの行使
# Ejercer una posición de opción
client.exercise_options(position_id)
暗号資産取引
利用可能なシンボルの一覧表示
from alpaca.trading.enums import AssetClass
crypto_assets = client.get_all_assets(asset_class=AssetClass.CRYPTO)
crypto = [a for a in crypto_assets if a.tradable]
print(f"Crypto tradables: {[a.symbol for a in crypto[:10]]}")
暗号資産の注文
order_request = MarketOrderRequest(
symbol="BTC/USD",
qty=0.1, # Fracciones permitidas
side=OrderSide.BUY,
time_in_force=TimeInForce.GTC
)
client.submit_order(order_request)
市場営業時間
クロックの取得
clock = client.get_clock()
print(f"Market open: {clock.is_open}")
print(f"Next open: {clock.next_open}")
print(f"Next close: {clock.next_close}")
市場が開いているか確認
if clock.is_open:
print("Mercado abierto - puedes tradear")
else:
print("Mercado cerrado")
ポートフォリオ履歴
from datetime import datetime
history = client.get_account_portfolio_history(
date_start=datetime(2024, 1, 1),
timeframe="1D"
)
print(f"Equity: {history.equity}")
print(f"Profit/Loss: {history.profit_loss}")
ウォッチリスト
from alpaca.trading.requests import CreateWatchlistRequest
# Crear watchlist
watchlist = client.create_watchlist(
CreateWatchlistRequest(name="Tech Stocks")
)
# Agregar símbolo
client.add_to_watchlist(watchlist.id, "AAPL")
# Obtener watchlists
watchlists = client.get_watchlists()
WebSocket ストリーミング
from alpaca.trading.stream import TradingStream
async def handle_trade_update(data):
print(f"Update: {data}")
stream = TradingStream(API_KEY, SECRET_KEY, paper=True)
stream.subscribe_trade_updates(handle_trade_update)
stream.run()
サンプルスクリプト
./scripts/ を参照してください。
# Ver cuenta
python ./scripts/check_account.py
# Ver posiciones
python ./scripts/check_positions.py
# Enviar orden de prueba
python ./scripts/place_order.py --symbol AAPL --qty 10 --side buy --type market
よくあるエラー
| エラー | 原因 | 解決策 |
|---|---|---|
| 403 Forbidden | 無効なキー | API キーを確認する |
| 403 | 権限がない | ダッシュボードで有効にする |
| 400 Bad Request | 無効なパラメーター | 注文のドキュメントを確認する |
| 403 Trading Halted | 取引が停止中 | 待つか、状態を確認する |
| 403 No Buying Power | 資金不足 | 入金する |
| 422 | 取引不可のシンボル | シンボルを確認する |
| 429 Too Many Requests | レート制限 | バックオフを実装する |
比較:ペーパーとライブ
| 項目 | ペーパー | ライブ |
|---|---|---|
| URL | paper-api.alpaca.markets | api.alpaca.markets |
| 実資金 | ❌ いいえ | ✅ はい |
| 実際の注文 | ❌ シミュレーション | ✅ 実注文 |
| 市場データ | ✅ 実データ | ✅ 実データ |
| テスト用途 | ✅ 最適 | ❌ 不可 |
必ず最初にペーパーでテストしてください。
コメント
Markdown 対応