| Overall Statistics |
|
Total Trades 422 Average Win 0.16% Average Loss -0.16% Compounding Annual Return -6.053% Drawdown 9.700% Expectancy -0.048 Net Profit -4.096% Sharpe Ratio -0.009 Probabilistic Sharpe Ratio 20.711% Loss Rate 52% Win Rate 48% Profit-Loss Ratio 0.98 Alpha 0.049 Beta -0.363 Annual Standard Deviation 0.154 Annual Variance 0.024 Information Ratio -0.791 Tracking Error 0.179 Treynor Ratio 0.004 Total Fees $691.56 |
from Alphas.EmaCrossAlphaModel import EmaCrossAlphaModel
from Execution.ImmediateExecutionModel import ImmediateExecutionModel
from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel
from Risk.MaximumDrawdownPercentPerSecurity import MaximumDrawdownPercentPerSecurity
import numpy as np
class TrailingStopPerSecurity(RiskManagementModel):
'''Provides an implementation of IRiskManagementModel that limits the drawdown per holding to the specified percentage'''
def __init__(self, maximumDrawdownPercent = 0.05):
'''Initializes a new instance of the MaximumDrawdownPercentPerSecurity class
Args:
maximumDrawdownPercent: The maximum percentage drawdown allowed for any single security holding'''
self.maximumDrawdownPercent = -abs(maximumDrawdownPercent)
self.asset_best_pnl = {}
def ManageRisk(self, algorithm, targets):
'''Manages the algorithm's risk at each time step
Args:
algorithm: The algorithm instance
targets: The current portfolio targets to be assessed for risk'''
# Clear History of items in self.asset_best_pnl by setting valid symbol for symbol with holding !=0
syms_quantities = {kvp.Value.Symbol.Value:kvp.Value.Holdings.Quantity for kvp in algorithm.Securities}
valid_syms = [key for key,val in syms_quantities.items() if val!=0]
new_assets = {key:val for key,val in self.asset_best_pnl.items() if key in valid_syms}
self.asset_best_pnl = new_assets
targets = []
for kvp in algorithm.Securities:
security = kvp.Value
symbol = security.Symbol.Value
if symbol not in self.asset_best_pnl.keys():
self.asset_best_pnl[symbol] = security.Holdings.UnrealizedProfitPercent
self.asset_best_pnl[symbol] = np.maximum(self.asset_best_pnl[symbol], security.Holdings.UnrealizedProfitPercent)
if not security.Invested:
continue
pnl = security.Holdings.UnrealizedProfitPercent - self.asset_best_pnl[symbol]
if pnl < self.maximumDrawdownPercent:
# liquidate
targets.append(PortfolioTarget(symbol, 0))
return targets
class ParticleModulatedAntennaArray(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2016, 12, 13) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
# self.AddEquity("SPY", Resolution.Minute)
self.AddAlpha(EmaCrossAlphaModel(50, 200, Resolution.Hour))
self.SetExecution(ImmediateExecutionModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetRiskManagement(TrailingStopPerSecurity(0.1))
self.SetUniverseSelection(TechnologyETFUniverse())
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
# if not self.Portfolio.Invested:
# self.SetHoldings("SPY", 1)