Overall Statistics
Total Trades
53
Average Win
2.80%
Average Loss
-3.08%
Compounding Annual Return
7.473%
Drawdown
12.200%
Expectancy
0.162
Net Profit
8.883%
Sharpe Ratio
0.643
Loss Rate
39%
Win Rate
61%
Profit-Loss Ratio
0.91
Alpha
0.266
Beta
-9.288
Annual Standard Deviation
0.124
Annual Variance
0.015
Information Ratio
0.481
Tracking Error
0.124
Treynor Ratio
-0.009
Total Fees
$87.94
from clr import AddReference
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Indicators")
AddReference("QuantConnect.Algorithm.Framework")

from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Data.UniverseSelection import *
from QuantConnect.Indicators import *

from datetime import timedelta, datetime

class lowStdAlphaAlgorithm(QCAlgorithmFramework):

    def Initialize(self):
        self.SetStartDate(2018, 1, 1)
        self.SetCash(100000)
    
        # Add SPY to Universe
        self.AddSecurity(SecurityType.Equity,"SPY", Resolution.Daily)

        # Use Manual Universe Selection Model
        self.SetUniverseSelection(ManualUniverseSelectionModel())
        
        # Select the Alpha Model
        self.SetAlpha(lowStdExampleAlphaModel())
        
        # Equally weigh securities
        self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())

class lowStdExampleAlphaModel(AlphaModel):

    def __init__(self):
        # Set length of the insight period
        self.period = timedelta(days=1)
        
        # Set lookback period for STD and SMA
        self.lookback = 10
        
        # Set data resolution
        self.resolution = Resolution.Daily

    def Update(self, algorithm, data):
        insights = []
        if not data.ContainsKey(self.symbol): return insights
        
        # Set magnitude prediction as the average percentage change of price
        magnitude = self.meanOfPriceChange.Current.Value
        
        # Emit an "Up" insight if STD(Price) < SMA(STD(Price)) 
        if self.std.Current.Value < self.stdAvg.Current.Value:
            insights.append(Insight.Price(self.symbol, self.period, InsightDirection.Up,magnitude))

        return insights
    
    # Ignites when securities are added/removed from universe
    def OnSecuritiesChanged(self, algorithm, changes):
        for added in changes.AddedSecurities:
            self.symbol = added.Symbol
            
            # Mean value of returns for magnitude prediction
            self.meanOfPriceChange = IndicatorExtensions.SMA(RateOfChangePercent(1),self.lookback)
            
            # Construct standard deviation of price using STD Indicator for added securities
            self.std = algorithm.STD(added.Symbol, self.lookback,self.resolution)
            # Construct simple moving average (SMA) of the standard deviation of price
            self.stdAvg = IndicatorExtensions.SMA(self.std, self.lookback)