Overall Statistics
Total Trades
161
Average Win
3.56%
Average Loss
-1.80%
Compounding Annual Return
4.455%
Drawdown
44.500%
Expectancy
0.505
Net Profit
94.999%
Sharpe Ratio
0.349
Probabilistic Sharpe Ratio
0.263%
Loss Rate
49%
Win Rate
51%
Profit-Loss Ratio
1.98
Alpha
0.051
Beta
-0.074
Annual Standard Deviation
0.129
Annual Variance
0.017
Information Ratio
-0.151
Tracking Error
0.228
Treynor Ratio
-0.608
Total Fees
$1369.20
class UncoupledOptimizedRadiator(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2005, 1, 1)
        self.SetCash(100000)
        
        self.UniverseSettings.Resolution = Resolution.Daily
        symbols = [ Symbol.Create("VB", 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
    
    
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("VB", 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