Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
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 = ["BTCUSD", "ETHUSD", "XRPUSD", "LTCUSD", "EOSUSD", "NEOUSD", "XMRUSD", "TRXUSD"] #tickers = ['BTCUSD', 'ETHUSD', 'XRPUSD', 'EOSUSD', 'LTCUSD', # 'XLMUSD', 'TRXUSD', 'XMRUSD', 'DSHUSD', # 'IOTUSD', 'NEOUSD', 'ZECUSD', 'BATUSD', # 'QTMUSD'] tickers = ["LTCBTC", "ETHBTC", "ETCBTC", "ZECBTC", "XMRBTC", "XRPBTC", "EOSBTC", "SANBTC", "OMGBTC", "BCHBTC", "NEOBTC", "ETPBTC", "BTGBTC", "GNTBTC", "BATBTC", "ZRXBTC", "TRXBTC", "RLCBTC", "LRCBTC", "DAIBTC", "ANTBTC", "XLMBTC", "MKRBTC", "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 = ["BTCUSD", "ETHUSD", "XRPUSD", "LTCUSD", "EOSUSD", "NEOUSD", "XMRUSD", "TRXUSD"] #tickers = ['BTCUSD', 'ETHUSD', 'XRPUSD', 'EOSUSD', 'LTCUSD', # 'XLMUSD', 'TRXUSD', 'XMRUSD', 'DSHUSD', # 'IOTUSD', 'NEOUSD', 'ZECUSD', 'BATUSD', # 'QTMUSD'] tickers = ["LTCBTC", "ETHBTC", "ETCBTC", "ZECBTC", "XMRBTC", "XRPBTC", "EOSBTC", "SANBTC", "OMGBTC", "BCHBTC", "NEOBTC", "ETPBTC", "BTGBTC", "GNTBTC", "BATBTC", "ZRXBTC", "TRXBTC", "RLCBTC", "LRCBTC", "DAIBTC", "ANTBTC", "XLMBTC", "MKRBTC", "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))