Overall Statistics
Total Trades
4936
Average Win
0.08%
Average Loss
-0.07%
Compounding Annual Return
13.320%
Drawdown
20.200%
Expectancy
0.028
Net Profit
13.320%
Sharpe Ratio
0.532
Loss Rate
50%
Win Rate
50%
Profit-Loss Ratio
1.08
Alpha
0.877
Beta
-43.338
Annual Standard Deviation
0.267
Annual Variance
0.071
Information Ratio
0.468
Tracking Error
0.267
Treynor Ratio
-0.003
Total Fees
$5403.92
import numpy as np

### <summary>
### Basic template algorithm simply initializes the date range and cash. This is a skeleton
### framework you can use for designing an algorithm.
### </summary>
class BasicTemplateAlgorithm(QCAlgorithm):
    '''Basic template algorithm simply initializes the date range and cash'''

    def Initialize(self):
        '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''

        self.SetStartDate(2016,1,01)  #Set Start Date
        self.SetEndDate(2017,1,01)    #Set End Date
        self.SetCash(100000)           #Set Strategy Cash
        self.UniverseSettings.Resolution = Resolution.Daily
        self.AddUniverse(self.CoarseSelectionFunction)
        self._changes = SecurityChanges.None
        self.CoarseSymbols = 200
        self.FineSymbols1  = 150
        self.FineSymbols2  = 100
        self.FineSymbols3  = 50
        self.FineSymbols4  = 20
        
    def CoarseSelectionFunction(self,coarse):
        sortedbyDollarVolume = sorted(coarse, key = lambda x: x.DollarVolume, reverse = True)
        return[x.Symbol for x in sortedbyDollarVolume[:self.CoarseSymbols]]
    
    def FineSelectionFunction(self,fine):
        sortedbyMetric1 = sorted(fine, key = lambda x: x.OperationRatios.ROIC.OneYear, reverse = False)
        sortedbyMetric2 = sorted(sortedbyMetric1[:self.FineSymbols1], key = lambda x: x.ValuationRatios.EVToEBITDA, reverse = True)
        sortedbyMetric3 = sorted(sortedbyMetric2[:self.FineSymbols2], key = lambda x: x.ValuationRatios.BookValuePerShare, reverse = False)
        sortedbyMetric4 = sorted(sortedbyMetric3[:self.FineSymbols3], key = lambda x: x.OperationRatios.ROE.OneYear, reverse = False)
        return[x.Symbol for x in sortedbyMetric4[:self.FineSymbols4]]

    def OnData(self, data):
        
        if self._changes == SecurityChanges.None: return
        
        # liquidate removed securities
        for security in self._changes.RemovedSecurities:
            if security.Invested:
                self.Liquidate(security.Symbol)

        # we want equal allocation in each security in our universe
        # 1 / 20 = 0.05 so use 0.045 to prevent insufficient funds
        for security in self._changes.AddedSecurities:
            self.SetHoldings(security.Symbol, 0.045)

        self._changes = SecurityChanges.None;

    # this event fires whenever we have changes to our universe
    def OnSecuritiesChanged(self, changes):
        self._changes = changes