Overall Statistics
Total Trades
216
Average Win
1.40%
Average Loss
-1.27%
Compounding Annual Return
-20.123%
Drawdown
11.000%
Expectancy
-0.028
Net Profit
-5.554%
Sharpe Ratio
-1.103
Loss Rate
54%
Win Rate
46%
Profit-Loss Ratio
1.11
Alpha
0.001
Beta
-10.669
Annual Standard Deviation
0.131
Annual Variance
0.017
Information Ratio
-1.207
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(2017, 10, 1)
        end = datetime(2017, 12, 31)
       
        # Gets historical data from the subscribed assets
       
        h1 = self.History(tickers, start, end, Resolution.Daily)
        #h1 = self.History(self.Securities.Keys, start, end, Resolution.Daily)
        #h1 = self.History(tickers, timedelta(30), Resolution.Daily)
        #h1 = self.History(tickers, 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))