Eine Ausführung ist keine Gewissheit
Ein naiver Backtest nimmt an, dass eine Order beliebiger Größe zum Preis in den Daten ausgeführt wird. Echte Orders stehen vor drei Fragen. Wie tief ist das Orderbuch: Eine Market-Order nimmt zuerst das beste Angebot, dann das nächste, eine große Order zahlt also einen schlechteren Durchschnittspreis. Hat der Markt mein Limit erreicht: Eine Limit-Order bekommt den verlangten Preis oder besser, aber nur, wenn gehandelt wird. Und wie viel kann ich nehmen: Eine große Order kann nur ein Bruchteil des Bar-Volumens sein, sie wird also in Teilen über die Zeit ausgeführt.
def fill_market_order(book, quantity):
remaining = quantity
cost = 0.0
filled = 0
for price, size in book: # cheapest offer first
if remaining <= 0:
break
take = min(size, remaining)
cost += take * price
filled += take
remaining -= take
if filled == 0:
return 0.0, 0
return cost / filled, filled
book = [(50.00, 300), (50.02, 500), (50.05, 1000)]
print(fill_market_order(book, 200)) # (50.0, 200) inside the first level
print(fill_market_order(book, 600)) # (50.01, 600) 300 at 50.00 and 300 at 50.02
print(fill_market_order(book, 5000)) # (50.0333, 1800) the whole book; 3,200 shares stay unfilled# The average price and the slippage against the best offer grow with the size
def average_price(book, quantity):
remaining, cost, filled = quantity, 0.0, 0
for price, size in book:
take = min(size, remaining)
cost += take * price
filled += take
remaining -= take
return cost / filled
book = [(50.00, 300), (50.02, 500), (50.05, 1000)]
for quantity in (100, 300, 800, 1800):
avg = average_price(book, quantity)
print(quantity, round(avg, 4), round((avg - 50.00) / 50.00 * 10000, 2), "bps above the best offer")Limit-Orders und Kurslücken
Mit Bar-Daten (Eröffnung, Tief, Hoch) sieht man nicht den Weg innerhalb der Bar, nur ihre Extreme. Ein Buy-Limit bei L wird ausgeführt, wenn das Tief der Bar L oder darunter erreichte. Der Preis ist L, es sei denn, die Bar eröffnete unter L: Dann ist der Markt durch Ihr Limit gesprungen, und Sie werden zur Eröffnung ausgeführt, was besser ist. Ein Sell-Limit ist das Spiegelbild. Eine nur berührte Limit-Order wird in Wirklichkeit vielleicht nicht ausgeführt, weil die Schlange vor Ihnen zuerst bedient wurde; das ist also die optimistische Grenze.
def limit_fill(side, limit, bar_open, bar_low, bar_high):
if side == "buy" and bar_low <= limit:
return min(bar_open, limit) # a gap below the limit fills at the better open
if side == "sell" and bar_high >= limit:
return max(bar_open, limit)
return None
print(limit_fill("buy", 49.95, 50.10, 49.90, 50.20)) # 49.95 traded down through the limit
print(limit_fill("buy", 49.95, 49.90, 49.80, 50.20)) # 49.9 opened below: filled at the open
print(limit_fill("buy", 49.95, 50.10, 50.00, 50.20)) # None never reached
print(limit_fill("sell", 50.15, 50.00, 49.90, 50.20)) # 50.15Eine große Order abarbeiten
Viele Handelstische nutzen ein Beteiligungslimit: nicht mehr als etwa 10 % des Volumens nehmen. In einer Bar mit 40.000 gehandelten Aktien sind das 4.000, abgerundet. Eine Order über 5.000 Aktien braucht dann zwei Bars, nicht eine. Das Durchlaufen der Bars ist eine Schleife, die die Restmenge mitführt: Jede Bar füllt min(remaining, int(volume * participation)), und Bars nach Abschluss der Order füllen nichts.
def partial_fill(quantity, bar_volume, participation):
return min(quantity, int(bar_volume * participation))
def fill_over_bars(quantity, volumes, participation):
remaining = quantity
fills = []
for volume in volumes:
filled = partial_fill(remaining, volume, participation)
fills.append(filled)
remaining -= filled
return fills
fills = fill_over_bars(5000, [40000, 30000, 80000, 100000], 0.1)
print(fills, sum(fills)) # [4000, 1000, 0, 0] 5000- Eine Market-Order durchläuft das Orderbuch Level für Level; der Durchschnittspreis ist volumengewichtet und wird mit der Größe schlechter, ein dünnes Buch füllt nur einen Teil.
- Eine Limit-Order wird ausgeführt, wenn die Bar das Limit erreicht, zur Eröffnung, wenn sie es übersprungen hat; eine bloße Berührung wird in Wirklichkeit vielleicht nicht ausgeführt.
- Beteiligungslimits begrenzen jede Bar auf
int(volume * participation); eine Schleife trägt die Restmenge über die Bars.
Als Nächstes: CAPM und Beta, messen, wie viel einer Rendite vom Markt stammt.
Lab: Was bewertet wird
- Mit
fill_market_orderdas Orderbuch durchlaufen25 Pkt. - Mit
limit_fillentscheiden, ob das Limit erreicht wird25 Pkt. - Mit
partial_filldas Volumen beachten25 Pkt. - Mit
fill_over_barsdie Order über die Zeit ausführen25 Pkt.