Skip to content

Instantly share code, notes, and snippets.

@snapo
Forked from mostlyinteresting/btc_max_dd.py
Created January 22, 2020 13:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snapo/e0c70c6420d007a27a07f42e2bed38ca to your computer and use it in GitHub Desktop.
Save snapo/e0c70c6420d007a27a07f42e2bed38ca to your computer and use it in GitHub Desktop.
Rolling n Year Max DD for BTC
import os
import pandas as pd
import datetime as dt
import seaborn as sns
import matplotlib.pyplot as plt
import ccxt
from dateutil import relativedelta
import numpy as np
sns.set(style = 'ticks', context = 'talk')
plt.style.use("dark_background")
pd.options.mode.chained_assignment = None
#Millisecond UTC timestamp to datetime
def ms2dt(x):
return dt.datetime.utcfromtimestamp(x//1000).replace(microsecond=x%1000*1000)
#Datetime to millisecond
def dt2ms(x):
return int(float(pd.to_datetime(x).to_datetime64()) / 1e6)
def get_max_dd(nvs = pd.Series(), window=None):
n = len(nvs)
if window is None:
window = n
peak_series = nvs.rolling(window=window, min_periods=1).max()
return (nvs / peak_series - 1.0).min()
if __name__ == '__main__':
symbol = 'BTC/USDT'
btcStr = 'Bitcoin'
goldStr = 'Gold'
startDate = dt.datetime(year = 2010, month = 1, day = 1)
today = dt.datetime.now()
today = dt.datetime(year = today.year, month = today.month, day = today.day)
lastYr = today - pd.Timedelta(days = 365)
startDate = startDate.strftime('%Y-%m-%d')
endDate = today.strftime('%Y-%m-%d')
polo = ccxt.poloniex()
startDate = dt.datetime(year = 2010, month = 1, day = 3)
startDateMS = dt2ms(startDate)
btc = polo.fetch_ohlcv(symbol, timeframe = '1d', since = startDateMS)
btc = pd.DataFrame(btc, columns = ['Date','Open','High','Low','Close','Volume'])
btc['Date'] = btc['Date'].apply( lambda x: ms2dt(x))
btc.set_index('Date', inplace = True)
btc = btc[ btc.index < today ]
prices = btc[['Close']]
prices.rename( columns = {'Close':btcStr}, inplace = True)
returns = prices.pct_change()
returns.dropna(how = 'any', axis = 'rows', inplace = True)
#Drawdowns
maxDate = prices.index.max()
rolling = []
years = list(range(1,4))
for year in years:
strYear = str(year) + ' Year'
for i in range(prices.shape[0]):
t0 = prices.index[i]
t1 = t0 + relativedelta.relativedelta(years=year)
if t1 <= maxDate:
p0 = prices[btcStr][ (prices.index >= t0) & (prices.index <= t1) ]
rolling.append([ strYear, t1, get_max_dd(p0)*-1 ])
rolling = pd.DataFrame.from_records(rolling, columns = ['Horizon','Date','Max Drawdown'])
dd1Y = rolling[['Date','Max Drawdown']][rolling['Horizon'] == '1 Year']
dd1Y.set_index('Date', inplace = True)
dd1Y.rename( columns = {'Max Drawdown':'Historical 1Y Max DD'}, inplace = True)
g = dd1Y.plot()
vals = g.get_yticks()
g.set_yticklabels(['{:,.0%}'.format(x) for x in vals])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment