Overall Statistics |
Total Trades 29 Average Win 4.24% Average Loss 0% Compounding Annual Return 32.328% Drawdown 49.200% Expectancy 0 Net Profit 70.860% Sharpe Ratio 0.753 Probabilistic Sharpe Ratio 27.545% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.042 Beta 4.809 Annual Standard Deviation 0.51 Annual Variance 0.26 Information Ratio 0.774 Tracking Error 0.404 Treynor Ratio 0.08 Total Fees $93.48 Estimated Strategy Capacity $330000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X |
using System; using QuantConnect.Data; using QuantConnect.Orders; using QuantConnect.Securities; using QuantConnect.Securities.Equity; namespace QuantConnect.Algorithm.CSharp { public class SpyLever : QCAlgorithm { private Equity _spy; private bool _shouldRebalance = true; public override void Initialize() { SetStartDate(2013, 10, 7); SetCash(100000); _spy = AddEquity("SPY", Resolution.Daily); _spy.SetBuyingPowerModel(new SecurityMarginModel(5m)); // Schedule rebalances monthly Schedule.On(DateRules.MonthStart(3), TimeRules.Midnight, () => { _shouldRebalance = true; }); // Portfolio.MarginCallModel = MarginCallModel.Null; } public override void OnData(Slice data) { Plot("Leverage", "Value", Portfolio.TotalAbsoluteHoldingsCost / Portfolio.TotalPortfolioValue); Plot("Values", "Holdings Cost", Portfolio.TotalAbsoluteHoldingsCost); Plot("Values", "Portfolio Value", Portfolio.TotalPortfolioValue); Plot("Values", "Cash", Portfolio.Cash); if (_shouldRebalance) { var close = data.Bars[_spy.Symbol].Close; var power = 5m * Portfolio.TotalPortfolioValue * 0.95m; var goal = (int)Math.Truncate(power / close); var current = Portfolio[_spy.Symbol].Quantity; var toBuy = goal - current; Debug($"Rebalance SPY@{close} with Power {power}: {current} -> {goal} buy {toBuy}"); MarketOrder(_spy.Symbol, toBuy); _shouldRebalance = false; } } public override void OnOrderEvent(OrderEvent ev) { if (ev.Status == OrderStatus.Invalid) { throw new Exception($"Failed order {ev.Message} for {ev.Quantity}"); } } } }