Introducción
En el episodio de hoy veremos como crear un porfolio de criptomonedas con Python, además usaremos la estrategia de las bandas de Bollinger para crear señales de compra venta de criptomonedas, en concreto de Ethereum aunque es extensible a cualquier valor de mercado.
Tecnologías que usaremos
El desarrollo lo realizaremos sobre un cuaderno Jupyter y usando las siguientes tecnologias
- yfinance para extraer datos de los valores usando el api de yahoo finance
- Dash para crear nuestro porfolio
- Plotly para los gráficos
- (opcional) plugin para Jupyter de Plotly
Crearemos un entorno virtual como es habitual y activaremos el mismo con:
virtualenv venv
source venv/bin/activate
Para empezar instalaremos todas las dependencias necesarias:
pip install dash==1.20.0
pip install plotly==4.14.3
pip install yfinance 0.1.59
pip install matplotlib
(opcional) !jupyter labextension install [email protected]
Una vez instaladas las dependencias importamos las librerías necesarias
import yfinance
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
Para traernos los datos de los stocks usaremos yfinance, elegiremos el intervalos que nos interese siempre y cuando tenga un rango mayor a 20 días, esto se debe a la ventana luego veremos por que:
name = 'ETH-EUR'
ticker = yfinance.Ticker(name)
df = ticker.history(interval='1d', start='2021-01-15', end='2021-06-07')
Ahora le toca el turno al cálculo de las bandas de Bollinger
period = 20 multiplier = 2 df['UpperBand'] = df['Close'].rolling(period).mean()+df['Close'].rolling(period).std()*multiplier df['LowerBand'] = df['Close'].rolling(period).mean()-\ df['Close'].rolling(period).std()*multiplier
Agregados los dos limites el inferior y el superior podemos hacer un primer plot con matplotlib para asegurarnos que todo es correcto:
plt.plot(df['Close'])
plt.plot(df['UpperBand'])
plt.plot(df['LowerBand'])
Debería quedar algo así:
Ya podemos ver el limite inferior y superior pero le falta interactividad con el usuario, es hora de DASH y PLOTLY.
Iniciando nuestra aplicación Dash. Esqueleto Básico.
Nuestra aplicación Dash se inicia con estas poquitas lineas de código
import plotly.express as px
import dash
import dash_core_components as dcc
import dash_html_components as html
app = dash.Dash()
app.layout = html.Div([
html.H1(children='''
Portfolio de criptomonedas con Python.
''')
])
app.run_server(debug=True, use_reloader=False)
Si ejecutamos la celda deberíamos poder ver la pagina con un titulo en H1 como «Portfolio de criptomonedas con Python.»
Vamos a agregar a continuación las funciones que calcularán la señal de compra venta de valores Ethereum:
def sell_func(data):
if(data['Close'] >= data['UpperBand']):
return data['Close']
def buy_func(data):
if(data['Close'] <= data['LowerBand']):
return data['Close']
Si el valor de cierre sobrepasa la banda superior es el momento de vender, si el valor de cierre sobrepasa la banda inferior es momento de comprar, pero esperad aun nos falta agregar estos valores a nuestro dataframe:
df['sell'] = df.apply(lambda row: sell_func(row), axis=1)
df['buy'] = df.apply(lambda row: buy_func(row), axis=1)
una vez hecho esto completamos el código de nuestro porfolio con Dash, el código final quedaría de la siguiente forma:
import plotly.express as px
import dash
import dash_core_components as dcc
import dash_html_components as html
fig = px.line(df, x=df.index, y=df['Close'], title='Ethereum price')
fig.add_scatter(x=df.index, y=df['UpperBand'], name='Banda alta')
fig.add_scatter(x=df.index, y=df['LowerBand'], name='Banda baja', fill='tonexty')
fig.add_scatter(x=df.index, y=df['buy'], name='Comprar',mode='markers', marker=dict(
color='rgba(255,0,0,0.5)',
size=20,
symbol='triangle-up'
))
fig.add_scatter(x=df.index, y=df['sell'], name='Vender',mode='markers', marker=dict(
color='rgba(0,255,0,0.5)',
size=20,
symbol='triangle-down'
))
app = dash.Dash()
app.layout = html.Div([
html.H1(children='''
Portfolio de criptomonedas con Python.
'''),
dcc.Graph(figure = fig)
])
app.run_server(debug=True, use_reloader=False)
Si queremos podemos pintar el área entre los dos limites con fill=’tonexty’ esto provocará una mejor visualización, el resultado final debería ser algo así:
Y eso es todo! Puedes agregar las monedas que desees simplemente incluyendo un listbox e incluyendo los nombres de los stocks de Yahoo!
Os dejo el vídeo completo en mi canal de Youtube, os agradecería un like y por supuesto que os suscribáis. Gracias y nos vemos en el próximo capitulo.
One Comment
Pingback: