| 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)