Overall Statistics |
Total Trades 296 Average Win 0.76% Average Loss -1.37% Compounding Annual Return 0% Drawdown 102.200% Expectancy -0.353 Net Profit -102.239% Sharpe Ratio -0.478 Probabilistic Sharpe Ratio 0.000% Loss Rate 58% Win Rate 42% Profit-Loss Ratio 0.55 Alpha 0 Beta 0 Annual Standard Deviation 2.087 Annual Variance 4.356 Information Ratio -0.478 Tracking Error 2.087 Treynor Ratio 0 Total Fees $388.88 Estimated Strategy Capacity $0 Lowest Capacity Asset KNCBTC E3 |
import decimal as d import pandas as pd from datetime import datetime, timedelta # https://www.quantconnect.com/forum/discussion/2865/crypto-bollinger-band-strategy/p1 # https://www.factorresearch.com/research-quant-strategies-in-the-cryptocurrency-space # https://www.quantconnect.com/tutorials/strategy-library/short-term-reversal-strategy-in-stocks # https://www.quantconnect.com/tutorials/introduction-to-financial-python/rate-of-return,-mean-and-variance # https://www.quantconnect.com/tutorials/strategy-library/forex-momentum class Bitfinex_Crypto_ShortTerm_Momentum(QCAlgorithm): def __init__(self): # set the flag for rebalance self.reb = 1 # Number of assets to long/short self.num_fine = 8 def Initialize(self): self.SetStartDate(2019, 1, 1) #Set Start Date self.SetEndDate(2021, 3, 31) #Set End Date # Set Strategy Cash (USD) self.SetCash(10000) self.SetBrokerageModel(BrokerageName.Bitfinex, AccountType.Margin) self.SetBenchmark('BTCUSD') tickers = ["LTCBTC", "ETHBTC", "ETCBTC", "ZECBTC", "XMRBTC", "XRPBTC", "EOSBTC", "SANBTC", "OMGBTC", "NEOBTC", "ETPBTC", "BTGBTC", "BATBTC", "ZRXBTC", "TRXBTC", "DAIBTC", "ANTBTC", "XLMBTC", "KNCBTC", "XTZBTC", "BSVBTC"] for ticker in tickers: self.AddCrypto(ticker, Resolution.Daily) # Set warmup period self.SetWarmUp(timedelta(7)) # Schedule the rebalance function to execute at the begining of each week self.Schedule.On(self.DateRules.WeekStart(), self.TimeRules.At(12, 0, 0), Action(self.rebalance)) def OnData(self, data): # Beräkna 7d avkastning på samtliga valutor. # Gå lång på de 4 valutor som utvecklats bäst de senaste 7d. # Gå kort på de 4 valutor som utvecklats sämst de senaste 7d. # Ombalansera varje vecka. pass def rebalance(self): tickers = ["LTCBTC", "ETHBTC", "ETCBTC", "ZECBTC", "XMRBTC", "XRPBTC", "EOSBTC", "SANBTC", "OMGBTC", "NEOBTC", "ETPBTC", "BTGBTC", "BATBTC", "ZRXBTC", "TRXBTC", "DAIBTC", "ANTBTC", "XLMBTC", "KNCBTC", "XTZBTC", "BSVBTC"] df = pd.DataFrame() #start = datetime(2018, 10, 1) #end = datetime(2018, 12, 31) # Gets historical data from the subscribed assets #h1 = self.History(self.Securities.Keys, start, end, Resolution.Daily) h1 = self.History(tickers, timedelta(30), Resolution.Daily) if h1.empty: self.Log("EMPTY dataframe!") # Resample to 1W timeframe. for i in tickers: df[i] = h1.loc[i]['close'].resample('W').mean().pct_change() # Sort the lastrow of dataframe last_week = df.iloc[-1].sort_values(ascending=False) # Assign the assets to short/long self.long = [last_week.index[0], last_week.index[1], last_week.index[2], last_week.index[3]] self.short = [last_week.index[-1], last_week.index[-2], last_week.index[-3], last_week.index[-4]] #if self.Portfolio.Invested != 0: # if this month the stock are not going to be long/short, liquidate it. long_short_list = self.long + self.short for i in self.Portfolio.Values: if (i.Invested) and (i not in long_short_list): self.Liquidate(i.Symbol) #else: # self.Log("Not invested.") #self.Liquidate() # Assign each asset equally. Alternatively you can design your own portfolio construction method for i in self.long: self.SetHoldings(i, 0.9/self.num_fine) for i in self.short: self.SetHoldings(i, -0.9/self.num_fine) self.reb = 1 def OnOrderEvent(self, orderEvent): self.Debug("{} {}".format(self.Time, orderEvent.ToString())) def OnEndOfAlgorithm(self): self.Log("{} - TotalPortfolioValue: {}".format(self.Time, self.Portfolio.TotalPortfolioValue)) self.Log("{} - CashBook: {}".format(self.Time, self.Portfolio.CashBook))