Overall Statistics
Total Trades
133
Average Win
0.03%
Average Loss
-0.01%
Compounding Annual Return
0.486%
Drawdown
2.400%
Expectancy
0.969
Net Profit
0.622%
Sharpe Ratio
0.202
Probabilistic Sharpe Ratio
13.932%
Loss Rate
47%
Win Rate
53%
Profit-Loss Ratio
2.71
Alpha
-0.01
Beta
0.121
Annual Standard Deviation
0.017
Annual Variance
0
Information Ratio
-0.947
Tracking Error
0.11
Treynor Ratio
0.029
Total Fees
$133.00
Estimated Strategy Capacity
$640000000.00
Lowest Capacity Asset
QQQ RIWIV7K5Z9LX
Portfolio Turnover
0.12%
#region imports
from AlgorithmImports import *
#endregion

class VWAPwithSTD(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2021, 1, 1)
        self.SetEndDate(2022, 4, 12)
        self.SetCash(100_000)
        self.symbols = ["QQQ", "SPY", "AAPL", "AMZN"] # list of symbols to trade
        self.vwaps = {}
        self.stds = {}
        for symbol in self.symbols:
            equity = self.AddEquity(symbol, Resolution.Minute)
            self.vwaps[symbol] = self.VWAP(equity.Symbol, 14, Resolution.Daily)
            self.stds[symbol] = self.STD(equity.Symbol, 14, Resolution.Daily)
        self.SetWarmUp(30, Resolution.Daily)

    def OnData(self, data):
        if self.IsWarmingUp or not all(std.IsReady for std in self.stds.values()):
            return

        for symbol in self.symbols:
            price = self.Securities[symbol].Price
            vwap = self.vwaps[symbol].Current.Value
            std = self.stds[symbol].Current.Value
            ub1 = vwap + std 
            ub2 = vwap + 2*std
            lb1 = vwap - std 
            lb2 = vwap - 2*std 

            self.Plot(symbol, 'price', price)
            self.Plot(symbol, 'vwap', vwap)
            self.Plot(symbol, 'ub2', ub2)
            self.Plot(symbol, 'ub1', ub1)
            self.Plot(symbol, 'lb1', lb1)
            self.Plot(symbol, 'lb2', lb2)

            # implement trading logic for each stock here
            # e.g., if price < lb2: buy the stock
            #       if price > ub2: sell the stock
            #       otherwise, hold the stock

            if symbol == "QQQ" and price < lb2:
                self.SetHoldings(symbol, .1, False, "Buy Signal")