Overall Statistics |
Total Trades 216 Average Win 1.40% Average Loss -1.27% Compounding Annual Return -20.012% Drawdown 11.000% Expectancy -0.028 Net Profit -5.521% Sharpe Ratio -1.095 Loss Rate 54% Win Rate 46% Profit-Loss Ratio 1.11 Alpha 0.001 Beta -10.6 Annual Standard Deviation 0.131 Annual Variance 0.017 Information Ratio -1.199 Tracking Error 0.131 Treynor Ratio 0.014 Total Fees $440.18 |
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 BasicTemplateCryptoAlgorithm(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(2018, 10, 1) #Set Start Date self.SetEndDate(2018, 12, 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"] for ticker in tickers: self.AddCrypto(ticker, Resolution.Daily, Market.Bitfinex) # set warmup period #self.SetWarmUp(20) self.SetWarmUp(timedelta(7)) # Schedule the rebalance function to execute at the begining of each month 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"] 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) #h1 = self.History(["BTCUSD", "ETHUSD", "XRPUSD", "LTCUSD", "EOSUSD", "NEOUSD", "XMRUSD", "TRXUSD"], 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[4], last_week.index[5], last_week.index[6], last_week.index[7]] # 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) 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))