mcpField
K
kalshi-trading

kalshi-trading

github.com/newyorkcomputeその他942 回インストール14 週間前に更新
リポジトリ

kalshi-trading について

kalshi-tradingは、予測市場取引所Kalshiを扱うスキルです。市場の調査やポジションの確認に加え、取引所APIを通じた認証付き注文に対応します。

主な機能

  1. 01市場検索と詳細確認
  2. 02注文板と価格の確認
  3. 03残高とポジションの照会
  4. 04買い注文と売り注文

活用シーン

  1. 01オープンなイベント契約市場の調査
  2. 02注文前の流動性確認
  3. 03保有ポジションと残高の確認
  4. 04YesまたはNoの取引注文

インストール

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

$npx skills add https://github.com/newyorkcompute/kalshi --skill kalshi-trading

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

同梱ファイル

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

API_REFERENCE.md
AUTHENTICATION.md
scripts/
kalshi-client.ts

詳細

Kalshi 取引

CFTC規制対象の予測市場取引所であるKalshiで取引します。このスキルを使うと、市場の検索、確率の分析、ポジションの管理、取引の実行ができます。

型

interface Market {
  ticker: string;
  title: string;
  status: string;
  yes_bid?: number;
  yes_ask?: number;
  volume?: number;
  close_time?: string;
}

interface Orderbook {
  yes: [number, number][]; // [price_cents, quantity]
  no: [number, number][];
}

interface Balance {
  balance: number; // cents
  payout: number;  // pending settlement
}

interface Position {
  ticker: string;
  position: number; // positive = YES, negative = NO
  market_exposure: number;
}

interface Order {
  order_id: string;
  ticker: string;
  side: "yes" | "no";
  action: "buy" | "sell";
  count: number;
  status: string;
}

クイックスタート

import * as crypto from "crypto";

const API_BASE = "https://api.elections.kalshi.com/trade-api/v2";

// See AUTHENTICATION.md for full setup
function getAuthHeaders(
  apiKey: string,
  privateKeyPem: string,
  method: string,
  path: string
): Record<string, string> {
  const timestamp = Date.now().toString();
  const message = `${timestamp}${method}${path}`;

  const sign = crypto.createSign("RSA-SHA256");
  sign.update(message);
  const signature = sign.sign(privateKeyPem, "base64");

  return {
    "KALSHI-ACCESS-KEY": apiKey,
    "KALSHI-ACCESS-SIGNATURE": signature,
    "KALSHI-ACCESS-TIMESTAMP": timestamp,
    "Content-Type": "application/json",
  };
}

よくある操作

市場を検索する
async function searchMarkets(query: string, limit = 10): Promise<Market[]> {
  const url = new URL(`${API_BASE}/markets`);
  url.searchParams.set("status", "open");
  url.searchParams.set("limit", String(limit));

  const response = await fetch(url.toString());
  const data = await response.json();

  // Filter by query in title
  return data.markets.filter((m: Market) =>
    m.title.toLowerCase().includes(query.toLowerCase())
  );
}
市場の詳細を取得する
async function getMarket(ticker: string): Promise<Market> {
  const response = await fetch(`${API_BASE}/markets/${ticker}`);
  const data = await response.json();
  return data.market;
}
オーダーブックを取得する
async function getOrderbook(ticker: string): Promise<Orderbook> {
  const response = await fetch(`${API_BASE}/markets/${ticker}/orderbook`);
  const data = await response.json();
  return data.orderbook;
}
残高を確認する(認証済み)
async function getBalance(
  apiKey: string,
  privateKeyPem: string
): Promise<Balance> {
  const path = "/portfolio/balance";
  const headers = getAuthHeaders(apiKey, privateKeyPem, "GET", path);

  const response = await fetch(`${API_BASE}${path}`, { headers });
  return response.json();
}
ポジションを取得する(認証済み)
async function getPositions(
  apiKey: string,
  privateKeyPem: string
): Promise<Position[]> {
  const path = "/portfolio/positions";
  const headers = getAuthHeaders(apiKey, privateKeyPem, "GET", path);

  const response = await fetch(`${API_BASE}${path}`, { headers });
  const data = await response.json();
  return data.market_positions;
}
注文を出す(認証済み)
async function placeOrder(
  apiKey: string,
  privateKeyPem: string,
  ticker: string,
  side: "yes" | "no",
  action: "buy" | "sell",
  count: number,
  price: number // In cents (1-99)
): Promise<Order> {
  const path = "/portfolio/orders";
  const headers = getAuthHeaders(apiKey, privateKeyPem, "POST", path);

  const body = {
    ticker,
    side,
    action,
    count,
    type: "limit",
    ...(side === "yes" ? { yes_price: price } : { no_price: price }),
  };

  const response = await fetch(`${API_BASE}${path}`, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
  });
  const data = await response.json();
  return data.order;
}

主な概念

  • 市場:Yes/Noの結果があるイベント契約です(例:「XはY日までに起こるか?」)。
  • 価格:セント単位(1~99)で表示され、確率のパーセンテージを表します。
  • ポジション:保有しているYesまたはNoの契約です。
  • 決済:市場は$1.00(Yesの勝利)または$0.00(Noの勝利)で決着します。

その他のリソース

ヒント

  1. まず市場を調査する:searchMarkets()を使って機会を探します。
  2. 流動性を確認する:大きな注文を出す前に、オーダーブックの厚みを確認します。
  3. 指値注文を使う:約定価格を管理するため、成行注文は避けます。
  4. ポジションを監視する:定期的にポジションと損益を確認します。

コメント