| Overall Statistics |
|
Total Orders 3045 Average Win 0.16% Average Loss -0.13% Compounding Annual Return 71.347% Drawdown 11.700% Expectancy 0.199 Start Equity 100000 End Equity 128879.27 Net Profit 28.879% Sharpe Ratio 2.395 Sortino Ratio 3.006 Probabilistic Sharpe Ratio 82.095% Loss Rate 45% Win Rate 55% Profit-Loss Ratio 1.19 Alpha 0.118 Beta 1.593 Annual Standard Deviation 0.187 Annual Variance 0.035 Information Ratio 1.944 Tracking Error 0.124 Treynor Ratio 0.282 Total Fees $2727.46 Estimated Strategy Capacity $68000000.00 Lowest Capacity Asset AMCR X58W2VQW0QXX Portfolio Turnover 99.25% |
# region imports
from AlgorithmImports import *
# endregion
class LiquidUniverseSelection(QCAlgorithm):
filtered_by_price = None
def initialize(self):
self.set_start_date(2019, 1, 11)
self.set_end_date(2019, 7, 1)
self.set_cash(100000)
self.add_universe(self.coarse_selection_filter)
# Ignore this for now, we'll cover it in the next task.
self.universe_settings.resolution = Resolution.DAILY
# self.SetWarmup(timedelta(days=30)) # Warm up with 30 days of data
def coarse_selection_filter(self, coarse):
sorted_by_dollar_volume = sorted(coarse, key=lambda x: x.dollar_volume, reverse=True)
filtered_by_price = [x.symbol for x in sorted_by_dollar_volume if x.has_fundamental_data and x.price > 10]
return filtered_by_price[:8]
def on_securities_changed(self, changes):
self.changes = changes
self.log(f"on_securities_changed({self.time}):: {changes}")
#1. Liquidate removed securities
for security in changes.removed_securities:
if security.invested:
self.liquidate(security.symbol)
#2. We want 10% allocation in each security in our universe
for security in self.changes.added_securities:
pass
# self.set_holdings(security.symbol, 0.1)
def OnData(self, data):
for symbol in data.keys():
if not self.Securities[symbol].invested:
self.set_holdings(symbol, 0.1)