Overall Statistics
Total Trades
130
Average Win
0.03%
Average Loss
-0.72%
Compounding Annual Return
-38.596%
Drawdown
6.900%
Expectancy
-0.211
Net Profit
-2.853%
Sharpe Ratio
3.382
Probabilistic Sharpe Ratio
61.375%
Loss Rate
25%
Win Rate
75%
Profit-Loss Ratio
0.05
Alpha
1.059
Beta
0.826
Annual Standard Deviation
0.328
Annual Variance
0.108
Information Ratio
3.282
Tracking Error
0.319
Treynor Ratio
1.344
Total Fees
$131.64
from datetime import timedelta
class helloWorldModel(AlphaModel): 
    
    #yahoo finance (daily data)
    #    algoseek
    
    def __init__(self):
        self.mom = []

    def OnSecuritiesChanged(self, algorithm, changes):
        for security in changes.AddedSecurities:
            symbol = security.Symbol
            kama_val=algorithm.KAMA(symbol, 10,2,30, Resolution.Hour)
            mom_val=algorithm.MOM(symbol, 14, Resolution.Hour)
            self.mom.append({"symbol":symbol, "mom":mom_val, "kama":kama_val})
 
    def Update(self, algorithm, data):
        grp=[]
        x = 0
        

        while x < len(self.mom):
            symbol=str(self.mom[x]['symbol'])
            mom=self.mom[x]['mom'].Current.Value
            kama=self.mom[x]['kama'].Current.Value
            price= algorithm.Securities[symbol].Price # Latest known price; we are at 12:00 and the last trade at 10.57
            if symbol in data.Bars.Keys:
                bar = data.Bars[symbol]
            
            vinsightDirection = InsightDirection.Flat
            signal="hold"
            if mom >0 and price>kama:
                vinsightDirection = InsightDirection.Up
                signal="buy"
            if mom < 0 or price<kama:
                vinsightDirection = InsightDirection.Down
                signal="sell"
            algorithm.Log(f"{symbol} MOM {mom}")
            #timedelta(1) insight stays for 1 day; 
            grp.append(Insight(symbol, timedelta(hours=1), InsightType.Price, vinsightDirection, 1,None, "helloWorldModel",None))
            x += 1
            
        return grp

class FrameworkAlgorithm(QCAlgorithm):
    
    def Initialize(self):
        self.SetStartDate(2020, 12, 1)   
        self.SetCash(100000)           
        tickers=["MSFT","MRNA","MELI"]
        symbols = [Symbol.Create(x, SecurityType.Equity, Market.USA) for x in tickers]
        # FTSE
        # DAX 
        frequency = Resolution.Hour  #10-11, etc Daily data is midnight to mifnight, 12AM EST 
        # Set Benchmark
        self.SetBenchmark("SPY")
        self.UniverseSettings.Resolution = frequency
        self.SetWarmUp(timedelta(28)) # Warm up 28 days of data.
        self.SetUniverseSelection(ManualUniverseSelectionModel(symbols))
        self.SetAlpha(helloWorldModel())
        #self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
        self.SetPortfolioConstruction(MeanVarianceOptimizationPortfolioConstructionModel(Resolution.Hour,PortfolioBias.LongShort,1,63,Resolution.Hour,0.02,MaximumSharpeRatioPortfolioOptimizer(0,1,0)))
        self.SetRiskManagement(MaximumDrawdownPercentPerSecurity(0.02)) # drop in profit from the max 
        self.SetExecution(ImmediateExecutionModel())