Overall Statistics
Total Trades
21
Average Win
2.20%
Average Loss
-7.47%
Compounding Annual Return
1.568%
Drawdown
18.700%
Expectancy
0.035
Net Profit
1.576%
Sharpe Ratio
0.149
Probabilistic Sharpe Ratio
15.213%
Loss Rate
20%
Win Rate
80%
Profit-Loss Ratio
0.29
Alpha
0.013
Beta
0.655
Annual Standard Deviation
0.159
Annual Variance
0.025
Information Ratio
0.05
Tracking Error
0.135
Treynor Ratio
0.036
Total Fees
$24.75
Estimated Strategy Capacity
$28000000.00
Lowest Capacity Asset
AAPL R735QTJ8XC9X
# DollarVolume-EMAC universe
from AlgorithmImports import *

# ------------------------------------------
N_DV = 6; FAST = 50; SLOW = 200; LEV = 1.00; 
# ------------------------------------------
class DollarVolumeEmacUniverse(QCAlgorithm):
    
    def Initialize(self):
        self.SetStartDate(2021, 6, 1)
        self.SetEndDate(2022, 6, 2)
        self.SetCash(100000)
        self.UniverseSettings.Resolution = Resolution.Minute
        self.AddUniverse(self.CoarseSelectionFunction)       
        self.assets = []        
        self.ema_f = {}
        self.ema_s = {}
        self.universeMonth = -1
        self.SetWarmUp(SLOW, Resolution.Daily)
    
    
    def CoarseSelectionFunction(self, universe):
        if self.Time.month == self.universeMonth:
            return self.assets
        stocks = [x for x in universe if (x.HasFundamentalData)]
        price_above_10 =  [x for x in stocks if (x.Price > 10)]
        dollar_volume = sorted(price_above_10, key = lambda c: c.DollarVolume, reverse=True)
        self.dollar_volume_top = [c.Symbol for c in dollar_volume[:N_DV]]        
        self.assets = self.dollar_volume_top
                
        return self.assets

       
    def OnSecuritiesChanged(self, changes):  
        for x in changes.RemovedSecurities:
            if x.Symbol in self.assets:
                del self.assets[x.Symbol]               

        for symbol in self.assets:
            self.ema_f[symbol] = self.EMA(symbol, FAST, Resolution.Daily)
            self.ema_s[symbol] = self.EMA(symbol, SLOW, Resolution.Daily)
     
    def OnData(self, data):  
        if self.IsWarmingUp: return
        if self.Time.month == self.universeMonth: return
        if not (self.Time.hour == 10 and self.Time.minute == 1): return

        self.selectedSymbols = []        
        
        for symbol in self.assets:
            if self.ema_f[symbol].Current.Value > self.ema_s[symbol].Current.Value:
                self.selectedSymbols.append(symbol)       

        for symbol in self.Portfolio.Keys:
            if symbol not in self.selectedSymbols:
                self.Liquidate(symbol)
                    
        for symbol in self.selectedSymbols:          
            wt = LEV/len(self.selectedSymbols) if len(self.selectedSymbols) > 0 else 0
            self.SetHoldings(symbol, wt)         

        self.universeMonth = self.Time.month