σμ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 هو الصيغة اليومية لملفات الإعداد وللبيانات المتبادلة بين البرامج وواجهات الويب. يتكوّن من كائنات {"key": value} ومصفوفات [1, 2] ونصوص وأرقام وtrue/false وnull. وهي تقابل بايثون مباشرة: تصبح الكائنات قواميس، والمصفوفات قوائم، وتصبح true/false هي True/False، وتصبح null هي None. وعلى خلاف جدول CSV يمكن لـJSON أن يتداخل: يستطيع أمر أن يحمل قائمة تنفيذات لكل منها حقولها.

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 إلا أنواعًا قليلة، فتتغير بعض قيم بايثون في الطريق. تعود الصفوف قوائم، وتعود مفاتيح القواميس دائمًا نصوصًا ({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 الخطأ json.JSONDecodeError، وهو نوع من ValueError، وقد يفتقر 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 المبني يدويًا. ابنِ قاموس بايثون ودع 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: التقط ما تتوقعه.

التالي: الاستثناءات ومعالجة الأخطاء، لتفشل برامجك بوضوح وتتعافى عند اللزوم.

المختبر: ما الذي يُقيَّم

  • اجمع الأوامر في ملف JSON باستخدام order_total25 نقطة
  • احفظ الإعدادات بصيغة JSON مقروءة باستخدام save_config25 نقطة
  • اقرأ رسالة عرض سعر بأمان باستخدام parse_quote25 نقطة
  • ضع الإعدادات فوق القيم الافتراضية باستخدام merge_configs25 نقطة
المستكشف · 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 والتتابع
  • تقدّم المحاضرة والملاحظات

سجّل الدخول لتشغيل الكود الخاص بك.

قراءة كل المحاضرات مجانية. أنشئ حسابًا أو سجّل الدخول لتشغيل الكود وتنفيذ الاختبارات وتسليم هذا المختبر.

  • بيئة تطوير داخل المتصفح مع طرفية bash — لا حاجة لتثبيت أي شيء
  • تصحيح فوري ونقاط خبرة ومكانك في المسار
إنشاء حسابتسجيل الدخول
أو
المتابعة عبر GitHub