1 votos

¿Cómo puedo encontrar los valores que han tenido una oscilación de precios del X% en un plazo de Y días, ordenados por el tiempo de dicha oscilación?

Digamos que quiero encontrar acciones que se hayan movido +-20% en un periodo de 10 días.

ABC coincidiría si en t , ABC es \$1 y en t+8 , ABC es de 1,20 dólares.

XYZ sería no coinciden si en t , XYZ es \$1 y en t+10 , XYZ es de 1,10 dólares, porque no se ha movido un 20% en 10 días.

Creo que estoy buscando algún tipo de indicador de volatilidad que también permita un rango de tiempo.

¿Cómo puedo clasificar también por lo reciente de este indicador?

Gracias por cualquier ayuda.

0 votos

¿Se siente cómodo con R o Python?

0 votos

@bushmanov Sí, Python.

1voto

ScottyDont Puntos 433

En cuanto te sientas cómodo con Python, vamos a hacer este ejercicio en tres pasos:

  1. 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)
  2. 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ó.
  3. 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();

enter image description here

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);

enter image description here

0voto

kathleen Puntos 21

No se busca la volatilidad, al menos no esa medida por sí sola. Imagina dos acciones A y B, A está ganando un 2% constante cada día mientras que B está ganando un 1% un día y -1% el otro día. A continuación, observa la rentabilidad a lo largo de los 10 días y la volatilidad de las dos acciones.

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