| Overall Statistics |
|
Total Orders 283 Average Win 17.70% Average Loss -5.27% Compounding Annual Return 35.936% Drawdown 38.000% Expectancy 1.210 Start Equity 5000 End Equity 1495963.66 Net Profit 29819.273% Sharpe Ratio 1.117 Sortino Ratio 1.179 Probabilistic Sharpe Ratio 64.694% Loss Rate 49% Win Rate 51% Profit-Loss Ratio 3.36 Alpha 0.201 Beta 0.689 Annual Standard Deviation 0.22 Annual Variance 0.048 Information Ratio 0.915 Tracking Error 0.197 Treynor Ratio 0.357 Total Fees $2481.75 Estimated Strategy Capacity $2600000.00 Lowest Capacity Asset SSO TJNNZWL5I4IT Portfolio Turnover 1.94% |
from AlgorithmImports import *
class LeveragedFTLT(QCAlgorithm):
def initialize(self):
self.set_start_date(2006, 6, 1)
self.set_cash(5000)
self.set_warmup(timedelta(days=250))
self.letf = self.add_equity("SSO", Resolution.MINUTE, data_normalization_mode=DataNormalizationMode.RAW, extended_market_hours=True).symbol
self.letf2 = self.add_equity("QLD", Resolution.MINUTE, data_normalization_mode=DataNormalizationMode.RAW, extended_market_hours=True).symbol
self.spy = self.add_equity("SPY", Resolution.MINUTE, data_normalization_mode=DataNormalizationMode.RAW, extended_market_hours=True).symbol
self.hedge = self.add_equity("BIL", Resolution.MINUTE, data_normalization_mode=DataNormalizationMode.ADJUSTED, extended_market_hours=True).symbol
self.hedge2 = self.add_equity("GLD", Resolution.MINUTE, data_normalization_mode=DataNormalizationMode.RAW).symbol
# spy_daily = self.add_equity("QQQ", Resolution.DAILY, data_normalization_mode=DataNormalizationMode.RAW).symbol
self.SetSecurityInitializer(lambda x: x.SetFillModel(ExtendedMarketHoursFillModel(self)))
spy_daily = self.add_equity("SPY", Resolution.DAILY, data_normalization_mode=DataNormalizationMode.RAW).symbol
self.sma = self.sma(spy_daily, period=200, resolution=Resolution.DAILY)
self.srsi = self.srsi(spy_daily, 14, 14, 3, 3)
self.rsi_10 = self.rsi(spy_daily, period=10, resolution=Resolution.DAILY)
self.rsi_2 = self.rsi(spy_daily, period=2, resolution=Resolution.DAILY)
self.schedule.on(
self.date_rules.week_end(self.letf),
self.time_rules.after_market_close(self.letf, 0),
self.trade
)
self.schedule.on(
self.date_rules.month_end(self.letf),
self.time_rules.after_market_close(self.letf, 0),
self.add_cash
)
self.risk_off_price = 0
self.buyDip1 = False
self.buyDip2 = False
def trade(self):
if not self.sma.is_ready or not self.rsi_10.is_ready or self.time < self.start_date:
return
sma = self.sma.current.value
rsi_10 = self.rsi_10.current.value
rsi_2 = self.rsi_2.current.value
price = self.securities[self.spy].price
# if not self.portfolio.invested:
# self.set_holdings(self.letf, 1)
history = self.history(self.spy, 2, Resolution.DAILY, data_normalization_mode=DataNormalizationMode.RAW)
if price < sma and not self.portfolio[self.hedge].invested: #history["close"][0] > sma and
# self.set_holdings([PortfolioTarget(self.hedge, 0.5), PortfolioTarget(self.hedge2, 0.5)], True)
self.set_holdings([PortfolioTarget(self.hedge, 0.5), PortfolioTarget(self.hedge2, 0.5)], True)
self.risk_off_price = price
return
# if price < sma and not self.buyDip1 and self.risk_off_price > 0 and price / self.risk_off_price >= 0.3 and self.portfolio[self.hedge].invested:
# self.set_holdings([PortfolioTarget(self.hedge, 0.9), PortfolioTarget(self.letf, 0.1)])
# self.buyDip1 = True
# if price < sma and not self.buyDip2 and self.risk_off_price > 0 and price / self.risk_off_price >= 0.6 and self.portfolio[self.hedge].invested:
# # self.set_holdings([PortfolioTarget(self.hedge, 0.8), PortfolioTarget(self.letf, 0.2)])
# self.set_holdings(self.hedge, 0.9)
# self.buyDip2 = True
if price > sma and not self.portfolio[self.letf].invested: #history["close"][0] < sma and
self.set_holdings([PortfolioTarget(self.letf, 0.5), PortfolioTarget(self.letf2, 0.5)], True)
self.risk_off_price = 0
self.buyDip1 = False
self.buyDip2 = False
return
if rsi_10 < 29 and price > sma and self.portfolio[self.letf].invested:
self.set_holdings([PortfolioTarget(self.letf, 0.5), PortfolioTarget(self.letf2, 0.5)])
return
def add_cash(self):
if self.time < self.start_date:
return
self.portfolio.cash_book["USD"].add_amount(800.0)
# if self.portfolio[self.letf].invested:
# self.set_holdings(self.letf, 1)
# if self.portfolio[self.hedge].invested:
# self.set_holdings(self.hedge, 1)
def on_order_event(self, order_event):
self.log(f"Time: {self.time} | Event: {order_event}")
class ExtendedMarketHoursFillModel(FillModel):
def __init__(self, algo):
self.algo = algo
def Fill(self, parameters):
security = parameters.Security
order = parameters.Order
utcTime = pytz.timezone("America/New_York").localize(self.algo.Time, is_dst=None).astimezone(pytz.utc)
order_event = OrderEvent(order, utcTime, OrderFee.Zero)
order_event.FillPrice = security.Price
order_event.Status = OrderStatus.Filled
order_event.FillQuantity = order.Quantity
return Fill(order_event)