Overall Statistics
Total Trades
157
Average Win
4.32%
Average Loss
-1.94%
Compounding Annual Return
6.783%
Drawdown
37.900%
Expectancy
0.763
Net Profit
179.207%
Sharpe Ratio
0.501
Probabilistic Sharpe Ratio
1.191%
Loss Rate
45%
Win Rate
55%
Profit-Loss Ratio
2.23
Alpha
0.07
Beta
-0.066
Annual Standard Deviation
0.127
Annual Variance
0.016
Information Ratio
-0.112
Tracking Error
0.227
Treynor Ratio
-0.967
Total Fees
$1706.51
class TransdimensionalHorizontalAtmosphericScrubbers(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2005, 1, 1)  
        self.SetCash(100000)  
        
        
        self.UniverseSettings.Resolution = Resolution.Daily
        symbols = [Symbol.Create("MCD", SecurityType.Equity, Market.USA)]
        self.AddUniverseSelection(ManualUniverseSelectionModel(symbols))
        
        self.AddAlpha(UnemploymentRateAlpha(self))
        
        self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
        self.SetExecution(ImmediateExecutionModel())
        self.AddRiskManagement(NullRiskManagementModel())
    

    def OnData(self, data):
       pass
   
# Algorithm framework model that produces insightsa
class UnemploymentRateAlpha:
    
    def __init__(self, algorithm):
        self.rate = algorithm.AddData(UNRATE, "UNRATE", Resolution.Daily, None, False, 1).Symbol 
        unemployment_history = algorithm.History([self.rate], timedelta(35))
        unemployment_numbers = unemployment_history.loc[self.rate].value.dropna() 
        self.lastRate = unemployment_numbers.values[0]

    def Update(self, algorithm, slice):
        insights = []
        
        if not slice.ContainsKey(self.rate):
            return []
        
        if slice[self.rate].Value < self.lastRate:
            insights.append( Insight.Price("MCD", timedelta(days=22), InsightDirection.Up) )
        
        self.lastRate = slice[self.rate].Value
        
        return insights

    def OnSecuritiesChanged(self, algorithm, changes):
        pass
    
class UNRATE(PythonData):
    def GetSource(self, config, date, isLiveMode):
        return SubscriptionDataSource("https://www.dropbox.com/s/u0qz2t5oavxb2ud/UNRATE.csv?dl=1", SubscriptionTransportMedium.RemoteFile)

    def Reader(self, config, line, date, isLiveMode):
        if not (line.strip() and line[0].isdigit()): return None
        rate = UNRATE()
        rate.Symbol = config.Symbol 
        data = line.split(',')
        rate.Time = datetime.strptime(data[0], "%Y-%m-%d") + timedelta(days=31)
        rate.Value = data[1]
        return rate