σμ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 AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 11 · Produktivsysteme und Spitzenmodelle›Thema 11.12·~2 Std.Experte

Reinforcement Learning für den Handel

Position in der SkillModul 11 von 11 · Thema 12 von 13
11.12 Reinforcement Learning für den Handel
—Lab-Punkte— / 100XP gesamt—Serie—

Lernen durch Ausprobieren

Beim überwachten Lernen kommt jedes Beispiel mit der richtigen Antwort. Beim Trading ist das anders: Niemand nennt Ihnen die beste Position, Sie handeln und der Markt antwortet mit Gewinn oder Verlust. Reinforcement Learning modelliert das als Agenten, der einen Zustand beobachtet, eine Aktion wählt, eine Belohnung erhält und in einen neuen Zustand wechselt, mit dem Ziel, die Gesamtbelohnung über die Zeit zu maximieren. Beim Handel kann der Zustand aus jüngsten Renditen oder der aktuellen Position bestehen, die Aktionen aus Kaufen, Halten oder Verkaufen und die Belohnung aus dem Gewinn des Schritts abzüglich Kosten. Die Schwierigkeit: Aktionen haben spätere Folgen, und der Agent muss durch Ausprobieren entdecken, was sich auszahlt.

# 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: der Wert einer Aktion in einem Zustand

Q-Learning führt eine Tabelle Q[Zustand, Aktion]: die erwartete Gesamtbelohnung, wenn man Aktion im Zustand wählt und danach gut handelt. Nach jedem Schritt schiebt es den Eintrag zu einer besseren Schätzung, dem Ziel: die soeben erhaltene Belohnung plus der abgezinste Wert der besten Aktion im Folgezustand, reward + gamma * max(Q[Folgezustand]). Das Update lautet Q[s, a] += alpha * (Ziel - Q[s, a]) mit einer Lernrate alpha. Der Diskontfaktor gamma (0 bis 1) sagt, wie viel künftige Belohnungen zählen: gamma = 0 ist ein kurzsichtiger Agent, nahe 1 ein geduldiger, und der Return einer Folge ist r0 + gamma r1 + gamma^2 r2 + .... Bei einem Endschritt gibt es keinen Folgezustand, und das Ziel ist nur die Belohnung.

# 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

Erkunden und eine ausgearbeitete Trainingsschleife

Ein Agent, der stets die beste ihm bekannte Aktion wählt, erfährt nie, ob eine andere besser ist. Epsilon-greedy behebt das: Mit Wahrscheinlichkeit epsilon erkundet er eine zufällige Aktion, sonst nutzt er die Aktion mit dem größten Q, bei Gleichstand die erste. Epsilon beginnt meist hoch und nimmt ab. Die Schleife lautet dann: Zustand beobachten, Aktion wählen, Belohnung und Folgezustand erhalten, Q aktualisieren, wiederholen. In einem Spielzeugmarkt, in dem auf einen Aufwärtstag meist ein weiterer folgt, lernt der Agent, der „gestern war aufwärts“ sieht, dass Long-Bleiben sich lohnt, und eine Tabelle aus zwei Zuständen und drei Aktionen reicht, um das zu zeigen.

# 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
Der Backtest einer gelernten Strategie lässt sich leicht täuschenEin auf einem Geschichtsabschnitt trainierter Agent findet jedes Muster, das dort zahlte, echt oder zufällig, und Marktdaten sind knapp und nicht stationär: Die Lektion eines Jahres gilt im nächsten vielleicht nicht. Trainieren und testen Sie auf getrennten Perioden (Walk-forward), setzen Sie realistische Kosten und Slippage in die Belohnung ein, bestrafen Sie Risiko und große Positionen, vergleichen Sie mit einer trivialen Regel wie Kaufen-und-Halten und misstrauen Sie jedem zu guten Ergebnis. Reinforcement Learning ist hier eher ein Forschungswerkzeug als eine Produktionsstrategie.
  • Ein Agent beobachtet einen Zustand, handelt, erhält eine Belohnung (Gewinn minus Kosten) und lernt, welche Aktionen sich lohnen; der Return ist die abgezinste Summe r0 + gamma r1 + gamma^2 r2 + ....
  • Q-Learning aktualisiert Q[s, a] += alpha * (reward + gamma * max Q[s'] - Q[s, a]) (bei einem Endschritt nur reward) und ändert hier die alte Tabelle nicht an Ort und Stelle.
  • Epsilon-greedy erkundet mit Wahrscheinlichkeit epsilon und nutzt sonst das größte Q; trainieren und testen Sie auf getrennten Perioden, setzen Sie realistische Kosten an und vergleichen Sie mit einfachen Basislinien.

Als Nächstes: das Abschlussprojekt, eine durchgängige Bewertungs- oder Strategiebibliothek, die alles zusammenführt.

Lab: Was bewertet wird

  • Mit choose_action erkunden oder ausnutzen25 Pkt.
  • Mit q_update aus einem Schritt lernen25 Pkt.
  • Handeln in step_reward bezahlen lassen25 Pkt.
  • Mit discounted_return die Zukunft aufsummieren25 Pkt.
Explorer · lab-141-1
▾ lab-141-1
…
bash · im Browser
learner@quantcraft:~/lab-141-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-141-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub