Overall Statistics
Total Orders
584
Average Win
0.16%
Average Loss
-0.07%
Compounding Annual Return
27.260%
Drawdown
3.100%
Expectancy
0.491
Start Equity
1000000
End Equity
1128436.18
Net Profit
12.844%
Sharpe Ratio
1.261
Sortino Ratio
6.251
Probabilistic Sharpe Ratio
63.156%
Loss Rate
55%
Win Rate
45%
Profit-Loss Ratio
2.34
Alpha
0.17
Beta
0.257
Annual Standard Deviation
0.146
Annual Variance
0.021
Information Ratio
0.744
Tracking Error
0.173
Treynor Ratio
0.716
Total Fees
$6050.86
Estimated Strategy Capacity
$1700000.00
Lowest Capacity Asset
NSPH TXA0MGR7LUG5
Portfolio Turnover
3.24%
from AlgorithmImports import *

class fixed_it(QCAlgorithm):

    def Initialize(self):

        self.set_start_date(2016, 1, 1)
        self.set_end_date(2016, 7, 1)
        self.set_cash(1000000)

        self.symbols = {}

        # Build universe
        self.universe_settings.resolution = Resolution.MINUTE
        self.add_universe(self.CoarseFilter)

        # Set a warm-up period to ensure indicators are ready
        self.set_warmup(200, Resolution.MINUTE)
        
    def CoarseFilter(self, universe):

        topVolume = []

        # Filter universe
        universe = [asset for asset in universe if asset.HasFundamentalData 
                                                    and asset.volume > 1000000
                                                    and asset.price <= 10 
                                                    and asset.MarketCap <= 1e6]

        # Sort universe by highest volume
        topVolume = sorted(universe, key=lambda asset: asset.volume, reverse=True)[:10]

        # Get symbol objects
        top_symbols = [x.symbol for x in topVolume]
                
        return top_symbols
    
    # Changes to the universe get passed into this function
    def OnSecuritiesChanged(self, changes):
        self.changes = changes
        
        # Sell
        for security in self.changes.RemovedSecurities:
            if security.Invested:
                self.liquidate(security.symbol)
                        
    def OnData(self, data):

        if self.IsWarmingUp:
            return

        for security in self.changes.AddedSecurities:
            symbol = security.symbol

            # Ensure slice contains data for symbol
            if data.ContainsKey(symbol) and data[symbol] is not None and data[symbol].Close is not None:
                # Ensure price exists and is non-zero
                if self.Securities[symbol].Price is not None and self.Securities[symbol].Price > 0:
                    # Ensure we are ready to trade
                    if not security.Invested and security.is_tradable:
                        # Buy
                        self.SetHoldings(symbol, 0.01)