mcpField
K
kalshi-api

kalshi-api

github.com/agiprolabsその他456307 回インストール8 週間前に更新
リポジトリ

kalshi-api について

kalshi-apiは、Kalshiの取引APIを統合するためのガイドです。RESTまたはWebSocketで市場データを取得し、注文を管理する開発者向けに、RSA-PSS認証、YES/NO板の解釈、ドル文字列形式の注文スキーマなどを説明します。

主な機能

  1. 01RSA-PSSリクエスト署名の解説
  2. 02口座・注文・市場エンドポイントの網羅
  3. 03YES/NO買い板と価格換算の説明
  4. 04注文フィールドと形式の要件
  5. 05板情報の補助スクリプト

活用シーン

  1. 01Kalshi APIリクエストの認証実装
  2. 02市場データと過去のローソク足の取得
  3. 03注文の発注・変更・取消・一括処理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/agiprolabs/claude-trading-skills --skill kalshi-api

インストール後、Claude Code で/kalshi-apiを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
auth-and-orders.md
endpoints-and-marketdata.md
websocket.md
scripts/
kalshi_orderbook.py

詳細

Kalshi API

CFTC 規制下の米国イベント取引所です。米ドル建てのバイナリー契約は、YES が勝てば 1.00 ドル、NO が勝てば 0.00 ドルで決済されます。REST と WebSocket に対応し、すべてのリクエストで RSA-PSS 認証を使用します。

契約の仕組みと決済ルールについては、kalshi-weather-markets と kalshi-crypto-index-markets のスキルを参照してください。戦略、ポジションサイズ、バックテストについては、prediction-market-strategy を参照してください。


コーディング前に必ず確認してください。 Kalshi API では、過去に後方互換性が破られています。ホストが変更され(旧 trading-api.kalshi.com は廃止)、注文スキーマも変更されました(整数のセント表記からドルの文字列表記へ)。リリース前に、必ずライブレスポンスに対して署名と注文本文をスモークテストしてください。

正規の情報源:


概要

  • ベース URL: https://api.elections.kalshi.com/trade-api/v2
  • 認証: すべてのリクエストで RSA-PSS を使用します。公開エンドポイント(認証不要のエンドポイント)はありません。
  • デモ環境との同等性なし: デモ環境(demo-api.kalshi.co)の板はほぼ空です。読み取り専用の取得でも本番環境を使用してください。
  • 契約: 1 契約あたり 0.01~0.99 ドル。YES が勝てば価格を支払い、NO が勝てば価格を失います。最大払い戻し額は 1.00 ドルです。

クイックスタート

1. 認証情報
KALSHI_KEY_ID=<your-key-uuid>
KALSHI_PRIVATE_KEY_PATH=~/.kalshi/private.pem

Kalshi ダッシュボードでキーを生成してください。シークレットは環境変数またはシークレットマネージャーに保存し、コードには絶対に記述しないでください。

2. インストール
pip install httpx cryptography
3. ホストと認証(多くの人が間違える部分)

実装で問題が起きるのは、ホストと署名形式です。よくある失敗は次の 3 つです。

  1. 旧 trading-api.kalshi.com ホストを使う → 401
  2. 署名対象のパスにクエリ文字列を含める → 401
  3. 秒単位のタイムスタンプで署名する(ミリ秒ではない) → 401
import os, time, base64, httpx
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

BASE = "https://api.elections.kalshi.com/trade-api/v2"
KEY_ID = os.environ["KALSHI_KEY_ID"]
with open(os.environ["KALSHI_PRIVATE_KEY_PATH"], "rb") as f:
    PRIV = serialization.load_pem_private_key(f.read(), password=None)

def _headers(method: str, path: str) -> dict:
    """path must include /trade-api/v2 prefix and exclude query string."""
    ts = str(int(time.time() * 1000))             # milliseconds
    msg = f"{ts}{method}{path}".encode()
    sig = PRIV.sign(
        msg,
        padding.PSS(mgf=padding.MGF1(hashes.SHA256()),
                    salt_length=padding.PSS.DIGEST_LENGTH),
        hashes.SHA256(),
    )
    return {
        "KALSHI-ACCESS-KEY": KEY_ID,
        "KALSHI-ACCESS-TIMESTAMP": ts,
        "KALSHI-ACCESS-SIGNATURE": base64.b64encode(sig).decode(),
    }

def get(path: str, params=None):
    # Sign the path only — query goes into params, not the signature
    r = httpx.get(BASE + path, params=params,
                  headers=_headers("GET", "/trade-api/v2" + path))
    r.raise_for_status()
    return r.json()

def post(path: str, body: dict):
    r = httpx.post(BASE + path, json=body,
                   headers=_headers("POST", "/trade-api/v2" + path))
    r.raise_for_status()
    return r.json()

# Example: open markets in a series
markets = get("/markets", params={"series_ticker": "KXHIGHNY", "status": "open"})

署名仕様: RSA-PSS、SHA-256 を使用する MGF1、ソルト長 = PSS.DIGEST_LENGTH。署名対象の文字列:{timestamp_ms}{METHOD}{path}。path には /trade-api/v2 を含め、クエリ文字列は含めません。

ヘッダー:KALSHI-ACCESS-KEY(UUID)、KALSHI-ACCESS-TIMESTAMP(ミリ秒)、KALSHI-ACCESS-SIGNATURE(base64)。

4. ローソク足の履歴
# Returns OHLC for yes_bid / yes_ask + volume + open_interest
# Values are dollar strings: {"close": "0.42"}
candles = get(
    f"/series/KXHIGHNY/markets/{ticker}/candlesticks",
    params={"start_ts": start_epoch, "end_ts": end_epoch, "period_interval": 60},
)

period_interval の単位は分です。指定できる値は 1、60、1440 です。


YES/NO 注文板の規則

Kalshi では、yes と no はどちらも未約定の BID(買い注文)の段階別価格一覧です。別個の ASK(売り注文)板はありません。反対側の注文を約定させるには、反対側の買い注文を取ります。

no_ask  = 1 − best_yes_bid    # cost to buy NO right now (lift YES bids)
yes_ask = 1 − best_no_bid     # cost to buy YES right now (lift NO bids)
P(YES) mid = (best_yes_bid + (1 − best_no_bid)) / 2

これを逆に理解すると、すべてのシグナルが気づかないうちに反転します。scripts/kalshi_orderbook.py のヘルパーを使用してください。

注文板のレスポンスは、API のティアに応じて 2 種類あります。使用前に正規化してください。

{"orderbook": {"yes": [[price, size], ...], "no": [[price, size], ...]}}

価格の値が > 1.0 の場合は整数のセント表記なので、100 で割ってください。


注文スキーマ

POST /trade-api/v2/portfolio/orders では、整数ではなく固定小数点のドル文字列を使用します。旧スキーマ(整数のセント表記、count、yes_price)を使うと、400 invalid_parameters が返されます。

{
  "ticker": "KXHIGHNY-26JUN02-B75.5",
  "action": "buy",
  "side": "yes",
  "count_fp": "1.00",
  "yes_price_dollars": "0.01",
  "client_order_id": "my-strategy-001",
  "time_in_force": "good_till_canceled"
}

重要なフィールドのルール — 違反すると、それぞれ 400 が返されます。

フィールドルールよくある 400 の原因
count_fp固定小数点の文字列 "1.00"整数の count: 1
{side}_price_dollarsドルの文字列 "0.01"整数のセント表記 yes_price: 1
time_in_force必須:good_till_canceled | immediate_or_cancel | fill_or_kill省略
client_order_id[A-Za-z0-9-] のみ文字列に . または : が含まれている — ティッカーには . が含まれるため、ティッカーをそのままコピーしないでください
type送信しないでください"type": "limit"

注文の全ライフサイクル(変更、数量の減少、キャンセル、一括処理)と strike_type に関する注意点については、references/auth-and-orders.md を参照してください。

エンドポイントの概要

カテゴリエンドポイント備考
残高GET /portfolio/balance—
ポジションGET /portfolio/positions—
注文GET /portfolio/orders?status=resting|canceled|executed
注文の発注POST /portfolio/orders上記のドル文字列スキーマ
キャンセルDELETE /portfolio/orders/{id}{"order": {...status: "canceled"}} を返します
変更POST /portfolio/orders/{id}/amendリクエスト本文で ticker が必須です
減少POST /portfolio/orders/{id}/decrease{"reduce_by_fp": "1.00"}
一括POST /portfolio/orders/batched{"orders": [...]}
約定GET /portfolio/fills?limit=N
決済GET /portfolio/settlements?limit=N
マーケットGET /markets?series_ticker=&status=open&limit=500
オーダーブックGET /markets/{ticker}/orderbook?depth=N
ローソク足GET /series/{series}/markets/{ticker}/candlesticks?start_ts=&end_ts=&period_interval=60
取引GET /markets/trades直近の取引記録

エンドポイントの全仕様、マーケットのメタデータフィールド、レート制限については、references/endpoints-and-marketdata.md を参照してください。 WebSocket の検出パイプラインについては、references/websocket.md を参照してください。


ファイル

リファレンス
  • references/auth-and-orders.md — RSA-PSS の仕様、ドル文字列の注文スキーマ、time_in_force、client_order_id のサニタイズ、変更・減少・キャンセルのライフサイクル、strike_type に関する注意点、手数料
  • references/endpoints-and-marketdata.md — エンドポイントの全一覧、オーダーブックのバリエーション、マーケットのメタデータフィールド(result、open_time、close_time、series_ticker)、ローソク足、レート制限
  • references/websocket.md — WS ホスト、検出パイプライン、チャネル、WS アップグレードへの署名
スクリプト
  • scripts/kalshi_orderbook.py — YES/NO のビッド段階ヘルパー(no_ask、yes_ask、p_yes_mid、overround、kalshi_fee)。標準ライブラリのみを使用し、キーは不要で、オフラインで実行できます。

コメント