├── preprocess
├── __init__.py
├── ScreenshotWiese_et_al.png
├── info.txt
├── acf.py
└── gaussianize.py
├── TCN.code-workspace
├── trained_generator_ShanghaiSE_daily.zip
├── trained
├── trained_generator_ShanghaiSE_daily.zip
└── trained_generator_SP500_daily_epoch_99.pth
├── trained_generator_ShanghaiSE_daily
├── fingerprint.pb
├── saved_model.pb
├── keras_metadata.pb
└── variables
│ ├── variables.index
│ └── variables.data-00000-of-00001
├── requirements.txt
├── model
├── info.txt
├── tf_tcn.py
├── torch_tcn.py
└── tf_gan.py
├── README.md
├── .gitignore
├── data
├── SP500andShanghaiSE.ipynb
├── ShanghaiSE_daily.csv
├── SP500andShanghaiSE.csv
└── SP500_daily.csv
├── torch_model.ipynb
└── tf_model.ipynb
/preprocess/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TCN.code-workspace:
--------------------------------------------------------------------------------
1 | {
2 | "folders": [
3 | {
4 | "path": "."
5 | }
6 | ],
7 | "settings": {}
8 | }
--------------------------------------------------------------------------------
/preprocess/ScreenshotWiese_et_al.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/preprocess/ScreenshotWiese_et_al.png
--------------------------------------------------------------------------------
/trained_generator_ShanghaiSE_daily.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained_generator_ShanghaiSE_daily.zip
--------------------------------------------------------------------------------
/trained/trained_generator_ShanghaiSE_daily.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained/trained_generator_ShanghaiSE_daily.zip
--------------------------------------------------------------------------------
/trained_generator_ShanghaiSE_daily/fingerprint.pb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained_generator_ShanghaiSE_daily/fingerprint.pb
--------------------------------------------------------------------------------
/trained_generator_ShanghaiSE_daily/saved_model.pb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained_generator_ShanghaiSE_daily/saved_model.pb
--------------------------------------------------------------------------------
/trained/trained_generator_SP500_daily_epoch_99.pth:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained/trained_generator_SP500_daily_epoch_99.pth
--------------------------------------------------------------------------------
/trained_generator_ShanghaiSE_daily/keras_metadata.pb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained_generator_ShanghaiSE_daily/keras_metadata.pb
--------------------------------------------------------------------------------
/trained_generator_ShanghaiSE_daily/variables/variables.index:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained_generator_ShanghaiSE_daily/variables/variables.index
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | pandas
2 | numpy
3 | matplotlib
4 | tensorflow-addons # TF Model
5 | torch # for Torch Model
6 | jupyter
7 | preprocess
8 | tensorflow
9 | sklearn
10 | google.collab
11 |
12 |
--------------------------------------------------------------------------------
/trained_generator_ShanghaiSE_daily/variables/variables.data-00000-of-00001:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesSullivan/temporalCN/HEAD/trained_generator_ShanghaiSE_daily/variables/variables.data-00000-of-00001
--------------------------------------------------------------------------------
/preprocess/info.txt:
--------------------------------------------------------------------------------
1 | See The Lambert Way to Gaussianize heavy tailed data with the inverse of Tukey’s h transformation as a special case
2 | https://www.researchgate.net/publication/253822761_The_Lambert_Way_to_Gaussianize_Heavy-Tailed_Data_with_the_Inverse_of_Tukey's_h_Transformation_as_a_Special_Case/link/0363ef580cf2fc730945c6d7/download
--------------------------------------------------------------------------------
/model/info.txt:
--------------------------------------------------------------------------------
1 | A TCN consisting of dilated, causal 1D convolutional layers with the same input and output lengths.
2 |
3 | tf_tcn.py and tf_gan.py
4 | Simplified and Modified (to match paper) Tensor Flow of a temporal convolutional network from
5 | https://github.com/ICascha/QuantGANs-replication
6 |
7 | torch_tcn.py
8 | Modified (to match paper) Torch version of a temporal convolutional networkk
9 | Official TCN PyTorch implementation: https://github.com/locuslab/TCN
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Deep Generative Models
2 |
3 | ## Implentation of Quant GANs: Deep Generation of Financial Time Series, 2019
4 |
5 |
6 | [Wiese et al., Quant GANs: Deep Generation of Financial Time Series, 2019](https://arxiv.org/abs/1907.06673)
7 |
8 |
9 | This repository includes code from:
10 | * [ICascha/QuantGANs-replication](https://github.com/ICascha/QuantGANs-replication)
11 | * [TCN](https://github.com/locuslab/TCN)
12 | * Greg Ver Steeg, 2015
13 |
14 | ### Data for S&P 500 and the Shanghai SE Composite Index needs to be put in the data folder
15 |
16 | ### TCN implementations are provided for both Tensor Flow and Torch
17 |
18 | ### For the Tensor Flow implementation of a TCN see the notebooks [tf_train.ipynb](./tf_train.ipynb) and [tf_model.ipynb](./tf_model.ipynb)
19 |
20 | ### For the Torch implementation of a TCN see the notebooks [torch_train.ipynb](./torch_train.ipynb) and [torch_model.ipynb](./torch_model.ipynb)
21 |
--------------------------------------------------------------------------------
/preprocess/acf.py:
--------------------------------------------------------------------------------
1 | """
2 | Utility code
3 | This code from ICascha/QuantGANs-replication
4 | """
5 |
6 | import numpy as np
7 | from sklearn.preprocessing import StandardScaler
8 |
9 |
10 | def rolling_window(x, k, sparse=True):
11 | """compute rolling windows from timeseries
12 |
13 | Args:
14 | x ([2d array]): x contains the time series in the shape (timestep, sample).
15 | k ([int]): window length.
16 | sparse (bool): Cut off the final windows containing NA. Defaults to True.
17 |
18 | Returns:
19 | [3d array]: array of rolling windows in the shape (window, timestep, sample).
20 | """
21 | out = np.full([k, *x.shape], np.nan)
22 | N = len(x)
23 | for i in range(k):
24 | out[i, :N-i] = x[i:]
25 |
26 | if not sparse:
27 | return out
28 |
29 | return out[:, :-(k-1)]
30 |
31 | def acf(x, k, le=False):
32 |
33 |
34 | arr = rolling_window(x, k, sparse=False)
35 | a = (arr[0] - np.nanmean(arr[0], axis=0))
36 | if le:
37 | arr **=2
38 | b = (arr - np.nanmean(arr, axis=1, keepdims=True))
39 |
40 | return np.nansum((a * b), axis=1) / np.sqrt(np.nansum(a**2, axis=0) * np.nansum(b**2, axis=1))
41 |
42 | def cross_acf(x, y, k, le=False):
43 |
44 | arr = rolling_window(y, k, sparse=False)
45 | a = (x - x.mean(axis=0))
46 |
47 | if le:
48 | arr **=2
49 | b = (arr - np.nanmean(arr, axis=1, keepdims=True))
50 |
51 | return np.nansum((a * b), axis=1) / np.sqrt(np.nansum(a**2, axis=0) * np.nansum(b**2, axis=1))
52 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
--------------------------------------------------------------------------------
/model/tf_tcn.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | from tensorflow.keras.layers import PReLU, Conv1D, Add, Input, Cropping2D, Concatenate, Lambda
3 | from tensorflow.keras.models import Model
4 | from tensorflow.compat.v1.keras.layers import BatchNormalization
5 | from tensorflow_addons.layers import SpectralNormalization
6 |
7 | fixed_filters = 80
8 | receptive_field_size = 127
9 | block_size = 2
10 |
11 | def add_temporal_block(previous, skip, kernel_size, dilation, cropping):
12 | """Creates a temporal block.
13 | Args:
14 | previous (tensorflow.keras.layers.Layer): previous layer to attach to on standard path.
15 | skip (tensorflow.keras.layers.Layer): skip layer to attach to on the skip path. Use None for intiation.
16 | kernel_size (int): kernel size along temporal axis of convolution layers within the temporal block.
17 | dilation (int): dilation of convolution layers along temporal axis within the temporal block.
18 | Returns:
19 | tuple of tensorflow.keras.layers.Layer: Output layers belonging to (normal path, skip path).
20 | """
21 | print(f"kernel_size: {kernel_size} dilation: {dilation}, fixed_filters: {fixed_filters} cropping: {cropping}")
22 | # Identity mapping so that we hold a valid reference to previous
23 | block = Lambda(lambda x: x)(previous)
24 |
25 | for _ in range(block_size):
26 | convs = []
27 | prev_block= Lambda(lambda x: x)(block)
28 | convs.append(SpectralNormalization(Conv1D(fixed_filters, (kernel_size), dilation_rate=(dilation,)))(block))
29 |
30 | if len(convs) > 1:
31 | block = Concatenate(axis=1)(convs)
32 | else:
33 | block = convs[0]
34 | block = BatchNormalization(axis=3, momentum=.9, epsilon=1e-4, renorm=True, renorm_momentum=.9)(block)
35 | block = PReLU(shared_axes=[2, 3])(block)
36 |
37 | # As layer output gets smaller, we need to crop less before putting output
38 | # on the skip path. We cannot infer this directly as tensor shapes may be variable.
39 | drop_left = block_size * (kernel_size - 1) * dilation
40 | cropping += drop_left
41 |
42 | if skip is None:
43 | previous = Conv1D(fixed_filters, 1)(previous)
44 | # add residual connections
45 | out = Add()([Cropping2D(cropping=((0,0), (drop_left, 0)))(previous), block])
46 | # crop from left side for skip path
47 | skip_out = Cropping2D(cropping=((0,0), (receptive_field_size-1-cropping, 0)))(out)
48 | # add current output with 1x1 conv to skip path
49 | if skip is not None:
50 | skip_out = Add()([skip, SpectralNormalization(Conv1D(fixed_filters, 1))(skip_out)])
51 | else:
52 | skip_out = SpectralNormalization(Conv1D(fixed_filters, 1))(skip_out)
53 |
54 | return PReLU(shared_axes=[2, 3])(out), skip_out, cropping
55 |
56 | def TCN(input_dim):
57 | """Causal temporal convolutional network with skip connections.
58 | This network uses 1D convolutions in order to model multiple timeseries co-dependency.
59 | Args:
60 | input_dim (list): Input dimension of the shape (timesteps, number of features). Timesteps may be None for variable length timeseries.
61 | Returns:
62 | tensorflow.keras.models.Model: a non-compiled keras model.
63 | """
64 | # Number of dilations in order to use for the temporal blocks.
65 | dilations = np.array([1, 2, 4, 8, 16, 32])
66 |
67 | input_dim.insert(0,1)
68 | print(f"input_dim: {input_dim}")
69 | input_layer = Input(shape=input_dim)
70 | cropping = 0
71 | assert (sum(dilations) * block_size + 1) == 127, "Paper specifies receptive field size should be 127"
72 |
73 | prev_layer, skip_layer, _ = add_temporal_block(input_layer, None, 1, 1, cropping)
74 |
75 | for dilation in dilations:
76 | prev_layer, skip_layer, cropping = add_temporal_block(prev_layer, skip_layer, 2, dilation, cropping)
77 |
78 | output_layer = PReLU(shared_axes=[2, 3])(skip_layer)
79 | output_layer = SpectralNormalization(Conv1D(fixed_filters, kernel_size=1))(output_layer)
80 | output_layer = PReLU(shared_axes=[2, 3])(output_layer)
81 | output_layer = SpectralNormalization(Conv1D(1, kernel_size=1))(output_layer)
82 |
83 | return Model(input_layer, output_layer)
84 |
85 | generator = TCN([None, 3])
86 | discriminator = TCN([receptive_field_size, 1])
--------------------------------------------------------------------------------
/model/torch_tcn.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import torch.nn as nn
3 | from torch.nn.utils import weight_norm
4 |
5 | class Chomp1d(nn.Module):
6 | def __init__(self, chomp_size):
7 | super(Chomp1d, self).__init__()
8 | self.chomp_size = chomp_size
9 |
10 | def forward(self, x):
11 | return x[:, :, :-self.chomp_size].contiguous()
12 |
13 |
14 | class TemporalBlock(nn.Module):
15 | """Creates a temporal block.
16 | Args:
17 | n_inputs (int): number of inputs.
18 | n_outputs (int): size of fully connected layers.
19 | kernel_size (int): kernel size along temporal axis of convolution layers within the temporal block.
20 | dilation (int): dilation of convolution layers along temporal axis within the temporal block.
21 | padding (int): padding
22 | dropout (float): dropout rate
23 | Returns:
24 | tuple of output layers
25 | """
26 | def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2):
27 | super(TemporalBlock, self).__init__()
28 | self.conv1 = weight_norm(nn.Conv1d(n_inputs, n_outputs, kernel_size, stride=stride, padding=padding, dilation=dilation))
29 | self.chomp1 = Chomp1d(padding)
30 | self.relu1 = nn.ReLU()
31 | self.dropout1 = nn.Dropout(dropout)
32 |
33 | self.conv2 = weight_norm(nn.Conv1d(n_outputs, n_outputs, kernel_size, stride=stride, padding=padding, dilation=dilation))
34 | self.chomp2 = Chomp1d(padding)
35 | self.relu2 = nn.ReLU()
36 | self.dropout2 = nn.Dropout(dropout)
37 |
38 | if padding == 0:
39 | self.net = nn.Sequential(self.conv1, self.relu1, self.dropout1, self.conv2, self.relu2, self.dropout2)
40 | else:
41 | self.net = nn.Sequential(self.conv1, self.chomp1, self.relu1, self.dropout1, self.conv2, self.chomp2, self.relu2, self.dropout2)
42 |
43 | self.downsample = nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs != n_outputs else None
44 | self.relu = nn.ReLU()
45 | self.init_weights()
46 |
47 | def init_weights(self):
48 | self.conv1.weight.data.normal_(0, 0.5)
49 | self.conv2.weight.data.normal_(0, 0.5)
50 | if self.downsample is not None:
51 | self.downsample.weight.data.normal_(0, 0.5)
52 |
53 | def forward(self, x):
54 | out = self.net(x)
55 | res = x if self.downsample is None else self.downsample(x)
56 | return out, self.relu(out + res)
57 |
58 |
59 |
60 | class Generator(nn.Module):
61 | """Generator: 3 to 1 Causal temporal convolutional network with skip connections.
62 | This network uses 1D convolutions in order to model multiple timeseries co-dependency.
63 | """
64 | def __init__(self):
65 | super(Generator, self).__init__()
66 | self.tcn = nn.ModuleList([TemporalBlock(3, 80, kernel_size=1, stride=1, dilation=1, padding=0),
67 | *[TemporalBlock(80, 80, kernel_size=2, stride=1, dilation=i, padding=i) for i in [1, 2, 4, 8, 16, 32]]])
68 | self.last = nn.Conv1d(80, 1, kernel_size=1, stride=1, dilation=1)
69 |
70 | def forward(self, x):
71 | skip_layers = []
72 | for layer in self.tcn:
73 | skip, x = layer(x)
74 | skip_layers.append(skip)
75 | x = self.last(x + sum(skip_layers))
76 | return x
77 |
78 |
79 | class Discriminator(nn.Module):
80 | """Discrimnator: 1 to 1 Causal temporal convolutional network with skip connections.
81 | This network uses 1D convolutions in order to model multiple timeseries co-dependency.
82 | """
83 | def __init__(self, seq_len, conv_dropout=0.05):
84 | super(Discriminator, self).__init__()
85 | self.tcn = nn.ModuleList([TemporalBlock(1, 80, kernel_size=1, stride=1, dilation=1, padding=0),
86 | *[TemporalBlock(80, 80, kernel_size=2, stride=1, dilation=i, padding=i) for i in [1, 2, 4, 8, 16, 32]]])
87 | self.last = nn.Conv1d(80, 1, kernel_size=1, dilation=1)
88 | self.to_prob = nn.Sequential(nn.Linear(seq_len, 1), nn.Sigmoid())
89 |
90 | def forward(self, x):
91 | skip_layers = []
92 | for layer in self.tcn:
93 | skip, x = layer(x)
94 | skip_layers.append(skip)
95 | x = self.last(x + sum(skip_layers))
96 | return self.to_prob(x).squeeze()
--------------------------------------------------------------------------------
/data/SP500andShanghaiSE.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "source": [
6 | "# Data API - Time Series examples\n",
7 | "This notebook demonstrates how to retrieve Time Series from Eikon or Refinitiv Workspace (fee liable service).\n",
8 | "\n",
9 | "#### Learn more\n",
10 | "To learn more about the Data API just connect to the Refinitiv Developer Community. By [registering](https://developers.refinitiv.com/iam/register) and [login](https://developers.refinitiv.com/iam/login) to the Refinitiv Developer Community portal you will get free access to a number of learning materials like [Quick Start guides](https://developers.refinitiv.com/eikon-apis/eikon-data-api/quick-start), [Tutorials](https://developers.refinitiv.com/eikon-apis/eikon-data-api/learning), [Documentation](https://developers.refinitiv.com/eikon-apis/eikon-data-api/docs) and much more. \n",
11 | "\n",
12 | "#### About the \"eikon\" module of the Refinitiv Data Platform Library\n",
13 | "The \"eikon\" module of the Refinitiv Data Platform Library for Python embeds all functions of the classical Eikon Data API (\"eikon\" python library). This module works the same as the Eikon Data API and can be used by applications that need the best of the Eikon Data API while taking advantage of the latest features offered by the Refinitiv Data Platform Library for Python. "
14 | ],
15 | "metadata": {}
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "source": [
20 | "## Import the library and connect to Eikon or Refinitiv Workspace"
21 | ],
22 | "metadata": {}
23 | },
24 | {
25 | "cell_type": "code",
26 | "execution_count": 20,
27 | "source": [
28 | "import refinitiv.dataplatform.eikon as ek\n",
29 | "import datetime\n",
30 | "\n",
31 | "ek.set_app_key('xxxxxx')"
32 | ],
33 | "outputs": [],
34 | "metadata": {}
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "source": [
39 | "## Get Time Series"
40 | ],
41 | "metadata": {}
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "source": [
46 | "#### Simple call with default parameters"
47 | ],
48 | "metadata": {}
49 | },
50 | {
51 | "cell_type": "code",
52 | "execution_count": 21,
53 | "source": [
54 | "SP500_daily = ek.get_timeseries(['.SPX'], start_date='2011-01-01', interval='daily')['CLOSE']\n",
55 | "ShanghaiSE_daily = ek.get_timeseries(['.SSEC'], start_date='2011-01-01', interval='daily')['CLOSE']"
56 | ],
57 | "outputs": [],
58 | "metadata": {}
59 | },
60 | {
61 | "cell_type": "markdown",
62 | "source": [
63 | "#### Sanity Check Results"
64 | ],
65 | "metadata": {}
66 | },
67 | {
68 | "cell_type": "code",
69 | "execution_count": 22,
70 | "source": [
71 | "print(f\"SP500_daily.shape: {SP500_daily.shape}\")\n",
72 | "print(f\"ShanghaiSE_daily.shape: {ShanghaiSE_daily.shape}\")['CLOSE']"
73 | ],
74 | "outputs": [
75 | {
76 | "output_type": "stream",
77 | "name": "stdout",
78 | "text": [
79 | "SP500_daily.shape: (2680,)\n",
80 | "ShanghaiSE_daily.shape: (2592, 6)\n"
81 | ]
82 | }
83 | ],
84 | "metadata": {}
85 | },
86 | {
87 | "cell_type": "markdown",
88 | "source": [
89 | "#### Save Results"
90 | ],
91 | "metadata": {}
92 | },
93 | {
94 | "cell_type": "code",
95 | "execution_count": 23,
96 | "source": [
97 | "SP500_daily.to_csv(f'./SP500_daily.csv')\n",
98 | "ShanghaiSE_daily.to_csv(f'./ShanghaiSE_daily.csv')"
99 | ],
100 | "outputs": [],
101 | "metadata": {}
102 | },
103 | {
104 | "cell_type": "code",
105 | "execution_count": null,
106 | "source": [],
107 | "outputs": [],
108 | "metadata": {}
109 | }
110 | ],
111 | "metadata": {
112 | "kernelspec": {
113 | "display_name": "Python 3",
114 | "language": "python",
115 | "name": "python3"
116 | },
117 | "language_info": {
118 | "codemirror_mode": {
119 | "name": "ipython",
120 | "version": 3
121 | },
122 | "file_extension": ".py",
123 | "mimetype": "text/x-python",
124 | "name": "python",
125 | "nbconvert_exporter": "python",
126 | "pygments_lexer": "ipython3",
127 | "version": "3.7.4"
128 | },
129 | "widgets": {
130 | "application/vnd.jupyter.widget-state+json": {
131 | "state": {},
132 | "version_major": 2,
133 | "version_minor": 0
134 | }
135 | }
136 | },
137 | "nbformat": 4,
138 | "nbformat_minor": 4
139 | }
--------------------------------------------------------------------------------
/model/tf_gan.py:
--------------------------------------------------------------------------------
1 | from preprocess.acf import *
2 | import numpy as np
3 | import tensorflow as tf
4 |
5 | from tensorflow.keras.losses import BinaryCrossentropy
6 | from tensorflow.keras.optimizers import Adam
7 | from tensorflow.keras.utils import Progbar
8 | from tensorflow.keras.models import load_model, Model
9 | from tensorflow.keras.layers import Input, Concatenate
10 | from tensorflow import convert_to_tensor
11 | from math import floor, ceil
12 |
13 |
14 |
15 |
16 | class GAN:
17 | """ Generative adverserial network class.
18 |
19 | Training code for a standard DCGAN using the Adam optimizer.
20 | Code taken in part from: https://github.com/tensorflow/docs/blob/master/site/en/tutorials/generative/dcgan.ipynb
21 | """
22 |
23 | def discriminator_loss(self, real_output, fake_output):
24 | real_loss = self.loss(tf.ones_like(real_output), real_output)
25 | fake_loss = self.loss(tf.zeros_like(fake_output), fake_output)
26 | total_loss = real_loss + fake_loss
27 | return total_loss
28 |
29 | def generator_loss(self, fake_output):
30 | return self.loss(tf.ones_like(fake_output), fake_output)
31 |
32 | def __init__(self, discriminator, generator, training_input, lr_d=1e-4, lr_g=3e-4, epsilon=1e-8, beta_1=.0, beta_2=0.9, from_logits=True):
33 | """Create a GAN instance
34 |
35 | Args:
36 | discriminator (tensorflow.keras.models.Model): Discriminator model.
37 | generator (tensorflow.keras.models.Model): Generator model.
38 | training_input (int): input size of temporal axis of noise samples.
39 | lr_d (float, optional): Learning rate of discriminator. Defaults to 1e-4.
40 | lr_g (float, optional): Learning rate of generator. Defaults to 3e-4.
41 | epsilon (float, optional): Epsilon paramater of Adam. Defaults to 1e-8.
42 | beta_1 (float, optional): Beta1 parameter of Adam. Defaults to 0.
43 | beta_2 (float, optional): Beta2 parameter of Adam. Defaults to 0.9.
44 | from_logits (bool, optional): Output range of discriminator, logits imply output on the entire reals. Defaults to True.
45 | """
46 | self.discriminator = discriminator
47 | self.generator = generator
48 | self.noise_shape = [self.generator.input_shape[1], training_input, self.generator.input_shape[-1]]
49 |
50 | self.loss = BinaryCrossentropy(from_logits=from_logits)
51 |
52 | self.generator_optimizer = Adam(lr_g, epsilon=epsilon, beta_1=beta_1, beta_2=beta_2)
53 | self.discriminator_optimizer = Adam(lr_d, epsilon=epsilon, beta_1=beta_1, beta_2=beta_2)
54 |
55 | def train(self, data, batch_size, n_batches):
56 | """training function of a GAN instance.
57 | Args:
58 | data (4d array): Training data in the following shape: (samples, timesteps, 1).
59 | batch_size (int): Batch size used during training.
60 | n_batches (int): Number of update steps taken.
61 | """
62 | progress = Progbar(n_batches)
63 |
64 | for n_batch in range(n_batches):
65 | # sample uniformly
66 | batch_idx = np.random.choice(np.arange(data.shape[0]), size=batch_size, replace=(batch_size > data.shape[0]))
67 | batch = data[batch_idx]
68 |
69 | self.train_step(batch, batch_size)
70 |
71 | if (n_batch + 1) % 500 == 0:
72 | y = self.generator(self.fixed_noise).numpy().squeeze()
73 | scores = []
74 | scores.append(np.linalg.norm(self.acf_real - acf(y.T, 250).mean(axis=1, keepdims=True)[:-1]))
75 | scores.append(np.linalg.norm(self.abs_acf_real - acf(y.T**2, 250).mean(axis=1, keepdims=True)[:-1]))
76 | scores.append(np.linalg.norm(self.le_real - acf(y.T, 250, le=True).mean(axis=1, keepdims=True)[:-1]))
77 | print("\nacf: {:.4f}, acf_abs: {:.4f}, le: {:.4f}".format(*scores))
78 |
79 | progress.update(n_batch + 1)
80 |
81 | @tf.function
82 | def train_step(self, data, batch_size):
83 |
84 | noise = tf.random.normal([batch_size, *self.noise_shape])
85 | generated_data = self.generator(noise, training=False)
86 |
87 | with tf.GradientTape() as disc_tape:
88 | real_output = self.discriminator(data, training=True)
89 | fake_output = self.discriminator(generated_data, training=True)
90 | disc_loss = self.discriminator_loss(real_output, fake_output)
91 |
92 | gradients_of_discriminator = disc_tape.gradient(disc_loss, self.discriminator.trainable_variables)
93 | self.discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, self.discriminator.trainable_variables))
94 |
95 | noise = tf.random.normal([batch_size, *self.noise_shape])
96 | generated_data = self.generator(noise, training=False)
97 |
98 | noise = tf.random.normal([batch_size, *self.noise_shape])
99 | with tf.GradientTape() as gen_tape:
100 | generated_data = self.generator(noise, training=True)
101 | fake_output = self.discriminator(generated_data, training=False)
102 | gen_loss = self.generator_loss(fake_output)
103 | gradients_of_generator = gen_tape.gradient(gen_loss, self.generator.trainable_variables)
104 | self.generator_optimizer.apply_gradients(zip(gradients_of_generator, self.generator.trainable_variables))
105 |
--------------------------------------------------------------------------------
/data/ShanghaiSE_daily.csv:
--------------------------------------------------------------------------------
1 | Date,CLOSE
2 | 2022-11-04,3770.550049
3 | 2022-11-07,3806.800049
4 | 2022-11-08,3828.110107
5 | 2022-11-09,3748.570068
6 | 2022-11-10,3956.370117
7 | 2022-11-11,3992.929932
8 | 2022-11-14,3957.25
9 | 2022-11-15,3991.72998
10 | 2022-11-16,3958.790039
11 | 2022-11-17,3946.560059
12 | 2022-11-18,3965.340088
13 | 2022-11-21,3949.939941
14 | 2022-11-22,4003.580078
15 | 2022-11-23,4027.26001
16 | 2022-11-25,4026.120117
17 | 2022-11-28,3963.939941
18 | 2022-11-29,3957.629883
19 | 2022-11-30,4080.110107
20 | 2022-12-01,4076.570068
21 | 2022-12-02,4071.699951
22 | 2022-12-05,3998.840088
23 | 2022-12-06,3941.26001
24 | 2022-12-07,3933.919922
25 | 2022-12-08,3963.51001
26 | 2022-12-09,3934.379883
27 | 2022-12-12,3990.560059
28 | 2022-12-13,4019.649902
29 | 2022-12-14,3995.320068
30 | 2022-12-15,3895.75
31 | 2022-12-16,3852.360107
32 | 2022-12-19,3817.659912
33 | 2022-12-20,3821.620117
34 | 2022-12-21,3878.439941
35 | 2022-12-22,3822.389893
36 | 2022-12-23,3844.820068
37 | 2022-12-27,3829.25
38 | 2022-12-28,3783.219971
39 | 2022-12-29,3849.280029
40 | 2022-12-30,3839.5
41 | 2023-01-03,3824.139893
42 | 2023-01-04,3852.969971
43 | 2023-01-05,3808.100098
44 | 2023-01-06,3895.080078
45 | 2023-01-09,3892.090088
46 | 2023-01-10,3919.25
47 | 2023-01-11,3969.610107
48 | 2023-01-12,3983.169922
49 | 2023-01-13,3999.090088
50 | 2023-01-17,3990.969971
51 | 2023-01-18,3928.860107
52 | 2023-01-19,3898.850098
53 | 2023-01-20,3972.610107
54 | 2023-01-23,4019.810059
55 | 2023-01-24,4016.949951
56 | 2023-01-25,4016.219971
57 | 2023-01-26,4060.429932
58 | 2023-01-27,4070.560059
59 | 2023-01-30,4017.77002
60 | 2023-01-31,4076.600098
61 | 2023-02-01,4119.209961
62 | 2023-02-02,4179.759766
63 | 2023-02-03,4136.47998
64 | 2023-02-06,4111.080078
65 | 2023-02-07,4164
66 | 2023-02-08,4117.859863
67 | 2023-02-09,4081.5
68 | 2023-02-10,4090.459961
69 | 2023-02-13,4137.290039
70 | 2023-02-14,4136.129883
71 | 2023-02-15,4147.600098
72 | 2023-02-16,4090.409912
73 | 2023-02-17,4079.090088
74 | 2023-02-21,3997.340088
75 | 2023-02-22,3991.050049
76 | 2023-02-23,4012.320068
77 | 2023-02-24,3970.040039
78 | 2023-02-27,3982.23999
79 | 2023-02-28,3970.149902
80 | 2023-03-01,3951.389893
81 | 2023-03-02,3981.350098
82 | 2023-03-03,4045.639893
83 | 2023-03-06,4048.419922
84 | 2023-03-07,3986.370117
85 | 2023-03-08,3992.01001
86 | 2023-03-09,3918.320068
87 | 2023-03-10,3861.590088
88 | 2023-03-13,3855.76001
89 | 2023-03-14,3919.290039
90 | 2023-03-15,3891.929932
91 | 2023-03-16,3960.280029
92 | 2023-03-17,3916.639893
93 | 2023-03-20,3951.570068
94 | 2023-03-21,4002.870117
95 | 2023-03-22,3936.969971
96 | 2023-03-23,3948.719971
97 | 2023-03-24,3970.98999
98 | 2023-03-27,3977.530029
99 | 2023-03-28,3971.27002
100 | 2023-03-29,4027.810059
101 | 2023-03-30,4050.830078
102 | 2023-03-31,4109.310059
103 | 2023-04-03,4124.509766
104 | 2023-04-04,4100.600098
105 | 2023-04-05,4090.379883
106 | 2023-04-06,4105.02002
107 | 2023-04-10,4109.109863
108 | 2023-04-11,4108.939941
109 | 2023-04-12,4091.949951
110 | 2023-04-13,4146.220215
111 | 2023-04-14,4137.640137
112 | 2023-04-17,4151.319824
113 | 2023-04-18,4154.870117
114 | 2023-04-19,4154.52002
115 | 2023-04-20,4129.790039
116 | 2023-04-21,4133.52002
117 | 2023-04-24,4137.040039
118 | 2023-04-25,4071.629883
119 | 2023-04-26,4055.98999
120 | 2023-04-27,4135.350098
121 | 2023-04-28,4169.47998
122 | 2023-05-01,4167.870117
123 | 2023-05-02,4119.580078
124 | 2023-05-03,4090.75
125 | 2023-05-04,4061.219971
126 | 2023-05-05,4136.25
127 | 2023-05-08,4138.120117
128 | 2023-05-09,4119.169922
129 | 2023-05-10,4137.640137
130 | 2023-05-11,4130.620117
131 | 2023-05-12,4124.080078
132 | 2023-05-15,4136.279785
133 | 2023-05-16,4109.899902
134 | 2023-05-17,4158.77002
135 | 2023-05-18,4198.049805
136 | 2023-05-19,4191.97998
137 | 2023-05-22,4192.629883
138 | 2023-05-23,4145.580078
139 | 2023-05-24,4115.240234
140 | 2023-05-25,4151.279785
141 | 2023-05-26,4205.450195
142 | 2023-05-30,4205.52002
143 | 2023-05-31,4179.830078
144 | 2023-06-01,4221.02002
145 | 2023-06-02,4282.370117
146 | 2023-06-05,4273.790039
147 | 2023-06-06,4283.850098
148 | 2023-06-07,4267.52002
149 | 2023-06-08,4293.930176
150 | 2023-06-09,4298.859863
151 | 2023-06-12,4338.930176
152 | 2023-06-13,4369.009766
153 | 2023-06-14,4372.589844
154 | 2023-06-15,4425.839844
155 | 2023-06-16,4409.589844
156 | 2023-06-20,4388.709961
157 | 2023-06-21,4365.689941
158 | 2023-06-22,4381.890137
159 | 2023-06-23,4348.330078
160 | 2023-06-26,4328.819824
161 | 2023-06-27,4378.410156
162 | 2023-06-28,4376.859863
163 | 2023-06-29,4396.439941
164 | 2023-06-30,4450.379883
165 | 2023-07-03,4455.589844
166 | 2023-07-05,4446.819824
167 | 2023-07-06,4411.589844
168 | 2023-07-07,4398.950195
169 | 2023-07-10,4409.529785
170 | 2023-07-11,4439.259766
171 | 2023-07-12,4472.160156
172 | 2023-07-13,4510.040039
173 | 2023-07-14,4505.419922
174 | 2023-07-17,4522.790039
175 | 2023-07-18,4554.97998
176 | 2023-07-19,4565.720215
177 | 2023-07-20,4534.870117
178 | 2023-07-21,4536.339844
179 | 2023-07-24,4554.640137
180 | 2023-07-25,4567.459961
181 | 2023-07-26,4566.75
182 | 2023-07-27,4537.410156
183 | 2023-07-28,4582.22998
184 | 2023-07-31,4588.959961
185 | 2023-08-01,4576.72998
186 | 2023-08-02,4513.390137
187 | 2023-08-03,4501.890137
188 | 2023-08-04,4478.029785
189 | 2023-08-07,4518.439941
190 | 2023-08-08,4499.379883
191 | 2023-08-09,4467.709961
192 | 2023-08-10,4468.830078
193 | 2023-08-11,4464.049805
194 | 2023-08-14,4489.720215
195 | 2023-08-15,4437.859863
196 | 2023-08-16,4404.330078
197 | 2023-08-17,4370.359863
198 | 2023-08-18,4369.709961
199 | 2023-08-21,4399.77002
200 | 2023-08-22,4387.549805
201 | 2023-08-23,4436.009766
202 | 2023-08-24,4376.310059
203 | 2023-08-25,4405.709961
204 | 2023-08-28,4433.310059
205 | 2023-08-29,4497.629883
206 | 2023-08-30,4514.870117
207 | 2023-08-31,4507.660156
208 | 2023-09-01,4515.77002
209 | 2023-09-05,4496.830078
210 | 2023-09-06,4465.47998
211 | 2023-09-07,4451.140137
212 | 2023-09-08,4457.490234
213 | 2023-09-11,4487.459961
214 | 2023-09-12,4461.899902
215 | 2023-09-13,4467.439941
216 | 2023-09-14,4505.100098
217 | 2023-09-15,4450.319824
218 | 2023-09-18,4453.529785
219 | 2023-09-19,4443.950195
220 | 2023-09-20,4402.200195
221 | 2023-09-21,4330
222 | 2023-09-22,4320.060059
223 | 2023-09-25,4337.439941
224 | 2023-09-26,4273.529785
225 | 2023-09-27,4274.509766
226 | 2023-09-28,4299.700195
227 | 2023-09-29,4288.049805
228 | 2023-10-02,4288.390137
229 | 2023-10-03,4229.450195
230 | 2023-10-04,4263.75
231 | 2023-10-05,4258.189941
232 | 2023-10-06,4308.5
233 | 2023-10-09,4335.660156
234 | 2023-10-10,4358.240234
235 | 2023-10-11,4376.950195
236 | 2023-10-12,4349.609863
237 | 2023-10-13,4327.779785
238 | 2023-10-16,4373.629883
239 | 2023-10-17,4373.200195
240 | 2023-10-18,4314.600098
241 | 2023-10-19,4278
242 | 2023-10-20,4224.160156
243 | 2023-10-23,4217.040039
244 | 2023-10-24,4247.680176
245 | 2023-10-25,4186.77002
246 | 2023-10-26,4137.22998
247 | 2023-10-27,4117.370117
248 | 2023-10-30,4166.819824
249 | 2023-10-31,4193.799805
250 | 2023-11-01,4237.859863
251 | 2023-11-02,4317.779785
252 | 2023-11-03,4358.339844
--------------------------------------------------------------------------------
/torch_model.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "source": [
6 | "# TCN MODEL implemented in Torch"
7 | ],
8 | "metadata": {}
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "source": [
13 | "[Wiese et al., Quant GANs: Deep Generation of Financial Time Series, 2019](https://arxiv.org/abs/1907.06673)\n",
14 | "\n",
15 | "For both the generator and the discriminator we used TCNs with skip connections. Inside the TCN architecture temporal blocks were used as block modules. A temporal block consists of two dilated causal convolutions and two PReLUs (He et al., 2015) as activation functions. The primary benefit of using temporal blocks is to make the TCN more expressive by increasing the number of non-linear operations in each block module. A complete definition is given below.\n",
16 | "\n",
17 | "**Definition B.1 (Temporal block)**. Let $N_I, N_H, N_O ∈ \\Bbb{N}$ denote the input, hidden and output dimension and let $D,K ∈ \\mathbb{N}$ denote the dilation and the kernel size. Furthermore, let $w_1, w_2$ be two dilated causal convolutional layers with arguments $(N_I, N_H, K, D)$ and $(N_H,N_O,K,D)$ respectively and\n",
18 | "let $φ_1, φ_2 : \\mathbb{R} → \\mathbb{R}$ be two PReLUs. The function $f : \\mathbb{R}^{N_I×(2D(K−1)+1)} → \\mathbb{R}^{N_O}$ defined by\n",
19 | "$$f(X) = φ_2 ◦ w_2 ◦ φ_1 ◦ w_1(X)$$\n",
20 | "is called temporal block with arguments $(N_I,N_H,N_O,K,D)$.\n",
21 | "\n",
22 | "The TCN architecture used for the generator and the discriminator in the pure TCN and C-SVNN model is illustrated in Table 3. Table 4 shows the input, hidden and output dimensions of the different models. Here, G abbreviates the generator and D the discriminator. Note that for all models, except the generator of the C-SVNN, the hidden dimension was set to eighty. The kernel size of each temporal block, except the first one, was two. Each TCN modeled a RFS of 127."
23 | ],
24 | "metadata": {}
25 | },
26 | {
27 | "cell_type": "markdown",
28 | "source": [
29 | "\n",
38 | "
Table 3
\n",
39 | "\n",
40 | "\n",
41 | " \n",
42 | " | Module Name | \n",
43 | " Arguments | \n",
44 | "
\n",
45 | "\n",
46 | "\n",
47 | " \n",
48 | " | Temporal block 1 | \n",
49 | " (NI, NH, NH, 1, 1) | \n",
50 | "
\n",
51 | " \n",
52 | " | Temporal block 2 | \n",
53 | " (NI, NH, NH, 2, 1) | \n",
54 | "
\n",
55 | " \n",
56 | " | Temporal block 3 | \n",
57 | " (NI, NH, NH, 2, 2) | \n",
58 | "
\n",
59 | " \n",
60 | " | Temporal block 4 | \n",
61 | " (NI, NH, NH, 2, 4) | \n",
62 | "
\n",
63 | " \n",
64 | " | Temporal block 5 | \n",
65 | " (NI, NH, NH, 2, 8) | \n",
66 | "
\n",
67 | " \n",
68 | " | Temporal block 6 | \n",
69 | " (NI, NH, NH, 2, 16) | \n",
70 | "
\n",
71 | " \n",
72 | " | Temporal block 7 | \n",
73 | " (NI, NH, NH, 2, 32) | \n",
74 | "
\n",
75 | " \n",
76 | " | 1 x 1 Convolution | \n",
77 | " (NH, NO, 1, 1) | \n",
78 | "
\n",
79 | "\n",
80 | "
"
81 | ],
82 | "metadata": {}
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "source": [
87 | "\n",
95 | "Table 4
\n",
96 | "\n",
97 | "\n",
98 | " \n",
99 | " | Models | \n",
100 | " PureTCN-G | \n",
101 | " Pure TCN-D
| \n",
102 | " C-SVNN-G | \n",
103 | " C-SVNN_D | \n",
104 | "
\n",
105 | "\n",
106 | "\n",
107 | " \n",
108 | " | NI | \n",
109 | " 3 | \n",
110 | " 1 | \n",
111 | " 3 | \n",
112 | " 1 | \n",
113 | "
\n",
114 | " \n",
115 | " | NH | \n",
116 | " 80 | \n",
117 | " 80 | \n",
118 | " 50
| \n",
119 | " 80 | \n",
120 | "
\n",
121 | " \n",
122 | " | NO | \n",
123 | " 1 | \n",
124 | " 1 | \n",
125 | " 2 | \n",
126 | " 1 | \n",
127 | "
\n",
128 | "\n",
129 | "
"
130 | ],
131 | "metadata": {}
132 | },
133 | {
134 | "cell_type": "code",
135 | "execution_count": 2,
136 | "source": [
137 | "import torch\n",
138 | "import torch.nn as nn\n",
139 | "from torch.nn.utils import weight_norm\n",
140 | "\n",
141 | "class Chomp1d(nn.Module):\n",
142 | " def __init__(self, chomp_size):\n",
143 | " super(Chomp1d, self).__init__()\n",
144 | " self.chomp_size = chomp_size\n",
145 | "\n",
146 | " def forward(self, x):\n",
147 | " return x[:, :, :-self.chomp_size].contiguous()\n",
148 | "\n",
149 | "\n",
150 | "class TemporalBlock(nn.Module):\n",
151 | " \"\"\"Creates a temporal block.\n",
152 | " Args:\n",
153 | " n_inputs (int): number of inputs.\n",
154 | " n_outputs (int): size of fully connected layers.\n",
155 | " kernel_size (int): kernel size along temporal axis of convolution layers within the temporal block.\n",
156 | " dilation (int): dilation of convolution layers along temporal axis within the temporal block.\n",
157 | " padding (int): padding\n",
158 | " dropout (float): dropout rate\n",
159 | " Returns:\n",
160 | " tuple of output layers\n",
161 | " \"\"\"\n",
162 | " def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2):\n",
163 | " super(TemporalBlock, self).__init__()\n",
164 | " self.conv1 = weight_norm(nn.Conv1d(n_inputs, n_outputs, kernel_size, stride=stride, padding=padding, dilation=dilation))\n",
165 | " self.chomp1 = Chomp1d(padding)\n",
166 | " self.relu1 = nn.ReLU()\n",
167 | " self.dropout1 = nn.Dropout(dropout)\n",
168 | "\n",
169 | " self.conv2 = weight_norm(nn.Conv1d(n_outputs, n_outputs, kernel_size, stride=stride, padding=padding, dilation=dilation))\n",
170 | " self.chomp2 = Chomp1d(padding)\n",
171 | " self.relu2 = nn.ReLU()\n",
172 | " self.dropout2 = nn.Dropout(dropout)\n",
173 | "\n",
174 | " if padding == 0:\n",
175 | " self.net = nn.Sequential(self.conv1, self.relu1, self.dropout1, self.conv2, self.relu2, self.dropout2)\n",
176 | " else:\n",
177 | " self.net = nn.Sequential(self.conv1, self.chomp1, self.relu1, self.dropout1, self.conv2, self.chomp2, self.relu2, self.dropout2)\n",
178 | "\n",
179 | " self.downsample = nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs != n_outputs else None\n",
180 | " self.relu = nn.ReLU()\n",
181 | " self.init_weights()\n",
182 | "\n",
183 | " def init_weights(self):\n",
184 | " self.conv1.weight.data.normal_(0, 0.5)\n",
185 | " self.conv2.weight.data.normal_(0, 0.5)\n",
186 | " if self.downsample is not None:\n",
187 | " self.downsample.weight.data.normal_(0, 0.5)\n",
188 | "\n",
189 | " def forward(self, x):\n",
190 | " out = self.net(x)\n",
191 | " res = x if self.downsample is None else self.downsample(x)\n",
192 | " return out, self.relu(out + res)\n",
193 | "\n",
194 | "\n",
195 | "\n",
196 | "class Generator(nn.Module):\n",
197 | " \"\"\"Generator: 3 to 1 Causal temporal convolutional network with skip connections.\n",
198 | " This network uses 1D convolutions in order to model multiple timeseries co-dependency.\n",
199 | " \"\"\" \n",
200 | " def __init__(self):\n",
201 | " super(Generator, self).__init__()\n",
202 | " self.tcn = nn.ModuleList([TemporalBlock(3, 80, kernel_size=1, stride=1, dilation=1, padding=0),\n",
203 | " *[TemporalBlock(80, 80, kernel_size=2, stride=1, dilation=i, padding=i) for i in [1, 2, 4, 8, 16, 32]]])\n",
204 | " self.last = nn.Conv1d(80, 1, kernel_size=1, stride=1, dilation=1)\n",
205 | "\n",
206 | " def forward(self, x):\n",
207 | " skip_layers = []\n",
208 | " for layer in self.tcn:\n",
209 | " skip, x = layer(x)\n",
210 | " skip_layers.append(skip)\n",
211 | " x = self.last(x + sum(skip_layers))\n",
212 | " return x\n",
213 | "\n",
214 | "\n",
215 | "class Discriminator(nn.Module):\n",
216 | " \"\"\"Discrimnator: 1 to 1 Causal temporal convolutional network with skip connections.\n",
217 | " This network uses 1D convolutions in order to model multiple timeseries co-dependency.\n",
218 | " \"\"\" \n",
219 | " def __init__(self, seq_len, conv_dropout=0.05):\n",
220 | " super(Discriminator, self).__init__()\n",
221 | " self.tcn = nn.ModuleList([TemporalBlock(1, 80, kernel_size=1, stride=1, dilation=1, padding=0),\n",
222 | " *[TemporalBlock(80, 80, kernel_size=2, stride=1, dilation=i, padding=i) for i in [1, 2, 4, 8, 16, 32]]])\n",
223 | " self.last = nn.Conv1d(80, 1, kernel_size=1, dilation=1)\n",
224 | " self.to_prob = nn.Sequential(nn.Linear(seq_len, 1), nn.Sigmoid())\n",
225 | "\n",
226 | " def forward(self, x):\n",
227 | " skip_layers = []\n",
228 | " for layer in self.tcn:\n",
229 | " skip, x = layer(x)\n",
230 | " skip_layers.append(skip)\n",
231 | " x = self.last(x + sum(skip_layers))\n",
232 | " return self.to_prob(x).squeeze()"
233 | ],
234 | "outputs": [],
235 | "metadata": {}
236 | }
237 | ],
238 | "metadata": {
239 | "orig_nbformat": 4,
240 | "language_info": {
241 | "name": "python",
242 | "version": "3.8.8",
243 | "mimetype": "text/x-python",
244 | "codemirror_mode": {
245 | "name": "ipython",
246 | "version": 3
247 | },
248 | "pygments_lexer": "ipython3",
249 | "nbconvert_exporter": "python",
250 | "file_extension": ".py"
251 | },
252 | "kernelspec": {
253 | "name": "python3",
254 | "display_name": "Python 3.8.8 64-bit ('base': conda)"
255 | },
256 | "interpreter": {
257 | "hash": "d89b3f520990f67813a536e0845046cd8eba1f701f32f0e9331279df485a6ae1"
258 | }
259 | },
260 | "nbformat": 4,
261 | "nbformat_minor": 2
262 | }
--------------------------------------------------------------------------------
/preprocess/gaussianize.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 | """
4 | Utility code from Greg Ver Steeg.
5 | Transform data so that it is approximately normally distributed
6 | """
7 |
8 | from typing import Text, List, Union
9 |
10 | import numpy as np
11 | from scipy import special
12 | from scipy.stats import kurtosis, norm, rankdata, boxcox
13 | from scipy import optimize # TODO: Explore efficacy of other opt. methods
14 | import sklearn
15 | from matplotlib import pylab as plt
16 | from scipy import stats
17 | import warnings
18 | import os
19 |
20 | np.seterr(all='warn')
21 |
22 |
23 | # Tolerance for == 0.0 tolerance.
24 | _EPS = 1e-6
25 |
26 |
27 | def _update_x(x: Union[np.ndarray, List]) -> np.ndarray:
28 | x = np.asarray(x)
29 | if len(x.shape) == 1:
30 | x = x[:, np.newaxis]
31 | elif len(x.shape) != 2:
32 | raise ValueError("Data should be a 1-d list of samples to transform or a 2d array with samples as rows.")
33 | return x
34 |
35 |
36 | class Gaussianize(sklearn.base.TransformerMixin):
37 | """
38 | Gaussianize data using various methods.
39 |
40 | Conventions
41 | ----------
42 | This class is a wrapper that follows sklearn naming/style (e.g. fit(X) to train).
43 | In this code, x is the input, y is the output. But in the functions outside the class, I follow
44 | Georg's convention that Y is the input and X is the output (Gaussianized) data.
45 |
46 | Parameters
47 | ----------
48 |
49 | strategy : str, default='lambert'. Possibilities are 'lambert'[1], 'brute'[2] and 'boxcox'[3].
50 |
51 | tol : float, default = 1e-4
52 |
53 | max_iter : int, default = 100
54 | Maximum number of iterations to search for correct parameters of Lambert transform.
55 |
56 | Attributes
57 | ----------
58 | coefs_ : list of tuples
59 | For each variable, we have transformation parameters.
60 | For Lambert, e.g., a tuple consisting of (mu, sigma, delta), corresponding to the parameters of the
61 | appropriate Lambert transform. Eq. 6 and 8 in the paper below.
62 |
63 | References
64 | ----------
65 | [1] Georg M Goerg. The Lambert Way to Gaussianize heavy tailed data with
66 | the inverse of Tukey's h transformation as a special case
67 | Author generously provides code in R: https://cran.r-project.org/web/packages/LambertW/
68 | [2] Valero Laparra, Gustavo Camps-Valls, and Jesus Malo. Iterative Gaussianization: From ICA to Random Rotations
69 | [3] Box cox transformation and references: https://en.wikipedia.org/wiki/Power_transform
70 | """
71 |
72 | def __init__(self, strategy: Text = 'lambert',
73 | tol: float = 1e-5,
74 | max_iter: int = 100,
75 | verbose: bool = False):
76 | self.tol = tol
77 | self.max_iter = max_iter
78 | self.strategy = strategy
79 | self.coefs_ = [] # Store tau for each transformed variable
80 | self.verbose = verbose
81 |
82 | def fit(self, x: np.ndarray, y=None):
83 | """Fit a Gaussianizing transformation to each variable/column in x."""
84 | # Initialize coefficients again with an empty list. Otherwise
85 | # calling .fit() repeatedly will augment previous .coefs_ list.
86 | self.coefs_ = []
87 | x = _update_x(x)
88 | if self.verbose:
89 | print("Gaussianizing with strategy='%s'" % self.strategy)
90 |
91 | if self.strategy == "lambert":
92 | _get_coef = lambda vec: igmm(vec, self.tol, max_iter=self.max_iter)
93 | elif self.strategy == "brute":
94 | _get_coef = lambda vec: None # TODO: In principle, we could store parameters to do a quasi-invert
95 | elif self.strategy == "boxcox":
96 | _get_coef = lambda vec: boxcox(vec)[1]
97 | else:
98 | raise NotImplementedError("stategy='%s' not implemented." % self.strategy)
99 |
100 | for x_i in x.T:
101 | self.coefs_.append(_get_coef(x_i))
102 |
103 | return self
104 |
105 | def transform(self, x: np.ndarray) -> np.ndarray:
106 | """Transform new data using a previously learned Gaussianization model."""
107 | x = _update_x(x)
108 | if x.shape[1] != len(self.coefs_):
109 | raise ValueError("%d variables in test data, but %d variables were in training data." % (x.shape[1], len(self.coefs_)))
110 |
111 | if self.strategy == 'lambert':
112 | return np.array([w_t(x_i, tau_i) for x_i, tau_i in zip(x.T, self.coefs_)]).T
113 | elif self.strategy == 'brute':
114 | return np.array([norm.ppf((rankdata(x_i) - 0.5) / len(x_i)) for x_i in x.T]).T
115 | elif self.strategy == 'boxcox':
116 | return np.array([boxcox(x_i, lmbda=lmbda_i) for x_i, lmbda_i in zip(x.T, self.coefs_)]).T
117 | else:
118 | raise NotImplementedError("stategy='%s' not implemented." % self.strategy)
119 |
120 | def inverse_transform(self, y: np.ndarray) -> np.ndarray:
121 | """Recover original data from Gaussianized data."""
122 | if self.strategy == 'lambert':
123 | return np.array([inverse(y_i, tau_i) for y_i, tau_i in zip(y.T, self.coefs_)]).T
124 | elif self.strategy == 'boxcox':
125 | return np.array([(1. + lmbda_i * y_i) ** (1./lmbda_i) for y_i, lmbda_i in zip(y.T, self.coefs_)]).T
126 | else:
127 | raise NotImplementedError("Inversion not supported for gaussianization transform '%s'" % self.strategy)
128 |
129 | def qqplot(self, x: np.ndarray, prefix: Text = 'qq', output_dir: Text = "/tmp/"):
130 | """Show qq plots compared to normal before and after the transform."""
131 | x = _update_x(x)
132 | y = self.transform(x)
133 | n_dim = y.shape[1]
134 | for i in range(n_dim):
135 | stats.probplot(x[:, i], dist="norm", plot=plt)
136 | plt.savefig(os.path.join(output_dir, prefix + '_%d_before.png' % i))
137 | plt.clf()
138 | stats.probplot(y[:, i], dist="norm", plot=plt)
139 | plt.savefig(os.path.join(output_dir, prefix + '_%d_after.png' % i))
140 | plt.clf()
141 |
142 |
143 | def w_d(z, delta):
144 | # Eq. 9
145 | if delta < _EPS:
146 | return z
147 | return np.sign(z) * np.sqrt(np.real(special.lambertw(delta * z ** 2)) / delta)
148 |
149 |
150 | def w_t(y, tau):
151 | # Eq. 8
152 | return tau[0] + tau[1] * w_d((y - tau[0]) / tau[1], tau[2])
153 |
154 |
155 | def inverse(x, tau):
156 | # Eq. 6
157 | u = (x - tau[0]) / tau[1]
158 | return tau[0] + tau[1] * (u * np.exp(u * u * (tau[2] * 0.5)))
159 |
160 |
161 | def igmm(y: np.ndarray, tol: float = 1e-6, max_iter: int = 100):
162 | # Infer mu, sigma, delta using IGMM in Alg.2, Appendix C
163 | if np.std(y) < _EPS:
164 | return np.mean(y), np.std(y).clip(_EPS), 0
165 | delta0 = delta_init(y)
166 | tau1 = (np.median(y), np.std(y) * (1. - 2. * delta0) ** 0.75, delta0)
167 | for k in range(max_iter):
168 | tau0 = tau1
169 | z = (y - tau1[0]) / tau1[1]
170 | delta1 = delta_gmm(z)
171 | x = tau0[0] + tau1[1] * w_d(z, delta1)
172 | mu1, sigma1 = np.mean(x), np.std(x)
173 | tau1 = (mu1, sigma1, delta1)
174 |
175 | if np.linalg.norm(np.array(tau1) - np.array(tau0)) < tol:
176 | break
177 | else:
178 | if k == max_iter - 1:
179 | warnings.warn("Warning: No convergence after %d iterations. Increase max_iter." % max_iter)
180 | return tau1
181 |
182 |
183 | def delta_gmm(z):
184 | # Alg. 1, Appendix C
185 | delta0 = delta_init(z)
186 |
187 | def func(q):
188 | u = w_d(z, np.exp(q))
189 | if not np.all(np.isfinite(u)):
190 | return 0.
191 | else:
192 | k = kurtosis(u, fisher=True, bias=False)**2
193 | if not np.isfinite(k) or k > 1e10:
194 | return 1e10
195 | else:
196 | return k
197 |
198 | res = optimize.fmin(func, np.log(delta0), disp=0)
199 | return np.around(np.exp(res[-1]), 6)
200 |
201 |
202 | def delta_init(z):
203 | gamma = kurtosis(z, fisher=False, bias=False)
204 | with np.errstate(all='ignore'):
205 | delta0 = np.clip(1. / 66 * (np.sqrt(66 * gamma - 162.) - 6.), 0.01, 0.48)
206 | if not np.isfinite(delta0):
207 | delta0 = 0.01
208 | return delta0
209 |
210 |
211 | if __name__ == '__main__':
212 | # Command line interface
213 | # Sample commands:
214 | # python gaussianize.py test_data.csv
215 | import csv
216 | import sys, os
217 | import traceback
218 | from optparse import OptionParser, OptionGroup
219 |
220 | parser = OptionParser(usage="usage: %prog [options] data_file.csv \n"
221 | "It is assumed that the first row and first column of the data CSV file are labels.\n"
222 | "Use options to indicate otherwise.")
223 | group = OptionGroup(parser, "Input Data Format Options")
224 | group.add_option("-c", "--no_column_names",
225 | action="store_true", dest="nc", default=False,
226 | help="We assume the top row is variable names for each column. "
227 | "This flag says that data starts on the first row and gives a "
228 | "default numbering scheme to the variables (1,2,3...).")
229 | group.add_option("-r", "--no_row_names",
230 | action="store_true", dest="nr", default=False,
231 | help="We assume the first column is a label or index for each sample. "
232 | "This flag says that data starts on the first column.")
233 | group.add_option("-d", "--delimiter",
234 | action="store", dest="delimiter", type="string", default=",",
235 | help="Separator between entries in the data, default is ','.")
236 | parser.add_option_group(group)
237 |
238 | group = OptionGroup(parser, "Transform Options")
239 | group.add_option("-s", "--strategy",
240 | action="store", dest="strategy", type="string", default="lambert",
241 | help="Strategy.")
242 | parser.add_option_group(group)
243 |
244 | group = OptionGroup(parser, "Output Options")
245 | group.add_option("-o", "--output",
246 | action="store", dest="output", type="string", default="gaussian_output.csv",
247 | help="Where to store gaussianized data.")
248 | group.add_option("-q", "--qqplots",
249 | action="store_true", dest="q", default=False,
250 | help="Produce qq plots for each variable before and after transform.")
251 | parser.add_option_group(group)
252 |
253 | (options, args) = parser.parse_args()
254 | if not len(args) == 1:
255 | warnings.warn("Run with '-h' option for usage help.")
256 | sys.exit()
257 |
258 | #Load data from csv file
259 | filename = args[0]
260 | with open(filename, 'rU') as csvfile:
261 | reader = csv.reader(csvfile, delimiter=" ") #options.delimiter)
262 | if options.nc:
263 | variable_names = None
264 | else:
265 | variable_names = reader.next()[(1 - options.nr):]
266 | sample_names = []
267 | data = []
268 | for row in reader:
269 | if options.nr:
270 | sample_names = None
271 | else:
272 | sample_names.append(row[0])
273 | data.append(row[(1 - options.nr):])
274 |
275 | print(len(data), data[0])
276 | try:
277 | for i in range(len(data)):
278 | data[i] = map(float, data[i])
279 | X = np.array(data, dtype=float) # Data matrix in numpy format
280 | except:
281 | raise ValueError("Incorrect data format.\nCheck that you've correctly specified options "
282 | "such as continuous or not, \nand if there is a header row or column.\n"
283 | "Run 'python gaussianize.py -h' option for help with options.")
284 | traceback.print_exc(file=sys.stdout)
285 | sys.exit()
286 |
287 | ks = []
288 | for xi in X.T:
289 | ks.append(kurtosis(xi))
290 | print(np.mean(np.array(ks) > 1))
291 | from matplotlib import pylab
292 | pylab.hist(ks, bins=30)
293 | pylab.xlabel('excess kurtosis')
294 | pylab.savefig('excess_kurtoses_all.png')
295 | pylab.clf()
296 | pylab.hist([k for k in ks if k < 2], bins=30)
297 | pylab.xlabel('excess kurtosis')
298 | pylab.savefig('excess_kurtoses_near_zero.png')
299 | print(np.argmax(ks))
300 | pdict = {}
301 | for k in np.argsort(- np.array(ks))[:50]:
302 | pylab.clf()
303 | p = np.argmax(X[:, k])
304 | pdict[p] = pdict.get(p, 0) + 1
305 | pylab.hist(X[:, k], bins=30)
306 | pylab.xlabel(variable_names[k])
307 | pylab.ylabel('Histogram of patients')
308 | pylab.savefig('high_kurtosis/'+variable_names[k] + '.png')
309 | print(pdict) # 203, 140 appear three times.
310 | sys.exit()
311 | out = Gaussianize(strategy=options.strategy)
312 | y = out.fit_transform(X)
313 | with open(options.output, 'w') as csvfile:
314 | writer = csv.writer(csvfile, delimiter=options.delimiter)
315 | if not options.nc:
316 | writer.writerow([""] * (1 - options.nr) + variable_names)
317 | for i, row in enumerate(y):
318 | if not options.nr:
319 | writer.writerow([sample_names[i]] + list(row))
320 | else:
321 | writer.writerow(row)
322 |
323 | if options.q:
324 | print('Making qq plots')
325 | prefix = options.output.split('.')[0]
326 | if not os.path.exists(prefix+'_q'):
327 | os.makedirs(prefix+'_q')
328 | out.qqplot(X, prefix=prefix + '_q/q')
--------------------------------------------------------------------------------
/tf_model.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "source": [
6 | "# TCN MODEL implemented in Tensor Flow"
7 | ],
8 | "metadata": {}
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "source": [
13 | "[Wiese et al., Quant GANs: Deep Generation of Financial Time Series, 2019](https://arxiv.org/abs/1907.06673)\n",
14 | "\n",
15 | "For both the generator and the discriminator we used TCNs with skip connections. Inside the TCN architecture temporal blocks were used as block modules. A temporal block consists of two dilated causal convolutions and two PReLUs (He et al., 2015) as activation functions. The primary benefit of using temporal blocks is to make the TCN more expressive by increasing the number of non-linear operations in each block module. A complete definition is given below.\n",
16 | "\n",
17 | "**Definition B.1 (Temporal block)**. Let $N_I, N_H, N_O ∈ \\Bbb{N}$ denote the input, hidden and output dimension and let $D,K ∈ \\mathbb{N}$ denote the dilation and the kernel size. Furthermore, let $w_1, w_2$ be two dilated causal convolutional layers with arguments $(N_I, N_H, K, D)$ and $(N_H,N_O,K,D)$ respectively and\n",
18 | "let $φ_1, φ_2 : \\mathbb{R} → \\mathbb{R}$ be two PReLUs. The function $f : \\mathbb{R}^{N_I×(2D(K−1)+1)} → \\mathbb{R}^{N_O}$ defined by\n",
19 | "$$f(X) = φ_2 ◦ w_2 ◦ φ_1 ◦ w_1(X)$$\n",
20 | "is called temporal block with arguments $(N_I,N_H,N_O,K,D)$.\n",
21 | "\n",
22 | "The TCN architecture used for the generator and the discriminator in the pure TCN and C-SVNN model is illustrated in Table 3. Table 4 shows the input, hidden and output dimensions of the different models. Here, G abbreviates the generator and D the discriminator. Note that for all models, except the generator of the C-SVNN, the hidden dimension was set to eighty. The kernel size of each temporal block, except the first one, was two. Each TCN modeled a RFS of 127."
23 | ],
24 | "metadata": {}
25 | },
26 | {
27 | "cell_type": "markdown",
28 | "source": [
29 | "\n",
38 | "Table 3
\n",
39 | "\n",
40 | "\n",
41 | " \n",
42 | " | Module Name | \n",
43 | " Arguments | \n",
44 | "
\n",
45 | "\n",
46 | "\n",
47 | " \n",
48 | " | Temporal block 1 | \n",
49 | " (NI, NH, NH, 1, 1) | \n",
50 | "
\n",
51 | " \n",
52 | " | Temporal block 2 | \n",
53 | " (NI, NH, NH, 2, 1) | \n",
54 | "
\n",
55 | " \n",
56 | " | Temporal block 3 | \n",
57 | " (NI, NH, NH, 2, 2) | \n",
58 | "
\n",
59 | " \n",
60 | " | Temporal block 4 | \n",
61 | " (NI, NH, NH, 2, 4) | \n",
62 | "
\n",
63 | " \n",
64 | " | Temporal block 5 | \n",
65 | " (NI, NH, NH, 2, 8) | \n",
66 | "
\n",
67 | " \n",
68 | " | Temporal block 6 | \n",
69 | " (NI, NH, NH, 2, 16) | \n",
70 | "
\n",
71 | " \n",
72 | " | Temporal block 7 | \n",
73 | " (NI, NH, NH, 2, 32) | \n",
74 | "
\n",
75 | " \n",
76 | " | 1 x 1 Convolution | \n",
77 | " (NH, NO, 1, 1) | \n",
78 | "
\n",
79 | "\n",
80 | "
"
81 | ],
82 | "metadata": {}
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "source": [
87 | "\n",
95 | "Table 4
\n",
96 | "\n",
97 | "\n",
98 | " \n",
99 | " | Models | \n",
100 | " PureTCN-G | \n",
101 | " Pure TCN-D
| \n",
102 | " C-SVNN-G | \n",
103 | " C-SVNN_D | \n",
104 | "
\n",
105 | "\n",
106 | "\n",
107 | " \n",
108 | " | NI | \n",
109 | " 3 | \n",
110 | " 1 | \n",
111 | " 3 | \n",
112 | " 1 | \n",
113 | "
\n",
114 | " \n",
115 | " | NH | \n",
116 | " 80 | \n",
117 | " 80 | \n",
118 | " 50
| \n",
119 | " 80 | \n",
120 | "
\n",
121 | " \n",
122 | " | NO | \n",
123 | " 1 | \n",
124 | " 1 | \n",
125 | " 2 | \n",
126 | " 1 | \n",
127 | "
\n",
128 | "\n",
129 | "
"
130 | ],
131 | "metadata": {}
132 | },
133 | {
134 | "cell_type": "code",
135 | "execution_count": 1,
136 | "source": [
137 | "import os\n",
138 | "if 'COLAB_GPU' in os.environ:\n",
139 | "\t!pip install tensorflow-addons\n",
140 | "\n",
141 | "import numpy as np\n",
142 | "from tensorflow.keras.layers import PReLU, Conv1D, Add, Input, Cropping2D, Concatenate, Lambda\n",
143 | "from tensorflow.keras.models import Model\n",
144 | "from tensorflow.compat.v1.keras.layers import BatchNormalization\n",
145 | "from tensorflow_addons.layers import SpectralNormalization\n",
146 | "\n",
147 | "fixed_filters = 80\n",
148 | "receptive_field_size = 127\n",
149 | "block_size = 2\n",
150 | "\n",
151 | "def add_temporal_block(previous, skip, kernel_size, dilation, cropping):\n",
152 | " \"\"\"Creates a temporal block.\n",
153 | " Args:\n",
154 | " previous (tensorflow.keras.layers.Layer): previous layer to attach to on standard path.\n",
155 | " skip (tensorflow.keras.layers.Layer): skip layer to attach to on the skip path. Use None for intiation.\n",
156 | " kernel_size (int): kernel size along temporal axis of convolution layers within the temporal block.\n",
157 | " dilation (int): dilation of convolution layers along temporal axis within the temporal block.\n",
158 | " Returns:\n",
159 | " tuple of tensorflow.keras.layers.Layer: Output layers belonging to (normal path, skip path).\n",
160 | " \"\"\"\n",
161 | " print(f\"kernel_size: {kernel_size} dilation: {dilation}, fixed_filters: {fixed_filters} cropping: {cropping}\")\n",
162 | " # Identity mapping so that we hold a valid reference to previous\n",
163 | " block = Lambda(lambda x: x)(previous)\n",
164 | "\n",
165 | " for _ in range(block_size):\n",
166 | " convs = []\n",
167 | " prev_block= Lambda(lambda x: x)(block)\n",
168 | " convs.append(SpectralNormalization(Conv1D(fixed_filters, (kernel_size), dilation_rate=(dilation,)))(block))\n",
169 | "\n",
170 | " if len(convs) > 1:\n",
171 | " block = Concatenate(axis=1)(convs) \n",
172 | " else:\n",
173 | " block = convs[0]\n",
174 | " block = BatchNormalization(axis=3, momentum=.9, epsilon=1e-4, renorm=True, renorm_momentum=.9)(block)\n",
175 | " block = PReLU(shared_axes=[2, 3])(block)\n",
176 | "\n",
177 | " # As layer output gets smaller, we need to crop less before putting output\n",
178 | " # on the skip path. We cannot infer this directly as tensor shapes may be variable.\n",
179 | " drop_left = block_size * (kernel_size - 1) * dilation\n",
180 | " cropping += drop_left\n",
181 | "\n",
182 | " if skip is None:\n",
183 | " previous = Conv1D(fixed_filters, 1)(previous)\n",
184 | " # add residual connections\n",
185 | " out = Add()([Cropping2D(cropping=((0,0), (drop_left, 0)))(previous), block])\n",
186 | " # crop from left side for skip path\n",
187 | " skip_out = Cropping2D(cropping=((0,0), (receptive_field_size-1-cropping, 0)))(out)\n",
188 | " # add current output with 1x1 conv to skip path\n",
189 | " if skip is not None:\n",
190 | " skip_out = Add()([skip, SpectralNormalization(Conv1D(fixed_filters, 1))(skip_out)])\n",
191 | " else:\n",
192 | " skip_out = SpectralNormalization(Conv1D(fixed_filters, 1))(skip_out)\n",
193 | "\n",
194 | " return PReLU(shared_axes=[2, 3])(out), skip_out, cropping\n",
195 | "\t\n",
196 | "def TCN(input_dim):\n",
197 | " \"\"\"Causal temporal convolutional network with skip connections.\n",
198 | " This network uses 1D convolutions in order to model multiple timeseries co-dependency.\n",
199 | " Args:\n",
200 | " input_dim (list): Input dimension of the shape (timesteps, number of features). Timesteps may be None for variable length timeseries. \n",
201 | " Returns:\n",
202 | " tensorflow.keras.models.Model: a non-compiled keras model.\n",
203 | " \"\"\" \n",
204 | " # Number of dilations in order to use for the temporal blocks.\n",
205 | " dilations = np.array([1, 2, 4, 8, 16, 32])\n",
206 | "\n",
207 | " input_dim.insert(0,1)\n",
208 | " print(f\"input_dim: {input_dim}\")\n",
209 | " input_layer = Input(shape=input_dim)\n",
210 | " cropping = 0\n",
211 | " assert (sum(dilations) * block_size + 1) == 127, \"Paper specifies receptive field size should be 127\"\n",
212 | " \n",
213 | " prev_layer, skip_layer, _ = add_temporal_block(input_layer, None, 1, 1, cropping)\n",
214 | " \n",
215 | " for dilation in dilations:\n",
216 | " prev_layer, skip_layer, cropping = add_temporal_block(prev_layer, skip_layer, 2, dilation, cropping)\n",
217 | "\n",
218 | " output_layer = PReLU(shared_axes=[2, 3])(skip_layer)\n",
219 | " output_layer = SpectralNormalization(Conv1D(fixed_filters, kernel_size=1))(output_layer)\n",
220 | " output_layer = PReLU(shared_axes=[2, 3])(output_layer)\n",
221 | " output_layer = SpectralNormalization(Conv1D(1, kernel_size=1))(output_layer)\n",
222 | "\n",
223 | " return Model(input_layer, output_layer)\n",
224 | "\n",
225 | "generator = TCN([None, 3])\n",
226 | "discriminator = TCN([receptive_field_size, 1])\n",
227 | "\n"
228 | ],
229 | "outputs": [
230 | {
231 | "output_type": "error",
232 | "ename": "ModuleNotFoundError",
233 | "evalue": "No module named 'tensorflow'",
234 | "traceback": [
235 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
236 | "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
237 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlayers\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mPReLU\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mConv1D\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAdd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mInput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCropping2D\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mConcatenate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mLambda\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlayers\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBatchNormalization\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow_addons\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlayers\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSpectralNormalization\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
238 | "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'tensorflow'"
239 | ]
240 | }
241 | ],
242 | "metadata": {}
243 | },
244 | {
245 | "cell_type": "code",
246 | "execution_count": null,
247 | "source": [],
248 | "outputs": [],
249 | "metadata": {}
250 | }
251 | ],
252 | "metadata": {
253 | "orig_nbformat": 4,
254 | "language_info": {
255 | "name": "python",
256 | "version": "3.8.8",
257 | "mimetype": "text/x-python",
258 | "codemirror_mode": {
259 | "name": "ipython",
260 | "version": 3
261 | },
262 | "pygments_lexer": "ipython3",
263 | "nbconvert_exporter": "python",
264 | "file_extension": ".py"
265 | },
266 | "kernelspec": {
267 | "name": "python3",
268 | "display_name": "Python 3.8.8 64-bit ('base': conda)"
269 | },
270 | "interpreter": {
271 | "hash": "d89b3f520990f67813a536e0845046cd8eba1f701f32f0e9331279df485a6ae1"
272 | }
273 | },
274 | "nbformat": 4,
275 | "nbformat_minor": 2
276 | }
--------------------------------------------------------------------------------
/data/SP500andShanghaiSE.csv:
--------------------------------------------------------------------------------
1 | Date,Open,High,Low,Close,Adj Close,Volume
2 | 2022-11-04,3766.979980,3796.340088,3708.840088,3770.550049,3770.550049,5400180000
3 | 2022-11-07,3780.709961,3813.949951,3764.699951,3806.800049,3806.800049,4341620000
4 | 2022-11-08,3817.020020,3859.399902,3786.280029,3828.110107,3828.110107,4607640000
5 | 2022-11-09,3810.939941,3818.199951,3744.219971,3748.570068,3748.570068,4645010000
6 | 2022-11-10,3859.889893,3958.330078,3859.889893,3956.370117,3956.370117,5781260000
7 | 2022-11-11,3963.719971,4001.479980,3944.820068,3992.929932,3992.929932,5593310000
8 | 2022-11-14,3977.969971,4008.969971,3956.399902,3957.250000,3957.250000,4561930000
9 | 2022-11-15,4006.409912,4028.840088,3953.169922,3991.729980,3991.729980,5015310000
10 | 2022-11-16,3976.820068,3983.090088,3954.340088,3958.790039,3958.790039,4165320000
11 | 2022-11-17,3919.260010,3954.330078,3906.540039,3946.560059,3946.560059,4051780000
12 | 2022-11-18,3966.389893,3979.889893,3935.979980,3965.340088,3965.340088,4037360000
13 | 2022-11-21,3956.229980,3962.000000,3933.340088,3949.939941,3949.939941,3850690000
14 | 2022-11-22,3965.510010,4005.879883,3956.879883,4003.580078,4003.580078,3887990000
15 | 2022-11-23,4000.300049,4033.780029,3998.659912,4027.260010,4027.260010,3279720000
16 | 2022-11-25,4023.340088,4034.020020,4020.760010,4026.120117,4026.120117,1706460000
17 | 2022-11-28,4005.360107,4012.270020,3955.770020,3963.939941,3963.939941,3615430000
18 | 2022-11-29,3964.189941,3976.770020,3937.649902,3957.629883,3957.629883,3546040000
19 | 2022-11-30,3957.179932,4080.110107,3938.580078,4080.110107,4080.110107,6579360000
20 | 2022-12-01,4087.139893,4100.509766,4050.870117,4076.570068,4076.570068,4527130000
21 | 2022-12-02,4040.169922,4080.479980,4026.629883,4071.699951,4071.699951,4012620000
22 | 2022-12-05,4052.020020,4052.449951,3984.489990,3998.840088,3998.840088,4280820000
23 | 2022-12-06,3996.629883,4001.510010,3918.389893,3941.260010,3941.260010,4368380000
24 | 2022-12-07,3933.280029,3957.570068,3922.679932,3933.919922,3933.919922,4118050000
25 | 2022-12-08,3947.790039,3974.189941,3935.830078,3963.510010,3963.510010,4006900000
26 | 2022-12-09,3954.169922,3977.020020,3933.040039,3934.379883,3934.379883,3888260000
27 | 2022-12-12,3939.290039,3990.709961,3935.300049,3990.560059,3990.560059,3904130000
28 | 2022-12-13,4069.379883,4100.959961,3993.030029,4019.649902,4019.649902,5079360000
29 | 2022-12-14,4015.540039,4053.760010,3965.649902,3995.320068,3995.320068,4472340000
30 | 2022-12-15,3958.370117,3958.370117,3879.449951,3895.750000,3895.750000,4493900000
31 | 2022-12-16,3890.909912,3890.909912,3827.909912,3852.360107,3852.360107,7493660000
32 | 2022-12-19,3853.790039,3854.860107,3800.040039,3817.659912,3817.659912,3969610000
33 | 2022-12-20,3810.469971,3838.239990,3795.620117,3821.620117,3821.620117,3985370000
34 | 2022-12-21,3839.489990,3889.820068,3839.489990,3878.439941,3878.439941,3775200000
35 | 2022-12-22,3853.260010,3853.260010,3764.489990,3822.389893,3822.389893,3956950000
36 | 2022-12-23,3815.110107,3845.800049,3797.010010,3844.820068,3844.820068,2819280000
37 | 2022-12-27,3843.340088,3846.649902,3813.219971,3829.250000,3829.250000,3030300000
38 | 2022-12-28,3829.560059,3848.320068,3780.780029,3783.219971,3783.219971,3083520000
39 | 2022-12-29,3805.449951,3858.189941,3805.449951,3849.280029,3849.280029,3003680000
40 | 2022-12-30,3829.060059,3839.850098,3800.340088,3839.500000,3839.500000,2979870000
41 | 2023-01-03,3853.290039,3878.459961,3794.330078,3824.139893,3824.139893,3959140000
42 | 2023-01-04,3840.360107,3873.159912,3815.770020,3852.969971,3852.969971,4414080000
43 | 2023-01-05,3839.739990,3839.739990,3802.419922,3808.100098,3808.100098,3893450000
44 | 2023-01-06,3823.370117,3906.189941,3809.560059,3895.080078,3895.080078,3923560000
45 | 2023-01-09,3910.820068,3950.570068,3890.419922,3892.090088,3892.090088,4311770000
46 | 2023-01-10,3888.570068,3919.830078,3877.290039,3919.250000,3919.250000,3851030000
47 | 2023-01-11,3932.350098,3970.070068,3928.540039,3969.610107,3969.610107,4303360000
48 | 2023-01-12,3977.570068,3997.760010,3937.560059,3983.169922,3983.169922,4440260000
49 | 2023-01-13,3960.600098,4003.949951,3947.669922,3999.090088,3999.090088,3939700000
50 | 2023-01-17,3999.280029,4015.389893,3984.570068,3990.969971,3990.969971,4235560000
51 | 2023-01-18,4002.250000,4014.159912,3926.590088,3928.860107,3928.860107,4298710000
52 | 2023-01-19,3911.840088,3922.939941,3885.540039,3898.850098,3898.850098,3991500000
53 | 2023-01-20,3909.040039,3972.959961,3897.860107,3972.610107,3972.610107,4013360000
54 | 2023-01-23,3978.139893,4039.310059,3971.639893,4019.810059,4019.810059,3945210000
55 | 2023-01-24,4001.739990,4023.919922,3989.790039,4016.949951,4016.949951,3320430000
56 | 2023-01-25,3982.709961,4019.550049,3949.060059,4016.219971,4016.219971,3724020000
57 | 2023-01-26,4036.080078,4061.570068,4013.290039,4060.429932,4060.429932,3809590000
58 | 2023-01-27,4053.719971,4094.209961,4048.699951,4070.560059,4070.560059,3907760000
59 | 2023-01-30,4049.270020,4063.850098,4015.550049,4017.770020,4017.770020,3802000000
60 | 2023-01-31,4020.850098,4077.159912,4020.439941,4076.600098,4076.600098,4679320000
61 | 2023-02-01,4070.070068,4148.950195,4037.199951,4119.209961,4119.209961,4856930000
62 | 2023-02-02,4158.680176,4195.439941,4141.879883,4179.759766,4179.759766,5624360000
63 | 2023-02-03,4136.689941,4182.359863,4123.359863,4136.479980,4136.479980,4694510000
64 | 2023-02-06,4119.569824,4124.629883,4093.379883,4111.080078,4111.080078,4114240000
65 | 2023-02-07,4105.350098,4176.540039,4088.389893,4164.000000,4164.000000,4355860000
66 | 2023-02-08,4153.470215,4156.850098,4111.669922,4117.859863,4117.859863,4029820000
67 | 2023-02-09,4144.250000,4156.229980,4069.669922,4081.500000,4081.500000,4270200000
68 | 2023-02-10,4068.919922,4094.360107,4060.790039,4090.459961,4090.459961,3891520000
69 | 2023-02-13,4096.620117,4138.899902,4092.669922,4137.290039,4137.290039,3448620000
70 | 2023-02-14,4126.700195,4159.770020,4095.010010,4136.129883,4136.129883,3929200000
71 | 2023-02-15,4119.500000,4148.109863,4103.979980,4147.600098,4147.600098,4075980000
72 | 2023-02-16,4114.750000,4136.540039,4089.489990,4090.409912,4090.409912,4143660000
73 | 2023-02-17,4077.389893,4081.510010,4047.949951,4079.090088,4079.090088,4045480000
74 | 2023-02-21,4052.350098,4052.350098,3995.189941,3997.340088,3997.340088,4121590000
75 | 2023-02-22,4001.830078,4017.370117,3976.899902,3991.050049,3991.050049,4079320000
76 | 2023-02-23,4018.600098,4028.300049,3969.189941,4012.320068,4012.320068,3952940000
77 | 2023-02-24,3973.239990,3978.250000,3943.080078,3970.040039,3970.040039,3877700000
78 | 2023-02-27,3992.360107,4018.050049,3973.550049,3982.239990,3982.239990,3836950000
79 | 2023-02-28,3977.189941,3997.500000,3968.979980,3970.149902,3970.149902,5043400000
80 | 2023-03-01,3963.340088,3971.729980,3939.050049,3951.389893,3951.389893,4249480000
81 | 2023-03-02,3938.679932,3990.840088,3928.159912,3981.350098,3981.350098,4244900000
82 | 2023-03-03,3998.020020,4048.290039,3995.169922,4045.639893,4045.639893,4084730000
83 | 2023-03-06,4055.149902,4078.489990,4044.610107,4048.419922,4048.419922,4000870000
84 | 2023-03-07,4048.260010,4050.000000,3980.310059,3986.370117,3986.370117,3922500000
85 | 2023-03-08,3987.550049,4000.409912,3969.760010,3992.010010,3992.010010,3535570000
86 | 2023-03-09,3998.659912,4017.810059,3908.699951,3918.320068,3918.320068,4445260000
87 | 2023-03-10,3912.770020,3934.050049,3846.320068,3861.590088,3861.590088,5518190000
88 | 2023-03-13,3835.120117,3905.050049,3808.860107,3855.760010,3855.760010,6558020000
89 | 2023-03-14,3894.010010,3937.290039,3873.629883,3919.290039,3919.290039,5665870000
90 | 2023-03-15,3876.739990,3894.260010,3838.239990,3891.929932,3891.929932,6594010000
91 | 2023-03-16,3878.929932,3964.459961,3864.110107,3960.280029,3960.280029,5695790000
92 | 2023-03-17,3958.689941,3958.909912,3901.270020,3916.639893,3916.639893,9354280000
93 | 2023-03-20,3917.469971,3956.620117,3916.889893,3951.570068,3951.570068,5347140000
94 | 2023-03-21,3975.889893,4009.080078,3971.189941,4002.870117,4002.870117,4920240000
95 | 2023-03-22,4002.040039,4039.489990,3936.169922,3936.969971,3936.969971,4533010000
96 | 2023-03-23,3959.209961,4007.659912,3919.050049,3948.719971,3948.719971,4991600000
97 | 2023-03-24,3939.209961,3972.739990,3909.159912,3970.989990,3970.989990,4583970000
98 | 2023-03-27,3982.929932,4003.830078,3970.489990,3977.530029,3977.530029,4233540000
99 | 2023-03-28,3974.129883,3979.199951,3951.530029,3971.270020,3971.270020,4014600000
100 | 2023-03-29,3999.530029,4030.590088,3999.530029,4027.810059,4027.810059,4145250000
101 | 2023-03-30,4046.739990,4057.850098,4032.100098,4050.830078,4050.830078,3930860000
102 | 2023-03-31,4056.179932,4110.750000,4056.179932,4109.310059,4109.310059,4525120000
103 | 2023-04-03,4102.200195,4127.660156,4098.790039,4124.509766,4124.509766,4234700000
104 | 2023-04-04,4128.029785,4133.129883,4086.870117,4100.600098,4100.600098,4227800000
105 | 2023-04-05,4094.500000,4099.689941,4072.560059,4090.379883,4090.379883,3968020000
106 | 2023-04-06,4081.149902,4107.319824,4069.840088,4105.020020,4105.020020,3486690000
107 | 2023-04-10,4085.199951,4109.500000,4072.550049,4109.109863,4109.109863,3423650000
108 | 2023-04-11,4110.290039,4124.259766,4102.609863,4108.939941,4108.939941,3665830000
109 | 2023-04-12,4121.720215,4134.370117,4086.939941,4091.949951,4091.949951,3633120000
110 | 2023-04-13,4100.040039,4150.259766,4099.399902,4146.220215,4146.220215,3596590000
111 | 2023-04-14,4140.109863,4163.189941,4113.200195,4137.640137,4137.640137,3575690000
112 | 2023-04-17,4137.169922,4151.720215,4123.180176,4151.319824,4151.319824,3611180000
113 | 2023-04-18,4164.259766,4169.479980,4140.359863,4154.870117,4154.870117,3536640000
114 | 2023-04-19,4139.330078,4162.569824,4134.490234,4154.520020,4154.520020,3572560000
115 | 2023-04-20,4130.479980,4148.569824,4114.569824,4129.790039,4129.790039,3772080000
116 | 2023-04-21,4132.140137,4138.020020,4113.859863,4133.520020,4133.520020,3611750000
117 | 2023-04-24,4132.069824,4142.410156,4117.770020,4137.040039,4137.040039,3290940000
118 | 2023-04-25,4126.430176,4126.430176,4071.379883,4071.629883,4071.629883,3978640000
119 | 2023-04-26,4087.780029,4089.669922,4049.350098,4055.989990,4055.989990,3837030000
120 | 2023-04-27,4075.290039,4138.240234,4075.290039,4135.350098,4135.350098,3750550000
121 | 2023-04-28,4129.629883,4170.060059,4127.180176,4169.479980,4169.479980,4087800000
122 | 2023-05-01,4166.790039,4186.919922,4164.120117,4167.870117,4167.870117,3321370000
123 | 2023-05-02,4164.100098,4164.100098,4089.719971,4119.580078,4119.580078,4486130000
124 | 2023-05-03,4122.250000,4148.299805,4088.860107,4090.750000,4090.750000,4246510000
125 | 2023-05-04,4082.550049,4082.610107,4048.280029,4061.219971,4061.219971,4920090000
126 | 2023-05-05,4084.729980,4147.020020,4084.729980,4136.250000,4136.250000,4186270000
127 | 2023-05-08,4136.979980,4142.299805,4123.810059,4138.120117,4138.120117,3641640000
128 | 2023-05-09,4124.250000,4130.350098,4116.649902,4119.169922,4119.169922,3810140000
129 | 2023-05-10,4143.740234,4154.279785,4098.919922,4137.640137,4137.640137,4057160000
130 | 2023-05-11,4132.240234,4132.799805,4109.290039,4130.620117,4130.620117,3752900000
131 | 2023-05-12,4138.540039,4143.740234,4099.120117,4124.080078,4124.080078,3533740000
132 | 2023-05-15,4126.649902,4141.250000,4110.270020,4136.279785,4136.279785,3562170000
133 | 2023-05-16,4127.950195,4135.540039,4109.859863,4109.899902,4109.899902,3654200000
134 | 2023-05-17,4122.850098,4164.669922,4113.620117,4158.770020,4158.770020,4039080000
135 | 2023-05-18,4157.680176,4202.200195,4153.500000,4198.049805,4198.049805,3980500000
136 | 2023-05-19,4204.149902,4212.910156,4180.200195,4191.979980,4191.979980,4041900000
137 | 2023-05-22,4190.779785,4209.220215,4179.680176,4192.629883,4192.629883,3728520000
138 | 2023-05-23,4176.799805,4185.680176,4142.540039,4145.580078,4145.580078,4155320000
139 | 2023-05-24,4132.959961,4132.959961,4103.979980,4115.240234,4115.240234,3739160000
140 | 2023-05-25,4155.709961,4165.740234,4129.729980,4151.279785,4151.279785,4147760000
141 | 2023-05-26,4156.160156,4212.870117,4156.160156,4205.450195,4205.450195,3715460000
142 | 2023-05-30,4226.709961,4231.100098,4192.180176,4205.520020,4205.520020,4228510000
143 | 2023-05-31,4190.740234,4195.439941,4166.149902,4179.830078,4179.830078,5980670000
144 | 2023-06-01,4183.029785,4232.430176,4171.640137,4221.020020,4221.020020,4391860000
145 | 2023-06-02,4241.009766,4290.669922,4241.009766,4282.370117,4282.370117,4454200000
146 | 2023-06-05,4282.990234,4299.279785,4266.819824,4273.790039,4273.790039,3813290000
147 | 2023-06-06,4271.339844,4288.330078,4263.089844,4283.850098,4283.850098,3996560000
148 | 2023-06-07,4285.470215,4299.189941,4263.959961,4267.520020,4267.520020,4537800000
149 | 2023-06-08,4268.689941,4298.009766,4261.069824,4293.930176,4293.930176,3826740000
150 | 2023-06-09,4304.879883,4322.620117,4291.700195,4298.859863,4298.859863,3786510000
151 | 2023-06-12,4308.319824,4340.129883,4304.370117,4338.930176,4338.930176,3945670000
152 | 2023-06-13,4352.609863,4375.370117,4349.310059,4369.009766,4369.009766,4275400000
153 | 2023-06-14,4366.290039,4391.819824,4337.850098,4372.589844,4372.589844,4252110000
154 | 2023-06-15,4365.330078,4439.200195,4362.600098,4425.839844,4425.839844,4176690000
155 | 2023-06-16,4440.950195,4448.470215,4407.439941,4409.589844,4409.589844,6848600000
156 | 2023-06-20,4396.109863,4400.149902,4367.189941,4388.709961,4388.709961,4055790000
157 | 2023-06-21,4380.009766,4386.220215,4360.140137,4365.689941,4365.689941,3709330000
158 | 2023-06-22,4355.399902,4382.250000,4351.819824,4381.890137,4381.890137,3511000000
159 | 2023-06-23,4354.169922,4366.549805,4341.339844,4348.330078,4348.330078,6053620000
160 | 2023-06-26,4344.839844,4362.060059,4328.080078,4328.819824,4328.819824,3415030000
161 | 2023-06-27,4337.359863,4384.419922,4335.000000,4378.410156,4378.410156,3573500000
162 | 2023-06-28,4367.479980,4390.350098,4360.220215,4376.859863,4376.859863,3739330000
163 | 2023-06-29,4374.939941,4398.390137,4371.970215,4396.439941,4396.439941,3696660000
164 | 2023-06-30,4422.439941,4458.479980,4422.439941,4450.379883,4450.379883,3923450000
165 | 2023-07-03,4450.479980,4456.459961,4442.290039,4455.589844,4455.589844,2034280000
166 | 2023-07-05,4442.040039,4454.060059,4436.609863,4446.819824,4446.819824,3482620000
167 | 2023-07-06,4422.620117,4422.620117,4385.049805,4411.589844,4411.589844,3682020000
168 | 2023-07-07,4404.540039,4440.390137,4397.399902,4398.950195,4398.950195,3630480000
169 | 2023-07-10,4394.229980,4412.600098,4389.919922,4409.529785,4409.529785,3429600000
170 | 2023-07-11,4415.549805,4443.640137,4408.459961,4439.259766,4439.259766,3624220000
171 | 2023-07-12,4467.689941,4488.339844,4463.229980,4472.160156,4472.160156,3920290000
172 | 2023-07-13,4491.500000,4517.379883,4489.359863,4510.040039,4510.040039,3839530000
173 | 2023-07-14,4514.609863,4527.759766,4499.560059,4505.419922,4505.419922,3647450000
174 | 2023-07-17,4508.859863,4532.850098,4504.899902,4522.790039,4522.790039,3538240000
175 | 2023-07-18,4521.779785,4562.299805,4514.589844,4554.979980,4554.979980,4090010000
176 | 2023-07-19,4563.870117,4578.430176,4557.479980,4565.720215,4565.720215,4115670000
177 | 2023-07-20,4554.379883,4564.740234,4527.560059,4534.870117,4534.870117,3761770000
178 | 2023-07-21,4550.160156,4555.000000,4535.790039,4536.339844,4536.339844,3570190000
179 | 2023-07-24,4543.390137,4563.410156,4541.290039,4554.640137,4554.640137,3856250000
180 | 2023-07-25,4555.189941,4580.620117,4552.419922,4567.459961,4567.459961,3812470000
181 | 2023-07-26,4558.959961,4582.470215,4547.580078,4566.750000,4566.750000,3990290000
182 | 2023-07-27,4598.259766,4607.069824,4528.560059,4537.410156,4537.410156,4553210000
183 | 2023-07-28,4565.750000,4590.160156,4564.009766,4582.229980,4582.229980,3981010000
184 | 2023-07-31,4584.819824,4594.220215,4573.140137,4588.959961,4588.959961,4503600000
185 | 2023-08-01,4578.830078,4584.620117,4567.529785,4576.729980,4576.729980,4042370000
186 | 2023-08-02,4550.930176,4550.930176,4505.750000,4513.390137,4513.390137,4270710000
187 | 2023-08-03,4494.270020,4519.490234,4485.540039,4501.890137,4501.890137,4149120000
188 | 2023-08-04,4513.959961,4540.339844,4474.549805,4478.029785,4478.029785,4143310000
189 | 2023-08-07,4491.580078,4519.839844,4491.149902,4518.439941,4518.439941,3493920000
190 | 2023-08-08,4498.029785,4503.310059,4464.390137,4499.379883,4499.379883,3884910000
191 | 2023-08-09,4501.569824,4502.439941,4461.330078,4467.709961,4467.709961,3803100000
192 | 2023-08-10,4487.160156,4527.370117,4457.919922,4468.830078,4468.830078,4504370000
193 | 2023-08-11,4450.689941,4476.229980,4443.979980,4464.049805,4464.049805,3753290000
194 | 2023-08-14,4458.129883,4490.330078,4453.439941,4489.720215,4489.720215,3896410000
195 | 2023-08-15,4478.870117,4478.870117,4432.189941,4437.859863,4437.859863,3832250000
196 | 2023-08-16,4433.790039,4449.950195,4403.549805,4404.330078,4404.330078,3753910000
197 | 2023-08-17,4416.319824,4421.169922,4364.830078,4370.359863,4370.359863,3943700000
198 | 2023-08-18,4344.879883,4381.819824,4335.310059,4369.709961,4369.709961,3940400000
199 | 2023-08-21,4380.279785,4407.549805,4360.299805,4399.770020,4399.770020,3726850000
200 | 2023-08-22,4415.330078,4418.589844,4382.770020,4387.549805,4387.549805,3522760000
201 | 2023-08-23,4396.439941,4443.180176,4396.439941,4436.009766,4436.009766,3837270000
202 | 2023-08-24,4455.160156,4458.299805,4375.549805,4376.310059,4376.310059,3723470000
203 | 2023-08-25,4389.379883,4418.459961,4356.290039,4405.709961,4405.709961,3296180000
204 | 2023-08-28,4426.029785,4439.560059,4414.979980,4433.310059,4433.310059,2957230000
205 | 2023-08-29,4432.750000,4500.140137,4431.680176,4497.629883,4497.629883,3354820000
206 | 2023-08-30,4500.339844,4521.649902,4493.589844,4514.870117,4514.870117,3064110000
207 | 2023-08-31,4517.009766,4532.259766,4507.390137,4507.660156,4507.660156,3946360000
208 | 2023-09-01,4530.600098,4541.250000,4501.350098,4515.770020,4515.770020,3246260000
209 | 2023-09-05,4510.060059,4514.290039,4496.009766,4496.830078,4496.830078,3526250000
210 | 2023-09-06,4490.350098,4490.350098,4442.379883,4465.479980,4465.479980,3418850000
211 | 2023-09-07,4434.549805,4457.810059,4430.459961,4451.140137,4451.140137,3763760000
212 | 2023-09-08,4451.299805,4473.529785,4448.379883,4457.490234,4457.490234,3259290000
213 | 2023-09-11,4480.979980,4490.770020,4467.890137,4487.459961,4487.459961,3369920000
214 | 2023-09-12,4473.270020,4487.109863,4456.830078,4461.899902,4461.899902,3435740000
215 | 2023-09-13,4462.649902,4479.390137,4453.520020,4467.439941,4467.439941,3529430000
216 | 2023-09-14,4487.779785,4511.990234,4478.689941,4505.100098,4505.100098,3648720000
217 | 2023-09-15,4497.979980,4497.979980,4447.209961,4450.319824,4450.319824,6932230000
218 | 2023-09-18,4445.129883,4466.359863,4442.109863,4453.529785,4453.529785,3161230000
219 | 2023-09-19,4445.410156,4449.850098,4416.609863,4443.950195,4443.950195,3614880000
220 | 2023-09-20,4452.810059,4461.029785,4401.379883,4402.200195,4402.200195,3308450000
221 | 2023-09-21,4374.359863,4375.700195,4329.169922,4330.000000,4330.000000,3662340000
222 | 2023-09-22,4341.740234,4357.399902,4316.490234,4320.060059,4320.060059,3349570000
223 | 2023-09-25,4310.620117,4338.509766,4302.700195,4337.439941,4337.439941,3195650000
224 | 2023-09-26,4312.879883,4313.009766,4265.979980,4273.529785,4273.529785,3472340000
225 | 2023-09-27,4282.629883,4292.069824,4238.629883,4274.509766,4274.509766,3875880000
226 | 2023-09-28,4269.649902,4317.270020,4264.379883,4299.700195,4299.700195,3846230000
227 | 2023-09-29,4328.180176,4333.149902,4274.859863,4288.049805,4288.049805,3865960000
228 | 2023-10-02,4284.520020,4300.580078,4260.209961,4288.390137,4288.390137,3938660000
229 | 2023-10-03,4269.750000,4281.149902,4216.450195,4229.450195,4229.450195,3953830000
230 | 2023-10-04,4233.830078,4268.500000,4220.479980,4263.750000,4263.750000,3777600000
231 | 2023-10-05,4259.310059,4267.129883,4225.910156,4258.189941,4258.189941,3581470000
232 | 2023-10-06,4234.790039,4324.100098,4219.549805,4308.500000,4308.500000,3902030000
233 | 2023-10-09,4289.020020,4341.729980,4283.790039,4335.660156,4335.660156,3174630000
234 | 2023-10-10,4339.750000,4385.459961,4339.640137,4358.240234,4358.240234,3520240000
235 | 2023-10-11,4366.589844,4378.640137,4345.339844,4376.950195,4376.950195,3601660000
236 | 2023-10-12,4380.939941,4385.850098,4325.430176,4349.609863,4349.609863,3713140000
237 | 2023-10-13,4360.490234,4377.100098,4311.970215,4327.779785,4327.779785,0
238 | 2023-10-16,4342.370117,4383.330078,4342.370117,4373.629883,4373.629883,3409960000
239 | 2023-10-17,4345.229980,4393.569824,4337.540039,4373.200195,4373.200195,3794850000
240 | 2023-10-18,4357.350098,4364.200195,4303.839844,4314.600098,4314.600098,3686030000
241 | 2023-10-19,4321.359863,4339.540039,4269.689941,4278.000000,4278.000000,3969730000
242 | 2023-10-20,4273.850098,4276.560059,4223.029785,4224.160156,4224.160156,4004030000
243 | 2023-10-23,4210.399902,4255.839844,4189.220215,4217.040039,4217.040039,3776100000
244 | 2023-10-24,4235.790039,4259.379883,4219.430176,4247.680176,4247.680176,3821820000
245 | 2023-10-25,4232.419922,4232.419922,4181.419922,4186.770020,4186.770020,3869370000
246 | 2023-10-26,4175.990234,4183.600098,4127.899902,4137.229980,4137.229980,4277640000
247 | 2023-10-27,4152.930176,4156.700195,4103.779785,4117.370117,4117.370117,4019500000
248 | 2023-10-30,4139.390137,4177.470215,4132.939941,4166.819824,4166.819824,3911140000
249 | 2023-10-31,4171.330078,4195.549805,4153.120117,4193.799805,4193.799805,4249470000
250 | 2023-11-01,4201.270020,4245.640137,4197.740234,4237.859863,4237.859863,4224900000
251 | 2023-11-02,4268.259766,4319.720215,4268.259766,4317.779785,4317.779785,4669780000
252 | 2023-11-03,4334.229980,4373.620117,4334.229980,4358.339844,4358.339844,4570960000
--------------------------------------------------------------------------------
/data/SP500_daily.csv:
--------------------------------------------------------------------------------
1 | Date,Close
2 | 2014-01-06,1826.77002
3 | 2014-01-07,1837.880005
4 | 2014-01-08,1837.48999
5 | 2014-01-09,1838.130005
6 | 2014-01-10,1842.369995
7 | 2014-01-13,1819.199951
8 | 2014-01-14,1838.880005
9 | 2014-01-15,1848.380005
10 | 2014-01-16,1845.890015
11 | 2014-01-17,1838.699951
12 | 2014-01-21,1843.800049
13 | 2014-01-22,1844.859985
14 | 2014-01-23,1828.459961
15 | 2014-01-24,1790.290039
16 | 2014-01-27,1781.560059
17 | 2014-01-28,1792.5
18 | 2014-01-29,1774.199951
19 | 2014-01-30,1794.189941
20 | 2014-01-31,1782.589966
21 | 2014-02-03,1741.890015
22 | 2014-02-04,1755.199951
23 | 2014-02-05,1751.640015
24 | 2014-02-06,1773.430054
25 | 2014-02-07,1797.02002
26 | 2014-02-10,1799.839966
27 | 2014-02-11,1819.75
28 | 2014-02-12,1819.26001
29 | 2014-02-13,1829.829956
30 | 2014-02-14,1838.630005
31 | 2014-02-18,1840.76001
32 | 2014-02-19,1828.75
33 | 2014-02-20,1839.780029
34 | 2014-02-21,1836.25
35 | 2014-02-24,1847.609985
36 | 2014-02-25,1845.119995
37 | 2014-02-26,1845.160034
38 | 2014-02-27,1854.290039
39 | 2014-02-28,1859.449951
40 | 2014-03-03,1845.72998
41 | 2014-03-04,1873.910034
42 | 2014-03-05,1873.810059
43 | 2014-03-06,1877.030029
44 | 2014-03-07,1878.040039
45 | 2014-03-10,1877.170044
46 | 2014-03-11,1867.630005
47 | 2014-03-12,1868.199951
48 | 2014-03-13,1846.339966
49 | 2014-03-14,1841.130005
50 | 2014-03-17,1858.829956
51 | 2014-03-18,1872.25
52 | 2014-03-19,1860.77002
53 | 2014-03-20,1872.01001
54 | 2014-03-21,1866.52002
55 | 2014-03-24,1857.439941
56 | 2014-03-25,1865.619995
57 | 2014-03-26,1852.560059
58 | 2014-03-27,1849.040039
59 | 2014-03-28,1857.619995
60 | 2014-03-31,1872.339966
61 | 2014-04-01,1885.52002
62 | 2014-04-02,1890.900024
63 | 2014-04-03,1888.77002
64 | 2014-04-04,1865.089966
65 | 2014-04-07,1845.040039
66 | 2014-04-08,1851.959961
67 | 2014-04-09,1872.180054
68 | 2014-04-10,1833.079956
69 | 2014-04-11,1815.689941
70 | 2014-04-14,1830.609985
71 | 2014-04-15,1842.97998
72 | 2014-04-16,1862.310059
73 | 2014-04-17,1864.849976
74 | 2014-04-21,1871.890015
75 | 2014-04-22,1879.550049
76 | 2014-04-23,1875.390015
77 | 2014-04-24,1878.609985
78 | 2014-04-25,1863.400024
79 | 2014-04-28,1869.430054
80 | 2014-04-29,1878.329956
81 | 2014-04-30,1883.949951
82 | 2014-05-01,1883.680054
83 | 2014-05-02,1881.140015
84 | 2014-05-05,1884.660034
85 | 2014-05-06,1867.719971
86 | 2014-05-07,1878.209961
87 | 2014-05-08,1875.630005
88 | 2014-05-09,1878.47998
89 | 2014-05-12,1896.650024
90 | 2014-05-13,1897.449951
91 | 2014-05-14,1888.530029
92 | 2014-05-15,1870.849976
93 | 2014-05-16,1877.859985
94 | 2014-05-19,1885.079956
95 | 2014-05-20,1872.829956
96 | 2014-05-21,1888.030029
97 | 2014-05-22,1892.48999
98 | 2014-05-23,1900.530029
99 | 2014-05-27,1911.910034
100 | 2014-05-28,1909.780029
101 | 2014-05-29,1920.030029
102 | 2014-05-30,1923.569946
103 | 2014-06-02,1924.969971
104 | 2014-06-03,1924.23999
105 | 2014-06-04,1927.880005
106 | 2014-06-05,1940.459961
107 | 2014-06-06,1949.439941
108 | 2014-06-09,1951.27002
109 | 2014-06-10,1950.790039
110 | 2014-06-11,1943.890015
111 | 2014-06-12,1930.109985
112 | 2014-06-13,1936.160034
113 | 2014-06-16,1937.780029
114 | 2014-06-17,1941.98999
115 | 2014-06-18,1956.97998
116 | 2014-06-19,1959.47998
117 | 2014-06-20,1962.869995
118 | 2014-06-23,1962.609985
119 | 2014-06-24,1949.97998
120 | 2014-06-25,1959.530029
121 | 2014-06-26,1957.219971
122 | 2014-06-27,1960.959961
123 | 2014-06-30,1960.22998
124 | 2014-07-01,1973.319946
125 | 2014-07-02,1974.619995
126 | 2014-07-03,1985.439941
127 | 2014-07-07,1977.650024
128 | 2014-07-08,1963.709961
129 | 2014-07-09,1972.829956
130 | 2014-07-10,1964.680054
131 | 2014-07-11,1967.569946
132 | 2014-07-14,1977.099976
133 | 2014-07-15,1973.280029
134 | 2014-07-16,1981.569946
135 | 2014-07-17,1958.119995
136 | 2014-07-18,1978.219971
137 | 2014-07-21,1973.630005
138 | 2014-07-22,1983.530029
139 | 2014-07-23,1987.01001
140 | 2014-07-24,1987.97998
141 | 2014-07-25,1978.339966
142 | 2014-07-28,1978.910034
143 | 2014-07-29,1969.949951
144 | 2014-07-30,1970.069946
145 | 2014-07-31,1930.670044
146 | 2014-08-01,1925.150024
147 | 2014-08-04,1938.98999
148 | 2014-08-05,1920.209961
149 | 2014-08-06,1920.23999
150 | 2014-08-07,1909.569946
151 | 2014-08-08,1931.589966
152 | 2014-08-11,1936.920044
153 | 2014-08-12,1933.75
154 | 2014-08-13,1946.719971
155 | 2014-08-14,1955.180054
156 | 2014-08-15,1955.060059
157 | 2014-08-18,1971.73999
158 | 2014-08-19,1981.599976
159 | 2014-08-20,1986.51001
160 | 2014-08-21,1992.369995
161 | 2014-08-22,1988.400024
162 | 2014-08-25,1997.920044
163 | 2014-08-26,2000.02002
164 | 2014-08-27,2000.119995
165 | 2014-08-28,1996.73999
166 | 2014-08-29,2003.369995
167 | 2014-09-02,2002.280029
168 | 2014-09-03,2000.719971
169 | 2014-09-04,1997.650024
170 | 2014-09-05,2007.709961
171 | 2014-09-08,2001.540039
172 | 2014-09-09,1988.439941
173 | 2014-09-10,1995.689941
174 | 2014-09-11,1997.449951
175 | 2014-09-12,1985.540039
176 | 2014-09-15,1984.130005
177 | 2014-09-16,1998.97998
178 | 2014-09-17,2001.569946
179 | 2014-09-18,2011.359985
180 | 2014-09-19,2010.400024
181 | 2014-09-22,1994.290039
182 | 2014-09-23,1982.77002
183 | 2014-09-24,1998.300049
184 | 2014-09-25,1965.98999
185 | 2014-09-26,1982.849976
186 | 2014-09-29,1977.800049
187 | 2014-09-30,1972.290039
188 | 2014-10-01,1946.160034
189 | 2014-10-02,1946.170044
190 | 2014-10-03,1967.900024
191 | 2014-10-06,1964.819946
192 | 2014-10-07,1935.099976
193 | 2014-10-08,1968.890015
194 | 2014-10-09,1928.209961
195 | 2014-10-10,1906.130005
196 | 2014-10-13,1874.73999
197 | 2014-10-14,1877.699951
198 | 2014-10-15,1862.48999
199 | 2014-10-16,1862.76001
200 | 2014-10-17,1886.76001
201 | 2014-10-20,1904.01001
202 | 2014-10-21,1941.280029
203 | 2014-10-22,1927.109985
204 | 2014-10-23,1950.819946
205 | 2014-10-24,1964.579956
206 | 2014-10-27,1961.630005
207 | 2014-10-28,1985.050049
208 | 2014-10-29,1982.300049
209 | 2014-10-30,1994.650024
210 | 2014-10-31,2018.050049
211 | 2014-11-03,2017.810059
212 | 2014-11-04,2012.099976
213 | 2014-11-05,2023.569946
214 | 2014-11-06,2031.209961
215 | 2014-11-07,2031.920044
216 | 2014-11-10,2038.26001
217 | 2014-11-11,2039.680054
218 | 2014-11-12,2038.25
219 | 2014-11-13,2039.329956
220 | 2014-11-14,2039.819946
221 | 2014-11-17,2041.319946
222 | 2014-11-18,2051.800049
223 | 2014-11-19,2048.719971
224 | 2014-11-20,2052.75
225 | 2014-11-21,2063.5
226 | 2014-11-24,2069.409912
227 | 2014-11-25,2067.030029
228 | 2014-11-26,2072.830078
229 | 2014-11-28,2067.560059
230 | 2014-12-01,2053.439941
231 | 2014-12-02,2066.550049
232 | 2014-12-03,2074.330078
233 | 2014-12-04,2071.919922
234 | 2014-12-05,2075.370117
235 | 2014-12-08,2060.310059
236 | 2014-12-09,2059.820068
237 | 2014-12-10,2026.140015
238 | 2014-12-11,2035.329956
239 | 2014-12-12,2002.329956
240 | 2014-12-15,1989.630005
241 | 2014-12-16,1972.73999
242 | 2014-12-17,2012.890015
243 | 2014-12-18,2061.22998
244 | 2014-12-19,2070.649902
245 | 2014-12-22,2078.540039
246 | 2014-12-23,2082.169922
247 | 2014-12-24,2081.879883
248 | 2014-12-26,2088.77002
249 | 2014-12-29,2090.570068
250 | 2014-12-30,2080.350098
251 | 2014-12-31,2058.899902
252 | 2015-01-02,2058.199951
253 | 2015-01-05,2020.579956
254 | 2015-01-06,2002.609985
255 | 2015-01-07,2025.900024
256 | 2015-01-08,2062.139893
257 | 2015-01-09,2044.810059
258 | 2015-01-12,2028.26001
259 | 2015-01-13,2023.030029
260 | 2015-01-14,2011.27002
261 | 2015-01-15,1992.670044
262 | 2015-01-16,2019.420044
263 | 2015-01-20,2022.550049
264 | 2015-01-21,2032.119995
265 | 2015-01-22,2063.149902
266 | 2015-01-23,2051.820068
267 | 2015-01-26,2057.090088
268 | 2015-01-27,2029.550049
269 | 2015-01-28,2002.160034
270 | 2015-01-29,2021.25
271 | 2015-01-30,1994.98999
272 | 2015-02-02,2020.849976
273 | 2015-02-03,2050.030029
274 | 2015-02-04,2041.51001
275 | 2015-02-05,2062.52002
276 | 2015-02-06,2055.469971
277 | 2015-02-09,2046.73999
278 | 2015-02-10,2068.590088
279 | 2015-02-11,2068.530029
280 | 2015-02-12,2088.47998
281 | 2015-02-13,2096.98999
282 | 2015-02-17,2100.340088
283 | 2015-02-18,2099.679932
284 | 2015-02-19,2097.449951
285 | 2015-02-20,2110.300049
286 | 2015-02-23,2109.659912
287 | 2015-02-24,2115.47998
288 | 2015-02-25,2113.860107
289 | 2015-02-26,2110.73999
290 | 2015-02-27,2104.5
291 | 2015-03-02,2117.389893
292 | 2015-03-03,2107.780029
293 | 2015-03-04,2098.530029
294 | 2015-03-05,2101.040039
295 | 2015-03-06,2071.26001
296 | 2015-03-09,2079.429932
297 | 2015-03-10,2044.160034
298 | 2015-03-11,2040.23999
299 | 2015-03-12,2065.949951
300 | 2015-03-13,2053.399902
301 | 2015-03-16,2081.189941
302 | 2015-03-17,2074.280029
303 | 2015-03-18,2099.5
304 | 2015-03-19,2089.27002
305 | 2015-03-20,2108.100098
306 | 2015-03-23,2104.419922
307 | 2015-03-24,2091.5
308 | 2015-03-25,2061.050049
309 | 2015-03-26,2056.149902
310 | 2015-03-27,2061.02002
311 | 2015-03-30,2086.23999
312 | 2015-03-31,2067.889893
313 | 2015-04-01,2059.689941
314 | 2015-04-02,2066.959961
315 | 2015-04-06,2080.620117
316 | 2015-04-07,2076.330078
317 | 2015-04-08,2081.899902
318 | 2015-04-09,2091.179932
319 | 2015-04-10,2102.060059
320 | 2015-04-13,2092.429932
321 | 2015-04-14,2095.840088
322 | 2015-04-15,2106.629883
323 | 2015-04-16,2104.98999
324 | 2015-04-17,2081.179932
325 | 2015-04-20,2100.399902
326 | 2015-04-21,2097.290039
327 | 2015-04-22,2107.959961
328 | 2015-04-23,2112.929932
329 | 2015-04-24,2117.689941
330 | 2015-04-27,2108.919922
331 | 2015-04-28,2114.76001
332 | 2015-04-29,2106.850098
333 | 2015-04-30,2085.51001
334 | 2015-05-01,2108.290039
335 | 2015-05-04,2114.48999
336 | 2015-05-05,2089.459961
337 | 2015-05-06,2080.149902
338 | 2015-05-07,2088.0
339 | 2015-05-08,2116.100098
340 | 2015-05-11,2105.330078
341 | 2015-05-12,2099.120117
342 | 2015-05-13,2098.47998
343 | 2015-05-14,2121.100098
344 | 2015-05-15,2122.72998
345 | 2015-05-18,2129.199951
346 | 2015-05-19,2127.830078
347 | 2015-05-20,2125.850098
348 | 2015-05-21,2130.820068
349 | 2015-05-22,2126.060059
350 | 2015-05-26,2104.199951
351 | 2015-05-27,2123.47998
352 | 2015-05-28,2120.790039
353 | 2015-05-29,2107.389893
354 | 2015-06-01,2111.72998
355 | 2015-06-02,2109.600098
356 | 2015-06-03,2114.070068
357 | 2015-06-04,2095.840088
358 | 2015-06-05,2092.830078
359 | 2015-06-08,2079.280029
360 | 2015-06-09,2080.149902
361 | 2015-06-10,2105.199951
362 | 2015-06-11,2108.860107
363 | 2015-06-12,2094.110107
364 | 2015-06-15,2084.429932
365 | 2015-06-16,2096.290039
366 | 2015-06-17,2100.439941
367 | 2015-06-18,2121.23999
368 | 2015-06-19,2109.98999
369 | 2015-06-22,2122.850098
370 | 2015-06-23,2124.199951
371 | 2015-06-24,2108.580078
372 | 2015-06-25,2102.310059
373 | 2015-06-26,2101.48999
374 | 2015-06-29,2057.639893
375 | 2015-06-30,2063.110107
376 | 2015-07-01,2077.419922
377 | 2015-07-02,2076.780029
378 | 2015-07-06,2068.76001
379 | 2015-07-07,2081.340088
380 | 2015-07-08,2046.680054
381 | 2015-07-09,2051.310059
382 | 2015-07-10,2076.620117
383 | 2015-07-13,2099.600098
384 | 2015-07-14,2108.949951
385 | 2015-07-15,2107.399902
386 | 2015-07-16,2124.290039
387 | 2015-07-17,2126.639893
388 | 2015-07-20,2128.280029
389 | 2015-07-21,2119.209961
390 | 2015-07-22,2114.149902
391 | 2015-07-23,2102.149902
392 | 2015-07-24,2079.649902
393 | 2015-07-27,2067.639893
394 | 2015-07-28,2093.25
395 | 2015-07-29,2108.570068
396 | 2015-07-30,2108.629883
397 | 2015-07-31,2103.840088
398 | 2015-08-03,2098.040039
399 | 2015-08-04,2093.320068
400 | 2015-08-05,2099.840088
401 | 2015-08-06,2083.560059
402 | 2015-08-07,2077.570068
403 | 2015-08-10,2104.179932
404 | 2015-08-11,2084.070068
405 | 2015-08-12,2086.050049
406 | 2015-08-13,2083.389893
407 | 2015-08-14,2091.540039
408 | 2015-08-17,2102.439941
409 | 2015-08-18,2096.919922
410 | 2015-08-19,2079.610107
411 | 2015-08-20,2035.72998
412 | 2015-08-21,1970.890015
413 | 2015-08-24,1893.209961
414 | 2015-08-25,1867.609985
415 | 2015-08-26,1940.51001
416 | 2015-08-27,1987.660034
417 | 2015-08-28,1988.869995
418 | 2015-08-31,1972.180054
419 | 2015-09-01,1913.849976
420 | 2015-09-02,1948.859985
421 | 2015-09-03,1951.130005
422 | 2015-09-04,1921.219971
423 | 2015-09-08,1969.410034
424 | 2015-09-09,1942.040039
425 | 2015-09-10,1952.290039
426 | 2015-09-11,1961.050049
427 | 2015-09-14,1953.030029
428 | 2015-09-15,1978.089966
429 | 2015-09-16,1995.310059
430 | 2015-09-17,1990.199951
431 | 2015-09-18,1958.030029
432 | 2015-09-21,1966.969971
433 | 2015-09-22,1942.73999
434 | 2015-09-23,1938.76001
435 | 2015-09-24,1932.23999
436 | 2015-09-25,1931.339966
437 | 2015-09-28,1881.77002
438 | 2015-09-29,1884.089966
439 | 2015-09-30,1920.030029
440 | 2015-10-01,1923.819946
441 | 2015-10-02,1951.359985
442 | 2015-10-05,1987.050049
443 | 2015-10-06,1979.920044
444 | 2015-10-07,1995.829956
445 | 2015-10-08,2013.430054
446 | 2015-10-09,2014.890015
447 | 2015-10-12,2017.459961
448 | 2015-10-13,2003.689941
449 | 2015-10-14,1994.23999
450 | 2015-10-15,2023.859985
451 | 2015-10-16,2033.109985
452 | 2015-10-19,2033.660034
453 | 2015-10-20,2030.77002
454 | 2015-10-21,2018.939941
455 | 2015-10-22,2052.51001
456 | 2015-10-23,2075.149902
457 | 2015-10-26,2071.179932
458 | 2015-10-27,2065.889893
459 | 2015-10-28,2090.350098
460 | 2015-10-29,2089.409912
461 | 2015-10-30,2079.360107
462 | 2015-11-02,2104.050049
463 | 2015-11-03,2109.790039
464 | 2015-11-04,2102.310059
465 | 2015-11-05,2099.929932
466 | 2015-11-06,2099.199951
467 | 2015-11-09,2078.580078
468 | 2015-11-10,2081.719971
469 | 2015-11-11,2075.0
470 | 2015-11-12,2045.969971
471 | 2015-11-13,2023.040039
472 | 2015-11-16,2053.189941
473 | 2015-11-17,2050.439941
474 | 2015-11-18,2083.580078
475 | 2015-11-19,2081.23999
476 | 2015-11-20,2089.169922
477 | 2015-11-23,2086.590088
478 | 2015-11-24,2089.139893
479 | 2015-11-25,2088.870117
480 | 2015-11-27,2090.110107
481 | 2015-11-30,2080.409912
482 | 2015-12-01,2102.629883
483 | 2015-12-02,2079.51001
484 | 2015-12-03,2049.620117
485 | 2015-12-04,2091.689941
486 | 2015-12-07,2077.070068
487 | 2015-12-08,2063.590088
488 | 2015-12-09,2047.619995
489 | 2015-12-10,2052.22998
490 | 2015-12-11,2012.369995
491 | 2015-12-14,2021.939941
492 | 2015-12-15,2043.410034
493 | 2015-12-16,2073.070068
494 | 2015-12-17,2041.890015
495 | 2015-12-18,2005.550049
496 | 2015-12-21,2021.150024
497 | 2015-12-22,2038.969971
498 | 2015-12-23,2064.290039
499 | 2015-12-24,2060.98999
500 | 2015-12-28,2056.5
501 | 2015-12-29,2078.360107
502 | 2015-12-30,2063.360107
503 | 2015-12-31,2043.939941
504 | 2016-01-04,2012.660034
505 | 2016-01-05,2016.709961
506 | 2016-01-06,1990.26001
507 | 2016-01-07,1943.089966
508 | 2016-01-08,1922.030029
509 | 2016-01-11,1923.670044
510 | 2016-01-12,1938.680054
511 | 2016-01-13,1890.280029
512 | 2016-01-14,1921.839966
513 | 2016-01-15,1880.329956
514 | 2016-01-19,1881.329956
515 | 2016-01-20,1859.329956
516 | 2016-01-21,1868.98999
517 | 2016-01-22,1906.900024
518 | 2016-01-25,1877.079956
519 | 2016-01-26,1903.630005
520 | 2016-01-27,1882.949951
521 | 2016-01-28,1893.359985
522 | 2016-01-29,1940.23999
523 | 2016-02-01,1939.380005
524 | 2016-02-02,1903.030029
525 | 2016-02-03,1912.530029
526 | 2016-02-04,1915.449951
527 | 2016-02-05,1880.050049
528 | 2016-02-08,1853.439941
529 | 2016-02-09,1852.209961
530 | 2016-02-10,1851.859985
531 | 2016-02-11,1829.079956
532 | 2016-02-12,1864.780029
533 | 2016-02-16,1895.579956
534 | 2016-02-17,1926.819946
535 | 2016-02-18,1917.829956
536 | 2016-02-19,1917.780029
537 | 2016-02-22,1945.5
538 | 2016-02-23,1921.27002
539 | 2016-02-24,1929.800049
540 | 2016-02-25,1951.699951
541 | 2016-02-26,1948.050049
542 | 2016-02-29,1932.22998
543 | 2016-03-01,1978.349976
544 | 2016-03-02,1986.449951
545 | 2016-03-03,1993.400024
546 | 2016-03-04,1999.98999
547 | 2016-03-07,2001.76001
548 | 2016-03-08,1979.26001
549 | 2016-03-09,1989.26001
550 | 2016-03-10,1989.569946
551 | 2016-03-11,2022.189941
552 | 2016-03-14,2019.640015
553 | 2016-03-15,2015.930054
554 | 2016-03-16,2027.219971
555 | 2016-03-17,2040.589966
556 | 2016-03-18,2049.580078
557 | 2016-03-21,2051.600098
558 | 2016-03-22,2049.800049
559 | 2016-03-23,2036.709961
560 | 2016-03-24,2035.939941
561 | 2016-03-28,2037.050049
562 | 2016-03-29,2055.01001
563 | 2016-03-30,2063.949951
564 | 2016-03-31,2059.73999
565 | 2016-04-01,2072.780029
566 | 2016-04-04,2066.129883
567 | 2016-04-05,2045.170044
568 | 2016-04-06,2066.659912
569 | 2016-04-07,2041.910034
570 | 2016-04-08,2047.599976
571 | 2016-04-11,2041.98999
572 | 2016-04-12,2061.719971
573 | 2016-04-13,2082.419922
574 | 2016-04-14,2082.780029
575 | 2016-04-15,2080.72998
576 | 2016-04-18,2094.340088
577 | 2016-04-19,2100.800049
578 | 2016-04-20,2102.399902
579 | 2016-04-21,2091.47998
580 | 2016-04-22,2091.580078
581 | 2016-04-25,2087.790039
582 | 2016-04-26,2091.699951
583 | 2016-04-27,2095.149902
584 | 2016-04-28,2075.810059
585 | 2016-04-29,2065.300049
586 | 2016-05-02,2081.429932
587 | 2016-05-03,2063.370117
588 | 2016-05-04,2051.120117
589 | 2016-05-05,2050.629883
590 | 2016-05-06,2057.139893
591 | 2016-05-09,2058.689941
592 | 2016-05-10,2084.389893
593 | 2016-05-11,2064.459961
594 | 2016-05-12,2064.110107
595 | 2016-05-13,2046.609985
596 | 2016-05-16,2066.659912
597 | 2016-05-17,2047.209961
598 | 2016-05-18,2047.630005
599 | 2016-05-19,2040.040039
600 | 2016-05-20,2052.320068
601 | 2016-05-23,2048.040039
602 | 2016-05-24,2076.060059
603 | 2016-05-25,2090.540039
604 | 2016-05-26,2090.100098
605 | 2016-05-27,2099.060059
606 | 2016-05-31,2096.949951
607 | 2016-06-01,2099.330078
608 | 2016-06-02,2105.26001
609 | 2016-06-03,2099.129883
610 | 2016-06-06,2109.409912
611 | 2016-06-07,2112.129883
612 | 2016-06-08,2119.120117
613 | 2016-06-09,2115.47998
614 | 2016-06-10,2096.070068
615 | 2016-06-13,2079.060059
616 | 2016-06-14,2075.320068
617 | 2016-06-15,2071.5
618 | 2016-06-16,2077.98999
619 | 2016-06-17,2071.219971
620 | 2016-06-20,2083.25
621 | 2016-06-21,2088.899902
622 | 2016-06-22,2085.449951
623 | 2016-06-23,2113.320068
624 | 2016-06-24,2037.410034
625 | 2016-06-27,2000.540039
626 | 2016-06-28,2036.089966
627 | 2016-06-29,2070.77002
628 | 2016-06-30,2098.860107
629 | 2016-07-01,2102.949951
630 | 2016-07-05,2088.550049
631 | 2016-07-06,2099.72998
632 | 2016-07-07,2097.899902
633 | 2016-07-08,2129.899902
634 | 2016-07-11,2137.159912
635 | 2016-07-12,2152.139893
636 | 2016-07-13,2152.429932
637 | 2016-07-14,2163.75
638 | 2016-07-15,2161.73999
639 | 2016-07-18,2166.889893
640 | 2016-07-19,2163.780029
641 | 2016-07-20,2173.02002
642 | 2016-07-21,2165.169922
643 | 2016-07-22,2175.030029
644 | 2016-07-25,2168.47998
645 | 2016-07-26,2169.179932
646 | 2016-07-27,2166.580078
647 | 2016-07-28,2170.060059
648 | 2016-07-29,2173.600098
649 | 2016-08-01,2170.840088
650 | 2016-08-02,2157.030029
651 | 2016-08-03,2163.790039
652 | 2016-08-04,2164.25
653 | 2016-08-05,2182.870117
654 | 2016-08-08,2180.889893
655 | 2016-08-09,2181.73999
656 | 2016-08-10,2175.48999
657 | 2016-08-11,2185.790039
658 | 2016-08-12,2184.050049
659 | 2016-08-15,2190.149902
660 | 2016-08-16,2178.149902
661 | 2016-08-17,2182.219971
662 | 2016-08-18,2187.02002
663 | 2016-08-19,2183.870117
664 | 2016-08-22,2182.639893
665 | 2016-08-23,2186.899902
666 | 2016-08-24,2175.439941
667 | 2016-08-25,2172.469971
668 | 2016-08-26,2169.040039
669 | 2016-08-29,2180.379883
670 | 2016-08-30,2176.120117
671 | 2016-08-31,2170.949951
672 | 2016-09-01,2170.860107
673 | 2016-09-02,2179.97998
674 | 2016-09-06,2186.47998
675 | 2016-09-07,2186.159912
676 | 2016-09-08,2181.300049
677 | 2016-09-09,2127.810059
678 | 2016-09-12,2159.040039
679 | 2016-09-13,2127.02002
680 | 2016-09-14,2125.77002
681 | 2016-09-15,2147.26001
682 | 2016-09-16,2139.159912
683 | 2016-09-19,2139.120117
684 | 2016-09-20,2139.76001
685 | 2016-09-21,2163.120117
686 | 2016-09-22,2177.179932
687 | 2016-09-23,2164.689941
688 | 2016-09-26,2146.100098
689 | 2016-09-27,2159.929932
690 | 2016-09-28,2171.370117
691 | 2016-09-29,2151.129883
692 | 2016-09-30,2168.27002
693 | 2016-10-03,2161.199951
694 | 2016-10-04,2150.48999
695 | 2016-10-05,2159.72998
696 | 2016-10-06,2160.77002
697 | 2016-10-07,2153.73999
698 | 2016-10-10,2163.659912
699 | 2016-10-11,2136.72998
700 | 2016-10-12,2139.179932
701 | 2016-10-13,2132.550049
702 | 2016-10-14,2132.97998
703 | 2016-10-17,2126.5
704 | 2016-10-18,2139.600098
705 | 2016-10-19,2144.290039
706 | 2016-10-20,2141.340088
707 | 2016-10-21,2141.159912
708 | 2016-10-24,2151.330078
709 | 2016-10-25,2143.159912
710 | 2016-10-26,2139.429932
711 | 2016-10-27,2133.040039
712 | 2016-10-28,2126.409912
713 | 2016-10-31,2126.149902
714 | 2016-11-01,2111.719971
715 | 2016-11-02,2097.939941
716 | 2016-11-03,2088.659912
717 | 2016-11-04,2085.179932
718 | 2016-11-07,2131.52002
719 | 2016-11-08,2139.560059
720 | 2016-11-09,2163.26001
721 | 2016-11-10,2167.47998
722 | 2016-11-11,2164.449951
723 | 2016-11-14,2164.199951
724 | 2016-11-15,2180.389893
725 | 2016-11-16,2176.939941
726 | 2016-11-17,2187.120117
727 | 2016-11-18,2181.899902
728 | 2016-11-21,2198.179932
729 | 2016-11-22,2202.939941
730 | 2016-11-23,2204.719971
731 | 2016-11-25,2213.350098
732 | 2016-11-28,2201.719971
733 | 2016-11-29,2204.659912
734 | 2016-11-30,2198.810059
735 | 2016-12-01,2191.080078
736 | 2016-12-02,2191.949951
737 | 2016-12-05,2204.709961
738 | 2016-12-06,2212.22998
739 | 2016-12-07,2241.350098
740 | 2016-12-08,2246.189941
741 | 2016-12-09,2259.530029
742 | 2016-12-12,2256.959961
743 | 2016-12-13,2271.719971
744 | 2016-12-14,2253.280029
745 | 2016-12-15,2262.030029
746 | 2016-12-16,2258.070068
747 | 2016-12-19,2262.530029
748 | 2016-12-20,2270.76001
749 | 2016-12-21,2265.179932
750 | 2016-12-22,2260.959961
751 | 2016-12-23,2263.790039
752 | 2016-12-27,2268.879883
753 | 2016-12-28,2249.919922
754 | 2016-12-29,2249.26001
755 | 2016-12-30,2238.830078
756 | 2017-01-03,2257.830078
757 | 2017-01-04,2270.75
758 | 2017-01-05,2269.0
759 | 2017-01-06,2276.97998
760 | 2017-01-09,2268.899902
761 | 2017-01-10,2268.899902
762 | 2017-01-11,2275.320068
763 | 2017-01-12,2270.439941
764 | 2017-01-13,2274.639893
765 | 2017-01-17,2267.889893
766 | 2017-01-18,2271.889893
767 | 2017-01-19,2263.689941
768 | 2017-01-20,2271.310059
769 | 2017-01-23,2265.199951
770 | 2017-01-24,2280.070068
771 | 2017-01-25,2298.370117
772 | 2017-01-26,2296.679932
773 | 2017-01-27,2294.689941
774 | 2017-01-30,2280.899902
775 | 2017-01-31,2278.870117
776 | 2017-02-01,2279.550049
777 | 2017-02-02,2280.850098
778 | 2017-02-03,2297.419922
779 | 2017-02-06,2292.560059
780 | 2017-02-07,2293.080078
781 | 2017-02-08,2294.669922
782 | 2017-02-09,2307.870117
783 | 2017-02-10,2316.100098
784 | 2017-02-13,2328.25
785 | 2017-02-14,2337.580078
786 | 2017-02-15,2349.25
787 | 2017-02-16,2347.219971
788 | 2017-02-17,2351.159912
789 | 2017-02-21,2365.379883
790 | 2017-02-22,2362.820068
791 | 2017-02-23,2363.810059
792 | 2017-02-24,2367.340088
793 | 2017-02-27,2369.75
794 | 2017-02-28,2363.639893
795 | 2017-03-01,2395.959961
796 | 2017-03-02,2381.919922
797 | 2017-03-03,2383.120117
798 | 2017-03-06,2375.310059
799 | 2017-03-07,2368.389893
800 | 2017-03-08,2362.97998
801 | 2017-03-09,2364.870117
802 | 2017-03-10,2372.600098
803 | 2017-03-13,2373.469971
804 | 2017-03-14,2365.449951
805 | 2017-03-15,2385.26001
806 | 2017-03-16,2381.379883
807 | 2017-03-17,2378.25
808 | 2017-03-20,2373.469971
809 | 2017-03-21,2344.02002
810 | 2017-03-22,2348.449951
811 | 2017-03-23,2345.959961
812 | 2017-03-24,2343.97998
813 | 2017-03-27,2341.590088
814 | 2017-03-28,2358.570068
815 | 2017-03-29,2361.129883
816 | 2017-03-30,2368.060059
817 | 2017-03-31,2362.719971
818 | 2017-04-03,2358.840088
819 | 2017-04-04,2360.159912
820 | 2017-04-05,2352.949951
821 | 2017-04-06,2357.48999
822 | 2017-04-07,2355.540039
823 | 2017-04-10,2357.159912
824 | 2017-04-11,2353.780029
825 | 2017-04-12,2344.929932
826 | 2017-04-13,2328.949951
827 | 2017-04-17,2349.01001
828 | 2017-04-18,2342.189941
829 | 2017-04-19,2338.169922
830 | 2017-04-20,2355.840088
831 | 2017-04-21,2348.689941
832 | 2017-04-24,2374.149902
833 | 2017-04-25,2388.610107
834 | 2017-04-26,2387.449951
835 | 2017-04-27,2388.77002
836 | 2017-04-28,2384.199951
837 | 2017-05-01,2388.330078
838 | 2017-05-02,2391.169922
839 | 2017-05-03,2388.129883
840 | 2017-05-04,2389.52002
841 | 2017-05-05,2399.290039
842 | 2017-05-08,2399.379883
843 | 2017-05-09,2396.919922
844 | 2017-05-10,2399.629883
845 | 2017-05-11,2394.439941
846 | 2017-05-12,2390.899902
847 | 2017-05-15,2402.320068
848 | 2017-05-16,2400.669922
849 | 2017-05-17,2357.030029
850 | 2017-05-18,2365.719971
851 | 2017-05-19,2381.72998
852 | 2017-05-22,2394.02002
853 | 2017-05-23,2398.419922
854 | 2017-05-24,2404.389893
855 | 2017-05-25,2415.070068
856 | 2017-05-26,2415.820068
857 | 2017-05-30,2412.909912
858 | 2017-05-31,2411.800049
859 | 2017-06-01,2430.060059
860 | 2017-06-02,2439.070068
861 | 2017-06-05,2436.100098
862 | 2017-06-06,2429.330078
863 | 2017-06-07,2433.139893
864 | 2017-06-08,2433.790039
865 | 2017-06-09,2431.77002
866 | 2017-06-12,2429.389893
867 | 2017-06-13,2440.350098
868 | 2017-06-14,2437.919922
869 | 2017-06-15,2432.459961
870 | 2017-06-16,2433.149902
871 | 2017-06-19,2453.459961
872 | 2017-06-20,2437.030029
873 | 2017-06-21,2435.610107
874 | 2017-06-22,2434.5
875 | 2017-06-23,2438.300049
876 | 2017-06-26,2439.070068
877 | 2017-06-27,2419.379883
878 | 2017-06-28,2440.689941
879 | 2017-06-29,2419.699951
880 | 2017-06-30,2423.409912
881 | 2017-07-03,2429.01001
882 | 2017-07-05,2432.540039
883 | 2017-07-06,2409.75
884 | 2017-07-07,2425.179932
885 | 2017-07-10,2427.429932
886 | 2017-07-11,2425.530029
887 | 2017-07-12,2443.25
888 | 2017-07-13,2447.830078
889 | 2017-07-14,2459.27002
890 | 2017-07-17,2459.139893
891 | 2017-07-18,2460.610107
892 | 2017-07-19,2473.830078
893 | 2017-07-20,2473.449951
894 | 2017-07-21,2472.540039
895 | 2017-07-24,2469.909912
896 | 2017-07-25,2477.129883
897 | 2017-07-26,2477.830078
898 | 2017-07-27,2475.419922
899 | 2017-07-28,2472.100098
900 | 2017-07-31,2470.300049
901 | 2017-08-01,2476.350098
902 | 2017-08-02,2477.570068
903 | 2017-08-03,2472.159912
904 | 2017-08-04,2476.830078
905 | 2017-08-07,2480.909912
906 | 2017-08-08,2474.919922
907 | 2017-08-09,2474.02002
908 | 2017-08-10,2438.209961
909 | 2017-08-11,2441.320068
910 | 2017-08-14,2465.840088
911 | 2017-08-15,2464.610107
912 | 2017-08-16,2468.110107
913 | 2017-08-17,2430.01001
914 | 2017-08-18,2425.550049
915 | 2017-08-21,2428.370117
916 | 2017-08-22,2452.51001
917 | 2017-08-23,2444.040039
918 | 2017-08-24,2438.969971
919 | 2017-08-25,2443.050049
920 | 2017-08-28,2444.23999
921 | 2017-08-29,2446.300049
922 | 2017-08-30,2457.590088
923 | 2017-08-31,2471.649902
924 | 2017-09-01,2476.550049
925 | 2017-09-05,2457.850098
926 | 2017-09-06,2465.540039
927 | 2017-09-07,2465.100098
928 | 2017-09-08,2461.429932
929 | 2017-09-11,2488.110107
930 | 2017-09-12,2496.47998
931 | 2017-09-13,2498.370117
932 | 2017-09-14,2495.620117
933 | 2017-09-15,2500.22998
934 | 2017-09-18,2503.870117
935 | 2017-09-19,2506.649902
936 | 2017-09-20,2508.23999
937 | 2017-09-21,2500.600098
938 | 2017-09-22,2502.219971
939 | 2017-09-25,2496.659912
940 | 2017-09-26,2496.840088
941 | 2017-09-27,2507.040039
942 | 2017-09-28,2510.060059
943 | 2017-09-29,2519.360107
944 | 2017-10-02,2529.120117
945 | 2017-10-03,2534.580078
946 | 2017-10-04,2537.73999
947 | 2017-10-05,2552.070068
948 | 2017-10-06,2549.330078
949 | 2017-10-09,2544.72998
950 | 2017-10-10,2550.639893
951 | 2017-10-11,2555.23999
952 | 2017-10-12,2550.929932
953 | 2017-10-13,2553.169922
954 | 2017-10-16,2557.639893
955 | 2017-10-17,2559.360107
956 | 2017-10-18,2561.26001
957 | 2017-10-19,2562.100098
958 | 2017-10-20,2575.209961
959 | 2017-10-23,2564.97998
960 | 2017-10-24,2569.129883
961 | 2017-10-25,2557.149902
962 | 2017-10-26,2560.399902
963 | 2017-10-27,2581.070068
964 | 2017-10-30,2572.830078
965 | 2017-10-31,2575.26001
966 | 2017-11-01,2579.360107
967 | 2017-11-02,2579.850098
968 | 2017-11-03,2587.840088
969 | 2017-11-06,2591.129883
970 | 2017-11-07,2590.639893
971 | 2017-11-08,2594.379883
972 | 2017-11-09,2584.620117
973 | 2017-11-10,2582.300049
974 | 2017-11-13,2584.840088
975 | 2017-11-14,2578.870117
976 | 2017-11-15,2564.620117
977 | 2017-11-16,2585.639893
978 | 2017-11-17,2578.850098
979 | 2017-11-20,2582.139893
980 | 2017-11-21,2599.030029
981 | 2017-11-22,2597.080078
982 | 2017-11-24,2602.419922
983 | 2017-11-27,2601.419922
984 | 2017-11-28,2627.040039
985 | 2017-11-29,2626.070068
986 | 2017-11-30,2647.580078
987 | 2017-12-01,2642.219971
988 | 2017-12-04,2639.439941
989 | 2017-12-05,2629.570068
990 | 2017-12-06,2629.27002
991 | 2017-12-07,2636.97998
992 | 2017-12-08,2651.5
993 | 2017-12-11,2659.98999
994 | 2017-12-12,2664.110107
995 | 2017-12-13,2662.850098
996 | 2017-12-14,2652.01001
997 | 2017-12-15,2675.810059
998 | 2017-12-18,2690.159912
999 | 2017-12-19,2681.469971
1000 | 2017-12-20,2679.25
1001 | 2017-12-21,2684.570068
1002 | 2017-12-22,2683.340088
1003 | 2017-12-26,2680.5
1004 | 2017-12-27,2682.620117
1005 | 2017-12-28,2687.540039
1006 | 2017-12-29,2673.610107
1007 | 2018-01-02,2695.810059
1008 | 2018-01-03,2713.060059
1009 | 2018-01-04,2723.98999
1010 | 2018-01-05,2743.149902
1011 | 2018-01-08,2747.709961
1012 | 2018-01-09,2751.290039
1013 | 2018-01-10,2748.22998
1014 | 2018-01-11,2767.560059
1015 | 2018-01-12,2786.23999
1016 | 2018-01-16,2776.419922
1017 | 2018-01-17,2802.560059
1018 | 2018-01-18,2798.030029
1019 | 2018-01-19,2810.300049
1020 | 2018-01-22,2832.969971
1021 | 2018-01-23,2839.129883
1022 | 2018-01-24,2837.540039
1023 | 2018-01-25,2839.25
1024 | 2018-01-26,2872.870117
1025 | 2018-01-29,2853.530029
1026 | 2018-01-30,2822.429932
1027 | 2018-01-31,2823.810059
1028 | 2018-02-01,2821.97998
1029 | 2018-02-02,2762.129883
1030 | 2018-02-05,2648.939941
1031 | 2018-02-06,2695.139893
1032 | 2018-02-07,2681.659912
1033 | 2018-02-08,2581.0
1034 | 2018-02-09,2619.550049
1035 | 2018-02-12,2656.0
1036 | 2018-02-13,2662.939941
1037 | 2018-02-14,2698.629883
1038 | 2018-02-15,2731.199951
1039 | 2018-02-16,2732.219971
1040 | 2018-02-20,2716.26001
1041 | 2018-02-21,2701.330078
1042 | 2018-02-22,2703.959961
1043 | 2018-02-23,2747.300049
1044 | 2018-02-26,2779.600098
1045 | 2018-02-27,2744.280029
1046 | 2018-02-28,2713.830078
1047 | 2018-03-01,2677.669922
1048 | 2018-03-02,2691.25
1049 | 2018-03-05,2720.939941
1050 | 2018-03-06,2728.120117
1051 | 2018-03-07,2726.800049
1052 | 2018-03-08,2738.969971
1053 | 2018-03-09,2786.570068
1054 | 2018-03-12,2783.02002
1055 | 2018-03-13,2765.310059
1056 | 2018-03-14,2749.47998
1057 | 2018-03-15,2747.330078
1058 | 2018-03-16,2752.01001
1059 | 2018-03-19,2712.919922
1060 | 2018-03-20,2716.939941
1061 | 2018-03-21,2711.929932
1062 | 2018-03-22,2643.689941
1063 | 2018-03-23,2588.26001
1064 | 2018-03-26,2658.550049
1065 | 2018-03-27,2612.620117
1066 | 2018-03-28,2605.0
1067 | 2018-03-29,2640.870117
1068 | 2018-04-02,2581.879883
1069 | 2018-04-03,2614.449951
1070 | 2018-04-04,2644.689941
1071 | 2018-04-05,2662.840088
1072 | 2018-04-06,2604.469971
1073 | 2018-04-09,2613.159912
1074 | 2018-04-10,2656.870117
1075 | 2018-04-11,2642.189941
1076 | 2018-04-12,2663.98999
1077 | 2018-04-13,2656.300049
1078 | 2018-04-16,2677.840088
1079 | 2018-04-17,2706.389893
1080 | 2018-04-18,2708.639893
1081 | 2018-04-19,2693.129883
1082 | 2018-04-20,2670.139893
1083 | 2018-04-23,2670.290039
1084 | 2018-04-24,2634.560059
1085 | 2018-04-25,2639.399902
1086 | 2018-04-26,2666.939941
1087 | 2018-04-27,2669.909912
1088 | 2018-04-30,2648.050049
1089 | 2018-05-01,2654.800049
1090 | 2018-05-02,2635.669922
1091 | 2018-05-03,2629.72998
1092 | 2018-05-04,2663.419922
1093 | 2018-05-07,2672.629883
1094 | 2018-05-08,2671.919922
1095 | 2018-05-09,2697.790039
1096 | 2018-05-10,2723.070068
1097 | 2018-05-11,2727.719971
1098 | 2018-05-14,2730.129883
1099 | 2018-05-15,2711.449951
1100 | 2018-05-16,2722.459961
1101 | 2018-05-17,2720.129883
1102 | 2018-05-18,2712.969971
1103 | 2018-05-21,2733.01001
1104 | 2018-05-22,2724.439941
1105 | 2018-05-23,2733.290039
1106 | 2018-05-24,2727.76001
1107 | 2018-05-25,2721.330078
1108 | 2018-05-29,2689.860107
1109 | 2018-05-30,2724.01001
1110 | 2018-05-31,2705.27002
1111 | 2018-06-01,2734.620117
1112 | 2018-06-04,2746.870117
1113 | 2018-06-05,2748.800049
1114 | 2018-06-06,2772.350098
1115 | 2018-06-07,2770.370117
1116 | 2018-06-08,2779.030029
1117 | 2018-06-11,2782.0
1118 | 2018-06-12,2786.850098
1119 | 2018-06-13,2775.629883
1120 | 2018-06-14,2782.48999
1121 | 2018-06-15,2779.659912
1122 | 2018-06-18,2773.75
1123 | 2018-06-19,2762.590088
1124 | 2018-06-20,2767.320068
1125 | 2018-06-21,2749.76001
1126 | 2018-06-22,2754.879883
1127 | 2018-06-25,2717.070068
1128 | 2018-06-26,2723.060059
1129 | 2018-06-27,2699.629883
1130 | 2018-06-28,2716.310059
1131 | 2018-06-29,2718.370117
1132 | 2018-07-02,2726.709961
1133 | 2018-07-03,2713.219971
1134 | 2018-07-05,2736.610107
1135 | 2018-07-06,2759.820068
1136 | 2018-07-09,2784.169922
1137 | 2018-07-10,2793.840088
1138 | 2018-07-11,2774.02002
1139 | 2018-07-12,2798.290039
1140 | 2018-07-13,2801.310059
1141 | 2018-07-16,2798.429932
1142 | 2018-07-17,2809.550049
1143 | 2018-07-18,2815.620117
1144 | 2018-07-19,2804.48999
1145 | 2018-07-20,2801.830078
1146 | 2018-07-23,2806.97998
1147 | 2018-07-24,2820.399902
1148 | 2018-07-25,2846.070068
1149 | 2018-07-26,2837.439941
1150 | 2018-07-27,2818.820068
1151 | 2018-07-30,2802.600098
1152 | 2018-07-31,2816.290039
1153 | 2018-08-01,2813.360107
1154 | 2018-08-02,2827.219971
1155 | 2018-08-03,2840.350098
1156 | 2018-08-06,2850.399902
1157 | 2018-08-07,2858.449951
1158 | 2018-08-08,2857.699951
1159 | 2018-08-09,2853.580078
1160 | 2018-08-10,2833.280029
1161 | 2018-08-13,2821.929932
1162 | 2018-08-14,2839.959961
1163 | 2018-08-15,2818.370117
1164 | 2018-08-16,2840.689941
1165 | 2018-08-17,2850.129883
1166 | 2018-08-20,2857.050049
1167 | 2018-08-21,2862.959961
1168 | 2018-08-22,2861.820068
1169 | 2018-08-23,2856.97998
1170 | 2018-08-24,2874.689941
1171 | 2018-08-27,2896.73999
1172 | 2018-08-28,2897.52002
1173 | 2018-08-29,2914.040039
1174 | 2018-08-30,2901.129883
1175 | 2018-08-31,2901.52002
1176 | 2018-09-04,2896.719971
1177 | 2018-09-05,2888.600098
1178 | 2018-09-06,2878.050049
1179 | 2018-09-07,2871.679932
1180 | 2018-09-10,2877.129883
1181 | 2018-09-11,2887.889893
1182 | 2018-09-12,2888.919922
1183 | 2018-09-13,2904.179932
1184 | 2018-09-14,2904.97998
1185 | 2018-09-17,2888.800049
1186 | 2018-09-18,2904.310059
1187 | 2018-09-19,2907.949951
1188 | 2018-09-20,2930.75
1189 | 2018-09-21,2929.669922
1190 | 2018-09-24,2919.370117
1191 | 2018-09-25,2915.560059
1192 | 2018-09-26,2905.969971
1193 | 2018-09-27,2914.0
1194 | 2018-09-28,2913.97998
1195 | 2018-10-01,2924.590088
1196 | 2018-10-02,2923.429932
1197 | 2018-10-03,2925.51001
1198 | 2018-10-04,2901.610107
1199 | 2018-10-05,2885.570068
1200 | 2018-10-08,2884.429932
1201 | 2018-10-09,2880.340088
1202 | 2018-10-10,2785.679932
1203 | 2018-10-11,2728.370117
1204 | 2018-10-12,2767.129883
1205 | 2018-10-15,2750.790039
1206 | 2018-10-16,2809.919922
1207 | 2018-10-17,2809.209961
1208 | 2018-10-18,2768.780029
1209 | 2018-10-19,2767.780029
1210 | 2018-10-22,2755.879883
1211 | 2018-10-23,2740.689941
1212 | 2018-10-24,2656.100098
1213 | 2018-10-25,2705.570068
1214 | 2018-10-26,2658.689941
1215 | 2018-10-29,2641.25
1216 | 2018-10-30,2682.629883
1217 | 2018-10-31,2711.73999
1218 | 2018-11-01,2740.370117
1219 | 2018-11-02,2723.060059
1220 | 2018-11-05,2738.310059
1221 | 2018-11-06,2755.449951
1222 | 2018-11-07,2813.889893
1223 | 2018-11-08,2806.830078
1224 | 2018-11-09,2781.01001
1225 | 2018-11-12,2726.219971
1226 | 2018-11-13,2722.179932
1227 | 2018-11-14,2701.580078
1228 | 2018-11-15,2730.199951
1229 | 2018-11-16,2736.27002
1230 | 2018-11-19,2690.72998
1231 | 2018-11-20,2641.889893
1232 | 2018-11-21,2649.929932
1233 | 2018-11-23,2632.560059
1234 | 2018-11-26,2673.449951
1235 | 2018-11-27,2682.169922
1236 | 2018-11-28,2743.790039
1237 | 2018-11-29,2737.800049
1238 | 2018-11-30,2760.169922
1239 | 2018-12-03,2790.370117
1240 | 2018-12-04,2700.060059
1241 | 2018-12-06,2695.949951
1242 | 2018-12-07,2633.080078
1243 | 2018-12-10,2637.719971
1244 | 2018-12-11,2636.780029
1245 | 2018-12-12,2651.070068
1246 | 2018-12-13,2650.540039
1247 | 2018-12-14,2599.949951
1248 | 2018-12-17,2545.939941
1249 | 2018-12-18,2546.159912
1250 | 2018-12-19,2506.959961
1251 | 2018-12-20,2467.419922
1252 | 2018-12-21,2416.620117
1253 | 2018-12-24,2351.100098
1254 | 2018-12-26,2467.699951
1255 | 2018-12-27,2488.830078
1256 | 2018-12-28,2485.73999
1257 | 2018-12-31,2506.850098
1258 | 2019-01-02,2510.030029
1259 | 2019-01-03,2447.889893
1260 | 2019-01-04,2531.939941
1261 | 2019-01-07,2549.689941
1262 | 2019-01-08,2574.409912
1263 | 2019-01-09,2584.959961
1264 | 2019-01-10,2596.639893
1265 | 2019-01-11,2596.26001
1266 | 2019-01-14,2582.610107
1267 | 2019-01-15,2610.300049
1268 | 2019-01-16,2616.100098
1269 | 2019-01-17,2635.959961
1270 | 2019-01-18,2670.709961
1271 | 2019-01-22,2632.899902
1272 | 2019-01-23,2638.699951
1273 | 2019-01-24,2642.330078
1274 | 2019-01-25,2664.76001
1275 | 2019-01-28,2643.850098
1276 | 2019-01-29,2640.0
1277 | 2019-01-30,2681.050049
1278 | 2019-01-31,2704.100098
1279 | 2019-02-01,2706.530029
1280 | 2019-02-04,2724.870117
1281 | 2019-02-05,2737.699951
1282 | 2019-02-06,2731.610107
1283 | 2019-02-07,2706.050049
1284 | 2019-02-08,2707.879883
1285 | 2019-02-11,2709.800049
1286 | 2019-02-12,2744.72998
1287 | 2019-02-13,2753.030029
1288 | 2019-02-14,2745.72998
1289 | 2019-02-15,2775.600098
1290 | 2019-02-19,2779.76001
1291 | 2019-02-20,2784.699951
1292 | 2019-02-21,2774.879883
1293 | 2019-02-22,2792.669922
1294 | 2019-02-25,2796.110107
1295 | 2019-02-26,2793.899902
1296 | 2019-02-27,2792.379883
1297 | 2019-02-28,2784.48999
1298 | 2019-03-01,2803.689941
1299 | 2019-03-04,2792.810059
1300 | 2019-03-05,2789.649902
1301 | 2019-03-06,2771.449951
1302 | 2019-03-07,2748.929932
1303 | 2019-03-08,2743.070068
1304 | 2019-03-11,2783.300049
1305 | 2019-03-12,2791.52002
1306 | 2019-03-13,2810.919922
1307 | 2019-03-14,2808.47998
1308 | 2019-03-15,2822.47998
1309 | 2019-03-18,2832.939941
1310 | 2019-03-19,2832.570068
1311 | 2019-03-20,2824.22998
1312 | 2019-03-21,2854.879883
1313 | 2019-03-22,2800.709961
1314 | 2019-03-25,2798.360107
1315 | 2019-03-26,2818.459961
1316 | 2019-03-27,2805.370117
1317 | 2019-03-28,2815.439941
1318 | 2019-03-29,2834.399902
1319 | 2019-04-01,2867.189941
1320 | 2019-04-02,2867.23999
1321 | 2019-04-03,2873.399902
1322 | 2019-04-04,2879.389893
1323 | 2019-04-05,2892.73999
1324 | 2019-04-08,2895.77002
1325 | 2019-04-09,2878.199951
1326 | 2019-04-10,2888.209961
1327 | 2019-04-11,2888.320068
1328 | 2019-04-12,2907.409912
1329 | 2019-04-15,2905.580078
1330 | 2019-04-16,2907.060059
1331 | 2019-04-17,2900.449951
1332 | 2019-04-18,2905.030029
1333 | 2019-04-22,2907.969971
1334 | 2019-04-23,2933.679932
1335 | 2019-04-24,2927.25
1336 | 2019-04-25,2926.169922
1337 | 2019-04-26,2939.879883
1338 | 2019-04-29,2943.030029
1339 | 2019-04-30,2945.830078
1340 | 2019-05-01,2923.72998
1341 | 2019-05-02,2917.52002
1342 | 2019-05-03,2945.639893
1343 | 2019-05-06,2932.469971
1344 | 2019-05-07,2884.050049
1345 | 2019-05-08,2879.419922
1346 | 2019-05-09,2870.719971
1347 | 2019-05-10,2881.399902
1348 | 2019-05-13,2811.870117
1349 | 2019-05-14,2834.409912
1350 | 2019-05-15,2850.959961
1351 | 2019-05-16,2876.320068
1352 | 2019-05-17,2859.530029
1353 | 2019-05-20,2840.22998
1354 | 2019-05-21,2864.360107
1355 | 2019-05-22,2856.27002
1356 | 2019-05-23,2822.23999
1357 | 2019-05-24,2826.060059
1358 | 2019-05-28,2802.389893
1359 | 2019-05-29,2783.02002
1360 | 2019-05-30,2788.860107
1361 | 2019-05-31,2752.060059
1362 | 2019-06-03,2744.449951
1363 | 2019-06-04,2803.27002
1364 | 2019-06-05,2826.149902
1365 | 2019-06-06,2843.48999
1366 | 2019-06-07,2873.340088
1367 | 2019-06-10,2886.72998
1368 | 2019-06-11,2885.719971
1369 | 2019-06-12,2879.840088
1370 | 2019-06-13,2891.639893
1371 | 2019-06-14,2886.97998
1372 | 2019-06-17,2889.669922
1373 | 2019-06-18,2917.75
1374 | 2019-06-19,2926.459961
1375 | 2019-06-20,2954.179932
1376 | 2019-06-21,2950.459961
1377 | 2019-06-24,2945.350098
1378 | 2019-06-25,2917.379883
1379 | 2019-06-26,2913.780029
1380 | 2019-06-27,2924.919922
1381 | 2019-06-28,2941.76001
1382 | 2019-07-01,2964.330078
1383 | 2019-07-02,2973.01001
1384 | 2019-07-03,2995.820068
1385 | 2019-07-05,2990.409912
1386 | 2019-07-08,2975.949951
1387 | 2019-07-09,2979.629883
1388 | 2019-07-10,2993.070068
1389 | 2019-07-11,2999.909912
1390 | 2019-07-12,3013.77002
1391 | 2019-07-15,3014.300049
1392 | 2019-07-16,3004.040039
1393 | 2019-07-17,2984.419922
1394 | 2019-07-18,2995.110107
1395 | 2019-07-19,2976.610107
1396 | 2019-07-22,2985.030029
1397 | 2019-07-23,3005.469971
1398 | 2019-07-24,3019.560059
1399 | 2019-07-25,3003.669922
1400 | 2019-07-26,3025.860107
1401 | 2019-07-29,3020.969971
1402 | 2019-07-30,3013.179932
1403 | 2019-07-31,2980.379883
1404 | 2019-08-01,2953.560059
1405 | 2019-08-02,2932.050049
1406 | 2019-08-05,2844.73999
1407 | 2019-08-06,2881.77002
1408 | 2019-08-07,2883.97998
1409 | 2019-08-08,2938.090088
1410 | 2019-08-09,2918.649902
1411 | 2019-08-12,2882.699951
1412 | 2019-08-13,2926.320068
1413 | 2019-08-14,2840.600098
1414 | 2019-08-15,2847.600098
1415 | 2019-08-16,2888.679932
1416 | 2019-08-19,2923.649902
1417 | 2019-08-20,2900.51001
1418 | 2019-08-21,2924.429932
1419 | 2019-08-22,2922.949951
1420 | 2019-08-23,2847.110107
1421 | 2019-08-26,2878.379883
1422 | 2019-08-27,2869.159912
1423 | 2019-08-28,2887.939941
1424 | 2019-08-29,2924.580078
1425 | 2019-08-30,2926.459961
1426 | 2019-09-03,2906.27002
1427 | 2019-09-04,2937.780029
1428 | 2019-09-05,2976.0
1429 | 2019-09-06,2978.709961
1430 | 2019-09-09,2978.429932
1431 | 2019-09-10,2979.389893
1432 | 2019-09-11,3000.929932
1433 | 2019-09-12,3009.570068
1434 | 2019-09-13,3007.389893
1435 | 2019-09-16,2997.959961
1436 | 2019-09-17,3005.699951
1437 | 2019-09-18,3006.72998
1438 | 2019-09-19,3006.790039
1439 | 2019-09-20,2992.070068
1440 | 2019-09-23,2991.780029
1441 | 2019-09-24,2966.600098
1442 | 2019-09-25,2984.870117
1443 | 2019-09-26,2977.620117
1444 | 2019-09-27,2961.790039
1445 | 2019-09-30,2976.73999
1446 | 2019-10-01,2940.25
1447 | 2019-10-02,2887.610107
1448 | 2019-10-03,2910.629883
1449 | 2019-10-04,2952.01001
1450 | 2019-10-07,2938.790039
1451 | 2019-10-08,2893.060059
1452 | 2019-10-09,2919.399902
1453 | 2019-10-10,2938.129883
1454 | 2019-10-11,2970.27002
1455 | 2019-10-14,2966.149902
1456 | 2019-10-15,2995.679932
1457 | 2019-10-16,2989.689941
1458 | 2019-10-17,2997.949951
1459 | 2019-10-18,2986.199951
1460 | 2019-10-21,3006.719971
1461 | 2019-10-22,2995.98999
1462 | 2019-10-23,3004.52002
1463 | 2019-10-24,3010.290039
1464 | 2019-10-25,3022.550049
1465 | 2019-10-28,3039.419922
1466 | 2019-10-29,3036.889893
1467 | 2019-10-30,3046.77002
1468 | 2019-10-31,3037.560059
1469 | 2019-11-01,3066.909912
1470 | 2019-11-04,3078.27002
1471 | 2019-11-05,3074.620117
1472 | 2019-11-06,3076.780029
1473 | 2019-11-07,3085.179932
1474 | 2019-11-08,3093.080078
1475 | 2019-11-11,3087.01001
1476 | 2019-11-12,3091.840088
1477 | 2019-11-13,3094.040039
1478 | 2019-11-14,3096.629883
1479 | 2019-11-15,3120.459961
1480 | 2019-11-18,3122.030029
1481 | 2019-11-19,3120.179932
1482 | 2019-11-20,3108.459961
1483 | 2019-11-21,3103.540039
1484 | 2019-11-22,3110.290039
1485 | 2019-11-25,3133.639893
1486 | 2019-11-26,3140.52002
1487 | 2019-11-27,3153.629883
1488 | 2019-11-29,3140.97998
1489 | 2019-12-02,3113.870117
1490 | 2019-12-03,3093.199951
1491 | 2019-12-04,3112.76001
1492 | 2019-12-05,3117.429932
1493 | 2019-12-06,3145.909912
1494 | 2019-12-09,3135.959961
1495 | 2019-12-10,3132.52002
1496 | 2019-12-11,3141.629883
1497 | 2019-12-12,3168.570068
1498 | 2019-12-13,3168.800049
1499 | 2019-12-16,3191.449951
1500 | 2019-12-17,3192.52002
1501 | 2019-12-18,3191.139893
1502 | 2019-12-19,3205.370117
1503 | 2019-12-20,3221.219971
1504 | 2019-12-23,3224.01001
1505 | 2019-12-24,3223.379883
1506 | 2019-12-26,3239.909912
1507 | 2019-12-27,3240.02002
1508 | 2019-12-30,3221.290039
1509 | 2019-12-31,3230.780029
1510 | 2020-01-02,3257.850098
1511 | 2020-01-03,3234.850098
1512 | 2020-01-06,3246.280029
1513 | 2020-01-07,3237.179932
1514 | 2020-01-08,3253.050049
1515 | 2020-01-09,3274.699951
1516 | 2020-01-10,3265.350098
1517 | 2020-01-13,3288.129883
1518 | 2020-01-14,3283.149902
1519 | 2020-01-15,3289.290039
1520 | 2020-01-16,3316.810059
1521 | 2020-01-17,3329.620117
1522 | 2020-01-21,3320.790039
1523 | 2020-01-22,3321.75
1524 | 2020-01-23,3325.540039
1525 | 2020-01-24,3295.469971
1526 | 2020-01-27,3243.629883
1527 | 2020-01-28,3276.23999
1528 | 2020-01-29,3273.399902
1529 | 2020-01-30,3283.659912
1530 | 2020-01-31,3225.52002
1531 | 2020-02-03,3248.919922
1532 | 2020-02-04,3297.590088
1533 | 2020-02-05,3334.689941
1534 | 2020-02-06,3345.780029
1535 | 2020-02-07,3327.709961
1536 | 2020-02-10,3352.090088
1537 | 2020-02-11,3357.75
1538 | 2020-02-12,3379.449951
1539 | 2020-02-13,3373.939941
1540 | 2020-02-14,3380.159912
1541 | 2020-02-18,3370.290039
1542 | 2020-02-19,3386.149902
1543 | 2020-02-20,3373.22998
1544 | 2020-02-21,3337.75
1545 | 2020-02-24,3225.889893
1546 | 2020-02-25,3128.209961
1547 | 2020-02-26,3116.389893
1548 | 2020-02-27,2978.76001
1549 | 2020-02-28,2954.219971
1550 | 2020-03-02,3090.22998
1551 | 2020-03-03,3003.370117
1552 | 2020-03-04,3130.120117
1553 | 2020-03-05,3023.939941
1554 | 2020-03-06,2972.370117
1555 | 2020-03-09,2746.560059
1556 | 2020-03-10,2882.22998
1557 | 2020-03-11,2741.379883
1558 | 2020-03-12,2480.639893
1559 | 2020-03-13,2711.02002
1560 | 2020-03-16,2386.129883
1561 | 2020-03-17,2529.189941
1562 | 2020-03-18,2398.100098
1563 | 2020-03-19,2409.389893
1564 | 2020-03-20,2304.919922
1565 | 2020-03-23,2237.399902
1566 | 2020-03-24,2447.330078
1567 | 2020-03-25,2475.560059
1568 | 2020-03-26,2630.070068
1569 | 2020-03-27,2541.469971
1570 | 2020-03-30,2626.649902
1571 | 2020-03-31,2584.590088
1572 | 2020-04-01,2470.5
1573 | 2020-04-02,2526.899902
1574 | 2020-04-03,2488.649902
1575 | 2020-04-06,2663.679932
1576 | 2020-04-07,2659.409912
1577 | 2020-04-08,2749.97998
1578 | 2020-04-09,2789.820068
1579 | 2020-04-13,2761.629883
1580 | 2020-04-14,2846.060059
1581 | 2020-04-15,2783.360107
1582 | 2020-04-16,2799.550049
1583 | 2020-04-17,2874.560059
1584 | 2020-04-20,2823.159912
1585 | 2020-04-21,2736.560059
1586 | 2020-04-22,2799.310059
1587 | 2020-04-23,2797.800049
1588 | 2020-04-24,2836.73999
1589 | 2020-04-27,2878.47998
1590 | 2020-04-28,2863.389893
1591 | 2020-04-29,2939.51001
1592 | 2020-04-30,2912.429932
1593 | 2020-05-01,2830.709961
1594 | 2020-05-04,2842.73999
1595 | 2020-05-05,2868.439941
1596 | 2020-05-06,2848.419922
1597 | 2020-05-07,2881.189941
1598 | 2020-05-08,2929.800049
1599 | 2020-05-11,2930.189941
1600 | 2020-05-12,2870.120117
1601 | 2020-05-13,2820.0
1602 | 2020-05-14,2852.5
1603 | 2020-05-15,2863.699951
1604 | 2020-05-18,2953.909912
1605 | 2020-05-19,2922.939941
1606 | 2020-05-20,2971.610107
1607 | 2020-05-21,2948.51001
1608 | 2020-05-22,2955.449951
1609 | 2020-05-26,2991.77002
1610 | 2020-05-27,3036.129883
1611 | 2020-05-28,3029.72998
1612 | 2020-05-29,3044.310059
1613 | 2020-06-01,3055.72998
1614 | 2020-06-02,3080.820068
1615 | 2020-06-03,3122.870117
1616 | 2020-06-04,3112.350098
1617 | 2020-06-05,3193.929932
1618 | 2020-06-08,3232.389893
1619 | 2020-06-09,3207.179932
1620 | 2020-06-10,3190.139893
1621 | 2020-06-11,3002.100098
1622 | 2020-06-12,3041.310059
1623 | 2020-06-15,3066.590088
1624 | 2020-06-16,3124.73999
1625 | 2020-06-17,3113.48999
1626 | 2020-06-18,3115.340088
1627 | 2020-06-19,3097.73999
1628 | 2020-06-22,3117.860107
1629 | 2020-06-23,3131.290039
1630 | 2020-06-24,3050.330078
1631 | 2020-06-25,3083.76001
1632 | 2020-06-26,3009.050049
1633 | 2020-06-29,3053.23999
1634 | 2020-06-30,3100.290039
1635 | 2020-07-01,3115.860107
1636 | 2020-07-02,3130.01001
1637 | 2020-07-06,3179.719971
1638 | 2020-07-07,3145.320068
1639 | 2020-07-08,3169.939941
1640 | 2020-07-09,3152.050049
1641 | 2020-07-10,3185.040039
1642 | 2020-07-13,3155.219971
1643 | 2020-07-14,3197.52002
1644 | 2020-07-15,3226.560059
1645 | 2020-07-16,3215.570068
1646 | 2020-07-17,3224.72998
1647 | 2020-07-20,3251.840088
1648 | 2020-07-21,3257.300049
1649 | 2020-07-22,3276.02002
1650 | 2020-07-23,3235.659912
1651 | 2020-07-24,3215.629883
1652 | 2020-07-27,3239.409912
1653 | 2020-07-28,3218.439941
1654 | 2020-07-29,3258.439941
1655 | 2020-07-30,3246.219971
1656 | 2020-07-31,3271.120117
1657 | 2020-08-03,3294.610107
1658 | 2020-08-04,3306.51001
1659 | 2020-08-05,3327.77002
1660 | 2020-08-06,3349.159912
1661 | 2020-08-07,3351.280029
1662 | 2020-08-10,3360.469971
1663 | 2020-08-11,3333.689941
1664 | 2020-08-12,3380.350098
1665 | 2020-08-13,3373.429932
1666 | 2020-08-14,3372.850098
1667 | 2020-08-17,3381.98999
1668 | 2020-08-18,3389.780029
1669 | 2020-08-19,3374.850098
1670 | 2020-08-20,3385.51001
1671 | 2020-08-21,3397.159912
1672 | 2020-08-24,3431.280029
1673 | 2020-08-25,3443.620117
1674 | 2020-08-26,3478.72998
1675 | 2020-08-27,3484.550049
1676 | 2020-08-28,3508.01001
1677 | 2020-08-31,3500.310059
1678 | 2020-09-01,3526.649902
1679 | 2020-09-02,3580.840088
1680 | 2020-09-03,3455.060059
1681 | 2020-09-04,3426.959961
1682 | 2020-09-08,3331.840088
1683 | 2020-09-09,3398.959961
1684 | 2020-09-10,3339.189941
1685 | 2020-09-11,3340.969971
1686 | 2020-09-14,3383.540039
1687 | 2020-09-15,3401.199951
1688 | 2020-09-16,3385.48999
1689 | 2020-09-17,3357.01001
1690 | 2020-09-18,3319.469971
1691 | 2020-09-21,3281.060059
1692 | 2020-09-22,3315.570068
1693 | 2020-09-23,3236.919922
1694 | 2020-09-24,3246.590088
1695 | 2020-09-25,3298.459961
1696 | 2020-09-28,3351.600098
1697 | 2020-09-29,3335.469971
1698 | 2020-09-30,3363.0
1699 | 2020-10-01,3380.800049
1700 | 2020-10-02,3348.419922
1701 | 2020-10-05,3408.600098
1702 | 2020-10-06,3360.969971
1703 | 2020-10-07,3419.439941
1704 | 2020-10-08,3446.830078
1705 | 2020-10-09,3477.139893
1706 | 2020-10-12,3534.219971
1707 | 2020-10-13,3511.929932
1708 | 2020-10-14,3488.669922
1709 | 2020-10-15,3483.340088
1710 | 2020-10-16,3483.810059
1711 | 2020-10-19,3426.919922
1712 | 2020-10-20,3443.120117
1713 | 2020-10-21,3435.560059
1714 | 2020-10-22,3453.48999
1715 | 2020-10-23,3465.389893
1716 | 2020-10-26,3400.969971
1717 | 2020-10-27,3390.679932
1718 | 2020-10-28,3271.030029
1719 | 2020-10-29,3310.110107
1720 | 2020-10-30,3269.959961
1721 | 2020-11-02,3310.23999
1722 | 2020-11-03,3369.159912
1723 | 2020-11-04,3443.439941
1724 | 2020-11-05,3510.449951
1725 | 2020-11-06,3509.439941
1726 | 2020-11-09,3550.5
1727 | 2020-11-10,3545.530029
1728 | 2020-11-11,3572.659912
1729 | 2020-11-12,3537.01001
1730 | 2020-11-13,3585.149902
1731 | 2020-11-16,3626.909912
1732 | 2020-11-17,3609.530029
1733 | 2020-11-18,3567.790039
1734 | 2020-11-19,3581.870117
1735 | 2020-11-20,3557.540039
1736 | 2020-11-23,3577.590088
1737 | 2020-11-24,3635.409912
1738 | 2020-11-25,3629.649902
1739 | 2020-11-27,3638.350098
1740 | 2020-11-30,3621.629883
1741 | 2020-12-01,3662.449951
1742 | 2020-12-02,3669.01001
1743 | 2020-12-03,3666.719971
1744 | 2020-12-04,3699.120117
1745 | 2020-12-07,3691.959961
1746 | 2020-12-08,3702.25
1747 | 2020-12-09,3672.820068
1748 | 2020-12-10,3668.100098
1749 | 2020-12-11,3663.459961
1750 | 2020-12-14,3647.48999
1751 | 2020-12-15,3694.620117
1752 | 2020-12-16,3701.169922
1753 | 2020-12-17,3722.47998
1754 | 2020-12-18,3709.409912
1755 | 2020-12-21,3694.919922
1756 | 2020-12-22,3687.26001
1757 | 2020-12-23,3690.01001
1758 | 2020-12-24,3703.060059
1759 | 2020-12-28,3735.360107
1760 | 2020-12-29,3727.040039
1761 | 2020-12-30,3732.040039
1762 | 2020-12-31,3756.070068
1763 | 2021-01-04,3700.649902
1764 | 2021-01-05,3726.860107
1765 | 2021-01-06,3748.139893
1766 | 2021-01-07,3803.790039
1767 | 2021-01-08,3824.679932
1768 | 2021-01-11,3799.610107
1769 | 2021-01-12,3801.189941
1770 | 2021-01-13,3809.840088
1771 | 2021-01-14,3795.540039
1772 | 2021-01-15,3768.25
1773 | 2021-01-19,3798.909912
1774 | 2021-01-20,3851.850098
1775 | 2021-01-21,3853.070068
1776 | 2021-01-22,3841.469971
1777 | 2021-01-25,3855.360107
1778 | 2021-01-26,3849.620117
1779 | 2021-01-27,3750.77002
1780 | 2021-01-28,3787.379883
1781 | 2021-01-29,3714.23999
1782 | 2021-02-01,3773.860107
1783 | 2021-02-02,3826.310059
1784 | 2021-02-03,3830.169922
1785 | 2021-02-04,3871.73999
1786 | 2021-02-05,3886.830078
1787 | 2021-02-08,3915.590088
1788 | 2021-02-09,3911.22998
1789 | 2021-02-10,3909.879883
1790 | 2021-02-11,3916.379883
1791 | 2021-02-12,3934.830078
1792 | 2021-02-16,3932.590088
1793 | 2021-02-17,3931.330078
1794 | 2021-02-18,3913.969971
1795 | 2021-02-19,3906.709961
1796 | 2021-02-22,3876.5
1797 | 2021-02-23,3881.370117
1798 | 2021-02-24,3925.429932
1799 | 2021-02-25,3829.340088
1800 | 2021-02-26,3811.149902
1801 | 2021-03-01,3901.820068
1802 | 2021-03-02,3870.290039
1803 | 2021-03-03,3819.719971
1804 | 2021-03-04,3768.469971
1805 | 2021-03-05,3841.939941
1806 | 2021-03-08,3821.350098
1807 | 2021-03-09,3875.439941
1808 | 2021-03-10,3898.810059
1809 | 2021-03-11,3939.340088
1810 | 2021-03-12,3943.340088
1811 | 2021-03-15,3968.939941
1812 | 2021-03-16,3962.709961
1813 | 2021-03-17,3974.120117
1814 | 2021-03-18,3915.459961
1815 | 2021-03-19,3913.100098
1816 | 2021-03-22,3940.590088
1817 | 2021-03-23,3910.52002
1818 | 2021-03-24,3889.139893
1819 | 2021-03-25,3909.52002
1820 | 2021-03-26,3974.540039
1821 | 2021-03-29,3971.090088
1822 | 2021-03-30,3958.550049
1823 | 2021-03-31,3972.889893
1824 | 2021-04-01,4019.870117
1825 | 2021-04-05,4077.909912
1826 | 2021-04-06,4073.939941
1827 | 2021-04-07,4079.949951
1828 | 2021-04-08,4097.169922
1829 | 2021-04-09,4128.799805
1830 | 2021-04-12,4127.990234
1831 | 2021-04-13,4141.589844
1832 | 2021-04-14,4124.660156
1833 | 2021-04-15,4170.419922
1834 | 2021-04-16,4185.470215
1835 | 2021-04-19,4163.259766
1836 | 2021-04-20,4134.939941
1837 | 2021-04-21,4173.419922
1838 | 2021-04-22,4134.97998
1839 | 2021-04-23,4180.169922
1840 | 2021-04-26,4187.620117
1841 | 2021-04-27,4186.720215
1842 | 2021-04-28,4183.180176
1843 | 2021-04-29,4211.470215
1844 | 2021-04-30,4181.169922
1845 | 2021-05-03,4192.660156
1846 | 2021-05-04,4164.660156
1847 | 2021-05-05,4167.589844
1848 | 2021-05-06,4201.620117
1849 | 2021-05-07,4232.600098
1850 | 2021-05-10,4188.430176
1851 | 2021-05-11,4152.100098
1852 | 2021-05-12,4063.040039
1853 | 2021-05-13,4112.5
1854 | 2021-05-14,4173.850098
1855 | 2021-05-17,4163.290039
1856 | 2021-05-18,4127.830078
1857 | 2021-05-19,4115.680176
1858 | 2021-05-20,4159.120117
1859 | 2021-05-21,4155.859863
1860 | 2021-05-24,4197.049805
1861 | 2021-05-25,4188.129883
1862 | 2021-05-26,4195.990234
1863 | 2021-05-27,4200.879883
1864 | 2021-05-28,4204.109863
1865 | 2021-06-01,4202.040039
1866 | 2021-06-02,4208.120117
1867 | 2021-06-03,4192.850098
1868 | 2021-06-04,4229.890137
1869 | 2021-06-07,4226.52002
1870 | 2021-06-08,4227.259766
1871 | 2021-06-09,4219.549805
1872 | 2021-06-10,4239.180176
1873 | 2021-06-11,4247.439941
1874 | 2021-06-14,4255.149902
1875 | 2021-06-15,4246.589844
1876 | 2021-06-16,4223.700195
1877 | 2021-06-17,4221.859863
1878 | 2021-06-18,4166.450195
1879 | 2021-06-21,4224.790039
1880 | 2021-06-22,4246.439941
1881 | 2021-06-23,4241.839844
1882 | 2021-06-24,4266.490234
1883 | 2021-06-25,4280.700195
1884 | 2021-06-28,4290.609863
1885 | 2021-06-29,4291.799805
1886 | 2021-06-30,4297.5
1887 | 2021-07-01,4319.939941
1888 | 2021-07-02,4352.339844
1889 | 2021-07-06,4343.540039
1890 | 2021-07-07,4358.129883
1891 | 2021-07-08,4320.819824
1892 | 2021-07-09,4369.549805
1893 | 2021-07-12,4384.629883
1894 | 2021-07-13,4369.209961
1895 | 2021-07-14,4374.299805
1896 | 2021-07-15,4360.029785
1897 | 2021-07-16,4327.160156
1898 | 2021-07-19,4258.490234
1899 | 2021-07-20,4323.060059
1900 | 2021-07-21,4358.689941
1901 | 2021-07-22,4367.47998
1902 | 2021-07-23,4411.790039
1903 | 2021-07-26,4422.299805
1904 | 2021-07-27,4401.459961
1905 | 2021-07-28,4400.640137
1906 | 2021-07-29,4419.149902
1907 | 2021-07-30,4395.259766
1908 | 2021-08-02,4387.160156
1909 | 2021-08-03,4423.149902
1910 | 2021-08-04,4402.660156
1911 | 2021-08-05,4429.100098
1912 | 2021-08-06,4436.52002
1913 | 2021-08-09,4432.350098
1914 | 2021-08-10,4436.75
1915 | 2021-08-11,4442.410156
1916 | 2021-08-12,4460.830078
1917 | 2021-08-13,4468.0
1918 | 2021-08-16,4479.709961
1919 | 2021-08-17,4448.080078
1920 | 2021-08-18,4400.27002
1921 | 2021-08-19,4405.799805
1922 | 2021-08-20,4441.669922
1923 | 2021-08-23,4479.529785
1924 | 2021-08-24,4486.22998
1925 | 2021-08-25,4496.189941
1926 | 2021-08-26,4470.0
1927 | 2021-08-27,4509.370117
1928 | 2021-08-30,4528.790039
1929 | 2021-08-31,4522.680176
1930 | 2021-09-01,4524.089844
1931 | 2021-09-02,4536.950195
1932 | 2021-09-03,4535.430176
1933 | 2021-09-07,4520.029785
1934 | 2021-09-08,4514.069824
1935 | 2021-09-09,4493.279785
1936 | 2021-09-10,4458.580078
1937 | 2021-09-13,4468.72998
1938 | 2021-09-14,4443.049805
1939 | 2021-09-15,4480.700195
1940 | 2021-09-16,4473.75
1941 | 2021-09-17,4432.990234
1942 | 2021-09-20,4357.72998
1943 | 2021-09-21,4354.189941
1944 | 2021-09-22,4395.640137
1945 | 2021-09-23,4448.97998
1946 | 2021-09-24,4455.47998
1947 | 2021-09-27,4443.109863
1948 | 2021-09-28,4352.629883
1949 | 2021-09-29,4359.459961
1950 | 2021-09-30,4307.540039
1951 | 2021-10-01,4357.040039
1952 | 2021-10-04,4300.459961
1953 | 2021-10-05,4345.720215
1954 | 2021-10-06,4363.549805
1955 | 2021-10-07,4399.759766
1956 | 2021-10-08,4391.339844
1957 | 2021-10-11,4361.189941
1958 | 2021-10-12,4350.649902
1959 | 2021-10-13,4363.799805
1960 | 2021-10-14,4438.259766
1961 | 2021-10-15,4471.370117
1962 | 2021-10-18,4486.459961
1963 | 2021-10-19,4519.629883
1964 | 2021-10-20,4536.189941
1965 | 2021-10-21,4549.779785
1966 | 2021-10-22,4544.899902
1967 | 2021-10-25,4566.47998
1968 | 2021-10-26,4574.790039
1969 | 2021-10-27,4551.680176
1970 | 2021-10-28,4596.419922
1971 | 2021-10-29,4605.379883
1972 | 2021-11-01,4613.669922
1973 | 2021-11-02,4630.649902
1974 | 2021-11-03,4660.569824
1975 | 2021-11-04,4680.060059
1976 | 2021-11-05,4697.529785
1977 | 2021-11-08,4701.700195
1978 | 2021-11-09,4685.25
1979 | 2021-11-10,4646.709961
1980 | 2021-11-11,4649.27002
1981 | 2021-11-12,4682.850098
1982 | 2021-11-15,4682.799805
1983 | 2021-11-16,4700.899902
1984 | 2021-11-17,4688.669922
1985 | 2021-11-18,4704.540039
1986 | 2021-11-19,4697.959961
1987 | 2021-11-22,4682.939941
1988 | 2021-11-23,4690.700195
1989 | 2021-11-24,4701.459961
1990 | 2021-11-26,4594.620117
1991 | 2021-11-29,4655.27002
1992 | 2021-11-30,4567.0
1993 | 2021-12-01,4513.040039
1994 | 2021-12-02,4577.100098
1995 | 2021-12-03,4538.430176
1996 | 2021-12-06,4591.669922
1997 | 2021-12-07,4686.75
1998 | 2021-12-08,4701.209961
1999 | 2021-12-09,4667.450195
2000 | 2021-12-10,4712.02002
2001 | 2021-12-13,4668.970215
2002 | 2021-12-14,4634.089844
2003 | 2021-12-15,4709.850098
2004 | 2021-12-16,4668.669922
2005 | 2021-12-17,4620.640137
2006 | 2021-12-20,4568.02002
2007 | 2021-12-21,4649.22998
2008 | 2021-12-22,4696.560059
2009 | 2021-12-23,4725.790039
2010 | 2021-12-27,4791.189941
2011 | 2021-12-28,4786.350098
2012 | 2021-12-29,4793.060059
2013 | 2021-12-30,4778.72998
2014 | 2021-12-31,4766.180176
2015 | 2022-01-03,4796.560059
2016 | 2022-01-04,4793.540039
2017 | 2022-01-05,4700.580078
2018 | 2022-01-06,4696.049805
2019 | 2022-01-07,4677.029785
2020 | 2022-01-10,4670.290039
2021 | 2022-01-11,4713.069824
2022 | 2022-01-12,4726.350098
2023 | 2022-01-13,4659.029785
2024 | 2022-01-14,4662.850098
2025 | 2022-01-18,4577.109863
2026 | 2022-01-19,4532.759766
2027 | 2022-01-20,4482.72998
2028 | 2022-01-21,4397.939941
2029 | 2022-01-24,4410.129883
2030 | 2022-01-25,4356.450195
2031 | 2022-01-26,4349.930176
2032 | 2022-01-27,4326.509766
2033 | 2022-01-28,4431.850098
2034 | 2022-01-31,4515.549805
2035 | 2022-02-01,4546.540039
2036 | 2022-02-02,4589.379883
2037 | 2022-02-03,4477.439941
2038 | 2022-02-04,4500.529785
2039 | 2022-02-07,4483.870117
2040 | 2022-02-08,4521.540039
2041 | 2022-02-09,4587.180176
2042 | 2022-02-10,4504.080078
2043 | 2022-02-11,4418.640137
2044 | 2022-02-14,4401.669922
2045 | 2022-02-15,4471.069824
2046 | 2022-02-16,4475.009766
2047 | 2022-02-17,4380.259766
2048 | 2022-02-18,4348.870117
2049 | 2022-02-22,4304.759766
2050 | 2022-02-23,4225.5
2051 | 2022-02-24,4288.700195
2052 | 2022-02-25,4384.649902
2053 | 2022-02-28,4373.939941
2054 | 2022-03-01,4306.259766
2055 | 2022-03-02,4386.540039
2056 | 2022-03-03,4363.490234
2057 | 2022-03-04,4328.870117
2058 | 2022-03-07,4201.089844
2059 | 2022-03-08,4170.700195
2060 | 2022-03-09,4277.879883
2061 | 2022-03-10,4259.52002
2062 | 2022-03-11,4204.310059
2063 | 2022-03-14,4173.109863
2064 | 2022-03-15,4262.450195
2065 | 2022-03-16,4357.859863
2066 | 2022-03-17,4411.669922
2067 | 2022-03-18,4463.120117
2068 | 2022-03-21,4461.180176
2069 | 2022-03-22,4511.609863
2070 | 2022-03-23,4456.240234
2071 | 2022-03-24,4520.160156
2072 | 2022-03-25,4543.060059
2073 | 2022-03-28,4575.52002
2074 | 2022-03-29,4631.600098
2075 | 2022-03-30,4602.450195
2076 | 2022-03-31,4530.410156
2077 | 2022-04-01,4545.859863
2078 | 2022-04-04,4582.640137
2079 | 2022-04-05,4525.120117
2080 | 2022-04-06,4481.149902
2081 | 2022-04-07,4500.209961
2082 | 2022-04-08,4488.279785
2083 | 2022-04-11,4412.529785
2084 | 2022-04-12,4397.450195
2085 | 2022-04-13,4446.589844
2086 | 2022-04-14,4392.589844
2087 | 2022-04-18,4391.689941
2088 | 2022-04-19,4462.209961
2089 | 2022-04-20,4459.450195
2090 | 2022-04-21,4393.660156
2091 | 2022-04-22,4271.779785
2092 | 2022-04-25,4296.120117
2093 | 2022-04-26,4175.200195
2094 | 2022-04-27,4183.959961
2095 | 2022-04-28,4287.5
2096 | 2022-04-29,4131.930176
2097 | 2022-05-02,4155.379883
2098 | 2022-05-03,4175.47998
2099 | 2022-05-04,4300.169922
2100 | 2022-05-05,4146.870117
2101 | 2022-05-06,4123.339844
2102 | 2022-05-09,3991.23999
2103 | 2022-05-10,4001.050049
2104 | 2022-05-11,3935.179932
2105 | 2022-05-12,3930.080078
2106 | 2022-05-13,4023.889893
2107 | 2022-05-16,4008.01001
2108 | 2022-05-17,4088.850098
2109 | 2022-05-18,3923.679932
2110 | 2022-05-19,3900.790039
2111 | 2022-05-20,3901.360107
2112 | 2022-05-23,3973.75
2113 | 2022-05-24,3941.47998
2114 | 2022-05-25,3978.72998
2115 | 2022-05-26,4057.840088
2116 | 2022-05-27,4158.240234
2117 | 2022-05-31,4132.149902
2118 | 2022-06-01,4101.22998
2119 | 2022-06-02,4176.819824
2120 | 2022-06-03,4108.540039
2121 | 2022-06-06,4121.430176
2122 | 2022-06-07,4160.680176
2123 | 2022-06-08,4115.77002
2124 | 2022-06-09,4017.820068
2125 | 2022-06-10,3900.860107
2126 | 2022-06-13,3749.629883
2127 | 2022-06-14,3735.47998
2128 | 2022-06-15,3789.98999
2129 | 2022-06-16,3666.77002
2130 | 2022-06-17,3674.840088
2131 | 2022-06-21,3764.790039
2132 | 2022-06-22,3759.889893
2133 | 2022-06-23,3795.72998
2134 | 2022-06-24,3911.73999
2135 | 2022-06-27,3900.110107
2136 | 2022-06-28,3821.550049
2137 | 2022-06-29,3818.830078
2138 | 2022-06-30,3785.379883
2139 | 2022-07-01,3825.330078
2140 | 2022-07-05,3831.389893
2141 | 2022-07-06,3845.080078
2142 | 2022-07-07,3902.620117
2143 | 2022-07-08,3899.379883
2144 | 2022-07-11,3854.429932
2145 | 2022-07-12,3818.800049
2146 | 2022-07-13,3801.780029
2147 | 2022-07-14,3790.379883
2148 | 2022-07-15,3863.159912
2149 | 2022-07-18,3830.850098
2150 | 2022-07-19,3936.689941
2151 | 2022-07-20,3959.899902
2152 | 2022-07-21,3998.949951
2153 | 2022-07-22,3961.629883
2154 | 2022-07-25,3966.840088
2155 | 2022-07-26,3921.050049
2156 | 2022-07-27,4023.610107
2157 | 2022-07-28,4072.429932
2158 | 2022-07-29,4130.290039
2159 | 2022-08-01,4118.629883
2160 | 2022-08-02,4091.189941
2161 | 2022-08-03,4155.169922
2162 | 2022-08-04,4151.939941
2163 | 2022-08-05,4145.189941
2164 | 2022-08-08,4140.060059
2165 | 2022-08-09,4122.470215
2166 | 2022-08-10,4210.240234
2167 | 2022-08-11,4207.27002
2168 | 2022-08-12,4280.149902
2169 | 2022-08-15,4297.140137
2170 | 2022-08-16,4305.200195
2171 | 2022-08-17,4274.040039
2172 | 2022-08-18,4283.740234
2173 | 2022-08-19,4228.47998
2174 | 2022-08-22,4137.990234
2175 | 2022-08-23,4128.72998
2176 | 2022-08-24,4140.77002
2177 | 2022-08-25,4199.120117
2178 | 2022-08-26,4057.659912
2179 | 2022-08-29,4030.610107
2180 | 2022-08-30,3986.159912
2181 | 2022-08-31,3955.0
2182 | 2022-09-01,3966.850098
2183 | 2022-09-02,3924.26001
2184 | 2022-09-06,3908.189941
2185 | 2022-09-07,3979.870117
2186 | 2022-09-08,4006.179932
2187 | 2022-09-09,4067.360107
2188 | 2022-09-12,4110.410156
2189 | 2022-09-13,3932.689941
2190 | 2022-09-14,3946.01001
2191 | 2022-09-15,3901.350098
2192 | 2022-09-16,3873.330078
2193 | 2022-09-19,3899.889893
2194 | 2022-09-20,3855.929932
2195 | 2022-09-21,3789.929932
2196 | 2022-09-22,3757.98999
2197 | 2022-09-23,3693.22998
2198 | 2022-09-26,3655.040039
2199 | 2022-09-27,3647.290039
2200 | 2022-09-28,3719.040039
2201 | 2022-09-29,3640.469971
2202 | 2022-09-30,3585.620117
2203 | 2022-10-03,3678.429932
2204 | 2022-10-04,3790.929932
2205 | 2022-10-05,3783.280029
2206 | 2022-10-06,3744.52002
2207 | 2022-10-07,3639.659912
2208 | 2022-10-10,3612.389893
2209 | 2022-10-11,3588.840088
2210 | 2022-10-12,3577.030029
2211 | 2022-10-13,3669.909912
2212 | 2022-10-14,3583.070068
2213 | 2022-10-17,3677.949951
2214 | 2022-10-18,3719.97998
2215 | 2022-10-19,3695.159912
2216 | 2022-10-20,3665.780029
2217 | 2022-10-21,3752.75
2218 | 2022-10-24,3797.340088
2219 | 2022-10-25,3859.110107
2220 | 2022-10-26,3830.600098
2221 | 2022-10-27,3807.300049
2222 | 2022-10-28,3901.060059
2223 | 2022-10-31,3871.97998
2224 | 2022-11-01,3856.100098
2225 | 2022-11-02,3759.689941
2226 | 2022-11-03,3719.889893
2227 | 2022-11-04,3770.550049
2228 | 2022-11-07,3806.800049
2229 | 2022-11-08,3828.110107
2230 | 2022-11-09,3748.570068
2231 | 2022-11-10,3956.370117
2232 | 2022-11-11,3992.929932
2233 | 2022-11-14,3957.25
2234 | 2022-11-15,3991.72998
2235 | 2022-11-16,3958.790039
2236 | 2022-11-17,3946.560059
2237 | 2022-11-18,3965.340088
2238 | 2022-11-21,3949.939941
2239 | 2022-11-22,4003.580078
2240 | 2022-11-23,4027.26001
2241 | 2022-11-25,4026.120117
2242 | 2022-11-28,3963.939941
2243 | 2022-11-29,3957.629883
2244 | 2022-11-30,4080.110107
2245 | 2022-12-01,4076.570068
2246 | 2022-12-02,4071.699951
2247 | 2022-12-05,3998.840088
2248 | 2022-12-06,3941.26001
2249 | 2022-12-07,3933.919922
2250 | 2022-12-08,3963.51001
2251 | 2022-12-09,3934.379883
2252 | 2022-12-12,3990.560059
2253 | 2022-12-13,4019.649902
2254 | 2022-12-14,3995.320068
2255 | 2022-12-15,3895.75
2256 | 2022-12-16,3852.360107
2257 | 2022-12-19,3817.659912
2258 | 2022-12-20,3821.620117
2259 | 2022-12-21,3878.439941
2260 | 2022-12-22,3822.389893
2261 | 2022-12-23,3844.820068
2262 | 2022-12-27,3829.25
2263 | 2022-12-28,3783.219971
2264 | 2022-12-29,3849.280029
2265 | 2022-12-30,3839.5
2266 | 2023-01-03,3824.139893
2267 | 2023-01-04,3852.969971
2268 | 2023-01-05,3808.100098
2269 | 2023-01-06,3895.080078
2270 | 2023-01-09,3892.090088
2271 | 2023-01-10,3919.25
2272 | 2023-01-11,3969.610107
2273 | 2023-01-12,3983.169922
2274 | 2023-01-13,3999.090088
2275 | 2023-01-17,3990.969971
2276 | 2023-01-18,3928.860107
2277 | 2023-01-19,3898.850098
2278 | 2023-01-20,3972.610107
2279 | 2023-01-23,4019.810059
2280 | 2023-01-24,4016.949951
2281 | 2023-01-25,4016.219971
2282 | 2023-01-26,4060.429932
2283 | 2023-01-27,4070.560059
2284 | 2023-01-30,4017.77002
2285 | 2023-01-31,4076.600098
2286 | 2023-02-01,4119.209961
2287 | 2023-02-02,4179.759766
2288 | 2023-02-03,4136.47998
2289 | 2023-02-06,4111.080078
2290 | 2023-02-07,4164.0
2291 | 2023-02-08,4117.859863
2292 | 2023-02-09,4081.5
2293 | 2023-02-10,4090.459961
2294 | 2023-02-13,4137.290039
2295 | 2023-02-14,4136.129883
2296 | 2023-02-15,4147.600098
2297 | 2023-02-16,4090.409912
2298 | 2023-02-17,4079.090088
2299 | 2023-02-21,3997.340088
2300 | 2023-02-22,3991.050049
2301 | 2023-02-23,4012.320068
2302 | 2023-02-24,3970.040039
2303 | 2023-02-27,3982.23999
2304 | 2023-02-28,3970.149902
2305 | 2023-03-01,3951.389893
2306 | 2023-03-02,3981.350098
2307 | 2023-03-03,4045.639893
2308 | 2023-03-06,4048.419922
2309 | 2023-03-07,3986.370117
2310 | 2023-03-08,3992.01001
2311 | 2023-03-09,3918.320068
2312 | 2023-03-10,3861.590088
2313 | 2023-03-13,3855.76001
2314 | 2023-03-14,3919.290039
2315 | 2023-03-15,3891.929932
2316 | 2023-03-16,3960.280029
2317 | 2023-03-17,3916.639893
2318 | 2023-03-20,3951.570068
2319 | 2023-03-21,4002.870117
2320 | 2023-03-22,3936.969971
2321 | 2023-03-23,3948.719971
2322 | 2023-03-24,3970.98999
2323 | 2023-03-27,3977.530029
2324 | 2023-03-28,3971.27002
2325 | 2023-03-29,4027.810059
2326 | 2023-03-30,4050.830078
2327 | 2023-03-31,4109.310059
2328 | 2023-04-03,4124.509766
2329 | 2023-04-04,4100.600098
2330 | 2023-04-05,4090.379883
2331 | 2023-04-06,4105.02002
2332 | 2023-04-10,4109.109863
2333 | 2023-04-11,4108.939941
2334 | 2023-04-12,4091.949951
2335 | 2023-04-13,4146.220215
2336 | 2023-04-14,4137.640137
2337 | 2023-04-17,4151.319824
2338 | 2023-04-18,4154.870117
2339 | 2023-04-19,4154.52002
2340 | 2023-04-20,4129.790039
2341 | 2023-04-21,4133.52002
2342 | 2023-04-24,4137.040039
2343 | 2023-04-25,4071.629883
2344 | 2023-04-26,4055.98999
2345 | 2023-04-27,4135.350098
2346 | 2023-04-28,4169.47998
2347 | 2023-05-01,4167.870117
2348 | 2023-05-02,4119.580078
2349 | 2023-05-03,4090.75
2350 | 2023-05-04,4061.219971
2351 | 2023-05-05,4136.25
2352 | 2023-05-08,4138.120117
2353 | 2023-05-09,4119.169922
2354 | 2023-05-10,4137.640137
2355 | 2023-05-11,4130.620117
2356 | 2023-05-12,4124.080078
2357 | 2023-05-15,4136.279785
2358 | 2023-05-16,4109.899902
2359 | 2023-05-17,4158.77002
2360 | 2023-05-18,4198.049805
2361 | 2023-05-19,4191.97998
2362 | 2023-05-22,4192.629883
2363 | 2023-05-23,4145.580078
2364 | 2023-05-24,4115.240234
2365 | 2023-05-25,4151.279785
2366 | 2023-05-26,4205.450195
2367 | 2023-05-30,4205.52002
2368 | 2023-05-31,4179.830078
2369 | 2023-06-01,4221.02002
2370 | 2023-06-02,4282.370117
2371 | 2023-06-05,4273.790039
2372 | 2023-06-06,4283.850098
2373 | 2023-06-07,4267.52002
2374 | 2023-06-08,4293.930176
2375 | 2023-06-09,4298.859863
2376 | 2023-06-12,4338.930176
2377 | 2023-06-13,4369.009766
2378 | 2023-06-14,4372.589844
2379 | 2023-06-15,4425.839844
2380 | 2023-06-16,4409.589844
2381 | 2023-06-20,4388.709961
2382 | 2023-06-21,4365.689941
2383 | 2023-06-22,4381.890137
2384 | 2023-06-23,4348.330078
2385 | 2023-06-26,4328.819824
2386 | 2023-06-27,4378.410156
2387 | 2023-06-28,4376.859863
2388 | 2023-06-29,4396.439941
2389 | 2023-06-30,4450.379883
2390 | 2023-07-03,4455.589844
2391 | 2023-07-05,4446.819824
2392 | 2023-07-06,4411.589844
2393 | 2023-07-07,4398.950195
2394 | 2023-07-10,4409.529785
2395 | 2023-07-11,4439.259766
2396 | 2023-07-12,4472.160156
2397 | 2023-07-13,4510.040039
2398 | 2023-07-14,4505.419922
2399 | 2023-07-17,4522.790039
2400 | 2023-07-18,4554.97998
2401 | 2023-07-19,4565.720215
2402 | 2023-07-20,4534.870117
2403 | 2023-07-21,4536.339844
2404 | 2023-07-24,4554.640137
2405 | 2023-07-25,4567.459961
2406 | 2023-07-26,4566.75
2407 | 2023-07-27,4537.410156
2408 | 2023-07-28,4582.22998
2409 | 2023-07-31,4588.959961
2410 | 2023-08-01,4576.72998
2411 | 2023-08-02,4513.390137
2412 | 2023-08-03,4501.890137
2413 | 2023-08-04,4478.029785
2414 | 2023-08-07,4518.439941
2415 | 2023-08-08,4499.379883
2416 | 2023-08-09,4467.709961
2417 | 2023-08-10,4468.830078
2418 | 2023-08-11,4464.049805
2419 | 2023-08-14,4489.720215
2420 | 2023-08-15,4437.859863
2421 | 2023-08-16,4404.330078
2422 | 2023-08-17,4370.359863
2423 | 2023-08-18,4369.709961
2424 | 2023-08-21,4399.77002
2425 | 2023-08-22,4387.549805
2426 | 2023-08-23,4436.009766
2427 | 2023-08-24,4376.310059
2428 | 2023-08-25,4405.709961
2429 | 2023-08-28,4433.310059
2430 | 2023-08-29,4497.629883
2431 | 2023-08-30,4514.870117
2432 | 2023-08-31,4507.660156
2433 | 2023-09-01,4515.77002
2434 | 2023-09-05,4496.830078
2435 | 2023-09-06,4465.47998
2436 | 2023-09-07,4451.140137
2437 | 2023-09-08,4457.490234
2438 | 2023-09-11,4487.459961
2439 | 2023-09-12,4461.899902
2440 | 2023-09-13,4467.439941
2441 | 2023-09-14,4505.100098
2442 | 2023-09-15,4450.319824
2443 | 2023-09-18,4453.529785
2444 | 2023-09-19,4443.950195
2445 | 2023-09-20,4402.200195
2446 | 2023-09-21,4330.0
2447 | 2023-09-22,4320.060059
2448 | 2023-09-25,4337.439941
2449 | 2023-09-26,4273.529785
2450 | 2023-09-27,4274.509766
2451 | 2023-09-28,4299.700195
2452 | 2023-09-29,4288.049805
2453 | 2023-10-02,4288.390137
2454 | 2023-10-03,4229.450195
2455 | 2023-10-04,4263.75
2456 | 2023-10-05,4258.189941
2457 | 2023-10-06,4308.5
2458 | 2023-10-09,4335.660156
2459 | 2023-10-10,4358.240234
2460 | 2023-10-11,4376.950195
2461 | 2023-10-12,4349.609863
2462 | 2023-10-13,4327.779785
2463 | 2023-10-16,4373.629883
2464 | 2023-10-17,4373.200195
2465 | 2023-10-18,4314.600098
2466 | 2023-10-19,4278.0
2467 | 2023-10-20,4224.160156
2468 | 2023-10-23,4217.040039
2469 | 2023-10-24,4247.680176
2470 | 2023-10-25,4186.77002
2471 | 2023-10-26,4137.22998
2472 | 2023-10-27,4117.370117
2473 | 2023-10-30,4166.819824
2474 | 2023-10-31,4193.799805
2475 | 2023-11-01,4237.859863
2476 | 2023-11-02,4317.779785
2477 | 2023-11-03,4358.339844
2478 | 2023-11-06,4365.97998
2479 | 2023-11-07,4378.379883
2480 | 2023-11-08,4382.779785
2481 | 2023-11-09,4347.350098
2482 | 2023-11-10,4415.240234
2483 | 2023-11-13,4411.549805
2484 | 2023-11-14,4495.700195
2485 | 2023-11-15,4502.879883
2486 | 2023-11-16,4508.240234
2487 | 2023-11-17,4514.02002
2488 | 2023-11-20,4547.379883
2489 | 2023-11-21,4538.189941
2490 | 2023-11-22,4556.620117
2491 | 2023-11-24,4559.339844
2492 | 2023-11-27,4550.430176
2493 | 2023-11-28,4554.890137
2494 | 2023-11-29,4550.580078
2495 | 2023-11-30,4567.799805
2496 | 2023-12-01,4594.629883
2497 | 2023-12-04,4569.779785
2498 | 2023-12-05,4567.180176
2499 | 2023-12-06,4549.339844
2500 | 2023-12-07,4585.589844
2501 | 2023-12-08,4604.370117
2502 | 2023-12-11,4622.439941
2503 | 2023-12-12,4643.700195
2504 | 2023-12-13,4707.089844
2505 | 2023-12-14,4719.549805
2506 | 2023-12-15,4719.189941
2507 | 2023-12-18,4740.560059
2508 | 2023-12-19,4768.370117
2509 | 2023-12-20,4698.350098
2510 | 2023-12-21,4746.75
2511 | 2023-12-22,4754.629883
2512 | 2023-12-26,4774.75
2513 | 2023-12-27,4781.580078
2514 | 2023-12-28,4783.350098
2515 | 2023-12-29,4769.830078
2516 | 2024-01-02,4742.830078
2517 | 2024-01-03,4704.810059
2518 |
--------------------------------------------------------------------------------