| Overall Statistics |
|
Total Trades 87 Average Win 2.12% Average Loss -2.69% Compounding Annual Return -22.341% Drawdown 40.000% Expectancy -0.150 Net Profit -11.843% Sharpe Ratio 0.03 Probabilistic Sharpe Ratio 20.641% Loss Rate 52% Win Rate 48% Profit-Loss Ratio 0.79 Alpha -0.216 Beta 1.012 Annual Standard Deviation 0.645 Annual Variance 0.417 Information Ratio -0.336 Tracking Error 0.635 Treynor Ratio 0.019 Total Fees $153.49 Estimated Strategy Capacity $85000000.00 Lowest Capacity Asset TSLA UNU3P8Y3WFAD Portfolio Turnover 15.96% |
from AlgorithmImports import *
class USCoarseUniverseConstituentsDataAlgorithm(QCAlgorithm):
_number_of_symbols = 3
_changes = None
def Initialize(self) -> None:
self.SetStartDate(2021, 1, 1)
self.SetEndDate(2021, 7, 1)
self.SetCash(100000)
# Requesting data
self.AddUniverse(self.FundamentalSelectionFunction)
def FundamentalSelectionFunction(self, fundamental: List[Fundamental]) -> List[Symbol]:
sortedByDollarVolume = sorted(fundamental, key=lambda x: x.DollarVolume, reverse=True)
return [ x.Symbol for x in sortedByDollarVolume[:self._number_of_symbols] ]
def OnData(self, data: Slice) -> None:
# 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._number_of_symbols)
self._changes = None
def OnSecuritiesChanged(self, changes: SecurityChanges) -> None:
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}")