├── 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 | " \n", 43 | " \n", 44 | " \n", 45 | "\n", 46 | "\n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | "\n", 80 | "
Module NameArguments
Temporal block 1(NI, NH, NH, 1, 1)
Temporal block 2(NI, NH, NH, 2, 1)
Temporal block 3(NI, NH, NH, 2, 2)
Temporal block 4(NI, NH, NH, 2, 4)
Temporal block 5(NI, NH, NH, 2, 8)
Temporal block 6(NI, NH, NH, 2, 16)
Temporal block 7(NI, NH, NH, 2, 32)
1 x 1 Convolution(NH, NO, 1, 1)
" 81 | ], 82 | "metadata": {} 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "source": [ 87 | "\n", 95 | "

Table 4

\n", 96 | "\n", 97 | "\n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | "\n", 106 | "\n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | "\n", 129 | "
ModelsPureTCN-GPure TCN-D
C-SVNN-GC-SVNN_D
NI3131
NH808050
80
NO1121
" 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 | " \n", 43 | " \n", 44 | " \n", 45 | "\n", 46 | "\n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | "\n", 80 | "
Module NameArguments
Temporal block 1(NI, NH, NH, 1, 1)
Temporal block 2(NI, NH, NH, 2, 1)
Temporal block 3(NI, NH, NH, 2, 2)
Temporal block 4(NI, NH, NH, 2, 4)
Temporal block 5(NI, NH, NH, 2, 8)
Temporal block 6(NI, NH, NH, 2, 16)
Temporal block 7(NI, NH, NH, 2, 32)
1 x 1 Convolution(NH, NO, 1, 1)
" 81 | ], 82 | "metadata": {} 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "source": [ 87 | "\n", 95 | "

Table 4

\n", 96 | "\n", 97 | "\n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | "\n", 106 | "\n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | "\n", 129 | "
ModelsPureTCN-GPure TCN-D
C-SVNN-GC-SVNN_D
NI3131
NH808050
80
NO1121
" 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 | --------------------------------------------------------------------------------