{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "dotnet_interactive": { "language": "csharp" }, "vscode": { "languageId": "dotnet-interactive.csharp" } }, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#r \"nuget:YahooFinanceApi;\" \n", "#r \"nuget:QuanTAlib;\" \n", "using YahooFinanceApi;\n", "using QuanTAlib;\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "dotnet_interactive": { "language": "csharp" }, "vscode": { "languageId": "dotnet-interactive.csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Date\t\t Value\t SMA\t MAD\t STDDEV\t MSE\t MAPE\n", " 2022-03-14\t 150.62\t 150.62\t 0.00\t 0.00\t 0.00\t 0.00\t\n", "2022-03-15\t 155.09\t 152.85\t 2.24\t 3.16\t 5.00\t 0.01\t\n", "2022-03-16\t 159.59\t 155.10\t 2.99\t 4.49\t 13.41\t 0.02\t\n", "2022-03-17\t 160.62\t 156.48\t 3.62\t 4.59\t 15.77\t 0.02\t\n", "2022-03-18\t 163.98\t 157.98\t 4.10\t 5.20\t 21.62\t 0.03\t\n", "2022-03-21\t 165.38\t 160.93\t 3.00\t 4.03\t 13.02\t 0.02\t\n", "2022-03-22\t 168.82\t 163.68\t 2.86\t 3.72\t 11.10\t 0.02\t\n", "2022-03-23\t 170.21\t 165.80\t 2.97\t 3.84\t 11.78\t 0.02\t\n", "2022-03-24\t 174.07\t 168.49\t 3.05\t 4.01\t 12.84\t 0.02\t\n", "2022-03-25\t 174.72\t 170.64\t 3.00\t 3.86\t 11.92\t 0.02\t\n", "2022-03-28\t 175.60\t 172.68\t 2.54\t 2.98\t 7.12\t 0.01\t\n", "2022-03-29\t 178.96\t 174.71\t 2.06\t 3.14\t 7.90\t 0.01\t\n", "2022-03-30\t 177.77\t 176.22\t 1.71\t 2.07\t 3.43\t 0.01\t\n", "2022-03-31\t 174.61\t 176.33\t 1.63\t 1.94\t 3.01\t 0.01\t\n" ] } ], "source": [ "TSeries data = new();\n", "var history = await Yahoo.GetHistoricalAsync(\"AAPL\", DateTime.Today.AddDays(-19), DateTime.Now, Period.Daily);\n", "SMA_Series sma = new(data, 5, false);\n", "SUB_Series sub = new(sma.STDDEV,sma.MAD);\n", "Console.Write($\"Date\\t\\t Value\\t SMA\\t MAD\\t STDDEV\\t MSE\\t MAPE\\n \");\n", "foreach (var i in history) {\n", " data.Add((i.DateTime, (double)i.Close));\n", " 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\");\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "dotnet_interactive": { "language": "csharp" }, "vscode": { "languageId": "dotnet-interactive.csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "date\t\t Value\t SMA\t WMA\t EMA\t HMA\t DEMA\t TEMA \tZLEMA \tJMA\r\n", "2022-03-21\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\n", "2022-03-22\t 168.82\t 167.10\t 167.67\t 166.53\t 166.91\t 167.29\t 167.80\t 167.67\t 168.29\n", "2022-03-23\t 170.21\t 168.14\t 168.94\t 167.75\t 168.52\t 169.08\t 169.80\t 170.13\t 170.00\n", "2022-03-24\t 174.07\t 169.62\t 170.99\t 169.86\t 171.53\t 172.15\t 173.27\t 173.19\t 173.30\n", "2022-03-25\t 174.72\t 170.64\t 172.24\t 171.48\t 174.45\t 174.09\t 175.04\t 175.21\t 174.42\n", "2022-03-28\t 175.60\t 172.68\t 173.89\t 172.85\t 175.90\t 175.51\t 176.18\t 175.85\t 175.23\n", "2022-03-29\t 178.96\t 174.71\t 175.98\t 174.89\t 177.60\t 178.01\t 178.78\t 178.30\t 177.49\n", "2022-03-30\t 177.77\t 176.22\t 177.00\t 175.85\t 178.50\t 178.57\t 178.81\t 178.85\t 177.95\n", "2022-03-31\t 174.61\t 176.33\t 176.46\t 175.44\t 177.08\t 176.98\t 176.35\t 175.98\t 176.09\n" ] } ], "source": [ "TSeries data = new();\n", "var history = await Yahoo.GetHistoricalAsync(\"AAPL\", DateTime.Today.AddDays(-10), DateTime.Now, Period.Daily);\n", "SMA_Series sma = new(data, 5);\n", "WMA_Series wma = new(data, 5);\n", "EMA_Series ema = new(data, 5);\n", "HMA_Series hma = new(data, 5);\n", "DEMA_Series dema = new(data, 5);\n", "TEMA_Series tema = new(data, 5);\n", "ZLEMA_Series zlema = new(data, 5);\n", "JMA_Series jma = new(data, 5);\n", "\n", "Console.WriteLine($\"date\\t\\t Value\\t SMA\\t WMA\\t EMA\\t HMA\\t DEMA\\t TEMA \\tZLEMA \\tJMA\");\n", "foreach (var i in history) {\n", " data.Add((i.DateTime, (double)i.Close)); // adding data will signal dependant indicators\n", "\n", " 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\");\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "dotnet_interactive": { "language": "csharp" }, "vscode": { "languageId": "dotnet-interactive.csharp" } }, "outputs": [ { "data": { "text/html": [ "
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
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ADD_Series two = new(zlema, jma); // even when indicator is created later, it will grab the data from its source table\n", "DIV_Series mean = new(two, 2); // this pair here calculates mean of ZLEMA and JMA indicators\n", "\n", "mean" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "dotnet_interactive": { "language": "csharp" }, "vscode": { "languageId": "dotnet-interactive.csharp" } }, "outputs": [], "source": [ "public class ALMA_Series : TSeries\n", "{\n", " private readonly int _p;\n", " private readonly bool _NaN;\n", " private readonly TSeries _data;\n", " private readonly double _offset, _sigma;\n", " private double _norm;\n", " private readonly System.Collections.Generic.List _buffer = new();\n", " private readonly System.Collections.Generic.List _weights = new();\n", "\n", " public ALMA_Series(TSeries source, int period, double offset = 0.85, double sigma = 6.0, bool useNaN = false)\n", " {\n", " this._p = period;\n", " this._data = source;\n", " this._NaN = useNaN;\n", " _offset = offset;\n", " _sigma = sigma;\n", "\n", " double _m = _offset * (_p - 1);\n", " double _s = _p / _sigma;\n", "\n", " _norm = 0;\n", " for (int i = 0; i < this._p; i++)\n", " {\n", " double wt = Math.Exp(-((i - _m) * (i - _m)) / (2 * _s * _s));\n", " this._weights.Add(wt);\n", " _norm += wt;\n", " }\n", "\n", " source.Pub += this.Sub;\n", " if (source.Count > 0)\n", " {\n", " for (int i = 0; i < source.Count; i++)\n", " {\n", " this.Add(source[i], false);\n", " }\n", " }\n", "\n", " }\n", " public new void Add((System.DateTime t, double v) data, bool update = false)\n", " {\n", " if (update) { this._buffer[this._buffer.Count - 1] = data.v; } else { this._buffer.Add(data.v); }\n", " if (this._buffer.Count > this._p) { this._buffer.RemoveAt(0); }\n", "\n", " double _wma = 0;\n", " for (int i = 0; i < this._buffer.Count; i++) { _wma += this._buffer[i] * this._weights[i]; }\n", " if (this._buffer.Count < this._p) {\n", " _norm = 0;\n", " for (int i = 0; i < this._buffer.Count; i++) { _norm += this._weights[i];}\n", " }\n", " _wma /= _norm;\n", "\n", " (System.DateTime t, double v) result = (data.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _wma);\n", " if (update) { base[base.Count - 1] = result; } else { base.Add(result); }\n", " }\n", " public void Add(bool update = false)\n", " {\n", " this.Add(this._data[this._data.Count - 1], update);\n", " }\n", " public new void Sub(object source, TSeriesEventArgs e) { this.Add(this._data[this._data.Count - 1], e.update); }\n", "\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "dotnet_interactive": { "language": "csharp" }, "vscode": { "languageId": "dotnet-interactive.csharp" } }, "outputs": [], "source": [ "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 };\n", "ALMA_Series alma = new(data, period: 10, offset: 0.0, sigma: 6.0, useNaN: true);\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "dotnet_interactive": { "language": "csharp" }, "vscode": { "languageId": "dotnet-interactive.csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2022-03-31\t 212.80\t NaN\t \n", "2022-03-31\t 214.06\t NaN\t \n", "2022-03-31\t 213.89\t NaN\t \n", "2022-03-31\t 214.66\t NaN\t \n", "2022-03-31\t 213.95\t NaN\t \n", "2022-03-31\t 213.95\t NaN\t \n", "2022-03-31\t 214.55\t NaN\t \n", "2022-03-31\t 214.02\t NaN\t \n", "2022-03-31\t 214.51\t NaN\t \n", "2022-03-31\t 213.75\t 213.58\t \n", "2022-03-31\t 214.22\t 214.11\t \n", "2022-03-31\t 213.43\t 214.17\t \n" ] } ], "source": [ "for (int i=0; i