mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-13 16:18:05 +00:00
11 KiB
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| index | Item1 | Item2 |
|---|---|---|
| 0 | 2022-03-21 00:00:00Z | 165.380005 |
| 1 | 2022-03-22 00:00:00Z | 167.9823694096766 |
| 2 | 2022-03-23 00:00:00Z | 170.06602047454277 |
| 3 | 2022-03-24 00:00:00Z | 173.24670154378663 |
| 4 | 2022-03-25 00:00:00Z | 174.81344756154755 |
| 5 | 2022-03-28 00:00:00Z | 175.53949324963583 |
| 6 | 2022-03-29 00:00:00Z | 177.89435364830672 |
| 7 | 2022-03-30 00:00:00Z | 178.39609966493987 |
| 8 | 2022-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