En cuanto te sientas cómodo con Python, vamos a hacer este ejercicio en tres pasos:
- Descargue los datos y calcule la rentabilidad acumulada (o el valor de su posición como si invirtiera 1 dólar en cada una de las acciones)
- Definir la función que capturará los movimientos de las acciones que superen el umbral predefinido, el 10% en este caso. Esta función va a ser el "indicador" que usted pidió.
- Trazar el "indicador" sobre los datos de las acciones.
Paso 1.
# Imports
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas_datareader import data
%matplotlib inline
plt.rcParams['figure.figsize']=(12,5)
# Definitions of global variables
N = 10
change = .1
stocks = ['GOOG','YHOO','AAPL','IBM','MSFT']
# Download of prices
price = pd.DataFrame()
for st in stocks:
price[st] = data.DataReader(st, 'yahoo')['Adj Close']
# Calculation of cumulative returns
return_cum = (1+price.pct_change()).cumprod()
return_cum.plot();
Paso 2.
Ahora, tenemos que definir el indicador propiamente dicho que captará cualquier movimiento, positivo o negativo, que supere el predefinido change
. La idea aquí es que ruede la ventana N
veces, cada vez disminuyéndolo en 1, y poniendo en el extremo derecho de la ventana 1 si el cambio acumulado absoluto es más que el cambio requerido. Por último, si para cualquier ventana de longitud cambiante tengo 1 en un día determinado, el indicador devuelve SINGLE 1
para ese día.
def change_within_NDays(x,N):
ret = pd.DataFrame()
for days in range(N+1):
ret[days] = pd.rolling_apply(x, days, func=lambda x: abs((x[-1]/x[0]-1)) > change)
return ret.any(1)
indicator = return_cum.apply(lambda x: change_within_NDays(x,N))
Paso 3.
Por último, podemos visualizar el indicador dibujándolo sobre los precios de las acciones:
_, ax = plt.subplots()
return_cum.plot(ax=ax)
indicator.plot(ax=ax, legend=0);
0 votos
¿Se siente cómodo con R o Python?
0 votos
@bushmanov Sí, Python.