martes, 10 de agosto de 2021

Trading algoritmico

Hay muchas maneras de hacer lo mismo con resultados distintos para invertir pasa lo mismo podemos invertir con estrategias comprobadas atravez del tiempo como en un portafolio altamente diversificado y a largo plazo, si se le da suficiente  tiempo y suficiente dinero se va terminar con riqueza inevitablemente como lo dice nick murray en su libro simple wealth, inevitable wealth.

pero el argumento contrario  tambien tiene algo de verdad si los mercados son eficientes, son eficientes por que los participantes del mismo así lo hacen.

bueno entonces las estrategias algorítmicas buscan encontrar patrones en los mercados para obtener ganancias por encima de las normales de los mismos, esto inevitablemente conlleva riesgos pues nada garantiza que por que algo sucedió antes vaya suceder después.

lo primero que necesitamos para esto es obtener la información del mercado una opción es usar la api de alpha avantage para usarla se debe obtener una clave o api-key atravez de su pagina web que dan gratuitamente luego de tenerla se puede usar este endpoint para consultar el simbolo de la empresa que queramos analizar colocandolo en keywords

https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=bmw&apikey=YOUR-API-KEY

 teniendo el simbolo luego vamos a este otro endpoint para obtener la informacion historica diaria del simbolo

https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=BMW.FRK&outputsize=full&apikey=YOUR-API-KEY

 Esta info luego puede ser organizada en un dataframe de python con el siguiente codigo

import numpy as np
import pandas as pd
import pandas_datareader.data as pdr
from datetime import datetime
import matplotlib.pyplot as plt
plt.style.use('seaborn')
import requests
import json
response = requests.get("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=BMW.FRK&outputsize=full&apikey=YOUR-API-KEY")
alphadict = json.loads(response.text)
alphadict.keys()
stock = pd.DataFrame(alphadict['Time Series (Daily)']).T
stock.columns = ['open', 'high', 'low', 'close','volume']
stock.index = pd.to_datetime(stock.index)
stock = stock.sort_index(ascending = True)
stock = stock.astype(float)
raw=stock[['close']].copy()
raw.columns=['close']
raw.tail()

 

  Con ese codigo quedamos en la variable raw con un dataframe que contiene los closing prices para la compañia bmw, que podemos usar directametne para generar modelos de trading algoritmico(tecnicos, cuantitativos, sumandole mas informacion para otros modelos).para verificar el simbolo yo encuentro especialmente util la siguiente linea

raw[-2000:].plot(lw=2.0,figsize=(10,6)

nos permite generar un grafico con los valores ir cambiando el -2000 por la cantida de registros que tengamos en nuestra herramienta de trading para mirar por encima que los valores coincidan con la grafica. 

luego con estos valores por ejemplo podemos probar alguna extrategia ahora mismo la unica que yo estoy probando es usar medias moviles, con fuerza bruta como indicador de momentum para una operacion que se abre el lunes y se cierra el viernes

from itertools import product
sma1 = range(0, 201, 5)
sma2 = range(200,501, 5)
results = pd.DataFrame()
for SMA1, SMA2 in product(sma1, sma2):
    data=raw.copy()
    data.dropna(inplace=True)
    data['Returns'] = np.log(data['close'] / data['close'].shift(4))
    data['SMA1'] = data['close'].rolling(SMA1).mean()
    data['SMA2'] = data['close'].rolling(SMA2).mean()
    data.dropna(inplace=True)
    data['Position'] = np.where(data['SMA1'] > data['SMA2'], 1, -1)
    data['Strategy'] = data['Position'].shift(4) * data['Returns']
    data['date']=data.index
    data['day-of-week']=data['date'].dt.day_name()
    data=data[data['day-of-week']=='Friday']
    data=data[-100:]
    data.dropna(inplace=True)
    perf = np.exp(data[['Returns', 'Strategy']].sum())
    results = results.append(pd.DataFrame({'SMA1': SMA1, 'SMA2': SMA2,'MARKET': perf['Returns'],
                                           'STRATEGY': perf['Strategy'],
                                           'OUT': perf['Strategy'] - perf['Returns']},index=[0]), ignore_index=True)

results.sort_values('OUT', ascending=False).head(7)


los rangos de la variable sma1 y sma2 pueden ser reducidos considerablemente para que no tome tanto tiempo la fuerza bruta y son los que usan para hacer la fuerza bruta, alfinal se compara lo que indique esta estrategia contra una de comprar y mantener la operacion y se organiza para obtener el que mayores ganancias reporte.

 esto termina siendo sobreajustado(overfitting) por que no tiene datos de prueba para evaluar aparte y ya de por si hacer esto es mineria de datos por lo que el nivel de riesgo es elevado de seguir una estrategia como esta creo es elevado, por tanto recomiendo no usarla  

notas del curso https://learning.oreilly.com/learning-paths/learning-path-hands-on/9781492082613/ - Learning Path: Hands-On Algorithmic Trading with Python de Deepak Kanungo

el segundo bloque de codigo de fuerza bruta esta modificado del codigo encontrado en el  capitulo 15 de Python for Finance, 2nd Edition, donde tambien explican otras estrategias, y dan mas detalle del mismo

No hay comentarios:

Publicar un comentario