| Overall Statistics |
|
Total Trades 496 Average Win 0.50% Average Loss -0.46% Compounding Annual Return 36.672% Drawdown 55.200% Expectancy 0.151 Net Profit 16.853% Sharpe Ratio 1.023 Probabilistic Sharpe Ratio 40.845% Loss Rate 44% Win Rate 56% Profit-Loss Ratio 1.07 Alpha 0.946 Beta 0.084 Annual Standard Deviation 0.948 Annual Variance 0.898 Information Ratio 0.721 Tracking Error 0.954 Treynor Ratio 11.537 Total Fees $681.81 Estimated Strategy Capacity $31000000.00 Lowest Capacity Asset MEDS XC03HZ3KX3L1 |
from AlgorithmImports import *
class MorningStarDataAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 1)
self.SetEndDate(2021, 7, 1)
self.SetCash(100000)
# Requesting data
self.AddUniverse(self.SelectCoarse, self.SelectFine)
self.num_coarse_symbols = 100
self.num_fine_symbols = 10
self.UniverseSettings.Resolution = Resolution.Daily
def SelectCoarse(self, coarse):
selected = [c for c in coarse if c.HasFundamentalData]
sorted_by_dollar_volume = sorted(selected, key=lambda c: c.DollarVolume, reverse=True)
return [ c.Symbol for c in sorted_by_dollar_volume[:self.num_coarse_symbols] ]
def SelectFine(self, fine):
sorted_by_pe_ratio = sorted(fine, key=lambda f: f.ValuationRatios.PERatio, reverse=True)
return [ f.Symbol for f in sorted_by_pe_ratio[:self.num_fine_symbols] ]
def OnData(self, data):
# if we have no changes, do nothing
if self._changes is None: return
# liquidate removed securities
for security in self._changes.RemovedSecurities:
if security.Invested:
self.Liquidate(security.Symbol)
# we want 1/N allocation in each security in our universe
for security in self._changes.AddedSecurities:
self.SetHoldings(security.Symbol, 1 / self.num_fine_symbols)
self._changes = None
def OnSecuritiesChanged(self, changes):
self._changes = changes
for security in changes.AddedSecurities:
# Historical data
history = self.History(security.Symbol, 7, Resolution.Daily)
self.Debug(f"We got {len(history)} from our history request for {security.Symbol}")