σμ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›الوحدة 11 · أنظمة الإنتاج والنماذج المتقدمة›الموضوع 11.12·~2 سخبير

التعلم المعزز للتداول

الموضع في المسارالوحدة 11 من 11 · الموضوع 12 من 13
11.12 التعلم المعزز للتداول
—درجة المختبر— / 100إجمالي XP—التتابع—

التعلم بالتجربة

في التعلم الخاضع للإشراف يأتي كل مثال بجوابه الصحيح. أما التداول فليس كذلك: لا أحد يخبرك بأفضل مركز، بل تتصرف فيجيبك السوق بربح أو خسارة. والتعلم المعزَّز ينمذج هذا بـوكيل يرصد حالة ويتخذ إجراءً ويتلقى مكافأة وينتقل إلى حالة جديدة بهدف تعظيم المكافأة الإجمالية عبر الزمن. وفي التداول قد تكون الحالة العوائد الأخيرة أو المركز الحالي والإجراءات الشراء أو الإبقاء أو البيع والمكافأة ربح الخطوة مطروحًا منه التكاليف. والصعوبة أن للإجراءات عواقب لاحقة وعلى الوكيل أن يكتشف ما يدرّ بالتجربة.

# Reward of one step: profit from the position held, minus the cost of changing position
def step_reward(position, price_change, previous_position, cost):
    return position * price_change - cost * abs(position - previous_position)

print(round(step_reward(1, 0.5, 0, 0.1), 4))         # 0.4    went long, the price rose 0.5, paid 0.1 to trade
print(round(step_reward(-1, 0.5, 1, 0.1), 4))        # -0.7   flipped from long to short just before a rise: lost 0.5 and paid 0.2
print(step_reward(1, 0.5, 1, 0.1))                   # 0.5    holding the same position costs nothing

Q-learning: قيمة الإجراء في حالة

يحتفظ Q-learning بجدول Q[حالة, إجراء]: المكافأة الإجمالية المتوقعة إن اتخذت الإجراء في الحالة ثم أحسنت التصرف بعدها. وبعد كل خطوة يدفع الخانة نحو تقدير أفضل هو الهدف: المكافأة التي نلتها للتو مضافًا إليها القيمة المخصومة لأفضل إجراء في الحالة التالية reward + gamma * max(Q[الحالة التالية]). والتحديث Q[s, a] += alpha * (الهدف - Q[s, a]) بمعدل تعلم alpha. ومعامل الخصم gamma (من 0 إلى 1) يبين مدى أهمية المكافآت المستقبلية: gamma = 0 وكيل قصير النظر وقريب من 1 وكيل صبور، والعائد لمتتالية هو r0 + gamma r1 + gamma^2 r2 + .... وفي الخطوة النهائية لا توجد حالة تالية والهدف هو المكافأة فقط.

# One Q-learning update on a table of 2 states x 3 actions (short, flat, long)
import numpy as np

def q_update(q, state, action, reward, next_state, alpha, gamma):
    updated = q.copy()
    target = reward if next_state is None else reward + gamma * updated[next_state].max()
    updated[state, action] += alpha * (target - updated[state, action])
    return updated

q = np.zeros((2, 3))
q = q_update(q, 0, 2, 1.0, 1, 0.5, 0.9)               # in state 0 we went long and earned 1.0
print(q[0])                                           # [0.  0.  0.5]   moved halfway (alpha 0.5) toward the target of 1.0
q = q_update(q, 0, 2, 1.0, 1, 0.5, 0.9)
print(q[0])                                           # [0.   0.   0.75]   a second visit moves it further

الاستكشاف وحلقة تدريب كاملة

الوكيل الذي يتخذ دائمًا أفضل إجراء يعرفه لا يكتشف أبدًا إن كان غيره أفضل. وابسيلون الشره (epsilon-greedy) يعالج ذلك: باحتمال epsilon يستكشف إجراءً عشوائيًا وإلا يستغل الإجراء ذا أكبر Q ويذهب التعادل إلى الأول. وعادةً يبدأ epsilon مرتفعًا ثم يتناقص. والحلقة حينئذ: رصد الحالة واختيار إجراء وتلقي المكافأة والحالة التالية وتحديث Q والتكرار. وفي سوق لعبة يتبع فيه يوم صاعد يومٌ صاعد غالبًا يتعلم الوكيل الذي يرى «أمس كان صاعدًا» أن البقاء طويلًا يدرّ، ويكفي جدول من حالتين وثلاثة إجراءات لإظهار ذلك.

# A toy market where an up day tends to be followed by another up day; the agent learns to follow the trend
import random
import numpy as np

rng = random.Random(1)
positions = [-1, 0, 1]                                # action 0 = short, 1 = flat, 2 = long
q = np.zeros((2, 3))                                  # state 0 = yesterday down, state 1 = yesterday up
alpha, gamma, cost = 0.1, 0.9, 0.0005
state, previous = 1, 0
for step in range(20000):
    epsilon = max(0.05, 1 - step / 10000)
    u, explore = rng.random(), rng.randrange(3)
    action = explore if u < epsilon else int(np.argmax(q[state]))
    up = rng.random() < (0.65 if state == 1 else 0.35)           # the trend continues 65% of the time
    change = 0.01 if up else -0.01
    reward = positions[action] * change - cost * abs(positions[action] - previous)
    next_state = 1 if up else 0
    target = reward + gamma * q[next_state].max()
    q[state, action] += alpha * (target - q[state, action])
    state, previous = next_state, positions[action]

print(int(np.argmax(q[0])), int(np.argmax(q[1])))     # 0 2   after a down day go short, after an up day go long
# The discounted return: with gamma below 1 a reward now is worth more than the same reward later
def discounted_return(rewards, gamma):
    total = 0.0
    for reward in reversed(rewards):
        total = reward + gamma * total
    return total

rewards = [1.0, 1.0, 1.0]
print(discounted_return(rewards, 0.5))               # 1.75   1 + 0.5 + 0.25
print(discounted_return(rewards, 1.0))               # 3.0    a patient agent: a plain sum
print(discounted_return(rewards, 0.0))               # 1.0    a short-sighted agent: only the first reward counts
اختبار رجعي لسياسة متعلَّمة يسهل خداعهسيجد الوكيل المدرَّب على فترة من التاريخ أي نمط أدرّ فيها، حقيقيًا كان أو عرضيًا، وبيانات السوق نادرة وغير ساكنة: فدرس سنة قد لا يصح في التالية. درّب واختبر على فترات منفصلة (walk-forward) واحتسب تكاليف وانزلاقًا واقعيَّين داخل المكافأة وعاقب المخاطرة والمراكز الكبيرة وقارن بقاعدة تافهة كالشراء والاحتفاظ واشتبه بأي نتيجة تبدو أجود مما ينبغي. والتعلم المعزَّز هنا أداة بحث أكثر منه استراتيجية إنتاج.
  • يرصد الوكيل حالة ويتصرف ويتلقى مكافأة (ربح ناقص تكاليف) ويتعلم أي الإجراءات تدرّ؛ والعائد هو المجموع المخصوم r0 + gamma r1 + gamma^2 r2 + ....
  • يحدّث Q-learning القيمة Q[s, a] += alpha * (reward + gamma * max Q[s'] - Q[s, a]) (reward فقط في الخطوة النهائية) ولا يعدّل الجدول القديم في مكانه هنا.
  • يستكشف epsilon-greedy باحتمال epsilon وإلا يستغل أكبر Q؛ درّب واختبر على فترات منفصلة واحتسب تكاليف واقعية وقارن بخطوط أساس بسيطة.

التالي: المشروع الختامي، مكتبة تسعير أو استراتيجية متكاملة تجمع كل شيء.

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

  • استكشف أو استغل باستخدام choose_action25 نقطة
  • تعلّم من خطوة واحدة باستخدام q_update25 نقطة
  • اجعل التداول مكلفًا في step_reward25 نقطة
  • اجمع المستقبل باستخدام discounted_return25 نقطة
المستكشف · lab-141-1
▾ lab-141-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-141-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

هل تريد إعادة ضبط هذا الموضوع؟

سيعود كل ما في lab-141-1 إلى الملفات الابتدائية وستُمسح الطرفية. ستفقد حلّك الحالي ولا يمكن التراجع عن ذلك.

سيُعاد ضبطه
  • main.py ← الشيفرة الابتدائية
  • سجل الطرفية ومخرجات الاختبارات
  • التغييرات غير المُرسلة
سيُحتفظ به
  • أفضل درجة في المختبر
  • نقاط XP والتتابع
  • تقدّم المحاضرة والملاحظات

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

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

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