Indicators

Data Point Indicators

Introduction

This page explains how to create, update and visualize LEAN data-point indicators.

Prerequisites

Working knowledge of C#.

If you use Python, you must understand how to work with pandas DataFrames and Series. If you are not familiar with pandas, refer to the pandas documentation.

Get Historical Data

Get some historical market data to warm-up and create a historical record of indicator values. For example, to get data for SPY, run:

var qb = new QuantBook();
var symbol = qb.AddEquity("SPY").Symbol;
var history = qb.History(symbol, 70, Resolution.Daily);
qb = QuantBook()
symbol = qb.AddEquity("SPY").Symbol
history = qb.History(symbol, 70, Resolution.Daily).loc[symbol]

Create Indicator Timeseries

Follow these steps to create an indicator timeseries:

  1. Create an data-point indicator. In this tutorial, use a 20-period 2-standard-deviation BollingerBands indicator.
  2. var bb = new BollingerBands(20, 2);
    bb = BollingerBands(20, 2)
  3. Create a RollingWindow for each attribute of the indicator to hold their values.
  4. In this example, save 50 data points.

    var time = new RollingWindow<DateTime>(50);
    var window = new Dictionary<string, RollingWindow<decimal>>();
    window["bollingerbands"] = new RollingWindow<decimal>(50);
    window["lowerband"] = new RollingWindow<decimal>(50);
    window["middleband"] = new RollingWindow<decimal>(50);
    window["upperband"] = new RollingWindow<decimal>(50);
    window["bandwidth"] = new RollingWindow<decimal>(50);
    window["percentb"] = new RollingWindow<decimal>(50);
    window["standarddeviation"] = new RollingWindow<decimal>(50);
    window["price"] = new RollingWindow<decimal>(50);
    
    window = {}
    window['time'] = RollingWindow[DateTime](50)
    window["bollingerbands"] = RollingWindow[float](50)
    window["lowerband"] = RollingWindow[float](50)
    window["middleband"] = RollingWindow[float](50)
    window["upperband"] = RollingWindow[float](50)
    window["bandwidth"] = RollingWindow[float](50)
    window["percentb"] = RollingWindow[float](50)
    window["standarddeviation"] = RollingWindow[float](50)
    window["price"] = RollingWindow[float](50)
    
  5. Set handler methods to update the RollingWindows.
  6. bb.Updated += (sender, updated) => 
    {
        var indicator = (BollingerBands)sender;
        time.Add(updated.EndTime);
        window["bollingerbands"].Add(updated);
        window["lowerband"].Add(indicator.LowerBand);
        window["middleband"].Add(indicator.MiddleBand);
        window["upperband"].Add(indicator.UpperBand);
        window["bandwidth"].Add(indicator.BandWidth);
        window["percentb"].Add(indicator.PercentB);
        window["standarddeviation"].Add(indicator.StandardDeviation);
        window["price"].Add(indicator.Price);
    };
    def UpdateBollingerBandWindow(sender: object, updated: IndicatorDataPoint) -> None:
        indicator = sender
        window['time'].Add(updated.EndTime)
        window["bollingerbands"].Add(updated.Value)
        window["lowerband"].Add(indicator.LowerBand.Current.Value)
        window["middleband"].Add(indicator.MiddleBand.Current.Value)
        window["upperband"].Add(indicator.UpperBand.Current.Value)
        window["bandwidth"].Add(indicator.BandWidth.Current.Value)
        window["percentb"].Add(indicator.PercentB.Current.Value)
        window["standarddeviation"].Add(indicator.StandardDeviation.Current.Value)
        window["price"].Add(indicator.Price.Current.Value)
    
    bb.Updated += UpdateBollingerBandWindow

    When the indicators receive new data, the handler will add the new IndicatorDataPoints into the RollingWindows.

  7. Iterate the historical market data to update the indicators and the RollingWindows.
  8. foreach(var bar in history)
    {
        bb.Update(bar.EndTime, bar.Close);
    }
    for time, row in history.iterrows():
        bb.Update(time, row.close)
  9. Display the data.
  10. Console.WriteLine($"time,{string.Join(',', window.Select(kvp => kvp.Key))}");
    foreach (var i in Enumerable.Range(0, 5).Reverse())
    {
        var data = string.Join(", ", window.Select(kvp => Math.Round(kvp.Value[i],6)));
        Console.WriteLine($"{time[i]:yyyyMMdd}, {data}");
    }
  11. Convert the RollingWindows' data into pandas.DataFrame.
  12. bb_dataframe = pd.DataFrame(window).set_index('time')

Indicator Helper Method

Call the qb.Indicator method to create an indicator timeseries.

var bbIndicator = qb.Indicator(bb, symbol, 50, Resolution.Daily);
bb_indicator = qb.Indicator(bb, symbol, 50, Resolution.Daily)

Plot Indicators

Jupyter Notebooks don't currently support libraries to plot historical data, but we are working on adding the functionality. Until the functionality is added, use Python to plot historical Equity Options data.

You can call the in-built plot method of pandas.DataFrame to plot the indicators.

  1. Select the columns/features for plotting.
  2. bb_plot = bb_indicator[["upperband", "middleband", "lowerband", "price"]]
  3. Call plot to plot the indicator.
  4. bb_plot.plot(figsize=(15, 10), title="SPY BB(20,2)"))
  5. Show the plots.
  6. plt.show()

You can also see our Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the documentation: