σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academyロードマップ
Ctrl K
AO
+1.2k 人の学習者
ログイン参加する ↗
ロードマップ
AO
+1.2k 人の学習者
ログイン
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python ロードマップ›モジュール 1 · クオンツのためのPython基礎›トピック 1.18·~35 分初級

JSONデータ

ロードマップ上の位置モジュール 1/11 · トピック 18/33
1.18 JSONデータ
—ラボスコア— / 100合計XP—連続日数—

テキストとしての入れ子データ

JSON は、設定ファイルや、プログラムや Web API 間でやり取りするデータの日常的な形式です。オブジェクト {"key": value}、配列 [1, 2]、文字列、数値、true/false、null でできており、Python にそのまま対応します。オブジェクトは辞書、配列はリスト、true/false は True/False、null は None になります。CSV の表と違って入れ子にでき、注文が約定のリストを持ち、それぞれが独自の項目を持つこともできます。

import json

# Text to Python: loads() ("load string")
text = '{"symbol": "AAPL", "fills": [{"price": 184.25, "qty": 100}], "open": true, "note": null}'
order = json.loads(text)
print(order["fills"][0]["price"])   # 184.25
print(order["open"], order["note"]) # True None

# Python to text: dumps() ("dump string")
print(json.dumps({"symbol": "AAPL", "qty": 200}))  # {"symbol": "AAPL", "qty": 200}

ファイル:load と dump

s のない版はファイルを扱います。json.load(file) は開いたファイルを読み込んで解析し、json.dump(data, file) は書き出します。indent=2 で人が読みやすくなり、sort_keys=True でキーの順序が安定するため、バージョン管理での差分が小さくなります。常に with と encoding="utf-8" で開きましょう。

import json

# Save a config, then load it back
config = {"fee": 0.001, "symbols": ["MSFT", "AAPL"], "limits": {"max_qty": 500}}
with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2, sort_keys=True)

with open("config.json", encoding="utf-8") as file:
    print(file.read())
    # {
    #   "fee": 0.001,
    #   "limits": {
    #     "max_qty": 500
    #   },
    #   "symbols": [
    #     "MSFT",
    #     "AAPL"
    #   ]
    # }

with open("config.json", encoding="utf-8") as file:
    print(json.load(file) == config)  # True

往復で失われるもの

JSON の型は少ないため、Python の値の一部は途中で変わります。タプルはリストに戻り、辞書のキーは必ず文字列に戻り({1: "a"} は {"1": "a"} になる)、集合・日付・独自オブジェクトは変換するまで書き出せません(TypeError)。日付は .isoformat()、集合は sorted(...) で変換します。NaN と無限大も正式な JSON ではないことを覚えておきましょう。

import json
from datetime import date

# Tuples become lists, int keys become strings
data = {"pair": (1, 2), 7: "seven"}
print(json.loads(json.dumps(data)))  # {'pair': [1, 2], '7': 'seven'}

# A date has to be converted by hand
today = date(2025, 1, 2)
print(json.dumps({"day": today.isoformat()}))  # {"day": "2025-01-02"}

不正な入力

取引所からのメッセージのように外部から届くテキストは、そもそも有効な JSON ではないかもしれません。その場合 json.loads は ValueError の一種である json.JSONDecodeError を送出し、有効な JSON でも必要なキーがない(KeyError)、形が違う(TypeError)ことがあります。解析を try/except で囲み、不正なメッセージがプログラムにとって何を意味するかを決めましょう。次のトピックで例外を詳しく学びます。

import json

# Bad input raises, so catch it where you parse
def get_price(text):
    try:
        return json.loads(text)["price"]
    except (ValueError, KeyError, TypeError):
        return None

print(get_price('{"price": 184.25}'))  # 184.25
print(get_price("not json"))           # None
print(get_price('{"symbol": "AAPL"}')) # None
文字列をつなげて JSON を作らない値の中の引用符、バックスラッシュ、ASCII 以外の文字は、手作りの JSON を壊します。Python の辞書を作り、テキストの生成は json.dumps や json.dump、読み込みは json.loads や json.load に任せましょう。設定の統合も同じで、変更する前にコピーして、ある設定が別の設定に混ざらないようにします。
  • json.loads(text) / json.dumps(data) は文字列、json.load(file) / json.dump(data, file) はファイル用
  • indent=2 と sort_keys=True で、ファイルが読みやすく安定する
  • 不正な入力は ValueError、KeyError、TypeError を送出する。想定するものだけ捕まえる

次は例外とエラー処理です。プログラムが分かりやすく失敗し、必要なときに回復できるようにします。

ラボ:採点される内容

  • order_total で JSON ファイル内の注文を合計する25点
  • save_config で設定を読みやすい JSON として保存する25点
  • parse_quote で気配値メッセージを安全に読み取る25点
  • merge_configs で既定値に設定を重ねる25点
エクスプローラー · lab-18-1
▾ lab-18-1
…
bash · ブラウザ内
learner@quantcraft:~/lab-18-1$
Pythonは未読み込みPythonLn 1, Col 1Spaces: 4UTF-8

このトピックをリセットしますか?

lab-18-1 の内容はすべてスターターファイルに戻り、ターミナルも消去されます。現在の解答は失われ、元に戻せません。

リセットされるもの
  • main.py → スターターコード
  • ターミナル履歴とテスト出力
  • 未提出の変更
保持されるもの
  • ラボの最高スコア
  • XPと連続日数
  • 講義の進捗とメモ

コードを実行するにはログインしてください。

レクチャーはすべて無料で読めます。コードの実行、テスト、ラボの提出にはアカウントの作成かログインが必要です。

  • ブラウザ内IDEとbashターミナル。インストール不要
  • 即時採点、XP、ロードマップでの現在地
アカウントを作成ログイン
または
GitHubで続ける