Estudio de una estrategia de compra de bitcoin combinando DCA con el índice Fear and Greed

Análisis de una estrategia de inversión para la compra de bitcoin donde se combina el DCA (Dollar Cost Average) y el sentimiento del mercado, índice Fear and Greed.

La estrategia consistirá en el momento que correspondería a la compra periódica (DCA) se evaluará la métrica Fear and Greed (F&G) y si esta tiene un valor mayor de 50 que equivale a que el sentimiento de mercado es positivo, al final se realizará una comparativa de esta estrategia combinada frente a una DCA estándar durante el periodo que se se dispone de datos del índice Fear and Greed que es desde febrero 2018 hasta la actualidad.

El Dollar Cost Averaging (DCA) es un tipo de estrategia que consiste en invertir la misma cantidad de dinero cada cierto tiempo, es independiente de lo que suceda en el mercado ya que invertirás lo mismo, aunque el precio de BTC suba o baje.
Con ello se reduce el impacto que pueda tener una entrada en el mercado en el momento equivocado y minimizar las consecuencias de la alta volatilidad de BTC.
Inicialmente está pensada para comprar y mantener (hodl) pero no es obligatorio.
Es una opción prácticamente desatendida. Inviertes una cantidad de dinero en un momento determinado y lo dejas ahí durante tiempo con la idea de que bitcoin tenderá a subir en el largo plazo
No requiere una gran inversión inicial y te permite planificar tu riesgo.

El índice Fear and Greed es una métrica publicada por alternative que intenta predecir el sentimiento del mercado basándose en estos 5 indicadores: 

  • Volatilidad (25 %)
  • Volumen / impulso del mercado (25 %)
  • Redes Sociales (15%)
  • Dominancia (10%)
  • Tendencias (10%)

Disclaimer

Este artículo no es un consejo de inversión, actúa según tus propios criterios.

 

Se instala la librería necesaria para descargar los datos del precio de BTC de la web de Yahoo Finance.

!pip install yfinance > /dev/null

Las librerías Python que se utilizaran en el estudio son las siguientes.

import pandas as pd
import requests
import matplotlib.pyplot as plt
import yfinance as yf
from pylab import rcParams
import plotly.express as px
import warnings

warnings.filterwarnings('ignore')
rcParams['figure.figsize'] = 10, 5

Descarga de datos de precios de Bitcoin de Yahoo Finance.

df = yf.download('BTC-USD', interval = '1d')[['Close']]
df.rename(columns = {'Close':'close'}, inplace=True)
df.index.name = 'timestamp'
df['timestamp'] = df.index
df.reset_index(drop=True, inplace=True)
df.timestamp = pd.to_datetime(df.timestamp, unit='s').dt.tz_localize(None)
df.set_index(df.timestamp, inplace=True)
df.drop(['timestamp'], axis=1, inplace=True)

Descarga de los datos F&G de https://alternative.me/crypto/fear-and-greed-index/

r = requests.get('https://api.alternative.me/fng/?limit=0')

# Mostrar índice de miedo y codicia desde el febrero del año 2018.
# Los valores oscilan entre 0 y 100, donde los valores bajos indican miedo y los valores altos indican euforia.
df1 = pd.DataFrame(r.json()['data'])
df1.value = df1.value.astype(int)
df1.timestamp = pd.to_datetime(df1.timestamp, unit='s')
df1.set_index(df1.timestamp, inplace=True)
df1.rename(columns = {'value':'fear_greed', 'timestamp':'date'}, inplace=True)
df1.drop(['time_until_update'], axis=1, inplace=True)

Los datos del índice de miedo y avaricia se unen con los datos de precios de bitcoin en dólares.

data = df.merge(df1, on='timestamp')
data = data.sort_index()
data.tail()

Gráfico del precio de BTC coloreado en base al sentimiento del mercado marcado por el índice Fear and Greed.
Los colores más azulados corresponden al sentimiento de miedo y los más amarillentos a la euforia.

Se aprecia en la gráfica que en los periodos de subida de precio predominan los colores amarillentos y en los de bajada son los azules y violetas los colores más recurrentes.

fig = px.scatter(data, x="date", y="close", color="fear_greed",
                 title="BTC price with fear and greed index in continuous color")
fig.update_layout({
    "plot_bgcolor": "rgba(0, 0, 0, 0)",
    "paper_bgcolor": "rgba(0, 0, 0, 0)",
})
fig.show()

Se implementa una estrategia DCA donde se compra BTC una vez a la semana y sólo cuando el F&G es mayor de 50.

limit_fear_greed = 50
buy_dates = pd.date_range(data.index[0], data.index[-1], freq='1W')
data_buy = data[(data.index.isin(buy_dates) & (data.fear_greed > limit_fear_greed))]

# La cantidad de dolares disponibles semanalmente para comprar es de $100
buy_dca = 100
data_buy['btc_amt'] = buy_dca / data_buy.close
data_buy['btc_amt_sum'] = data_buy.btc_amt.cumsum()
data_buy

El periodo del que se disponen datos del índice F&G es del 1 de febrero del 2018 hasta la actualidad.

print(data_buy.index[0])
print(data_buy.index[-1])

2018-02-18 00:00:00
2021-11-14 00:00:00

Cálculo de los gastos y beneficios de la estrategia mixta (DCA y F&G) sin tener en cuenta las comisiones por la compra de BTC.

spent = buy_dca * len(data_buy)
amount = data_buy.iloc[-1].btc_amt_sum * data.iloc[-1].close
print("Nº of purchases: \t " + str(len(data_buy)))
print("Spent: \t\t\t $" + str(spent))
print("Gross profit: \t\t $" + str(amount))
print("Net profit: \t\t $" + str(amount - spent))

Nº of purchases: 81
Spent: $8100
Gross profit: $12389.597549207663
Net profit: $4289.597549207663

Gráfico semanal del precio de bitcoin cuando el índice de Fear and Greed es mayor de 50.
Los círculos que aparecen en la gráfica nos indican los momentos de compra según esta estrategia. Se aprecian 3 zonas de acumulación de ellos que coinciden con los periodos bullish del precio.

  • Una primera zona de febrero a agosto del año 2019 donde la subida es comedida y la euforia es menor.
  • Una segunda desde el agosto del 2020 hasta mayo del 2021 donde se produce una de las grandes corridas alcistas de bitcoin y el euforia es máxima llegando a alcanzar valores de 95 puntos. 
  • Y una última de agosto 2021 hasta noviembre del 2021 donde la euforia es menor pero donde se alcanza el ATH (el valor más alto de todos los tiempos) el 9 de noviembre del 2021, desde entonces el índice fear and greed no ha vuelto a sobrepasar los 50 por lo cual no se habría ejecutado ninguna orden de compra.

fig = px.scatter(data_buy, x="date", y="close", color="fear_greed",
                 title="BTC weekly price with fear and greed index only when F&G > 50")

fig.update_layout({
    "plot_bgcolor": "rgba(0, 0, 0, 0)",
    "paper_bgcolor": "rgba(0, 0, 0, 0)",
})
fig.show()

Cálculo del desempeño de la una estrategia DCA pura donde se compran BTC todas las semanas.

buy_dates = pd.date_range(data.index[0], data.index[-1], freq='1W')
data_buy_dca_week = data[(data.index.isin(buy_dates))]

# Se calcula la compra semanal en dólares para que el valor gastado durante el periodo sea parecido en los dos supuestos 
buy_dca_week = buy_dca * len(data_buy) / len(data_buy_dca_week)
data_buy_dca_week['btc_amt'] = buy_dca_week / data_buy_dca_week.close
data_buy_dca_week['btc_amt_sum'] = data_buy_dca_week.btc_amt.cumsum()
buy_dca_week

32.66129032258065

A la hora de calcular los beneficios de la estrategia DCA tampoco se tienen en cuenta las comisiones por la compra de bitcoin.

spent_dca_week = buy_dca_week * len(data_buy_dca_week)
amount_dca_week = data_buy_dca_week.iloc[-1].btc_amt_sum * data.iloc[-1].close

print("Nº of purchases: \t " + str(len(data_buy_dca_week)))
print("Spent: \t\t\t $" + str(spent_dca_week))
print("Gross profit: \t\t $" + str(amount_dca_week))
print("Net profit: \t\t $" + str(amount_dca_week - spent_dca_week))

Nº of purchases: 248
Spent: $8100.000000000001
Gross profit: $15127.876797682371
Net profit: $7027.87679768237

Gráfico comparativo donde se muestra como se van acumulando los BTC adquiridos en la estrategía mixta de DCA y F&G.
En el caso de la línea de DCA and F&G no aparecen datos desde noviembre 2021 porque desde entonces el índice Fear and Greed no ha superado los 50 puntos.

data_buy['btc_amt_sum'].plot(label='DCA and F&G')
data_buy_dca_week['btc_amt_sum'].plot(label='DCA')
plt.legend()
plt.show()

Comparativa de las dos estrategias de inversión en números.

print("#####\t DCA and F&G Strategy \t#####")
print("Spent: \t\t\t $" + str(spent))
print("Net profit: \t\t $" + str(amount - spent))
print("Accumulated BTC: \t " + str(data_buy.iloc[-1].btc_amt_sum))
print("\n#####\t DCA Strategy \t\t#####")
print("Spent: \t\t\t $" + str(spent_dca_week))
print("Net profit: \t\t $" + str(amount_dca_week - spent_dca_week))
print("Accumulated BTC: \t " + str(data_buy_dca_week.iloc[-1].btc_amt_sum))

DCA and F&G Strategy
Spent: $8100
Net profit: $4289.597549207663
Accumulated BTC: 0.627840393893085

DCA Strategy
Spent: $8100.000000000001
Net profit: $7027.87679768237
Accumulated BTC: 0.7666021506913571

A la vista de lo números la estrategia mixta de inversión en bitcoin de DCA y el índice Fear and Greed en el periodo estudiado es peor que una estrategia de compra recurrente de la misma cantidad de dinero.
En este periodo tendríamos un gasto de 8100 dólares y 0.62 BTC en nuestra cuenta, en el caso de la estrategía combinada que equivalen $4527 descontando los gastos de compra y tendríamos 0.76 BTC si hubiésemos optado por un DCA que al precio de hoy quitando los gastos son unos $7300.

Enlace al notebook en kaggle Study Bitcoin strategy DCA with Fear and Greed

Enlace al código Python en github Study Bitcoin strategy combining DCA with Fear Greed index



Categories: Bitcoin, BTC, Code, Hodl, Notebook, Price, Python, Script, Trader, Trading

Leave a Reply

%d bloggers like this: