Dies ist eine Fortsetzung von Letztes Mal.
LESSON 11 Putting It All Together Lassen Sie uns alles mobilisieren, was wir bisher gelernt haben, um eine einfache [mittlere Umkehrstrategie] zu implementieren (http://www.investopedia.com/terms/m/meanreversion.asp) [^ 1].
Planning the Strategy Lassen Sie uns zunächst einen strategischen Plan erstellen. Wenn der einfache gleitende 10-Tage-Durchschnitt (im Folgenden SMA) höher als der 30-Tage-SMA ist, fällt der Aktienkurs und umgekehrt steigt der Aktienkurs. Es nutzt die Natur der mittleren Regression aus.
Selecting Assets to Trade
Diese Art von Strategie verwendet normalerweise Pipeline, um den Bestand festzulegen, verwendet jedoch das bisher erlernte sid ()
. Ich werde.
Der folgende Code setzt 5 Marken. [^ 2]
# MSFT, UNH, CTAS, JNS, COG
context.security_list = [sid(5061), sid(7792), sid(1941), sid(24556), sid(1746)]
Setting a Rebalance Schedule Der folgende Code führt die Funktion "rebalance ()" (siehe unten) zu Beginn der Woche aus.
schedule_function(rebalance,
date_rules.week_start(days_offset=0),
time_rules.market_open())
Computing Weights Berechnen Sie das Gewicht des Portfolios. Entsprechend der oben genannten Strategie werden wir die Aktien, die die Bedingungen erfüllen, Long- oder Short-Positionen eingehen.
Wenn im folgenden Code der Unterschied zwischen 10-Tage-SMA und 30-Tage-SMA groß ist, wird das Gewicht erhöht und das Ganze als 1 normalisiert.
def compute_weights(context, data):
# Get the 30-day price history for each security in our list.
hist = data.history(context.security_list, 'price', 30, '1d')
# Create 10-day and 30-day trailing windows.
prices_10 = hist[-10:]
prices_30 = hist
# 10-day and 30-day simple moving average (SMA)
sma_10 = prices_10.mean()
sma_30 = prices_30.mean()
# Weights are based on the relative difference between the short and long SMAs
raw_weights = (sma_30 - sma_10) / sma_30
# Normalize our weights
normalized_weights = raw_weights / raw_weights.abs().sum()
# Return our normalized weights. These will be used when placing orders later.
return normalized_weights
Order Execution Der Inhalt der Funktion "rebalance ()", die unter Festlegen eines Rebalance-Zeitplans geplant ist. Der Bestand, der gemäß dem durch die obige Funktion "compute_weights" berechneten Gewicht festgelegt wurde, ist lang oder kurz.
def rebalance(context, data):
# Calculate our target weights.
weights = compute_weights(context, data)
# Place orders for each of our securities.
for security in context.security_list:
if data.can_trade(security):
order_target_percent(security, weights[security])
Recording and Plotting Zeichnen Sie die Anzahl der Longs und Shorts auf und visualisieren Sie sie. Der folgende Code implementiert den Aufzeichnungscode in der Funktion "record_vars ()" und führt ihn in der Funktion "Schedule_function ()" aus. Geplant für den täglichen Abschluss.
schedule_function(record_vars,
date_rules.every_day(),
time_rules.market_close())
Der Inhalt der Funktion record_vars ()
lautet wie folgt. Sie können die Anzahl der Aktien und die Anzahl der Positionen im Portfolio unter "context.portfolio.positions" überprüfen. Hier zählen wir einfach die Anzahl der Longs und die Anzahl der Shorts.
def record_vars(context, data):
# Check how many long and short positions we have.
longs = shorts = 0
for position in context.portfolio.positions.itervalues():
if position.amount > 0:
longs += 1
elif position.amount < 0:
shorts += 1
# Record our variables.
record(leverage=context.account.leverage, long_count=longs, short_count=shorts)
Putting It Together Diese Strategie gleicht das Portfolio wöchentlich neu aus und zeichnet es täglich auf. Sie benötigen also nicht die Funktion "handle_data ()", die jede Minute ausgeführt wird. Der Code bis zu dem oben genannten kann als der folgende Code zusammengefasst werden. Sie können den Code von [hier] klonen (https://www.quantopian.com/tutorials/getting-started#lesson11).
def initialize(context):
"""
initialize() is called once at the start of the program. Any one-time
startup logic goes here.
"""
# An assortment of securities from different sectors:
# MSFT, UNH, CTAS, JNS, COG
context.security_list = [sid(5061), sid(7792), sid(1941), sid(24556), sid(1746)]
# Rebalance every Monday (or the first trading day if it's a holiday)
# at market open.
schedule_function(rebalance,
date_rules.week_start(days_offset=0),
time_rules.market_open())
# Record variables at the end of each day.
schedule_function(record_vars,
date_rules.every_day(),
time_rules.market_close())
def compute_weights(context, data):
"""
Compute weights for each security that we want to order.
"""
# Get the 30-day price history for each security in our list.
hist = data.history(context.security_list, 'price', 30, '1d')
# Create 10-day and 30-day trailing windows.
prices_10 = hist[-10:]
prices_30 = hist
# 10-day and 30-day simple moving average (SMA)
sma_10 = prices_10.mean()
sma_30 = prices_30.mean()
# Weights are based on the relative difference between the short and long SMAs
raw_weights = (sma_30 - sma_10) / sma_30
# Normalize our weights
normalized_weights = raw_weights / raw_weights.abs().sum()
# Determine and log our long and short positions.
short_secs = normalized_weights.index[normalized_weights < 0]
long_secs = normalized_weights.index[normalized_weights > 0]
log.info("This week's longs: " + ", ".join([long_.symbol for long_ in long_secs]))
log.info("This week's shorts: " + ", ".join([short_.symbol for short_ in short_secs]))
# Return our normalized weights. These will be used when placing orders later.
return normalized_weights
def rebalance(context, data):
"""
This function is called according to our schedule_function settings and calls
order_target_percent() on every security in weights.
"""
# Calculate our target weights.
weights = compute_weights(context, data)
# Place orders for each of our securities.
for security in context.security_list:
if data.can_trade(security):
order_target_percent(security, weights[security])
def record_vars(context, data):
"""
This function is called at the end of each day and plots our leverage as well
as the number of long and short positions we are holding.
"""
# Check how many long and short positions we have.
longs = shorts = 0
for position in context.portfolio.positions.itervalues():
if position.amount > 0:
longs += 1
elif position.amount < 0:
shorts += 1
# Record our variables.
record(leverage=context.account.leverage, long_count=longs, short_count=shorts)
Damit ist Tutorial 1 abgeschlossen. Insgesamt gibt es vier Tutorials, und Tutorial 2 beschreibt Pipeline. Auf Wunsch können wir Tutorial 2 durchführen, aber wir werden es vorerst beenden. Danke für Ihre Unterstützung.
LEKTION 10 <-> Weiter mit Tutorial 2?
[^ 1]: Auch als Return-Reversal-Methode bekannt. Es ist eine Methode, die die Natur der durchschnittlichen Regression verwendet, um Aktien zu widersprechen, die vom Durchschnittswert abweichen und versuchen, einen Gewinn zu erzielen. [^ 2]: Die ausgewählte Marke hat keine besondere Bedeutung.
Recommended Posts