| Overall Statistics |
|
Total Trades 1335 Average Win 0.13% Average Loss -0.08% Compounding Annual Return 11.768% Drawdown 4.100% Expectancy 0.332 Net Profit 15.895% Sharpe Ratio 1.37 Probabilistic Sharpe Ratio 67.034% Loss Rate 49% Win Rate 51% Profit-Loss Ratio 1.63 Alpha 0.086 Beta -0.055 Annual Standard Deviation 0.06 Annual Variance 0.004 Information Ratio 0.077 Tracking Error 0.151 Treynor Ratio -1.496 Total Fees $2086.17 Estimated Strategy Capacity $410000.00 Lowest Capacity Asset SABRP XHVSM2QVDB39 |
# Long-Short Equity Rebalancing
from AlgorithmImports import *
class LongShortPF(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 1)
self.SetEndDate(2022, 5, 1)
self.SetCash(1000000)
self.AddUniverse(self.CoarseSelection, self.FineSelection)
self.selected = []
self.numb_stocks = 50
self.universeMonth = -1
def CoarseSelection(self, coarse):
if self.Time.month == self.universeMonth:
return self.filteredStocks
self.filteredStocks = [x.Symbol for x in coarse if x.HasFundamentalData and (float(x.Price)) > 10 and x.DollarVolume > 5000000]
return self.filteredStocks
def FineSelection(self,fine):
no_fin = [sec for sec in fine if sec.AssetClassification.MorningstarSectorCode != MorningstarSectorCode.FinancialServices]
tops = sorted(no_fin, key = lambda sec:sec.ValuationRatios.ForwardPERatio, reverse=True)[:self.numb_stocks]
bottoms = sorted(no_fin, key = lambda sec:sec.ValuationRatios.ForwardPERatio, reverse=True)[-self.numb_stocks:]
self.longs = [l.Symbol for l in tops if l.ValuationRatios.PEGRatio > 1]
self.shorts = [s.Symbol for s in bottoms if s.ValuationRatios.PEGRatio < 1]
self.selected = self.longs + self.shorts
return self.selected
def OnData(self, data):
if self.Time.month == self.universeMonth: return
if not (self.Time.hour == 10 and self.Time.minute == 1): return
for sec in self.Portfolio.Keys:
if sec not in self.selected:
self.Liquidate(sec)
for sec in self.longs:
wt = 0.45/len(self.longs) if len(self.longs) > 0 else 0
self.SetHoldings(sec, wt)
for sec in self.shorts:
wt = -0.45/len(self.shorts) if len(self.shorts) > 0 else 0
self.SetHoldings(sec, wt)
self.universeMonth = self.Time.month