Overall Statistics
Total Trades
50
Average Win
402.84%
Average Loss
-7.85%
Compounding Annual Return
109.981%
Drawdown
65.900%
Expectancy
13.653
Net Profit
15316.777%
Sharpe Ratio
1.793
Probabilistic Sharpe Ratio
82.192%
Loss Rate
72%
Win Rate
28%
Profit-Loss Ratio
51.33
Alpha
0.862
Beta
0.203
Annual Standard Deviation
0.49
Annual Variance
0.24
Information Ratio
1.573
Tracking Error
0.505
Treynor Ratio
4.328
Total Fees
$0.00
Estimated Strategy Capacity
$8800000.00
Lowest Capacity Asset
BTCUSD XJ
# region imports
from AlgorithmImports import *
import ht_auth
# endregion

class MuscularBlueChicken(QCAlgorithm):

    def Initialize(self):
        ht_auth.SetToken(self.GetParameter("mlfinlab-api-key"))
        from mlfinlab.labeling  import trend_scanning_labels
        self.trend_scanning_labels = trend_scanning_labels

        self.SetStartDate(2016, 1, 1) 
        self.SetCash(100000)
        self.symbol = self.AddCrypto("BTCUSD", Resolution.Daily).Symbol

        self.lookback = 3 * 30 # 3 months
        self.close_prices = pd.Series()
        trade_bars = self.History[TradeBar](self.symbol, self.lookback)
        for trade_bar in trade_bars:
            self.update_history(trade_bar)

    def update_history(self, trade_bar):
        self.close_prices.loc[trade_bar.EndTime] = trade_bar.Close
        self.close_prices = self.close_prices.iloc[-self.lookback:]

    def OnData(self, data: Slice):
        self.update_history(data[self.symbol])
        labels = self.trend_scanning_labels(self.close_prices, self.close_prices.index, observation_window=self.lookback, look_forward=False)
        trend_direction = labels['bin'].iloc[-1]
        if trend_direction == 1 and not self.Portfolio[self.symbol].IsLong \
            or trend_direction == -1 and self.Portfolio[self.symbol].IsLong:
            self.SetHoldings(self.symbol, int(trend_direction > 0))