mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-07-29 10:07:43 +00:00
306 lines
11 KiB
Plaintext
306 lines
11 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"dotnet_interactive": {
|
|
"language": "csharp"
|
|
},
|
|
"vscode": {
|
|
"languageId": "dotnet-interactive.csharp"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div><div></div><div></div><div></div></div>"
|
|
]
|
|
},
|
|
"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": [
|
|
"<table><thead><tr><th><i>index</i></th><th>Item1</th><th>Item2</th></tr></thead><tbody><tr><td>0</td><td><span>2022-03-21 00:00:00Z</span></td><td><div class=\"dni-plaintext\">165.380005</div></td></tr><tr><td>1</td><td><span>2022-03-22 00:00:00Z</span></td><td><div class=\"dni-plaintext\">167.9823694096766</div></td></tr><tr><td>2</td><td><span>2022-03-23 00:00:00Z</span></td><td><div class=\"dni-plaintext\">170.06602047454277</div></td></tr><tr><td>3</td><td><span>2022-03-24 00:00:00Z</span></td><td><div class=\"dni-plaintext\">173.24670154378663</div></td></tr><tr><td>4</td><td><span>2022-03-25 00:00:00Z</span></td><td><div class=\"dni-plaintext\">174.81344756154755</div></td></tr><tr><td>5</td><td><span>2022-03-28 00:00:00Z</span></td><td><div class=\"dni-plaintext\">175.53949324963583</div></td></tr><tr><td>6</td><td><span>2022-03-29 00:00:00Z</span></td><td><div class=\"dni-plaintext\">177.89435364830672</div></td></tr><tr><td>7</td><td><span>2022-03-30 00:00:00Z</span></td><td><div class=\"dni-plaintext\">178.39609966493987</div></td></tr><tr><td>8</td><td><span>2022-03-31 00:00:00Z</span></td><td><div class=\"dni-plaintext\">176.03431272212282</div></td></tr></tbody></table>"
|
|
]
|
|
},
|
|
"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<double> _buffer = new();\n",
|
|
" private readonly System.Collections.Generic.List<double> _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<data.Length; i++) {\n",
|
|
" Console.Write($\"{data[i].t:yyyy-MM-dd}\\t {(double)data[i].v:f2}\\t {alma[i].v:f2}\\t \\n\");\n",
|
|
"}"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": ".NET (C#)",
|
|
"language": "C#",
|
|
"name": ".net-csharp"
|
|
},
|
|
"language_info": {
|
|
"file_extension": ".cs",
|
|
"mimetype": "text/x-csharp",
|
|
"name": "C#",
|
|
"pygments_lexer": "csharp",
|
|
"version": "9.0"
|
|
},
|
|
"orig_nbformat": 4
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|