Files
QuanTAlib/Docs/QuantLib_test.ipynb
T
2022-04-19 15:46:34 -07:00

11 KiB

In [ ]:
#r "nuget:YahooFinanceApi;" 
#r "nuget:QuanTAlib;" 
using YahooFinanceApi;
using QuanTAlib;
In [ ]:
TSeries data = new();
var history = await Yahoo.GetHistoricalAsync("AAPL", DateTime.Today.AddDays(-19), DateTime.Now, Period.Daily);
SMA_Series sma = new(data, 5, false);
SUB_Series sub = new(sma.STDDEV,sma.MAD);
Console.Write($"Date\t\t Value\t SMA\t MAD\t STDDEV\t MSE\t MAPE\n ");
foreach (var i in history) {
    data.Add((i.DateTime,  (double)i.Close));
    Console.Write($"{data[^1].t:yyyy-MM-dd}\t {(double)data:f2}\t {(double)sma:f2}\t {(double)sma.MAD:f2}\t {(double)sma.STDDEV:f2}\t {(double)sma.MSE:f2}\t {(double)sma.MAPE:f2}\t\n");
}
Date		 Value	 SMA	 MAD	 STDDEV	 MSE	 MAPE
 2022-03-14	 150.62	 150.62	 0.00	 0.00	 0.00	 0.00	
2022-03-15	 155.09	 152.85	 2.24	 3.16	 5.00	 0.01	
2022-03-16	 159.59	 155.10	 2.99	 4.49	 13.41	 0.02	
2022-03-17	 160.62	 156.48	 3.62	 4.59	 15.77	 0.02	
2022-03-18	 163.98	 157.98	 4.10	 5.20	 21.62	 0.03	
2022-03-21	 165.38	 160.93	 3.00	 4.03	 13.02	 0.02	
2022-03-22	 168.82	 163.68	 2.86	 3.72	 11.10	 0.02	
2022-03-23	 170.21	 165.80	 2.97	 3.84	 11.78	 0.02	
2022-03-24	 174.07	 168.49	 3.05	 4.01	 12.84	 0.02	
2022-03-25	 174.72	 170.64	 3.00	 3.86	 11.92	 0.02	
2022-03-28	 175.60	 172.68	 2.54	 2.98	 7.12	 0.01	
2022-03-29	 178.96	 174.71	 2.06	 3.14	 7.90	 0.01	
2022-03-30	 177.77	 176.22	 1.71	 2.07	 3.43	 0.01	
2022-03-31	 174.61	 176.33	 1.63	 1.94	 3.01	 0.01	
In [ ]:
TSeries data = new();
var history = await Yahoo.GetHistoricalAsync("AAPL", DateTime.Today.AddDays(-10), DateTime.Now, Period.Daily);
SMA_Series sma = new(data, 5);
WMA_Series wma = new(data, 5);
EMA_Series ema = new(data, 5);
HMA_Series hma = new(data, 5);
DEMA_Series dema = new(data, 5);
TEMA_Series tema = new(data, 5);
ZLEMA_Series zlema = new(data, 5);
JMA_Series jma = new(data, 5);

Console.WriteLine($"date\t\t Value\t SMA\t WMA\t EMA\t HMA\t DEMA\t TEMA \tZLEMA \tJMA");
foreach (var i in history) {
    data.Add((i.DateTime,  (double)i.Close)); // adding data will signal dependant indicators

    Console.Write($"{data[^1].t:yyyy-MM-dd}\t {(double)data:f2}\t {(double)sma:f2}\t {(double)wma:f2}\t {(double)ema:f2}\t {(double)hma:f2}\t {(double)dema:f2}\t {(double)tema:f2}\t {(double)zlema:f2}\t {(double)jma:f2}\n");
}
date		 Value	 SMA	 WMA	 EMA	 HMA	 DEMA	 TEMA 	ZLEMA 	JMA
2022-03-21	 165.38	 165.38	 165.38	 165.38	 165.38	 165.38	 165.38	 165.38	 165.38
2022-03-22	 168.82	 167.10	 167.67	 166.53	 166.91	 167.29	 167.80	 167.67	 168.29
2022-03-23	 170.21	 168.14	 168.94	 167.75	 168.52	 169.08	 169.80	 170.13	 170.00
2022-03-24	 174.07	 169.62	 170.99	 169.86	 171.53	 172.15	 173.27	 173.19	 173.30
2022-03-25	 174.72	 170.64	 172.24	 171.48	 174.45	 174.09	 175.04	 175.21	 174.42
2022-03-28	 175.60	 172.68	 173.89	 172.85	 175.90	 175.51	 176.18	 175.85	 175.23
2022-03-29	 178.96	 174.71	 175.98	 174.89	 177.60	 178.01	 178.78	 178.30	 177.49
2022-03-30	 177.77	 176.22	 177.00	 175.85	 178.50	 178.57	 178.81	 178.85	 177.95
2022-03-31	 174.61	 176.33	 176.46	 175.44	 177.08	 176.98	 176.35	 175.98	 176.09
In [ ]:
ADD_Series two = new(zlema, jma);   // even when indicator is created later, it will grab the data from its source table
DIV_Series mean = new(two, 2);      // this pair here calculates mean of ZLEMA and JMA indicators

mean
indexItem1Item2
02022-03-21 00:00:00Z
165.380005
12022-03-22 00:00:00Z
167.9823694096766
22022-03-23 00:00:00Z
170.06602047454277
32022-03-24 00:00:00Z
173.24670154378663
42022-03-25 00:00:00Z
174.81344756154755
52022-03-28 00:00:00Z
175.53949324963583
62022-03-29 00:00:00Z
177.89435364830672
72022-03-30 00:00:00Z
178.39609966493987
82022-03-31 00:00:00Z
176.03431272212282
In [ ]:
public class ALMA_Series : TSeries
{
    private readonly int _p;
    private readonly bool _NaN;
    private readonly TSeries _data;
    private readonly double _offset, _sigma;
    private double _norm;
    private readonly System.Collections.Generic.List<double> _buffer = new();
    private readonly System.Collections.Generic.List<double> _weights = new();

    public ALMA_Series(TSeries source, int period, double offset = 0.85, double sigma = 6.0, bool useNaN = false)
    {
        this._p = period;
        this._data = source;
        this._NaN = useNaN;
        _offset = offset;
        _sigma = sigma;

        double _m = _offset * (_p - 1);
        double _s = _p / _sigma;

        _norm = 0;
        for (int i = 0; i < this._p; i++)
        {
            double wt = Math.Exp(-((i - _m) * (i - _m)) / (2 * _s * _s));
            this._weights.Add(wt);
            _norm += wt;
        }

        source.Pub += this.Sub;
        if (source.Count > 0)
        {
            for (int i = 0; i < source.Count; i++)
            {
                this.Add(source[i], false);
            }
        }

    }
    public new void Add((System.DateTime t, double v) data, bool update = false)
    {
        if (update) { this._buffer[this._buffer.Count - 1] = data.v; } else { this._buffer.Add(data.v); }
        if (this._buffer.Count > this._p) { this._buffer.RemoveAt(0); }

        double _wma = 0;
        for (int i = 0; i < this._buffer.Count; i++) { _wma += this._buffer[i] * this._weights[i]; }
        if (this._buffer.Count < this._p) {
            _norm = 0;
            for (int i = 0; i < this._buffer.Count; i++) { _norm += this._weights[i];}
        }
        _wma /= _norm;

        (System.DateTime t, double v) result = (data.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _wma);
        if (update) { base[base.Count - 1] = result; } else { base.Add(result); }
    }
    public void Add(bool update = false)
    {
        this.Add(this._data[this._data.Count - 1], update);
    }
    public new void Sub(object source, TSeriesEventArgs e) { this.Add(this._data[this._data.Count - 1], e.update); }

}
In [ ]:
TSeries data = new() {212.80, 214.06, 213.89, 214.66, 213.95, 213.95, 214.55, 214.02, 214.51, 213.75, 214.22, 213.43 };
ALMA_Series alma = new(data, period: 10, offset: 0.0, sigma: 6.0, useNaN: true);
In [ ]:
for (int i=0; i<data.Length; i++) {
    Console.Write($"{data[i].t:yyyy-MM-dd}\t {(double)data[i].v:f2}\t {alma[i].v:f2}\t \n");
}
2022-03-31	 212.80	 NaN	 
2022-03-31	 214.06	 NaN	 
2022-03-31	 213.89	 NaN	 
2022-03-31	 214.66	 NaN	 
2022-03-31	 213.95	 NaN	 
2022-03-31	 213.95	 NaN	 
2022-03-31	 214.55	 NaN	 
2022-03-31	 214.02	 NaN	 
2022-03-31	 214.51	 NaN	 
2022-03-31	 213.75	 213.58	 
2022-03-31	 214.22	 214.11	 
2022-03-31	 213.43	 214.17