Overall Statistics
Total Orders
97
Average Win
18.86%
Average Loss
-5.32%
Compounding Annual Return
27.689%
Drawdown
40.400%
Expectancy
0.913
Start Equity
10000
End Equity
112376.10
Net Profit
1023.761%
Sharpe Ratio
1.086
Sortino Ratio
0.868
Probabilistic Sharpe Ratio
65.399%
Loss Rate
58%
Win Rate
42%
Profit-Loss Ratio
3.54
Alpha
0.131
Beta
0.598
Annual Standard Deviation
0.164
Annual Variance
0.027
Information Ratio
0.653
Tracking Error
0.151
Treynor Ratio
0.299
Total Fees
$224.67
Estimated Strategy Capacity
$3500000.00
Lowest Capacity Asset
SSO TJNNZWL5I4IT
Portfolio Turnover
2.12%
from AlgorithmImports import *

class SSOBuyHoldStrategy(QCAlgorithm):
    def initialize(self):
        self.set_start_date(2015, 1, 1)
        self.set_cash(10000)
        self.set_warmup(timedelta(days=250))

        self.sso = self.add_equity("SSO", Resolution.MINUTE, data_normalization_mode=DataNormalizationMode.RAW).symbol
        self.bnd = self.add_equity("SGOV", Resolution.MINUTE, data_normalization_mode=DataNormalizationMode.RAW).symbol

        sso_daily = self.add_equity("SSO", Resolution.DAILY, data_normalization_mode=DataNormalizationMode.RAW).symbol
        self.sma = self.sma(sso_daily, period=200, resolution=Resolution.DAILY)
        self.rsi = self.rsi(sso_daily, period=10, resolution=Resolution.DAILY)

        self.schedule.on(
            self.date_rules.every_day(self.sso),
            self.time_rules.after_market_close(self.sso, 1),
            self.trade
        )

        self.schedule.on(
            self.date_rules.month_end(self.sso),
            self.time_rules.after_market_close(self.sso, 0),
            self.add_cash
        )

    def trade(self):
        if not self.sma.is_ready or not self.rsi.is_ready or self.time < self.start_date: 
            return 
        
        sma = self.sma.current.value
        rsi = self.rsi.current.value
        price = self.securities[self.sso].price

        history = self.history(self.sso, 2, Resolution.DAILY, data_normalization_mode=DataNormalizationMode.RAW)
        if history["close"][0] > sma and price < sma: 
            self.set_holdings(self.bnd, 1, True)
            return
        
        if history["close"][0] < sma and price > sma: 
            self.set_holdings(self.sso, 1, True)
            return 
        
        if rsi < 31 and price >= sma: 
            self.set_holdings(self.sso, 1, True)
            return 
    
    def add_cash(self):
        if self.time < self.start_date:
            return
        self.portfolio.cash_book["USD"].add_amount(300.0)