Overall Statistics
Total Trades
159
Average Win
4.22%
Average Loss
-1.94%
Compounding Annual Return
7.634%
Drawdown
37.900%
Expectancy
0.753
Net Profit
216.202%
Sharpe Ratio
0.548
Probabilistic Sharpe Ratio
1.944%
Loss Rate
45%
Win Rate
55%
Profit-Loss Ratio
2.18
Alpha
0.077
Beta
-0.065
Annual Standard Deviation
0.129
Annual Variance
0.017
Information Ratio
-0.082
Tracking Error
0.228
Treynor Ratio
-1.083
Total Fees
$1714.99
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://raw.githubusercontent.com/shilewenuw/FileHost/master/UNRATE.csv', 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