| Overall Statistics |
|
Total Trades 3200 Average Win 0.09% Average Loss -0.08% Compounding Annual Return 12.061% Drawdown 31.200% Expectancy 0.165 Net Profit 40.766% Sharpe Ratio 0.639 Probabilistic Sharpe Ratio 25.399% Loss Rate 45% Win Rate 55% Profit-Loss Ratio 1.13 Alpha 0.12 Beta -0.095 Annual Standard Deviation 0.169 Annual Variance 0.028 Information Ratio -0.066 Tracking Error 0.211 Treynor Ratio -1.131 Total Fees $3357.93 |
import numpy as np
import pandas as pd
import datetime
class NadionResistanceAutosequencers(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 1, 1)
self.SetEndDate(2020,1,1)# Set Start Date
self.SetCash(100000)
self.Security=["LMT","MSFT","GM","MS","FB","NKE","TSLA","MS","GS","AMZN","T","BA","BLK","EA","C","KO","AMD","MMM","AXP","F","HON","SPY"]
for s in self.Security:
self.AddEquity(s,Resolution.Daily)
self.SMASPYS = self.SMA('SPY',10)
self.SMASPYL = self.SMA('SPY',30)
self.SetWarmUp(360)
# Set Strategy Cash
# self.AddEquity("SPY", Resolution.Minute)
def OnData(self,data):
if self.IsWarmingUp:
return
S=["LMT","MSFT","GM","MS","FB","NKE","TSLA","MS","GS","AMZN","T","BA","BLK","EA","C","KO","AMD","MMM","AXP","F","HON","SPY"]
M=self.History(S,360,Resolution.Daily)
M=M.close
V=M.unstack(level=0)
Daily_returns=np.log(V/V.shift(1))
Daily_returns_mean = Daily_returns.mean()
Daily_std = Daily_returns.std()
SPY_index_return = Daily_returns_mean[-1] * 250
SPY_index_Var = Daily_returns.var()[-1] * 250**(1/2)
covariance_index_stock = Daily_returns.cov()
Beta = (covariance_index_stock.iloc[:,-1]/SPY_index_Var)*250
Rcapm = 0.02 + Beta * (SPY_index_return-0.02)
SR = (Rcapm - 0.02)/(Daily_std*250)
for i in range(len(S)-1):
if SR[i]>0 and self.SMASPYS.Current.Value >self.SMASPYL.Current.Value :
self.SetHoldings(S[i],2/(len(S)-1))
elif SR[i]>0 and self.SMASPYS.Current.Value <self.SMASPYL.Current.Value :
self.Liquidate(S[i])
else:
return
for i in range(len(S)-1):
if SR[i]<0 and self.SMASPYS.Current.Value < self.SMASPYL.Current.Value :
self.SetHoldings(S[i],-2/(len(S)-1))
elif SR[i]<0 and self.SMASPYS.Current.Value > self.SMASPYL.Current.Value :
self.Liquidate(S[i])
else:
return
class MaximumDrawdownPercentPerSecurity(RiskManagementModel):
def __init__(self,maximumDrawdownPercent = 0.10) :
self.maximumDrawDownPercent = -abs(maximumDrawdownPercent)
def ManageRisk(self,algorithm,targets) :
target = []
for items in algorithm.Securities :
security = items.Value
if not security.Invested:
return
pnl = self.Holdings.UnrealizedProfitPercent
if pnl < self.maximumDrawdownPercent :
target.append(PortfolioTarget(security.Symbol,0))
return target