5 votos

Cómo conseguir el la final % de retorno en backtesting?

Estoy aprendiendo a hacer backtesting en Python usando los Pandas. Estoy aprendiendo a usar la Media móvil de Cruce. He señales generadas a comprar o a vender ya. Pero no estoy seguro de dónde ir de allí? Digamos que si tengo el capital inicial de $100,000 de lo que sería mi final % de retorno

Me doy cuenta de que esta es una pregunta muy básica, pero me parece que no puede envolver mi cabeza alrededor de ella todavía.

Esto es lo que tengo hasta ahora.

import datetime
import pandas as pd
from pandas_datareader import data, wb
import numpy as np
import Quandl
import matplotlib.pylab as pylab
%matplotlib inline

start_date = datetime.datetime(2009,1,1)
end_date = datetime.datetime(2014,1,1)
amzn = data.DataReader("AMZN", "yahoo", start_date, end_date)

def generate_signals(self):
    # Create DataFrame and initialise signal series to zero
    signals = pd.DataFrame(index=amzn.index)
    signals['signal'] = 0

    # Create the short/long simple moving averages
    signals['short_mavg'] = pd.rolling_mean(amzn['Adj Close'], 40, min_periods=1)
    signals['long_mavg'] = pd.rolling_mean(amzn['Adj Close'], 100, min_periods=1)

    # When the short SMA exceeds the long SMA, set the ‘signals' Series to 1 (else 0)
    signals['signal'][40:] = np.where(signals['short_mavg'][40:] >
        signals['long_mavg'][100:], 1, 0)

    # Take the difference of the signals in order to generate actual trading orders
    signals['positions'] = signals['signal'].diff()
    return signals

Me he tomado el código de https://s3.amazonaws.com/quantstart/media/powerpoint/an-introduction-to-backtesting.pdf

El Portfolio parte no funciona para mí, así que estoy tratando de averiguar lo que se supone que sucederá en el real de backtesting.

4voto

mechler Puntos 16

Nota: Suponiendo que usted es un poco de un principiante tratando de aprender las cuerdas de cómo todo este proceso funciona en un nivel alto, definitivamente puedo hacer un par de recomendaciones (si estoy interpretando que mal, entonces me disculpo si la explicación de abajo no es lo que buscas).

Si usted está tratando de aprender algunas básicos de backtesting fundamentos, mientras que QuantStart es un increíble recurso educativo, yo te podría recomendar la escritura similar a la generación de señales función fuera de un Portfolio de la clase (por lo tanto no self argumento de la función), sólo para conseguir sus pies mojados con cómo el comercio de la lógica de las obras. La presentación está citando requiere un análisis mucho más riguroso enfoque orientado a objetos para toda cosa que puede que no haga clic en contextualmente para alguien que acaba de aprender los conceptos básicos.

Después, creo que es digno de mencionar que usted querrá asegurarse de que usted lag sus señales. No hacerlo es un común backtesting error que puede producir artificialmente buenos resultados.

Una vez que usted tiene una señal dada en cada paso de tiempo se puede calcular algunas ganancias. Vamos a decir que sus señales son de 1 por ser largo, -1 por ser corto, y 0 por estar fuera del mercado. A continuación, puede calcular las diferencias en el precio y se multiplican por sus señales, por lo que un aumento de precios será favorable si la señal es 1, y una caída en su precio será favorable si su señal es -1. Que la multiplicación paso rendimiento bruto (es decir, la cantidad en dólares) de P&L para cualquier día dado, suponiendo que cada comercio es sólo 1 compartir.

Una vez que el vector de diarios de P&L, usted puede tomar una suma acumulativa (cumsum función) para producir una ejecución total de P&L vector, a la que usted puede añadir su inicial de la cartera de capital de $100,000. Una vez que hayas hecho todo lo que usted puede comenzar a hacer algunas ganancias cálculos.

He aquí un pequeño ejemplo similar al código que se tienen sobre las que trabaja fuera de una Cartera de clase para hacer una muy simple y directo backtest.

import pandas as pd
from pandas.io.data import DataReader
import numpy as np

ticker = 'amzn'
px = DataReader(ticker, 'yahoo')

def generate_signals(px):
    signals = pd.DataFrame(index=px.index)
    signals['signal'] = 0
    short_ma = pd.rolling_mean(px['Adj Close'], 40, min_periods=1)
    long_ma = pd.rolling_mean(px['Adj Close'], 100, min_periods=1)
    signals['signal'] = np.where(short_ma > long_ma, 1, 0)
    return signals['signal'].shift(1)  # remember to lag your signals :)

px['Signals'] = generate_signals(px)
px['Daily P&L'] = px['Adj Close'].diff() * px['Signals']
px['Total P&L'] = px['Daily P&L'].cumsum()
print px

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X