| Overall Statistics |
|
Total Trades 706 Average Win 1.22% Average Loss -0.35% Compounding Annual Return 1.855% Drawdown 16.800% Expectancy 0.272 Net Profit 10.643% Sharpe Ratio 0.217 Probabilistic Sharpe Ratio 3.646% Loss Rate 71% Win Rate 29% Profit-Loss Ratio 3.44 Alpha -0.013 Beta 0.293 Annual Standard Deviation 0.12 Annual Variance 0.014 Information Ratio -0.63 Tracking Error 0.17 Treynor Ratio 0.089 Total Fees $0.00 |
class DynamicNadionCompensator(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2015, 1, 15) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.SetSecurityInitializer(self.CustomSecurityInitializer)
self.AddEquity('SPY', Resolution.Hour)
self.sma = self.SMA('SPY', 50, Resolution.Hour)
self.SetWarmup(50)
self.month_counter = 0
self.Schedule.On(self.DateRules.MonthEnd('SPY'), self.TimeRules.BeforeMarketClose('SPY'), self.Yearly)
self.prev_cumulative_profit = 0
def OnData(self, data):
if self.IsWarmingUp:
return
if data.ContainsKey('SPY') and data['SPY'] is not None:
if data['SPY'].Close > self.sma.Current.Value:
self.SetHoldings('SPY', 1.0)
else:
self.Liquidate('SPY')
def Yearly(self):
self.month_counter += 1
if self.month_counter % 12 == 0:
self.Plot('Total Profit', self.Portfolio.TotalProfit)
self.Plot('Separate Chart', 'Total Holdings', self.Portfolio.TotalHoldingsValue)
# alternatively
if self.Time.month == 11: #
self.Debug('Month End')
self.IncorporateFees()
def IncorporateFees(self):
fees = .002 * self.Portfolio.TotalHoldingsValue
current_year_profit = self.Portfolio.TotalProfit - self.prev_cumulative_profit
self.prev_cumulative_profit = self.Portfolio.TotalProfit
if current_year_profit > 0:
fees += current_year_profit
self.Plot('Custom', 'Fees', fees)
cash_after_fees = self.Portfolio.Cash - fees
if cash_after_fees < 0:
self.MarketOrder('SPY', -int(cash_after_fees / self.Securities['SPY'].Price + 1))
self.Portfolio.SetCash(cash_after_fees)
def CustomSecurityInitializer(self, security):
security.SetFeeModel(CustomFeeModel())
class CustomFeeModel:
def GetOrderFee(self, parameters):
return OrderFee(CashAmount(0, 'USD'))