Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-0.889
Tracking Error
0.272
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
import numpy as np

# Percentage Volume Oscillator (PVO)
# ---------------------------------
STOCK = 'SPY'; MA_F= 12; MA_S = 26;
# ---------------------------------
class PercentageVolumeOscillator(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 1, 1)
        self.SetCash(100000)
        self.stock = self.AddEquity(STOCK, Resolution.Daily).Symbol
        
        self.last_timestamp = None
        
        self.window = RollingWindow[float](MA_S)
        volume_history = self.History(self.stock, MA_S, Resolution.Daily).loc[self.stock]['volume']
        for time, volume in volume_history.iteritems():
            self.window.Add(volume)
            self.last_timestamp = time
            
    def OnData(self, data):
        if data.ContainsKey(self.stock) and data[self.stock] is not None and data.Time != self.last_timestamp:
            self.window.Add(data[self.stock].Volume)
            self.last_timestamp = data.Time

    def OnEndOfDay(self, symbol):
        v = np.array(list(self.window)[::-1])
        pvo = float(100*(v[-MA_F:].mean()/v[-MA_S:].mean() - 1))
        
        self.Plot("Indicator", "PVO", pvo)
        self.Plot("Indicator", "Zero", 0)