diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..778f359 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ +language: python +python: '3.7' +branches: + only: + - master + - develop + +install: + - pip install pytest coverage codacy-coverage + - pip install -r requirements.txt + +script: + - coverage run -m py.test tests -vvv + - coverage xml + +deploy: + provider: pypi + username: __token__ + password: + secure: R+BV7e3ClVkhJz5tQcDLewazEC7E1BbVpRXrCPi9ENhvMeU9ZKjlE4gLd7TCYwBXa44SNvZyrX0BlXWzoea+I/MeiG7Q6tP7LnMlJzFukkMGWaIgWjUpp9oBNg+HBbVET4Alnr2m3lvJeVVdziwsL6zNBg+n7a35WFJgYN/x3DDkFKV7wXSh4jw5cyFBqqCSyVl7GXQpBMIk3vHKEL5H9W1YfnGArOkluiiliFprUtmmI9kKd03VdFqOS5NRk+bpDwFikGPeilV8PWZ6KAtvzvpBQsL5395ns0zQIkeRxhW4/yJN/M4eHtWgIxNM+ZfbgEBP1wkh9HdVTqOsMipqwCjOwFoslO9+aArLcmTnExCr92X42uZxuhSNFeZ+u6NlVreOcxindCKH5GtTXnANQ4lTYaSMaVEYDLBYB4vMPC4jmtlwpZKkKST1hKVG2zzUwKSc0braW/gcXgBWYBwfUrqtxKK6bmmHPsbncJRuDZy24jFS86Sqa+SzlxMwiRVXGlfZt2RZX8zxn1MS2hnPuGvKysL4wvb8a/7hybHK8YRTnF52YcOfUenDMDPT4+2TqBCbm/rCl9YJ3XVlqbqlYrXb6Pm+VANiS4rrJ+erifJxalJtSqXKc5v2/oqE7Q2tvGmqzIuC0Fg/Vdka7qUspqbOgFi1MLo3mTbufGOzZPs= + distributions: sdist bdist_wheel + on: + all_branches: true + skip_cleanup: true + +after_script: + - echo "Deploy to PyPI finished." \ No newline at end of file diff --git a/README.md b/README.md index be8f5e4..b9460a5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,295 @@ # PriceGenerator -Simple generator of stock and forex prices. Use it to generates test data for your trade strategy. + + +See russian readme here (инструкция на русском здесь): https://github.com/Tim55667757/PriceGenerator/blob/master/README_RU.md + +[![build](https://travis-ci.org/Tim55667757/PriceGenerator.svg)](https://travis-ci.org/Tim55667757/PriceGenerator) +[![pypi](https://img.shields.io/pypi/v/PriceGenerator.svg)](https://pypi.python.org/pypi/PriceGenerator) +[![license](https://img.shields.io/pypi/l/PriceGenerator.svg)](https://github.com/Tim55667757/PriceGenerator/blob/master/LICENSE) + +**Contents** + +1. [Introduction](#Introduction) + - [Price generation method](#Price-generation-method) +2. [Setup](#Setup) +3. [Usage examples](#Usage-examples) + - [Command line](#Command-line) + - [Reference](#Reference) + - [Generating prices with default parameters](#Generating-prices-with-default-parameters) + - [Generating prices, getting statistics and drawing a chart](#Generating-prices-getting-statistics-and-drawing-a-chart) + - [Statistics and chart from saved prices](#Statistics-and-chart-from-saved-prices) + - [Module import](#Module-import) + + +## Introduction + +Sometimes, for testing automated trading algorithms, it is necessary to obtain a dataset with exchange prices. Usually traders and analysts use a price model like OHLCV-candlesticks (open, high, low, close, volume), the so-called Japanese candlesticks. One line of such data is a set of prices for constructing one Japanese candlestick: the opening date, the opening price, the highest price, the lowest price, the closing price at a given time interval and the value of the trading volume. + +**PriceGenerator** is a simple library that can be used as a python module or run from the command line and generate random price data that is as close as possible to "real prices", but with predefined statistical characteristics. You can set the price interval, timeframe, maximum and minimum values for the price range, maximum size of candles, probability of direction for the next candle, probability of price outliers, the number of generated candles, and some other parameters. + +For further statistical analysis of prices in python, the Pandas library is very often used. Prices stored as a Pandas DataFrame might look something like this: +```text + datetime open high low close volume +95 2021-02-03 11:00:00+03:00 76.82 78.43 76.21 78.13 33652 +96 2021-02-03 12:00:00+03:00 78.13 78.37 78.12 78.36 9347 +97 2021-02-03 13:00:00+03:00 78.36 78.40 78.05 78.07 27250 +98 2021-02-03 14:00:00+03:00 78.07 78.61 75.72 76.42 22979 +99 2021-02-03 15:00:00+03:00 76.42 77.37 76.25 77.16 30845 +``` + +The PriceGenerator library allows you to: +- save generated prices in .csv-format (example: [./media/test.csv](./media/test.csv)); +- save the generated prices to a Pandas DataFrame variable for further use in automation scripts; +- automatically calculate some statistical and probabilistic characteristics of the generated prices and save them in markdown format (example: [./media/index.html.md](./media/index.html.md)); +- load the prices of real instruments according to the OHLCV-candlesticks model from the .csv file and carry out their statistical analysis; +- draw a chart of generated or loaded real prices and save it in html-format (example: [./media/index.html](./media/index.html)); + - generated prices, a chart and some data on price behavior can be saved as a regular png-image (example: [./media/index.html.png](./media/index.html.png)): + + ![](./media/index.html.png) + +### Price generation method + +A set of candles of a given length `horizon` is generated according to the following (simplified) algorithm: +1. The open price of the first candlestick is determined or randomly generated in the specified range [`minClose`, `maxClose`]. +2. Randomly, depending on the value of the probability of the next candlestick `upCandlesProb` (50% by default), the direction of the candlestick is determined. If `random () ≤ upCandlesProb`, then an up candle (with `open ≤ close`) will be generated, otherwise a down candle (with `open > close`) will be generated. +3. After determining the direction, the `close` value of the candlestick is randomly generated and for the candle's "body" must be `|open - close| ≤ maxCandleBody`. +4. Randomly, depending on the probability of price outliers of the `maxOutlier` candlestick (default is 3%), the candlestick's `high` and `low` values ​​are generated. If `random () ≤ maxOutlier`, then a candlestick with price outliers will be generated: the "tails" of the candlestick may turn out to be large enough to simulate real price "outliers" in the market. If the candlestick is without anomalies, then "tails" will be generated in the range of no more than half of the candlestick body. +5. The close value of the generated candle becomes the open price of the next candle. +6. Then steps 2-5 are repeated until the entire price chain of the specified length `horizon` is generated. + +All parameters can be set after initializing an instance of the `PriceGenerator()` class. The result of price generation is saved in the `self.prices` field in the Pandas DataFrame format and can be used for further analysis. + + +## Setup + +The easiest way is to install via PyPI: +```commandline +pip install pricegenerator +``` + +After that, you can check the installation with the command: +```commandline +pip show pricegenerator +``` + + +## Usage examples + +### Command line + +#### Reference + +Get help: +```commandline +pricegenerator --help +``` + +Output: +```text +usage: python PriceGenerator.py [some options] [one or more commands] + +Forex and stocks price generator. Generates chain of candlesticks with +predefined statistical parameters, return pandas dataframe or saving as .csv- +file with OHLCV-candlestick in every strings. See examples: +https://tim55667757.github.io/PriceGenerator + +optional arguments: + -h, --help show this help message and exit + --sep SEP Option: separator in csv-file, if None then auto- + detecting enable. + --debug-level DEBUG_LEVEL + Option: showing STDOUT messages of minimal debug + level, e.g., 10 = DEBUG, 20 = INFO, 30 = WARNING, 40 = + ERROR, 50 = CRITICAL. + --load-from LOAD_FROM + Command: Load .cvs-file to Pandas dataframe. You can + draw chart in additional with --render-bokeh key. + --generate Command: Generates chain of candlesticks with + predefined statistical parameters and save stock + history as pandas dataframe or .csv-file if --save-to + key is defined. You can draw chart in additional with + --render-bokeh key. + --save-to SAVE_TO Command: Save generated or loaded dataframe to .csv- + file. You can draw chart in additional with --render- + bokeh key. + --render-bokeh RENDER_BOKEH + Command: Show chain of candlesticks as interactive + Bokeh chart. Before using this key you must define + --load-from or --generate keys. +``` + +#### Generating prices with default parameters + +Let's try to generate random price data (key `--generate`) with all default parameters and save them to the file `test.csv` (key `--save-to csv_file_name`). The command might look like this: +```commandline +pricegenerator --debug-level 10 --generate --save-to test.csv +``` + +You should get the output of logs similar to the following: +```text +PriceGenerator.py L:605 DEBUG [2021-01-31 17:52:49,954] =--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--= +PriceGenerator.py L:606 DEBUG [2021-01-31 17:52:49,954] PriceGenerator started: 2021-01-31 17:52:49 +PriceGenerator.py L:367 INFO [2021-01-31 17:52:49,954] Generating prices... +PriceGenerator.py L:368 DEBUG [2021-01-31 17:52:49,954] - Ticker name: TEST +PriceGenerator.py L:369 DEBUG [2021-01-31 17:52:49,954] - Interval or timeframe (time delta between two neighbour candles): 1:00:00 +PriceGenerator.py L:370 DEBUG [2021-01-31 17:52:49,954] - Horizon length (candlesticks count): 100 +PriceGenerator.py L:371 DEBUG [2021-01-31 17:52:49,954] - Start time: 2021-01-31--17-00-00 +PriceGenerator.py L:372 DEBUG [2021-01-31 17:52:49,955] |-> end time: 2021-02-04--21-00-00 +PriceGenerator.py L:373 DEBUG [2021-01-31 17:52:49,955] - Maximum of close prices: 79.21 +PriceGenerator.py L:374 DEBUG [2021-01-31 17:52:49,955] - Minimum of close prices: 67.69 +PriceGenerator.py L:375 DEBUG [2021-01-31 17:52:49,955] - Maximum of candle body sizes: 3.08 +PriceGenerator.py L:376 DEBUG [2021-01-31 17:52:49,955] - Maximum of candle tails outlier sizes: 3.42 +PriceGenerator.py L:377 DEBUG [2021-01-31 17:52:49,955] - Init close (1st open price in chain): 71.49 +PriceGenerator.py L:378 DEBUG [2021-01-31 17:52:49,955] - Maximum of volume of one candle: 42340 +PriceGenerator.py L:379 DEBUG [2021-01-31 17:52:49,955] - Probability that next candle is up: 50.0% +PriceGenerator.py L:380 DEBUG [2021-01-31 17:52:49,955] - Statistical outliers probability: 3.0% +PriceGenerator.py L:397 INFO [2021-01-31 17:52:49,958] Showing last 5 rows as pandas dataframe: +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] datetime open high low close volume +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 95 2021-02-03 11:00:00+03:00 76.82 78.43 76.21 78.13 33652 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 96 2021-02-03 12:00:00+03:00 78.13 78.37 78.12 78.36 9347 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 97 2021-02-03 13:00:00+03:00 78.36 78.40 78.05 78.07 27250 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 98 2021-02-03 14:00:00+03:00 78.07 78.61 75.72 76.42 22979 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 99 2021-02-03 15:00:00+03:00 76.42 77.37 76.25 77.16 30845 +PriceGenerator.py L:173 INFO [2021-01-31 17:52:49,963] Saving [100] rows of pandas dataframe with columns: ['date', 'time', 'open', 'high', 'low', 'close', 'volume']... +PriceGenerator.py L:174 DEBUG [2021-01-31 17:52:49,963] Delimeter: , +PriceGenerator.py L:181 INFO [2021-01-31 17:52:49,976] Pandas dataframe saved to .csv-file [./test.csv] +PriceGenerator.py L:645 DEBUG [2021-01-31 17:52:49,976] All PriceGenerator operations are finished success (summary code is 0). +PriceGenerator.py L:650 DEBUG [2021-01-31 17:52:49,976] PriceGenerator work duration: 0:00:00.022938 +PriceGenerator.py L:651 DEBUG [2021-01-31 17:52:49,976] PriceGenerator work finished: 2021-01-31 17:52:49 + +Process finished with exit code 0 +``` + +Also next to it will be saved the file `test.csv`, an example of which can be found here: [./media/test.csv](./media/test.csv). + +#### Generating prices, getting statistics and drawing a chart + +In the next example, let's not only generate a file with price data, but also get some statistical parameters of prices, as well as draw prices on the chart (the key `--render-bokeh html_file_name`). The command might be something like this: +```commandline +pricegenerator --debug-level 20 --generate --save-to test.csv --render-bokeh index.html +``` + +If successful, you will receive a log output similar to this: +```text +PriceGenerator.py L:367 INFO [2021-01-31 18:00:31,711] Generating prices... +PriceGenerator.py L:397 INFO [2021-01-31 18:00:31,714] Showing last 5 rows of Pandas generated dataframe object: +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] datetime open high low close volume +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 95 2021-02-03 11:00:00+03:00 76.82 78.43 76.21 78.13 33652 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 96 2021-02-03 12:00:00+03:00 78.13 78.37 78.12 78.36 9347 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 97 2021-02-03 13:00:00+03:00 78.36 78.40 78.05 78.07 27250 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 98 2021-02-03 14:00:00+03:00 78.07 78.61 75.72 76.42 22979 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 99 2021-02-03 15:00:00+03:00 76.42 77.37 76.25 77.16 30845 +PriceGenerator.py L:173 INFO [2021-01-31 18:00:31,719] Saving [100] rows of pandas dataframe with columns: ['date', 'time', 'open', 'high', 'low', 'close', 'volume']... +PriceGenerator.py L:181 INFO [2021-01-31 18:00:31,731] Pandas dataframe saved to .csv-file [./test.csv] +PriceGenerator.py L:410 INFO [2021-01-31 18:00:31,731] Rendering pandas dataframe as Bokeh chart... +PriceGenerator.py L:300 INFO [2021-01-31 18:00:31,740] Some statistical info: +## Summary + +| Parameter | Value +|----------------------------------------------|--------------- +| Candles count: | 100 +| Timeframe: | 1:00:00 +| Precision (signs after comma): | 2 +| Close first: | 71.49 +| Close last: | 77.16 +| Close max: | 79.21 +| Close min: | 67.69 +| Diapason (between max and min close prices): | 11.52 +| Trend (between close first and close last: | UP trend +| - Trend deviation parameter: | ±0.5% + +## Some statistics + +| Statistic | Value +|----------------------------------------------|--------------- +| Up candles count: | 53 (53.0%) +| Down candles count: | 47 (47.0%) +| Max of up candles chain: | 7 +| Max of down candles chain: | 5 +| Max delta (between High and Low prices): | 3.08 +| Min delta (between High and Low prices): | 0.0 +| Delta's std. dev.: | 0.86 +| - 99 percentile: | ≤ 2.99 +| - 95 percentile: | ≤ 2.89 +| - 80 percentile: | ≤ 2.2 +| - 50 percentile: | ≤ 1.15 +| Cumulative sum of volumes: | 1777314 +PriceGenerator.py L:563 INFO [2021-01-31 18:00:32,290] Pandas dataframe rendered as html-file [./index.html] + +Process finished with exit code 0 +``` + +After running the command above, you will get three files: +- `test.csv` — .csv-file containing a random set of prices similar to the real ones (example: [./media/test.csv](./media/test.csv)); +- `index.html` — price chart and statistics drawn using the Bokeh library and saved to an .html-file (example: [./media/index.html](./media/index.html)); +- `index.html.md` — statistics as simple text, saved in markdown format (example: [./media/index.html.md](./media/index.html.md)). + +#### Statistics and chart from saved prices + +If you need to get statistics on already generated or real prices, you can simply load the file (key `--load-from csv_file_name`) and draw the chart (key `--render-bokeh html_file_name`): + +```commandline +pricegenerator --debug-level 20 --load-from test.csv --render-bokeh index.html +``` + +As a result of executing the command, you will get a similar graph in `index.html` and statistics in `index.html.md`. + + +### Module import + +Let's look at an example of generating prices with some predefined parameters, save them to Pandas DataFrame and draw a chart. Just save and run the following script: +```python +from pricegenerator.PriceGenerator import PriceGenerator, uLogger +from datetime import datetime, timedelta + +# Disable logging: +uLogger.setLevel(0) + +# --- Initialize an instance of the generator class and set some parameters: +priceModel = PriceGenerator() +priceModel.precision = 1 # how many decimal places should be in generated prices +priceModel.ticker = "MY_GENERATED_PRICES" # random name (ticker) of generated prices +priceModel.timeframe = timedelta(days=1) # time interval between generated candles, 1 hour by default +priceModel.timeStart = datetime.today() # from what date to start generating candles, by default from the current time +priceModel.horizon = 60 # how many candles to generate, there must be at least 5, by default 100 +priceModel.maxClose = 16000 # the highest candlestick closing price in the entire price chain + # by default it is generated randomly in the interval (70, 90), it is similar to the current prices of USDRUB +priceModel.minClose = 13800 # the lowest candlestick closing price in the entire price chain + # by default it is generated randomly in the interval (60, 70), it is similar to the current prices of USDRUB +priceModel.initClose = 14400 # if a price is specified, it will be the closing price like the "previous" candlestick, and at the same time the opening price of the first candlestick in the generated chain + # None by default means that the opening price of the first candle will be generated randomly in the interval (minClose, maxClose) +priceModel.maxOutlier = 500 # The maximum value for the price outlier of the "tails" of the candles. + # None by default means that outliers will be no more than (maxClose - minClose) / 10 +priceModel.maxCandleBody = 300 # maximum value for the size of candlestick bodies abs(open - close) + # None by default means that the candlestick body can be no more than 90% of the outlier size: maxOutlier * 90% +priceModel.maxVolume = 400000 # the maximum trading volume for one candle, by default it is taken randomly from the interval (0, 100000) +priceModel.upCandlesProb = 0.46 # probability that the next generated candlestick will be up, 50% by default +priceModel.outliersProb = 0.11 # the probability that the next generated candlestick will have a price "outlier", 3% by default +priceModel.trendDeviation = 0.005 # price fluctuations between close prices of the first and last candlesticks defining the trend. “NO trend” if the difference is less than this value, by default ± 0.005 or ± 0.5% +priceModel._chartTitle = "" # chart title, usually generated automatically + +# Prices have not yet been generated and not loaded, let's check this: +print("Current prices:\n{}".format(priceModel.prices)) + +# We launch the price generator, and they will be saved in the +# priceModel.prices field in the Pandas DataFrame format: +priceModel.Generate() + +# Make sure the prices are generated: +print("Generated prices as Pandas DataFrame:\n{}".format(priceModel.prices)) + +# The dictionary with the calculated statistics is saved to a field self.stat: +print("Dict with statistics:\n{}".format(priceModel.stat)) + +# Saving OHLCV-prices into .csv-file: +priceModel.SaveToFile(fileName="test.csv") + +# Saving the price chart to a html-file and immediately opening it in the default browser. +# The statistics will be automatically saved in a markdown file named fileName + ".md". +priceModel.RenderBokeh(fileName="index.html", viewInBrowser=True) +``` + +When you run the script, you will receive a similar output to the logs, three files: `test.csv`,` index.html` and `index.html.md`. As well as the html-file with the price chart will be immediately opened in the browser. You can independently experiment with the parameters of the `PriceGenerator()` class to generate prices suitable for your conditions. + + +Good luck for you in automating and testing stock trading! ;) \ No newline at end of file diff --git a/README_RU.md b/README_RU.md new file mode 100644 index 0000000..772fdd5 --- /dev/null +++ b/README_RU.md @@ -0,0 +1,295 @@ +# PriceGenerator + + +Инструкция на английском здесь (see english readme here): https://github.com/Tim55667757/PriceGenerator/blob/master/README.md + +[![build](https://travis-ci.org/Tim55667757/PriceGenerator.svg)](https://travis-ci.org/Tim55667757/PriceGenerator) +[![pypi](https://img.shields.io/pypi/v/PriceGenerator.svg)](https://pypi.python.org/pypi/PriceGenerator) +[![license](https://img.shields.io/pypi/l/PriceGenerator.svg)](https://github.com/Tim55667757/PriceGenerator/blob/master/LICENSE) + +**Содержание** + +1. [Введение](#Введение) + - [Метод генерации цен](#Метод-генерации-цен) +2. [Как установить](#Как-установить) +3. [Примеры использования](#Примеры-использования) + - [Из командной строки](#Из-командной-строки) + - [Справка](#Справка) + - [Генерация цен с параметрами по умолчанию](#Генерация-цен-с-параметрами-по-умолчанию) + - [Генерация цен, получение статистики и отрисовка графика](#Генерация-цен-получение-статистики-и-отрисовка-графика) + - [Статистика и график из сохранённых цен](#Статистика-и-график-из-сохранённых-цен) + - [Через импорт модуля](#Через-импорт-модуля) + + +## Введение + +Иногда для целей тестирования автоматизированных торговых алгоритмов бывает необходимо получить набор данных с биржевыми ценами. Обычно трейдеры и аналитики используют модель цен вида OHLCV-candlesticks (open, high, low, close, volume), так называемые японские свечи. Одна строка таких данных представляет собой набор цен для построения одной японской свечи: дата открытия, цена открытия, наибольшая цена, наименьшая цена, цена закрытия на данном временном интервале и значение объёма торгов. + +**PriceGenerator** — это простая библиотека, которую можно использовать как python-модуль или запускать из командной строки и генерировать случайные ценовые данные, максимально похожие на "настоящие цены", но с заранее заданными статистическими характеристиками. Можно задать интервал цен, таймфрейм, максимальное и минимальное значения для диапазона цен, максимальный размер для свечей, вероятность направления для очередной свечи, вероятность ценовых выбросов, количество генерируемых свечей и некоторые другие параметры. + +Для дальнейшего статистического анализа цен в python очень часто используют библиотеку Pandas. Цены, сохранённые в виде Pandas DataFrame, могут выглядеть как-то так: +```text + datetime open high low close volume +95 2021-02-03 11:00:00+03:00 76.82 78.43 76.21 78.13 33652 +96 2021-02-03 12:00:00+03:00 78.13 78.37 78.12 78.36 9347 +97 2021-02-03 13:00:00+03:00 78.36 78.40 78.05 78.07 27250 +98 2021-02-03 14:00:00+03:00 78.07 78.61 75.72 76.42 22979 +99 2021-02-03 15:00:00+03:00 76.42 77.37 76.25 77.16 30845 +``` + +Библиотека PriceGenerator позволяет: +- сохранить сгенерированные цены в .csv-формате (пример: [./media/test.csv](./media/test.csv)); +- сохранить сгенерированные цены в переменную формата Pandas DataFrame для дальнейшего использования в скриптах автоматизации; +- автоматически рассчитать некоторые статистические и вероятностные характеристики сгенерированных цен и сохранить их в markdown-формате (пример: [./media/index.html.md](./media/index.html.md)); +- загрузить цены реальных инструментов по модели OHLCV-candlesticks из .csv-файла и провести их статистический анализ; +- нарисовать график сгенерированных или загруженных реальных цен и сохранить его в html-формате (пример: [./media/index.html](./media/index.html)); + - сгенерированные цены, график и некоторые данные о поведении цен можно сохранить в виде обычной png-картинки (пример: [./media/index.html.png](./media/index.html.png)): + + ![](./media/index.html.png) + +### Метод генерации цен + +Генерация набора свечей заданной длины `horizon` происходит по следующему (упрощённому) алгоритму: +1. Определяется или случайным образом генерируется в заданном диапазоне [`minClose`, `maxClose`] цена открытия `open` первой свечи. +2. Случайным образом, в зависимости от значения вероятности направления очередной свечи `upCandlesProb` (по умолчанию 50%), определяется направление свечи. Если `random() ≤ upCandlesProb`, то будет генерироваться up-свеча (у которой `open ≤ close`), иначе будет генерироваться down-свеча (у которой `open > close`). +3. После определения направления значение `close` свечи случайным образом генерируется так, чтобы для получившегося "тела" свечи было справедливо `|open - close| ≤ maxCandleBody`. +4. Случайным образом, в зависимости от значения вероятности ценовых выбросов свечи `maxOutlier` (по умолчанию 3%), генерируются значения `high` и `low` свечи. Если `random() ≤ maxOutlier`, то будет генерироваться свеча с ценовыми выбросами: "хвосты" свечи могут получиться достаточно большими, что будет имитировать реальные ценовые "выбросы" на рынке. Если свеча без аномалий, то "хвосты" будут генерироваться в диапазоне не более половины тела свечи. +5. Значение `close` сгенерированной свечи становится значением цены открытия `open` следующей свечи. +6. Далее повторяются шаги 2-5 пока не будет сгенерирована вся цепочка цен заданной длины `horizon`. + +Все параметры можно задать после инициализации экземпляра класса `PriceGenerator()`. Результат генерации цен сохраняется в переменной класса `prices` в формате Pandas DataFrame и может использоваться для дальнейшего анализа. + + +## Как установить + +Проще всего использовать установку через PyPI: +```commandline +pip install pricegenerator +``` + +После этого можно проверить установку командой: +```commandline +pip show pricegenerator +``` + + +## Примеры использования + +### Из командной строки + +#### Справка + +Внутренняя справка по ключам: +```commandline +pricegenerator --help +``` + +Вывод: +```text +usage: python PriceGenerator.py [some options] [one or more commands] + +Forex and stocks price generator. Generates chain of candlesticks with +predefined statistical parameters, return pandas dataframe or saving as .csv- +file with OHLCV-candlestick in every strings. See examples: +https://tim55667757.github.io/PriceGenerator + +optional arguments: + -h, --help show this help message and exit + --sep SEP Option: separator in csv-file, if None then auto- + detecting enable. + --debug-level DEBUG_LEVEL + Option: showing STDOUT messages of minimal debug + level, e.g., 10 = DEBUG, 20 = INFO, 30 = WARNING, 40 = + ERROR, 50 = CRITICAL. + --load-from LOAD_FROM + Command: Load .cvs-file to Pandas dataframe. You can + draw chart in additional with --render-bokeh key. + --generate Command: Generates chain of candlesticks with + predefined statistical parameters and save stock + history as pandas dataframe or .csv-file if --save-to + key is defined. You can draw chart in additional with + --render-bokeh key. + --save-to SAVE_TO Command: Save generated or loaded dataframe to .csv- + file. You can draw chart in additional with --render- + bokeh key. + --render-bokeh RENDER_BOKEH + Command: Show chain of candlesticks as interactive + Bokeh chart. Before using this key you must define + --load-from or --generate keys. +``` + +#### Генерация цен с параметрами по умолчанию + +Давайте попробуем сгенерировать случайные ценовые данные (ключ `--generate`) со всеми параметрами по умолчанию и сохранить их в файл `test.csv` (ключ `--save-to имя_csv_файла` ). Команда может выглядеть так: +```commandline +pricegenerator --debug-level 10 --generate --save-to test.csv +``` + +Должен получиться вывод логов примерно следующего содержания: +```text +PriceGenerator.py L:605 DEBUG [2021-01-31 17:52:49,954] =--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--= +PriceGenerator.py L:606 DEBUG [2021-01-31 17:52:49,954] PriceGenerator started: 2021-01-31 17:52:49 +PriceGenerator.py L:367 INFO [2021-01-31 17:52:49,954] Generating prices... +PriceGenerator.py L:368 DEBUG [2021-01-31 17:52:49,954] - Ticker name: TEST +PriceGenerator.py L:369 DEBUG [2021-01-31 17:52:49,954] - Interval or timeframe (time delta between two neighbour candles): 1:00:00 +PriceGenerator.py L:370 DEBUG [2021-01-31 17:52:49,954] - Horizon length (candlesticks count): 100 +PriceGenerator.py L:371 DEBUG [2021-01-31 17:52:49,954] - Start time: 2021-01-31--17-00-00 +PriceGenerator.py L:372 DEBUG [2021-01-31 17:52:49,955] |-> end time: 2021-02-04--21-00-00 +PriceGenerator.py L:373 DEBUG [2021-01-31 17:52:49,955] - Maximum of close prices: 79.21 +PriceGenerator.py L:374 DEBUG [2021-01-31 17:52:49,955] - Minimum of close prices: 67.69 +PriceGenerator.py L:375 DEBUG [2021-01-31 17:52:49,955] - Maximum of candle body sizes: 3.08 +PriceGenerator.py L:376 DEBUG [2021-01-31 17:52:49,955] - Maximum of candle tails outlier sizes: 3.42 +PriceGenerator.py L:377 DEBUG [2021-01-31 17:52:49,955] - Init close (1st open price in chain): 71.49 +PriceGenerator.py L:378 DEBUG [2021-01-31 17:52:49,955] - Maximum of volume of one candle: 42340 +PriceGenerator.py L:379 DEBUG [2021-01-31 17:52:49,955] - Probability that next candle is up: 50.0% +PriceGenerator.py L:380 DEBUG [2021-01-31 17:52:49,955] - Statistical outliers probability: 3.0% +PriceGenerator.py L:397 INFO [2021-01-31 17:52:49,958] Showing last 5 rows as pandas dataframe: +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] datetime open high low close volume +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 95 2021-02-03 11:00:00+03:00 76.82 78.43 76.21 78.13 33652 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 96 2021-02-03 12:00:00+03:00 78.13 78.37 78.12 78.36 9347 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 97 2021-02-03 13:00:00+03:00 78.36 78.40 78.05 78.07 27250 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 98 2021-02-03 14:00:00+03:00 78.07 78.61 75.72 76.42 22979 +PriceGenerator.py L:399 INFO [2021-01-31 17:52:49,963] 99 2021-02-03 15:00:00+03:00 76.42 77.37 76.25 77.16 30845 +PriceGenerator.py L:173 INFO [2021-01-31 17:52:49,963] Saving [100] rows of pandas dataframe with columns: ['date', 'time', 'open', 'high', 'low', 'close', 'volume']... +PriceGenerator.py L:174 DEBUG [2021-01-31 17:52:49,963] Delimeter: , +PriceGenerator.py L:181 INFO [2021-01-31 17:52:49,976] Pandas dataframe saved to .csv-file [./test.csv] +PriceGenerator.py L:645 DEBUG [2021-01-31 17:52:49,976] All PriceGenerator operations are finished success (summary code is 0). +PriceGenerator.py L:650 DEBUG [2021-01-31 17:52:49,976] PriceGenerator work duration: 0:00:00.022938 +PriceGenerator.py L:651 DEBUG [2021-01-31 17:52:49,976] PriceGenerator work finished: 2021-01-31 17:52:49 + +Process finished with exit code 0 +``` + +Также рядом будет сохранён файл `test.csv`, пример которого можно посмотреть здесь: [./media/test.csv](./media/test.csv). + +#### Генерация цен, получение статистики и отрисовка графика + +В следующем примере давайте не только сгенерируем файл с данными по ценам, но и получим некоторые статистические параметры цен, а также отрисуем цены на графике (ключ `--render-bokeh имя_html_файла`). Команда может быть примерно такой: +```commandline +pricegenerator --debug-level 20 --generate --save-to test.csv --render-bokeh index.html +``` + +В случае успеха вы получите вывод в лог, похожий на этот: +```text +PriceGenerator.py L:367 INFO [2021-01-31 18:00:31,711] Generating prices... +PriceGenerator.py L:397 INFO [2021-01-31 18:00:31,714] Showing last 5 rows of Pandas generated dataframe object: +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] datetime open high low close volume +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 95 2021-02-03 11:00:00+03:00 76.82 78.43 76.21 78.13 33652 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 96 2021-02-03 12:00:00+03:00 78.13 78.37 78.12 78.36 9347 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 97 2021-02-03 13:00:00+03:00 78.36 78.40 78.05 78.07 27250 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 98 2021-02-03 14:00:00+03:00 78.07 78.61 75.72 76.42 22979 +PriceGenerator.py L:399 INFO [2021-01-31 18:00:31,719] 99 2021-02-03 15:00:00+03:00 76.42 77.37 76.25 77.16 30845 +PriceGenerator.py L:173 INFO [2021-01-31 18:00:31,719] Saving [100] rows of pandas dataframe with columns: ['date', 'time', 'open', 'high', 'low', 'close', 'volume']... +PriceGenerator.py L:181 INFO [2021-01-31 18:00:31,731] Pandas dataframe saved to .csv-file [./test.csv] +PriceGenerator.py L:410 INFO [2021-01-31 18:00:31,731] Rendering pandas dataframe as Bokeh chart... +PriceGenerator.py L:300 INFO [2021-01-31 18:00:31,740] Some statistical info: +## Summary + +| Parameter | Value +|----------------------------------------------|--------------- +| Candles count: | 100 +| Timeframe: | 1:00:00 +| Precision (signs after comma): | 2 +| Close first: | 71.49 +| Close last: | 77.16 +| Close max: | 79.21 +| Close min: | 67.69 +| Diapason (between max and min close prices): | 11.52 +| Trend (between close first and close last: | UP trend +| - Trend deviation parameter: | ±0.5% + +## Some statistics + +| Statistic | Value +|----------------------------------------------|--------------- +| Up candles count: | 53 (53.0%) +| Down candles count: | 47 (47.0%) +| Max of up candles chain: | 7 +| Max of down candles chain: | 5 +| Max delta (between High and Low prices): | 3.08 +| Min delta (between High and Low prices): | 0.0 +| Delta's std. dev.: | 0.86 +| - 99 percentile: | ≤ 2.99 +| - 95 percentile: | ≤ 2.89 +| - 80 percentile: | ≤ 2.2 +| - 50 percentile: | ≤ 1.15 +| Cumulative sum of volumes: | 1777314 +PriceGenerator.py L:563 INFO [2021-01-31 18:00:32,290] Pandas dataframe rendered as html-file [./index.html] + +Process finished with exit code 0 +``` + +После выполнения команды выше вы получите три файла: +- `test.csv` — файл в .csv-формате, который содержит случайный набор цен, похожих на настоящие (пример: [./media/test.csv](./media/test.csv)); +- `index.html` — график цен и статистику, отрисованные при помощи библиотеки Bokeh и сохранённые в .html-файл (пример: [./media/index.html](./media/index.html)); +- `index.html.md` — статистика в текстовом виде, сохранённая в маркдаун-формате (пример: [./media/index.html.md](./media/index.html.md)). + +#### Статистика и график из сохранённых цен + +Если вам нужно получить статистику по уже сгенерированным или реальным ценам, вы можете просто загрузить файл (ключ `--load-from имя_csv_файла` ) и отрисовать график (ключ `--render-bokeh имя_html_файла`): + +```commandline +pricegenerator --debug-level 20 --load-from test.csv --render-bokeh index.html +``` + +В результате выполнения команды вы получите аналогичный график в `index.html` и статистику в `index.html.md`. + + +### Через импорт модуля + +Давайте рассмотрим пример генерации цен с указанием некоторых параметров, сохраним их в Pandas DataFrame и нарисуем график. Просто сохраните и запустите следующий скрипт: +```python +from pricegenerator.PriceGenerator import PriceGenerator, uLogger +from datetime import datetime, timedelta + +# Отключаем логирование, чтобы не мешалось: +uLogger.setLevel(0) + +# --- Инициализируем экземпляр класса генератора и настраиваем некоторые параметры: +priceModel = PriceGenerator() +priceModel.precision = 1 # сколько знаков после запятой должно быть в сгенерированных ценах +priceModel.ticker = "MY_GENERATED_PRICES" # произвольное имя (тикер) генерируемых цен +priceModel.timeframe = timedelta(days=1) # временной интервал между генерируемыми свечами, 1 час по умолчанию +priceModel.timeStart = datetime.today() # с какой даты начинать генерацию свечей, по умолчанию с текущего времени +priceModel.horizon = 60 # сколько сгенерировать свечей, их должно быть не меньше 5-ти, по умолчанию 100 +priceModel.maxClose = 16000 # максимальная цена закрытия свечи во всей цепочке цен, + # по умолчанию генерируется случайно в интервале (70, 90), это немного похоже на цены USDRUB +priceModel.minClose = 13800 # минимальная цена закрытия свечи во всей цепочке цен, + # по умолчанию генерируется случайно в интервале (60, 70), это немного похоже на цены USDRUB +priceModel.initClose = 14400 # если цена указана, то она будет ценой close (как бы "предыдущей" свечи) и одновременно ценой open самой первой свечи в генерируемой цепочке. + # None по умолчанию означает, что цена open первой свечи будет сгенерирована случайно в интервале (minClose, maxClose) +priceModel.maxOutlier = 500 # Максимальное значение для ценовых выбросов "хвостов" у свечей. + # None по умолчанию означает, что выбросы будут не более чем на (maxClose - minClose) / 10 +priceModel.maxCandleBody = 300 # Максимальное значение для размера тел свечей abs(open - close). + # None по умолчанию означает, что тело свечи может быть не более чем 90% от размера максимального выброса: maxOutlier * 90% +priceModel.maxVolume = 400000 # максимальное значение объёма торгов для одной свечи, по умолчанию берётся случайным образом из интервала (0, 100000) +priceModel.upCandlesProb = 0.46 # вероятность того, что очередная генерируемая свеча будет вверх, 50% по умолчанию +priceModel.outliersProb = 0.11 # вероятность того, что очередная генерируемая свеча будет иметь ценовой "выброс", 3% по умолчанию +priceModel.trendDeviation = 0.005 # колебание цены close первой и последней свечей для определения тренда. "NO trend" если разница меньше этого значения, по умолчанию ±0.005 или ±0.5%. +priceModel._chartTitle = "" # произвольный заголовок графика, обычно генерируется автоматически + +# Цены пока не сгенерированы и не загружены, проверим это: +print("Current prices:\n{}".format(priceModel.prices)) + +# Запускаем генератор цен, при этом они будут сохранены +# в переменной priceModel.prices в формате Pandas DataFrame: +priceModel.Generate() + +# Убеждаемся, что цены сгенерированы: +print("Generated prices as Pandas DataFrame:\n{}".format(priceModel.prices)) + +# Словарь с посчитанной статистикой сохраняется в переменную self.stat: +print("Dict with statistics:\n{}".format(priceModel.stat)) + +# Сохраняем OHLCV-цены в .csv-файл +priceModel.SaveToFile(fileName="test.csv") + +# Сохраняем график цен в html-файл и сразу открываем его в браузере. +# Статистика в текстовом виде будет автоматически сохранена в markdown-файле с именем fileName + ".md". +priceModel.RenderBokeh(fileName="index.html", viewInBrowser=True) +``` + +При запуске скрипта вы получите аналогичный вывод в логи, три файла: `test.csv`, `index.html` и `index.html.md`, а также html-файл с графиком цен будет сразу же открыт в браузере. Вы можете самостоятельно поэкспериментировать с параметрами класса `PriceGenerator()` для генерации цен подходящих под ваши условия. + + +Успехов вам в автоматизации и тестировании биржевой торговли! ;) \ No newline at end of file diff --git a/media/index.html b/media/index.html new file mode 100644 index 0000000..a723b48 --- /dev/null +++ b/media/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + Instrument: TEST, timeframe: 1h 0m 0s, horizon length: 100 (from 2021-01-30 09:00:00 to 2021-02-03 12:00:00) + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/media/index.html.md b/media/index.html.md new file mode 100644 index 0000000..39359fc --- /dev/null +++ b/media/index.html.md @@ -0,0 +1,31 @@ +## Summary + +| Parameter | Value +|----------------------------------------------|--------------- +| Candles count: | 100 +| Timeframe: | 1:00:00 +| Precision (signs after comma): | 2 +| Close first: | 71.49 +| Close last: | 77.16 +| Close max: | 79.21 +| Close min: | 67.69 +| Diapason (between max and min close prices): | 11.52 +| Trend (between close first and close last: | UP trend +| - Trend deviation parameter: | ±0.5% + +## Some statistics + +| Statistic | Value +|----------------------------------------------|--------------- +| Up candles count: | 53 (53.0%) +| Down candles count: | 47 (47.0%) +| Max of up candles chain: | 7 +| Max of down candles chain: | 5 +| Max delta (between High and Low prices): | 3.08 +| Min delta (between High and Low prices): | 0.0 +| Delta's std. dev.: | 0.86 +| - 99 percentile: | ≤ 2.99 +| - 95 percentile: | ≤ 2.89 +| - 80 percentile: | ≤ 2.2 +| - 50 percentile: | ≤ 1.15 +| Cumulative sum of volumes: | 1777314 \ No newline at end of file diff --git a/media/index.html.png b/media/index.html.png new file mode 100644 index 0000000..ce83e9f Binary files /dev/null and b/media/index.html.png differ diff --git a/media/test.csv b/media/test.csv new file mode 100644 index 0000000..0c3a89f --- /dev/null +++ b/media/test.csv @@ -0,0 +1,100 @@ +2021-01-30,12:00:00+03:00,73.14,73.26,70.7,71.49,6321 +2021-01-30,13:00:00+03:00,71.49,71.58,71.22,71.22,529 +2021-01-30,14:00:00+03:00,71.22,71.45,70.56,70.68,35530 +2021-01-30,15:00:00+03:00,70.68,70.88,69.9,70.11,3602 +2021-01-30,16:00:00+03:00,70.11,70.28,69.28,69.54,406 +2021-01-30,17:00:00+03:00,69.54,70.52,69.26,70.49,10642 +2021-01-30,18:00:00+03:00,70.49,71.09,68.7,68.93,18124 +2021-01-30,19:00:00+03:00,68.93,69.96,68.67,69.7,3959 +2021-01-30,20:00:00+03:00,69.7,70.4,68.04,68.22,16654 +2021-01-30,21:00:00+03:00,68.22,69.33,68.15,69.21,32769 +2021-01-30,22:00:00+03:00,69.21,70.55,68.86,70.18,357 +2021-01-30,23:00:00+03:00,70.18,70.77,70.12,70.74,15650 +2021-01-31,00:00:00+03:00,70.74,71.06,68.44,69.15,24648 +2021-01-31,01:00:00+03:00,69.15,69.25,68.85,68.95,28152 +2021-01-31,02:00:00+03:00,68.95,69.58,68.88,69.48,29036 +2021-01-31,03:00:00+03:00,69.48,69.58,68.95,69.1,24873 +2021-01-31,04:00:00+03:00,69.1,69.21,67.25,67.69,35685 +2021-01-31,05:00:00+03:00,67.69,69.12,67.1,68.97,4952 +2021-01-31,06:00:00+03:00,68.97,69.65,68.83,69.52,15562 +2021-01-31,07:00:00+03:00,69.52,69.82,68.49,68.55,6835 +2021-01-31,08:00:00+03:00,68.55,69.27,68.24,69.21,17149 +2021-01-31,09:00:00+03:00,69.21,71.47,68.53,70.72,12667 +2021-01-31,10:00:00+03:00,70.72,70.99,69.63,69.77,11321 +2021-01-31,11:00:00+03:00,69.77,69.89,69.73,69.87,16690 +2021-01-31,12:00:00+03:00,69.87,71.51,69.62,71.1,29930 +2021-01-31,13:00:00+03:00,71.1,72.79,70.58,72.35,1319 +2021-01-31,14:00:00+03:00,72.35,73.38,72.04,73.08,33752 +2021-01-31,15:00:00+03:00,73.08,73.25,71.21,71.58,8521 +2021-01-31,16:00:00+03:00,71.58,73.85,70.98,73.19,8139 +2021-01-31,17:00:00+03:00,73.19,75.15,73.11,74.73,34336 +2021-01-31,18:00:00+03:00,74.73,75.6,74.58,75.52,19862 +2021-01-31,19:00:00+03:00,75.52,75.73,74.88,75.08,11788 +2021-01-31,20:00:00+03:00,75.08,75.19,75.08,75.16,14535 +2021-01-31,21:00:00+03:00,75.16,75.16,74.99,75.02,3468 +2021-01-31,22:00:00+03:00,75.02,76.67,74.99,76.23,4344 +2021-01-31,23:00:00+03:00,76.23,76.84,76.06,76.69,12230 +2021-02-01,00:00:00+03:00,76.69,76.76,76.69,76.75,26946 +2021-02-01,01:00:00+03:00,76.75,77.72,76.5,77.69,15544 +2021-02-01,02:00:00+03:00,77.69,78.46,77.5,78.41,31632 +2021-02-01,03:00:00+03:00,78.41,78.87,78.35,78.74,938 +2021-02-01,04:00:00+03:00,78.74,79.37,78.66,79.21,17353 +2021-02-01,05:00:00+03:00,79.21,79.94,77.74,78.16,1414 +2021-02-01,06:00:00+03:00,78.16,78.37,78.09,78.35,13543 +2021-02-01,07:00:00+03:00,78.35,78.42,77.75,77.78,6210 +2021-02-01,08:00:00+03:00,77.78,77.9,77.15,77.35,18435 +2021-02-01,09:00:00+03:00,77.35,79.29,76.93,78.98,17735 +2021-02-01,10:00:00+03:00,78.98,79.46,77.6,77.77,15752 +2021-02-01,11:00:00+03:00,77.77,78.19,76.36,76.37,8637 +2021-02-01,12:00:00+03:00,76.37,76.37,76.37,76.37,28449 +2021-02-01,13:00:00+03:00,76.37,76.72,75.12,75.43,32907 +2021-02-01,14:00:00+03:00,75.43,75.62,74.6,74.74,13413 +2021-02-01,15:00:00+03:00,74.74,74.77,74.18,74.21,26541 +2021-02-01,16:00:00+03:00,74.21,74.5,73.4,73.58,33150 +2021-02-01,17:00:00+03:00,73.58,73.61,73.57,73.61,35433 +2021-02-01,18:00:00+03:00,73.61,73.91,71.76,72.3,6221 +2021-02-01,19:00:00+03:00,72.3,72.88,72.13,72.87,4961 +2021-02-01,20:00:00+03:00,72.87,73.72,72.53,73.56,25311 +2021-02-01,21:00:00+03:00,73.56,73.7,72.99,73.01,32653 +2021-02-01,22:00:00+03:00,73.01,73.31,72.89,73.3,22560 +2021-02-01,23:00:00+03:00,73.3,73.96,71.03,71.59,341 +2021-02-02,00:00:00+03:00,71.59,71.78,70.41,70.65,24284 +2021-02-02,01:00:00+03:00,70.65,70.85,69.81,70.02,31810 +2021-02-02,02:00:00+03:00,70.02,70.03,70.02,70.03,13944 +2021-02-02,03:00:00+03:00,70.03,70.07,69.3,69.47,19261 +2021-02-02,04:00:00+03:00,69.47,69.54,69.03,69.1,13253 +2021-02-02,05:00:00+03:00,69.1,69.11,68.64,68.74,3852 +2021-02-02,06:00:00+03:00,68.74,68.75,68.62,68.66,31781 +2021-02-02,07:00:00+03:00,68.66,71.03,68.04,70.39,7180 +2021-02-02,08:00:00+03:00,70.39,70.56,68.97,69.1,12761 +2021-02-02,09:00:00+03:00,69.1,70.33,69.03,70.21,15998 +2021-02-02,10:00:00+03:00,70.21,72.03,69.54,71.65,11344 +2021-02-02,11:00:00+03:00,71.65,73.32,70.96,73.11,34200 +2021-02-02,12:00:00+03:00,73.11,73.48,71.9,72.11,3252 +2021-02-02,13:00:00+03:00,72.11,73.31,71.86,73.29,24019 +2021-02-02,14:00:00+03:00,73.29,73.89,71.51,71.73,14824 +2021-02-02,15:00:00+03:00,71.73,72.18,71.71,72.05,34753 +2021-02-02,16:00:00+03:00,72.05,72.55,72.01,72.46,18130 +2021-02-02,17:00:00+03:00,72.46,74.18,71.73,74.01,4852 +2021-02-02,18:00:00+03:00,74.01,75.6,73.41,75.23,33378 +2021-02-02,19:00:00+03:00,75.23,75.24,74.61,74.67,29435 +2021-02-02,20:00:00+03:00,74.67,76.98,74.09,76.37,35645 +2021-02-02,21:00:00+03:00,76.37,76.51,75.9,76.0,26144 +2021-02-02,22:00:00+03:00,76.0,76.63,73.55,75.35,19452 +2021-02-02,23:00:00+03:00,75.35,75.72,75.21,75.7,4795 +2021-02-03,00:00:00+03:00,75.7,76.8,75.39,76.48,25675 +2021-02-03,01:00:00+03:00,76.48,77.3,76.36,77.05,13678 +2021-02-03,02:00:00+03:00,77.05,77.1,75.68,75.7,11015 +2021-02-03,03:00:00+03:00,75.7,77.35,75.18,77.16,18831 +2021-02-03,04:00:00+03:00,77.16,77.35,76.31,76.39,8950 +2021-02-03,05:00:00+03:00,76.39,78.61,75.9,77.93,35073 +2021-02-03,06:00:00+03:00,77.93,77.94,77.79,77.82,27636 +2021-02-03,07:00:00+03:00,77.82,79.06,77.62,78.87,446 +2021-02-03,08:00:00+03:00,78.87,78.97,78.87,78.96,20763 +2021-02-03,09:00:00+03:00,78.96,79.1,78.45,78.55,19923 +2021-02-03,10:00:00+03:00,78.55,79.04,76.2,76.82,12488 +2021-02-03,11:00:00+03:00,76.82,78.43,76.21,78.13,33652 +2021-02-03,12:00:00+03:00,78.13,78.37,78.12,78.36,9347 +2021-02-03,13:00:00+03:00,78.36,78.4,78.05,78.07,27250 +2021-02-03,14:00:00+03:00,78.07,78.61,75.72,76.42,22979 +2021-02-03,15:00:00+03:00,76.42,77.37,76.25,77.16,30845 diff --git a/pricegenerator/PriceGenerator.py b/pricegenerator/PriceGenerator.py new file mode 100644 index 0000000..b5dce9c --- /dev/null +++ b/pricegenerator/PriceGenerator.py @@ -0,0 +1,713 @@ +# -*- coding: utf-8 -*- +# Author: Timur Gilmullin + + +# Module: forex and stocks price generator. +# Generates chain of candlesticks with predefined statistical parameters, return pandas dataframe, saving as .csv-file or .html-file with OHLCV-candlestick in every strings. +# In additional you can view some statistical and probability parameters of generated or loaded prices. + + +import os +import sys +from datetime import datetime, timedelta +from dateutil.tz import tzlocal +from argparse import ArgumentParser + +from math import pi +from statistics import mode, pstdev, StatisticsError +from itertools import groupby +import pandas as pd +import random +from bokeh.plotting import figure, show, save, output_file +from bokeh.models import Legend + +import pricegenerator.UniLogger as uLog +import traceback as tb + + +# --- Common technical parameters: + +uLogger = uLog.UniLogger +uLogger.level = 10 # debug level by default +uLogger.handlers[0].level = 20 # info level by default for STDOUT +# uLogger.handlers[1].level = 10 # debug level by default for log.txt + + +class PriceGenerator: + """ + This class implements methods to generation of prices statistically similar to real ones. + """ + + def __init__(self): + self.prices = None # copy of generated or loaded prices will be put into this Pandas variable + + self.csvHeaders = ["date", "time", "open", "high", "low", "close", "volume"] # headers if .csv-file used + self.dfHeaders = ["datetime", "open", "high", "low", "close", "volume"] # dataframe headers + self.sep = "," # Separator in csv-file + + self._precision = 2 # signs after comma + self._deg10prec = 10 ** 2 # 10^precision is used for some formulas + + self.ticker = "TEST" # some fake ticker name + self.timeframe = timedelta(hours=1) # time delta between two neighbour candles, 1 hour by default + self.timeStart = datetime.now(tzlocal()).replace(microsecond=0, second=0, minute=0) + self.horizon = 100 # Generating candlesticks count, must be >= 5 + self.maxClose = random.uniform(70, 90) # maximum of close prices must be >= self.minClose + self.minClose = random.uniform(60, 70) # minimum of close prices must be <= self.maxClose + self.initClose = None # if not None generator started 1st open price of chain from this price + self.maxOutlier = None # maximum of outlier size of candle tails, if None then used (maxClose - minClose) / 10 + self.maxCandleBody = None # maximum of candle body sizes: abs(open - close), if None then used maxOutlier * 90% + self._maxVolume = random.randint(0, 100000) # maximum of trade volumes + self._upCandlesProb = 0.5 # probability that next candle is up, 50% by default + self._outliersProb = 0.03 # statistical outliers probability (price "tails"), 3% by default + self._trendDeviation = 0.005 # relative deviation for trend detection, 0.005 mean ±0.5% by default. "NO trend" if (1st_close - last_close) / 1st_close <= self.trendDeviation + + self._chartTitle = "" # chart title, auto-generated when loading or creating chain of candlesticks + + # some default statistics for calculation: + self._stat = { + "candles": 0, # generated candlesticks count + "precision": 2, # generated candlesticks count + "closeFirst": 0., # first close price + "closeLast": 0., # last close price + "closeMax": 0., # max close price + "closeMix": 0., # min close price + "diapason": 0., # diapason = closeMax - closeMin + "trend": "NO trend", # "UP trend" or "DOWN trend" with uses ±self.trendDeviation + "trendDev": 0.005, + "upCount": 0, # count of up candles + "downCount": 0, # count of down candles + "upCountChainMax": 0, # max chain count of up candles + "downCountChainMax": 0, # max chain count of down candles + "deltas": { + "max": 0., # delta max = max(close_prices) + "min": 0., # delta min = min(close_prices) + "stDev": 0., # standard deviation + "q99": 0., # 99 percentile + "q95": 0., # 95 percentile + "q80": 0., # 80 percentile + "q50": 0., # 50 percentile + }, + "cumSumVolumes": 0 # cumulative sum of volumes + } + + @property + def upCandlesProb(self): + return self._upCandlesProb + + @upCandlesProb.setter + def upCandlesProb(self, value): + if value is None or value < 0: + self._upCandlesProb = 0 + + elif value > 1: + self._upCandlesProb = 1 + + else: + self._upCandlesProb = value + + @property + def outliersProb(self): + return self._outliersProb + + @outliersProb.setter + def outliersProb(self, value): + if value is None or value < 0: + self._outliersProb = 0 + + elif value > 1: + self._outliersProb = 1 + + else: + self._outliersProb = value + + @property + def trendDeviation(self): + return self._trendDeviation + + @trendDeviation.setter + def trendDeviation(self, value): + if value is None or value < 0: + self._trendDeviation = 0 + + elif value > 1: + self._trendDeviation = 1 + + else: + self._trendDeviation = value + + @property + def maxVolume(self): + return self._maxVolume + + @maxVolume.setter + def maxVolume(self, value): + if value is None or value < 0: + self._maxVolume = 0 + + else: + self._maxVolume = value + + @property + def stat(self): + return self._stat + + @property + def precision(self): + return self._precision + + @precision.setter + def precision(self, value): + if value > 0: + self._precision = value + self._deg10prec = 10 ** value # 10^precision + + else: + self._precision = 1 + self._deg10prec = 1 + + @staticmethod + def FormattedDelta(tDelta, fmt): + """ + Return timedelta formatted as string, e.g. FormattedDelta(delta_obj, "{days} days {hours}:{minutes}:{seconds}") + """ + d = {"days": tDelta.days} + d["hours"], rem = divmod(tDelta.seconds, 3600) + d["minutes"], d["seconds"] = divmod(rem, 60) + + return fmt.format(**d) + + def DetectPrecision(self, examples): + """ + Auto detect precision from example values. E.g. 0.123 => 3, 0.12345 => 5 and so on. + This method set self.precision variable after detect precision. + :param examples: numpy.ndarray with examples of float values. + """ + uLogger.debug("Detecting precision of data values...") + try: + self.precision = mode(list(map(lambda x: len(str(x).split('.')[-1]) if len(str(x).split('.')) > 1 else 0, examples))) + + except StatisticsError as e: + uLogger.warning("Unable to unambiguously determine Mode() of the value of precision! Precision is set to 2 (default). StatisticsError: '{}'".format(e)) + self.precision = 2 + + finally: + uLogger.debug("Auto-detected precision: {}".format(self._precision)) + + def LoadFromFile(self, fileName): + """ + Load Pandas OHLCV model from csv-file. + :param fileName: path to csv-file with OHLCV columns. + :return: Pandas dataframe. + """ + uLogger.info("Loading, parse and preparing input data from [{}]...".format(os.path.abspath(fileName))) + self.prices = pd.read_csv(fileName, names=self.csvHeaders, engine="python", sep=self.sep, parse_dates={"datetime": ["date", "time"]}) + + self.horizon = len(self.prices) + self.ticker = os.path.basename(fileName) + + # auto-detect time delta between last two neighbour candles: + self.timeframe = min( + self.prices.iloc[-1].datetime - self.prices.iloc[-2].datetime, + self.prices.iloc[-2].datetime - self.prices.iloc[-3].datetime + ) + uLogger.debug("Auto-detect timeframe: {}".format(self.timeframe)) + + uLogger.info("It was read {} rows".format(self.horizon)) + uLogger.info("Showing last 5 rows as pandas dataframe:") + for line in pd.DataFrame.to_string(self.prices[self.dfHeaders][-5:], max_cols=20).split("\n"): + uLogger.info(line) + + return self.prices + + def SaveToFile(self, fileName): + """ + Save Pandas OHLCV model to csv-file. + :param fileName: path to csv-file. + """ + if self.prices is not None and not self.prices.empty: + uLogger.info("Saving [{}] rows of pandas dataframe with columns: {}...".format(len(self.prices), self.csvHeaders)) + uLogger.debug("Delimeter: {}".format(self.sep)) + dataReplacedDateTime = self.prices.copy(deep=True) + dataReplacedDateTime["date"] = [d.date() for d in dataReplacedDateTime["datetime"]] + dataReplacedDateTime["time"] = [d.time() for d in dataReplacedDateTime["datetime"]] + del dataReplacedDateTime["datetime"] + dataReplacedDateTime = dataReplacedDateTime[self.csvHeaders] + dataReplacedDateTime.to_csv(fileName, sep=self.sep, index=False, header=False) + uLogger.info("Pandas dataframe saved to .csv-file [{}]".format(os.path.abspath(fileName))) + + else: + raise Exception("Empty price data! Generate or load prices before saving!") + + @staticmethod + def GetTrend(firstClose, lastClose, trendDeviation=0.005): + """ + Get string with trend: "UP trend", "DOWN trend" or "NO trend". + :param firstClose: close of first candle. + :param lastClose: close of last candle. + :param trendDeviation: relative deviation for trend detection, 0.005 mean ±0.5% by default. + :return: string + """ + if abs(firstClose - lastClose) / firstClose <= trendDeviation: + trend = "NO trend" + + else: + trend = "UP trend" if firstClose <= lastClose else "DOWN trend" + + return trend + + def GetStatistics(self): + """ + Calculates statistics of candles chain. + :return: text in markdown with statistics. + """ + uLogger.debug("Calculating column with deltas between high and low values...") + self.prices["delta"] = list(map( + lambda x, y: x - y, + self.prices.high.values, + self.prices.low.values + )) + + uLogger.debug("Calculating column with average values...") + self.prices["avg"] = list(map( + lambda x, y: x - y / 2, + self.prices.high.values, + self.prices.delta.values + )) + + self.DetectPrecision(self.prices.close.values) # auto-detect precision + + self._chartTitle = "Instrument: {}, timeframe: {}, horizon length: {} (from {} to {})".format( + self.ticker, + self.FormattedDelta( + self.timeframe, "{days} days {hours}h {minutes}m {seconds}s" + ) if self.timeframe >= timedelta(days=1) else self.FormattedDelta( + self.timeframe, "{hours}h {minutes}m {seconds}s" + ), + self.horizon, + pd.to_datetime(self.prices.datetime.values[0]).strftime("%Y-%m-%d %H:%M:%S"), + pd.to_datetime(self.prices.datetime.values[-1]).strftime("%Y-%m-%d %H:%M:%S"), + ) + + self._stat["candles"] = len(self.prices) + self._stat["precision"] = self.precision + self._stat["closeFirst"] = self.prices.close.values[0] + self._stat["closeLast"] = self.prices.close.values[-1] + self._stat["closeMax"] = pd.DataFrame.max(self.prices.close) + self._stat["closeMin"] = pd.DataFrame.min(self.prices.close) + self._stat["diapason"] = self._stat["closeMax"] - self._stat["closeMin"] + self._stat["trend"] = self.GetTrend(firstClose=self._stat["closeFirst"], lastClose=self._stat["closeLast"], trendDeviation=self.trendDeviation) + + self.prices["up"] = self.prices.close >= self.prices.open # True mean that is up candle, and False mean down + upList = list(self.prices.up) + upChainsLengths = [len(list(chain)) for value, chain in groupby(upList) if value is True] + downChainsLengths = [len(list(chain)) for value, chain in groupby(upList) if value is False] + + self._stat["trendDev"] = self.trendDeviation + self._stat["upCount"] = len(self.prices.up[self.prices.up == True]) + self._stat["downCount"] = len(self.prices.up[self.prices.up == False]) + self._stat["upCountChainMax"] = max(upChainsLengths) if upChainsLengths else 1 + self._stat["downCountChainMax"] = max(downChainsLengths) if downChainsLengths else 1 + self._stat["deltas"]["max"] = pd.DataFrame.max(self.prices.delta) + self._stat["deltas"]["min"] = pd.DataFrame.min(self.prices.delta) + self._stat["deltas"]["stDev"] = round(pstdev(self.prices.delta), self._precision) + self._stat["deltas"]["q99"] = round(max(pd.DataFrame(self.prices.delta).quantile(q=0.99, interpolation='linear')), self._precision) + self._stat["deltas"]["q95"] = round(max(pd.DataFrame(self.prices.delta).quantile(q=0.95, interpolation='linear')), self._precision) + self._stat["deltas"]["q80"] = round(max(pd.DataFrame(self.prices.delta).quantile(q=0.80, interpolation='linear')), self._precision) + self._stat["deltas"]["q50"] = round(max(pd.DataFrame(self.prices.delta).quantile(q=0.50, interpolation='linear')), self._precision) + self._stat["cumSumVolumes"] = self.prices.volume.sum() + + uLogger.debug("self._stat = {}".format(self._stat)) + + summary = [ + "## Summary", + "", + "| Parameter | Value", + "|----------------------------------------------|---------------", + "| Candles count: | {}".format(self.stat["candles"]), + "| Timeframe: | {}".format(self.timeframe), + "| Precision (signs after comma): | {}".format(self.stat["precision"]), + "| Close first: | {}".format(round(self.stat["closeFirst"], self.precision)), + "| Close last: | {}".format(round(self.stat["closeLast"], self.precision)), + "| Close max: | {}".format(round(self.stat["closeMax"], self.precision)), + "| Close min: | {}".format(round(self.stat["closeMin"], self.precision)), + "| Diapason (between max and min close prices): | {}".format(round(self.stat["diapason"], self.precision)), + "| Trend (between close first and close last: | {}".format(self.stat["trend"]), + "| - Trend deviation parameter: | ±{}%".format(self.stat["trendDev"] * 100), + "", + "## Some statistics", + "", + "| Statistic | Value", + "|----------------------------------------------|---------------", + "| Up candles count: | {} ({}%)".format(self.stat["upCount"], round(100 * self.stat["upCount"] / self.stat["candles"], self.precision)), + "| Down candles count: | {} ({}%)".format(self.stat["downCount"], round(100 * self.stat["downCount"] / self.stat["candles"], self.precision)), + "| Max of up candles chain: | {}".format(self.stat["upCountChainMax"]), + "| Max of down candles chain: | {}".format(self.stat["downCountChainMax"]), + "| Max delta (between High and Low prices): | {}".format(round(self.stat["deltas"]["max"], self.precision)), + "| Min delta (between High and Low prices): | {}".format(round(self.stat["deltas"]["min"], self.precision)), + "| Delta's std. dev.: | {}".format(round(self.stat["deltas"]["stDev"], self.precision)), + "| - 99 percentile: | ≤ {}".format(round(self.stat["deltas"]["q99"], self.precision)), + "| - 95 percentile: | ≤ {}".format(round(self.stat["deltas"]["q95"], self.precision)), + "| - 80 percentile: | ≤ {}".format(round(self.stat["deltas"]["q80"], self.precision)), + "| - 50 percentile: | ≤ {}".format(round(self.stat["deltas"]["q50"], self.precision)), + "| Cumulative sum of volumes: | {}".format(self.stat["cumSumVolumes"]), + ] + + uLogger.info("Some statistical info:\n{}".format("\n".join(summary))) + + return summary + + def _GenNextCandle(self, lastClose): + """ + Generator for creating 1 next candle based on global probability parameters. + :param lastClose: value of last close price. + :return: OHLCV-candle as dict. + """ + candle = { + "open": lastClose, + "high": 0, + "low": 0, + "close": 0, + "volume": random.randint(a=0, b=self.maxVolume) + } + + if random.random() <= self.upCandlesProb: + maxBody = min(self.maxClose, candle["open"] + self.maxCandleBody) + candle["close"] = round(random.uniform(a=candle["open"], b=maxBody), self.precision) # up candle + + if random.random() <= self.outliersProb: + candle["high"] = round(random.uniform(a=candle["close"], b=candle["close"] + self.maxOutlier), self.precision) # with outlier price "tails" + candle["low"] = round(random.uniform(a=candle["open"] - self.maxOutlier, b=candle["open"]), self.precision) + + else: + halfBody = (candle["close"] - candle["open"]) / 2 + candle["high"] = round(random.uniform(a=candle["close"], b=candle["close"] + halfBody), self.precision) # without outlier price "tails" + candle["low"] = round(random.uniform(a=candle["open"] - halfBody, b=candle["open"]), self.precision) + + else: + minBody = max(self.minClose, candle["open"] - self.maxCandleBody) + candle["close"] = round(random.uniform(a=minBody, b=candle["open"]), self.precision) # down candle + + if random.random() <= self.outliersProb: + candle["high"] = round(random.uniform(a=candle["open"], b=candle["open"] + self.maxOutlier), self.precision) # with outlier price "tails" + candle["low"] = round(random.uniform(a=candle["close"] - self.maxOutlier, b=candle["close"]), self.precision) + + else: + halfBody = (candle["open"] - candle["close"]) / 2 + candle["high"] = round(random.uniform(a=candle["open"], b=candle["open"] + halfBody), self.precision) # without outlier price "tails" + candle["low"] = round(random.uniform(a=candle["close"] - halfBody, b=candle["close"]), self.precision) + + return candle + + def Generate(self): + """ + Main method to generate prices. + :return Pandas object with OHLCV-candlestick in every line and also saving it to the self.prices. + """ + if self.horizon is None or self.horizon < 5: + self.horizon = 5 + uLogger.warning("Horizon length less than 5! It is set to 5 by default.") + + # maximum of candle sizes: (high - low), if None then used (maxClose - minClose) / 10 + if self.maxOutlier is None: + self.maxOutlier = (self.maxClose - self.minClose) / 10 + + # maximum of candle body sizes: abs(open - close), if None then used maxOutlier * 90% + if self.maxCandleBody is None: + self.maxCandleBody = 0.9 * self.maxOutlier + + # initClose is the last close price (left on chart or "before" 1st generated candle), 1st candle["open"] = initClose + if self.initClose is None: + self.initClose = round(random.uniform(a=self.minClose, b=self.maxClose), self.precision) + + uLogger.info("Generating prices...") + uLogger.debug("- Ticker name: {}".format(self.ticker)) + uLogger.debug("- Interval or timeframe (time delta between two neighbour candles): {}".format(self.timeframe)) + uLogger.debug("- Horizon length (candlesticks count): {}".format(self.horizon)) + uLogger.debug("- Start time: {}".format(self.timeStart.strftime("%Y-%m-%d--%H-%M-%S"))) + uLogger.debug(" |-> end time: {}".format((self.timeStart + self.horizon * self.timeframe).strftime("%Y-%m-%d--%H-%M-%S"))) + uLogger.debug("- Maximum of close prices: {}".format(round(self.maxClose, self.precision))) + uLogger.debug("- Minimum of close prices: {}".format(round(self.minClose, self.precision))) + uLogger.debug("- Maximum of candle body sizes: {}".format(round(self.maxCandleBody, self.precision))) + uLogger.debug("- Maximum of candle tails outlier sizes: {}".format(round(self.maxOutlier, self.precision))) + uLogger.debug("- Init close (1st open price in chain): {}".format(round(self.initClose, self.precision))) + uLogger.debug("- Maximum of volume of one candle: {}".format(self.maxVolume)) + uLogger.debug("- Probability that next candle is up: {}%".format(self.upCandlesProb * 100)) + uLogger.debug("- Statistical outliers probability: {}%".format(self.outliersProb * 100)) + + # prepare candles chain: + candles = [self._GenNextCandle(round(self.initClose, self.precision))] + for i in range(1, self.horizon): + candles.append(self._GenNextCandle(candles[i - 1]["close"])) + + # prepare Dataframe from generated prices: + indx = pd.date_range( + start=self.timeStart, + end=self.timeStart + (self.horizon - 1) * self.timeframe, + freq=self.timeframe, + tz=tzlocal(), + ) + self.prices = pd.DataFrame(data=candles, columns=self.dfHeaders) + self.prices.datetime = indx + + uLogger.info("Showing last 5 rows of Pandas generated dataframe object:") + for line in pd.DataFrame.to_string(self.prices[self.dfHeaders][-5:], max_cols=20).split("\n"): + uLogger.info(line) + + return self.prices + + def RenderBokeh(self, fileName="index.html", viewInBrowser=False): + """ + Rendering prices from pandas dataframe to Bokeh chart of candlesticks and save to html-file. + :param fileName: html-file path to save Bokeh chart. + :param viewInBrowser: If True, then opens html in browser after rendering. + """ + if self.prices is not None and not self.prices.empty: + uLogger.info("Rendering pandas dataframe as Bokeh chart...") + + infoBlock = self.GetStatistics() + + uLogger.debug("Preparing Bokeh chart configuration...") + uLogger.debug("Title: {}".format(self._chartTitle)) + + # chart options: + chart = figure( + x_axis_type="datetime", + x_axis_label="Date and time", + y_axis_label="Price", + outline_line_width=3, + outline_line_color="white", + tools=["pan", "wheel_zoom", "box_zoom", "reset", "save"], + plot_width=1200, + plot_height=600, + sizing_mode="scale_width", + background_fill_color="black", + title=self._chartTitle, + toolbar_location="above", + min_border_left=0, + min_border_right=0, + min_border_top=0, + min_border_bottom=0, + ) + chart.toolbar.logo = None # remove bokeh logo and link to https://bokeh.org/ + + # Summary section and controls: + legendNameMain = "Max_close / Min_close / Trend line / Averages points" + summaryInfo = Legend( + click_policy="hide", + items=[(info, []) for info in infoBlock] + [("", []), ("", []), (uLog.sepShort, []), ("Show/hide on chart:", [])], + location="top_right", + label_text_font_size="8pt", + margin=0, + padding=0, + spacing=0, + label_text_font="Lucida Console", + ) + chart.add_layout(summaryInfo, 'right') + + # preparing grid: + chart.xaxis.major_label_orientation = pi / 4 + minY = pd.DataFrame.min(self.prices.low) + maxY = pd.DataFrame.max(self.prices.high) + chart.yaxis.bounds = (minY - (maxY - minY) / 2, maxY + (maxY - minY) / 2) + chart.grid.grid_line_dash = [6, 4] + chart.grid.grid_line_alpha = 0.5 + chart.grid.minor_grid_line_dash = [6, 4] + chart.grid.minor_grid_line_alpha = 0.5 + chart.xgrid.minor_grid_line_dash = [6, 4] + chart.xgrid.minor_grid_line_alpha = 0.3 + chart.xgrid.minor_grid_line_color = "white" + chart.ygrid.minor_grid_line_dash = [6, 4] + chart.ygrid.minor_grid_line_alpha = 0.3 + chart.ygrid.minor_grid_line_color = "white" + + # preparing data for candles: + inc = self.prices.open <= self.prices.close + dec = self.prices.open > self.prices.close + width = 108000 # as for 5 minutes by default + + if self.timeframe <= timedelta(days=31): + width = 864000000 # 12 * 60 * 60 * 25 * 800 # for 43200 minutes + + if self.timeframe <= timedelta(days=7): + width = 216000000 # 12 * 60 * 60 * 25 * 200 # for 10080 minutes + + if self.timeframe <= timedelta(days=1): + width = 32400000 # 12 * 60 * 60 * 25 * 30 # for 1440 minutes + + if self.timeframe <= timedelta(hours=4): + width = 6480000 # 12 * 60 * 60 * 25 * 6 # for 240 minutes + + if self.timeframe <= timedelta(hours=1): + width = 1620000 # 12 * 60 * 60 * 25 * 1.5 # for 60 minutes + + if self.timeframe <= timedelta(minutes=30): + width = 648000 # 12 * 60 * 60 * 15 # for 30 minutes + + if self.timeframe <= timedelta(minutes=15): + width = 345600 # 12 * 60 * 60 * 8 # for 15 minutes + + if self.timeframe <= timedelta(minutes=5): + width = 108000 # 12 * 60 * 60 * 2.5 # for 5 minutes + + if self.timeframe <= timedelta(minutes=1): + width = 21600 # 12 * 60 * 30 # for 1 minute + + # --- preparing body of candles: + candlesData = self.prices + chart.segment( + candlesData.datetime, candlesData.high, candlesData.datetime, candlesData.low, + color="#20ff00", line_alpha=1, + ) + chart.vbar( + candlesData.datetime[inc], width, candlesData.open[inc], candlesData.close[inc], + fill_color="black", line_color="#20ff00", line_width=1, fill_alpha=1, line_alpha=1, + ) + chart.vbar( + candlesData.datetime[dec], width, candlesData.open[dec], candlesData.close[dec], + fill_color="white", line_color="#20ff00", line_width=1, fill_alpha=1, line_alpha=1, + ) + + # preparing candle's average points: + chart.circle( + self.prices.tail(self.horizon).datetime, self.prices.tail(self.horizon).avg, + size=3, color="red", alpha=1, legend_label=legendNameMain, + ) + chart.line( + self.prices.tail(self.horizon).datetime, self.prices.tail(self.horizon).avg, + line_width=1, line_color="red", line_alpha=1, legend_label=legendNameMain, + ) + + # preparing for highest close line: + highestClose = round(max(self.prices.close.values), self._precision) + chart.line( + self.prices.tail(self.horizon + 1).datetime, highestClose, + line_width=2, line_color="yellow", line_alpha=1, legend_label=legendNameMain, + ) + chart.text( + self.prices.datetime.values[-1], highestClose + 1 / self._deg10prec, + text=[str(highestClose)], angle=0, text_color="yellow", text_font_size="8pt", legend_label=legendNameMain, + ) + + # preparing for lowest close line: + lowestClose = round(min(self.prices.close.values), self._precision) + chart.line( + self.prices.tail(self.horizon + 1).datetime, lowestClose, + line_width=2, line_color="yellow", line_alpha=1, legend_label=legendNameMain, + ) + chart.text( + self.prices.datetime.values[-1], lowestClose - 2 / self._deg10prec, + text=[str(lowestClose)], angle=0, text_color="yellow", text_font_size="8pt", legend_label=legendNameMain, + ) + + # preparing for direction line: + chart.line( + [self.prices.datetime.values[0], self.prices.datetime.values[-1]], + [self.prices.close.values[0], self.prices.close.values[-1]], + line_width=1, line_color="white", line_alpha=1, line_dash=[6, 6], legend_label=legendNameMain, + ) + + # preparing html-file with forecast chart: + output_file(fileName, title=self._chartTitle, mode="cdn") + save(chart) + with open("{}.md".format(fileName), "w", encoding="UTF-8") as fH: + fH.write("\n".join(infoBlock)) + + if viewInBrowser: + show(chart) # view forecast chart in browser immediately + + uLogger.info("Pandas dataframe rendered as html-file [{}]".format(os.path.abspath(fileName))) + + else: + raise Exception("Empty price data! Generate or load prices before show as Bokeh chart!") + + +def ParseArgs(): + """ + Function get and parse command line keys. + """ + parser = ArgumentParser() # command-line string parser + + parser.description = "Forex and stocks price generator. Generates chain of candlesticks with predefined statistical parameters, return pandas dataframe or saving as .csv-file with OHLCV-candlestick in every strings. See examples: https://tim55667757.github.io/PriceGenerator" + parser.usage = "python PriceGenerator.py [some options] [one or more commands]" + + # options: + parser.add_argument("--sep", type=str, default=None, help="Option: separator in csv-file, if None then auto-detecting enable.") + parser.add_argument("--debug-level", type=int, default=20, help="Option: showing STDOUT messages of minimal debug level, e.g., 10 = DEBUG, 20 = INFO, 30 = WARNING, 40 = ERROR, 50 = CRITICAL.") + + # commands: + parser.add_argument("--load-from", type=str, help="Command: Load .cvs-file to Pandas dataframe. You can draw chart in additional with --render-bokeh key.") + parser.add_argument("--generate", action="store_true", help="Command: Generates chain of candlesticks with predefined statistical parameters and save stock history as pandas dataframe or .csv-file if --save-to key is defined. You can draw chart in additional with --render-bokeh key.") + parser.add_argument("--save-to", type=str, help="Command: Save generated or loaded dataframe to .csv-file. You can draw chart in additional with --render-bokeh key.") + parser.add_argument("--render-bokeh", type=str, help="Command: Show chain of candlesticks as interactive Bokeh chart. Before using this key you must define --load-from or --generate keys.") + + cmdArgs = parser.parse_args() + return cmdArgs + + +def Main(): + """ + Main function to work from CLI, generate pandas dataframe, show charts and save to file. + """ + args = ParseArgs() # get and parse command-line parameters + exitCode = 0 + + if args.debug_level: + uLogger.level = 10 # always debug level by default + uLogger.handlers[0].level = args.debug_level # level for STDOUT + # uLogger.handlers[1].level = 10 # always debug level for log.txt + + start = datetime.now(tzlocal()) + uLogger.debug(uLog.sepLine) + uLogger.debug("PriceGenerator started: {}".format(start.strftime("%Y-%m-%d %H:%M:%S"))) + + priceModel = PriceGenerator() + + try: + # --- set options: + + if args.sep: + priceModel.sep = args.sep # separator in .csv-file + + # --- do one or more commands: + + if not args.load_from and not args.generate and not args.save_to and not args.render_bokeh: + raise Exception("At least one command must be selected! See: python PriceGenerator.py --help") + + if args.load_from: + priceModel.LoadFromFile(fileName=args.load_from) + + if args.generate: + priceModel.Generate() + + if args.save_to: + priceModel.SaveToFile(fileName=args.save_to) + + if args.render_bokeh: + priceModel.RenderBokeh(fileName=args.render_bokeh, viewInBrowser=True) + + except Exception as e: + uLogger.error(e) + exc = tb.format_exc().split("\n") + for line in exc: + if line: + uLogger.debug(line) + exitCode = 255 + + finally: + finish = datetime.now(tzlocal()) + + if exitCode == 0: + uLogger.debug("All PriceGenerator operations are finished success (summary code is 0).") + + else: + uLogger.error("An errors occurred during the work! See full debug log with --debug-level 10. Summary code: {}".format(exitCode)) + + uLogger.debug("PriceGenerator work duration: {}".format(finish - start)) + uLogger.debug("PriceGenerator work finished: {}".format(finish.strftime("%Y-%m-%d %H:%M:%S"))) + + sys.exit(exitCode) + + +if __name__ == "__main__": + Main() diff --git a/pricegenerator/UniLogger.py b/pricegenerator/UniLogger.py new file mode 100644 index 0000000..c152035 --- /dev/null +++ b/pricegenerator/UniLogger.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +# +# Author: Timur Gilmullin + +# This module initialize standard python logging system. + + +import sys +import logging.handlers + + +# initialize Main Parent Logger: +UniLogger = logging.getLogger("UniLogger") +formatString = "%(filename)-20sL:%(lineno)-5d%(levelname)-8s[%(asctime)s] %(message)s" +formatter = logging.Formatter(formatString) +sys.stderr = sys.stdout + + +def SetLevel(vLevel='ERROR'): + """ + This procedure setting up UniLogger verbosity level. + """ + UniLogger.level = logging.NOTSET + + if isinstance(vLevel, str): + if vLevel == '5' or vLevel.upper() == 'CRITICAL': + UniLogger.level = logging.CRITICAL + + elif vLevel == '4' or vLevel.upper() == 'ERROR': + UniLogger.level = logging.ERROR + + elif vLevel == '3' or vLevel.upper() == 'WARNING': + UniLogger.level = logging.WARNING + + elif vLevel == '2' or vLevel.upper() == 'INFO': + UniLogger.level = logging.INFO + + elif vLevel == '1' or vLevel.upper() == 'DEBUG': + UniLogger.level = logging.DEBUG + + +class LevelFilter(logging.Filter): + """ + Class using to set up log level filtering. + """ + + def __init__(self, level): + super().__init__() + self.level = level + + def filter(self, record): + return record.levelno >= self.level + + +def EnableLogger(logFile, parentHandler=UniLogger, useFormat=formatter): + """ + Adding new file logger with rotation. + """ + # logHandler = logging.FileHandler(logFile) + maxSizeBytes = 50 * 1024 * 1024 # 5Mb log rotate by default + logHandler = logging.handlers.RotatingFileHandler(logFile, encoding="UTF-8", maxBytes=maxSizeBytes, backupCount=4) + logHandler.level = logging.DEBUG # set up DEBUG verbosity level by default for file logging + logHandler.addFilter(LevelFilter(logging.DEBUG)) + + if useFormat: + logHandler.setFormatter(useFormat) + + else: + logHandler.setFormatter(formatter) + + parentHandler.addHandler(logHandler) + + return logHandler + + +def DisableLogger(handler, parentHandler=UniLogger): + """ + Disable given file logger. + """ + if handler: + handler.flush() + handler.close() + + if handler in parentHandler.handlers: + parentHandler.removeHandler(handler) + + +# --- Main init: + +SetLevel('DEBUG') # set up DEBUG verbosity level by default for UniLogger + +streamHandler = logging.StreamHandler() # initialize STDOUT UniLogger +streamHandler.setFormatter(formatter) # set formatter for STDOUT UniLogger +streamHandler.level = logging.INFO # set up INFO verbosity level by default for STDOUT UniLogger +UniLogger.addHandler(streamHandler) # adding STDOUT UniLogger handler to Parent UniLogger + +# fileLogHandler = EnableLogger(logFile='log.txt', parentHandler=UniLogger, useFormat=formatter) # add logging to file + +sepWide = '-' * 120 # long-long log separator +sepLong = '-' * 80 # long log separator +sepShort = '-' * 40 # short log separator +sepLine = '=--=' * 20 # log part separator \ No newline at end of file diff --git a/pricegenerator/__init__.py b/pricegenerator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pricegenerator/__main__.py b/pricegenerator/__main__.py new file mode 100644 index 0000000..7104454 --- /dev/null +++ b/pricegenerator/__main__.py @@ -0,0 +1,4 @@ +from pricegenerator.PriceGenerator import Main + +if __name__ == "__main__": + Main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3c2625a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +pytest>=5.3.5 +pandas>=1.0.1 +bokeh>=1.4.0 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..224a779 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[metadata] +description-file = README.md \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..64dcd3e --- /dev/null +++ b/setup.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# Author: Timur Gilmullin + +# Build with Travis CI + + +from setuptools import setup +import os + +__version__ = "1.0" + +devStatus = "4 - Beta" + +if "TRAVIS_BUILD_NUMBER" in os.environ and "TRAVIS_BRANCH" in os.environ: + print("This is TRAVIS-CI build") + print("TRAVIS_BUILD_NUMBER = {}".format(os.environ["TRAVIS_BUILD_NUMBER"])) + print("TRAVIS_BRANCH = {}".format(os.environ["TRAVIS_BRANCH"])) + + __version__ += ".{}{}".format( + "" if "release" in os.environ["TRAVIS_BRANCH"] or os.environ["TRAVIS_BRANCH"] == "master" else "dev", + os.environ["TRAVIS_BUILD_NUMBER"], + ) + + devStatus = "5 - Production/Stable" if "release" in os.environ["TRAVIS_BRANCH"] or os.environ["TRAVIS_BRANCH"] == "master" else devStatus + +else: + print("This is local build") + __version__ += ".dev0" # set version as major.minor.localbuild if local build: python setup.py install + +print("PriceGenerator build version = {}".format(__version__)) + +setup( + name="pricegenerator", + + version=__version__, + + description="Forex and stocks price generator. Generates chain of candlesticks with predefined statistical parameters, return pandas dataframe or saving as .csv-file with OHLCV-candlestick in every strings.", + + long_description="GitHub Pages: https://tim55667757.github.io/PriceGenerator", + + license="MIT", + + author="Timur Gilmullin", + + author_email="tim55667757@gmail.com", + + url="https://github.com/Tim55667757/PriceGenerator/", + + download_url="https://github.com/Tim55667757/PriceGenerator.git", + + entry_points={"console_scripts": ["pricegenerator = pricegenerator.PriceGenerator:Main"]}, + + classifiers=[ + "Development Status :: {}".format(devStatus), + "Environment :: Console", + "Intended Audience :: Financial and Insurance Industry", + "Topic :: Utilities", + "License :: OSI Approved :: MIT License", + "Natural Language :: English", + "Programming Language :: Python :: 3", + ], + + keywords=[ + "history", + "csv", + "stock", + "forex", + "prices", + "candlesticks", + "parser", + "generator", + "statistics", + "testing", + "testdata", + ], + + packages=[ + "pricegenerator", + ], + + tests_require=[ + "pytest>=5.3.5", + "pandas>=1.0.1", + "bokeh>=1.4.0", + ], + + install_requires=[ + "pandas>=1.0.1", + "bokeh>=1.4.0", + ], + + package_data={ + "": [ + "./pricegenerator/*.py", + "./media/*", + "./tests/*", + + "LICENSE", + "README.md", + "README_RU.md", + ], + }, + + zip_safe=True, +) diff --git a/tests/AFLT_day.csv b/tests/AFLT_day.csv new file mode 100644 index 0000000..b1f322f --- /dev/null +++ b/tests/AFLT_day.csv @@ -0,0 +1,2775 @@ +2010.01.11,10:00,53.75,55.49,53.47,54.36,1468467 +2010.01.12,10:00,52.94,55.8,52.94,54.17,1152965 +2010.01.13,10:00,54.2,54.45,53.01,53.57,672589 +2010.01.14,10:00,53.5,55.27,53.5,54.56,2364231 +2010.01.15,10:00,54.5,55.1,54.45,54.53,1715794 +2010.01.18,10:00,54.61,54.75,54.1,54.49,2365143 +2010.01.19,10:00,54.5,56.8,54.11,54.92,2810019 +2010.01.20,10:00,54.87,55.3,54.5,54.94,326871 +2010.01.21,10:00,53.55,55.48,53.55,55.0,731232 +2010.01.22,10:00,54.45,54.65,52.0,52.25,655041 +2010.01.25,10:00,51.93,53.5,47.6,52.44,762371 +2010.01.26,10:00,52.39,52.93,50.5,52.75,532548 +2010.01.27,10:00,53.17,54.4,52.65,53.78,587847 +2010.01.28,10:00,54.0,55.0,53.8,54.66,464132 +2010.01.29,10:00,54.58,56.49,54.2,56.14,478188 +2010.02.01,10:00,56.0,56.51,55.5,56.47,944793 +2010.02.02,10:00,56.53,57.8,56.45,57.0,1738882 +2010.02.03,10:00,58.01,58.21,56.0,56.36,3539531 +2010.02.04,10:00,55.02,56.5,54.0,54.39,732372 +2010.02.05,10:00,52.2,53.38,51.26,52.3,1089374 +2010.02.08,10:00,52.35,57.87,50.62,51.13,393771 +2010.02.09,10:00,51.2,52.4,50.6,52.3,321855 +2010.02.10,10:00,52.95,52.95,50.8,50.98,346350 +2010.02.11,10:00,51.27,52.7,51.27,51.44,286862 +2010.02.12,10:00,52.28,53.1,50.15,50.19,433659 +2010.02.15,10:00,50.38,51.5,50.0,50.87,156702 +2010.02.16,10:00,52.34,54.25,50.85,54.17,479992 +2010.02.17,10:00,54.65,56.81,54.65,56.48,1065101 +2010.02.18,10:00,56.2,57.7,54.57,55.54,616133 +2010.02.19,10:00,54.95,55.69,53.5,55.08,333994 +2010.02.24,10:00,55.0,56.2,54.5,55.91,1673112 +2010.02.25,10:00,55.7,55.8,53.99,54.64,283289 +2010.02.26,10:00,54.8,57.06,54.0,55.36,2094075 +2010.02.27,10:00,55.3,56.0,54.8,55.4,343685 +2010.03.01,10:00,55.95,56.44,55.01,55.34,550408 +2010.03.02,10:00,56.74,56.74,54.85,54.94,310745 +2010.03.03,10:00,55.58,55.58,54.3,54.93,863301 +2010.03.04,10:00,55.2,55.2,54.06,54.71,768298 +2010.03.05,10:00,54.86,55.35,54.8,55.07,685527 +2010.03.09,10:00,55.2,55.66,53.58,54.33,1773814 +2010.03.10,10:00,54.51,54.88,53.83,54.36,735729 +2010.03.11,10:00,54.32,54.6,53.98,54.26,750199 +2010.03.12,10:00,54.47,56.12,54.06,55.55,2318363 +2010.03.15,10:00,55.53,55.65,54.76,55.18,1025784 +2010.03.16,10:00,55.23,56.75,55.19,56.33,2191374 +2010.03.17,10:00,56.4,57.24,56.4,57.12,2479963 +2010.03.18,10:00,57.14,60.4,57.0,59.67,6160203 +2010.03.19,10:00,60.5,61.2,59.3,60.29,3170884 +2010.03.22,10:00,59.89,60.3,58.11,59.87,2345819 +2010.03.23,10:00,60.14,61.36,60.06,61.01,2592043 +2010.03.24,10:00,61.45,61.45,60.01,61.23,4601560 +2010.03.25,10:00,61.01,61.98,60.02,61.9,969362 +2010.03.26,10:00,62.92,64.9,61.82,63.94,9594746 +2010.03.29,10:00,63.97,64.98,63.15,64.48,6181378 +2010.03.30,10:00,66.21,66.21,64.01,65.43,1562910 +2010.03.31,10:00,65.53,68.53,65.01,68.28,2873900 +2010.04.01,10:00,68.31,68.98,66.51,67.9,1104150 +2010.04.02,10:00,68.39,69.0,68.0,68.85,536068 +2010.04.05,10:00,70.65,70.65,67.94,68.49,3767815 +2010.04.06,10:00,68.45,70.5,67.4,70.2,1525550 +2010.04.07,10:00,70.57,70.8,68.6,69.0,888525 +2010.04.08,10:00,68.93,68.93,66.31,66.77,1188886 +2010.04.09,10:00,68.68,68.68,67.0,67.69,1217311 +2010.04.12,10:00,67.76,68.4,65.46,66.17,860225 +2010.04.13,10:00,66.28,67.0,65.4,66.46,342125 +2010.04.14,10:00,67.7,68.1,66.41,66.69,1395065 +2010.04.15,10:00,67.74,67.74,64.6,65.3,677680 +2010.04.16,10:00,65.3,66.2,64.5,65.0,755906 +2010.04.19,10:00,62.74,63.5,61.18,62.2,4412618 +2010.04.20,10:00,62.3,65.0,62.3,64.02,4320701 +2010.04.21,10:00,64.6,65.7,63.01,63.27,776441 +2010.04.22,10:00,63.05,63.98,60.99,62.46,890814 +2010.04.23,10:00,62.66,63.19,61.36,62.99,557929 +2010.04.26,10:00,63.9,64.88,63.11,63.96,1858564 +2010.04.27,10:00,64.0,64.0,61.81,62.65,1090767 +2010.04.28,10:00,60.71,61.89,58.58,61.25,1499728 +2010.04.29,10:00,61.47,63.5,61.2,62.94,878594 +2010.04.30,10:00,63.0,63.79,62.0,62.0,857528 +2010.05.04,10:00,62.53,63.13,59.8,59.96,2812915 +2010.05.05,10:00,59.58,60.25,57.0,57.74,819336 +2010.05.06,10:00,58.43,58.49,56.8,58.33,2368479 +2010.05.07,10:00,57.26,57.5,54.04,54.13,1573693 +2010.05.11,10:00,56.88,57.97,55.09,55.7,448213 +2010.05.12,10:00,55.8,59.73,55.4,59.62,917098 +2010.05.13,10:00,60.0,62.8,59.5,60.29,827984 +2010.05.14,10:00,59.86,60.4,57.41,58.67,1505890 +2010.05.17,10:00,57.18,59.8,55.51,59.0,343944 +2010.05.18,10:00,59.5,60.4,58.5,60.0,730739 +2010.05.19,10:00,59.84,59.84,57.12,58.29,664937 +2010.05.20,10:00,57.08,59.47,57.08,57.1,824987 +2010.05.21,10:00,58.88,58.88,54.56,56.03,787674 +2010.05.24,10:00,57.0,57.13,54.99,56.27,753850 +2010.05.25,10:00,54.0,54.89,53.01,53.13,382986 +2010.05.26,10:00,54.5,56.8,53.7,56.67,459181 +2010.05.27,10:00,56.9,58.78,56.2,56.99,513865 +2010.05.28,10:00,57.5,57.99,56.03,56.36,306608 +2010.05.31,10:00,57.48,60.5,55.86,57.03,125747 +2010.06.01,10:00,56.99,57.45,55.16,57.4,511668 +2010.06.02,10:00,57.55,61.71,56.12,60.36,1114983 +2010.06.03,10:00,61.69,63.4,61.28,61.5,966326 +2010.06.04,10:00,61.97,62.11,59.09,60.22,436386 +2010.06.07,10:00,59.0,59.9,57.0,58.7,357014 +2010.06.08,10:00,59.21,59.76,57.3,58.57,735997 +2010.06.09,10:00,58.87,59.48,58.4,58.71,518619 +2010.06.10,10:00,59.04,61.3,58.15,59.91,320390 +2010.06.11,10:00,61.22,61.22,58.99,59.3,279683 +2010.06.15,10:00,62.24,62.24,58.7,61.39,2714713 +2010.06.16,10:00,62.0,62.9,60.51,60.62,302344 +2010.06.17,10:00,61.06,62.89,60.11,61.8,634048 +2010.06.18,10:00,62.12,62.88,61.9,62.3,231018 +2010.06.21,10:00,63.27,64.0,62.73,63.48,752768 +2010.06.22,10:00,63.47,63.49,61.7,62.36,252085 +2010.06.23,10:00,61.88,62.26,60.2,60.57,1226599 +2010.06.24,10:00,60.53,61.79,60.0,60.77,315572 +2010.06.25,10:00,60.78,60.8,59.31,59.61,419354 +2010.06.28,10:00,60.2,60.2,58.56,59.46,157140 +2010.06.29,10:00,59.4,59.8,55.75,56.35,1085055 +2010.06.30,10:00,56.03,57.7,56.0,57.15,443744 +2010.07.01,10:00,57.77,57.77,54.3,54.58,424660 +2010.07.02,10:00,55.2,56.07,54.8,55.63,167403 +2010.07.05,10:00,55.21,57.45,55.2,57.05,146611 +2010.07.06,10:00,57.34,58.9,57.2,58.66,143452 +2010.07.07,10:00,58.35,59.55,57.28,59.41,292155 +2010.07.08,10:00,59.43,61.0,59.43,59.59,369377 +2010.07.09,10:00,59.81,62.54,59.81,61.63,1192013 +2010.07.12,10:00,61.61,62.9,60.99,61.56,935413 +2010.07.13,10:00,61.51,62.25,60.64,62.08,983374 +2010.07.14,10:00,64.13,64.13,61.85,62.31,408952 +2010.07.15,10:00,62.29,63.14,61.49,62.32,323393 +2010.07.16,10:00,62.29,62.98,62.1,62.39,265827 +2010.07.19,10:00,62.39,62.62,62.1,62.26,196595 +2010.07.20,10:00,62.42,63.0,61.79,61.82,488264 +2010.07.21,10:00,62.0,62.35,61.57,61.83,345288 +2010.07.22,10:00,61.8,62.1,60.92,61.31,619698 +2010.07.23,10:00,61.35,62.23,61.3,61.72,915262 +2010.07.26,10:00,61.77,61.9,61.22,61.48,118230 +2010.07.27,10:00,61.49,61.59,60.65,60.78,1041680 +2010.07.28,10:00,61.0,61.23,59.52,59.88,826290 +2010.07.29,10:00,60.88,60.88,59.15,60.5,941153 +2010.07.30,10:00,60.15,60.68,59.92,60.59,701242 +2010.08.02,10:00,60.98,61.7,60.7,61.43,2701263 +2010.08.03,10:00,61.9,64.27,61.24,63.72,8096677 +2010.08.04,10:00,63.02,64.0,62.38,63.16,784876 +2010.08.05,10:00,63.02,63.75,62.11,62.92,435075 +2010.08.06,10:00,63.25,63.7,62.47,62.5,677429 +2010.08.09,10:00,62.55,63.4,62.5,62.55,356798 +2010.08.10,10:00,62.65,62.73,61.24,61.84,480162 +2010.08.11,10:00,61.56,61.8,59.61,60.0,560692 +2010.08.12,10:00,60.1,61.0,59.09,59.5,709113 +2010.08.13,10:00,59.8,60.5,59.69,60.4,398542 +2010.08.16,10:00,60.5,60.5,59.65,60.26,460821 +2010.08.17,10:00,60.29,61.35,59.95,61.33,448105 +2010.08.18,10:00,61.35,61.35,60.26,60.99,177552 +2010.08.19,10:00,61.11,61.8,60.81,60.85,306467 +2010.08.20,10:00,60.98,61.0,59.71,60.41,600969 +2010.08.23,10:00,60.15,60.76,60.01,60.4,157158 +2010.08.24,10:00,61.35,61.35,59.29,59.51,448569 +2010.08.25,10:00,59.66,59.99,57.51,58.1,270424 +2010.08.26,10:00,58.8,59.66,58.5,58.89,384888 +2010.08.27,10:00,59.04,61.44,58.6,61.0,901877 +2010.08.30,10:00,61.88,61.89,60.22,61.0,731440 +2010.08.31,10:00,60.0,61.23,59.39,60.99,365561 +2010.09.01,10:00,60.65,63.2,60.65,63.09,695316 +2010.09.02,10:00,62.0,63.4,61.75,62.75,447477 +2010.09.03,10:00,63.54,63.54,62.7,63.0,373725 +2010.09.06,10:00,64.0,64.0,62.27,63.09,297290 +2010.09.07,10:00,63.41,63.41,62.1,62.56,252853 +2010.09.08,10:00,62.06,63.5,61.22,63.32,455258 +2010.09.09,10:00,63.18,63.84,62.67,63.36,1347584 +2010.09.10,10:00,63.17,63.8,63.01,63.73,792639 +2010.09.13,10:00,63.5,64.51,63.5,63.83,1087337 +2010.09.14,10:00,63.69,67.99,63.69,65.65,3421408 +2010.09.15,10:00,65.76,66.8,64.5,66.66,4396393 +2010.09.16,10:00,65.89,67.3,65.89,66.8,703684 +2010.09.17,10:00,66.95,70.0,65.12,68.27,2495233 +2010.09.20,10:00,68.0,68.0,66.0,66.2,502767 +2010.09.21,10:00,66.0,66.8,65.54,65.8,502842 +2010.09.22,10:00,67.24,67.24,64.0,64.99,2054056 +2010.09.23,10:00,64.48,65.2,64.29,64.63,498031 +2010.09.24,10:00,64.74,66.0,64.04,65.87,798941 +2010.09.27,10:00,66.54,66.79,65.06,65.29,522324 +2010.09.28,10:00,65.38,65.38,64.51,65.0,395163 +2010.09.29,10:00,65.19,65.5,65.0,65.17,815038 +2010.09.30,10:00,65.38,66.63,65.17,66.41,716151 +2010.10.01,10:00,65.88,67.0,65.06,66.88,2130338 +2010.10.04,10:00,67.6,67.6,66.2,67.06,1333547 +2010.10.05,10:00,67.44,67.65,65.0,65.23,2225309 +2010.10.06,10:00,65.9,65.98,65.2,65.47,613364 +2010.10.07,10:00,65.41,66.2,65.1,65.5,689002 +2010.10.08,10:00,65.25,66.1,64.8,65.99,401577 +2010.10.11,10:00,66.09,66.75,65.77,66.62,838169 +2010.10.12,10:00,66.44,66.7,65.71,66.58,566610 +2010.10.13,10:00,66.46,69.5,66.46,69.47,2309243 +2010.10.14,10:00,69.57,69.98,68.05,69.04,740747 +2010.10.15,10:00,69.31,71.71,68.51,70.0,1866181 +2010.10.18,10:00,68.23,71.0,68.23,70.77,530520 +2010.10.19,10:00,71.0,74.92,70.75,74.55,3074473 +2010.10.20,10:00,74.5,75.4,73.32,74.87,2180433 +2010.10.21,10:00,75.45,75.45,73.11,74.71,945770 +2010.10.22,10:00,74.78,75.35,73.68,74.3,1256264 +2010.10.25,10:00,75.02,75.02,73.8,73.99,731126 +2010.10.26,10:00,73.74,74.1,71.82,73.38,809836 +2010.10.27,10:00,73.35,74.5,72.43,73.59,1928096 +2010.10.28,10:00,73.53,74.17,73.1,73.24,844706 +2010.10.29,10:00,73.24,76.8,73.12,75.76,1387582 +2010.11.01,10:00,76.46,77.5,75.54,76.67,796240 +2010.11.02,10:00,75.78,76.8,75.5,75.82,575669 +2010.11.03,10:00,75.65,77.0,75.65,76.64,551597 +2010.11.08,10:00,77.0,77.99,76.8,77.23,504396 +2010.11.09,10:00,77.75,78.18,76.48,76.91,1124747 +2010.11.10,10:00,77.39,77.5,74.98,75.03,625347 +2010.11.11,10:00,74.13,76.2,74.13,75.82,638472 +2010.11.12,10:00,75.5,75.7,74.25,74.84,654830 +2010.11.13,10:00,74.59,75.41,74.02,75.21,367771 +2010.11.15,10:00,75.2,75.95,75.0,75.52,7265204 +2010.11.16,10:00,75.5,75.5,74.59,75.02,569159 +2010.11.17,10:00,75.17,75.49,74.4,75.19,7017402 +2010.11.18,10:00,75.63,79.0,75.05,78.89,1894409 +2010.11.19,10:00,79.01,79.79,75.07,79.16,684938 +2010.11.22,10:00,79.43,79.98,79.0,79.32,1542550 +2010.11.23,10:00,78.56,79.16,77.93,78.4,2169287 +2010.11.24,10:00,78.4,79.87,78.28,79.56,1217858 +2010.11.25,10:00,79.59,81.45,79.49,81.3,1754765 +2010.11.26,10:00,81.24,82.9,80.8,81.54,1962049 +2010.11.29,10:00,82.16,82.16,79.79,80.3,1237236 +2010.11.30,10:00,80.25,80.99,78.92,79.92,716578 +2010.12.01,10:00,80.0,80.1,79.0,79.2,3676089 +2010.12.02,10:00,79.5,80.68,79.4,80.38,818093 +2010.12.03,10:00,80.32,83.5,79.87,82.39,1902572 +2010.12.06,10:00,82.5,85.0,82.01,83.94,581348 +2010.12.07,10:00,84.51,87.5,83.7,84.5,1473194 +2010.12.08,10:00,84.0,85.4,83.12,83.59,472446 +2010.12.09,10:00,84.0,84.3,83.06,83.99,382937 +2010.12.10,10:00,82.0,82.0,79.1,80.71,3513194 +2010.12.13,10:00,81.0,82.82,80.71,82.17,856447 +2010.12.14,10:00,82.1,82.3,81.12,82.09,569335 +2010.12.15,10:00,81.99,82.0,80.5,81.3,419014 +2010.12.16,10:00,81.0,81.75,80.5,80.78,804908 +2010.12.17,10:00,80.71,81.9,80.5,80.59,734418 +2010.12.20,10:00,81.0,81.5,80.45,80.58,404334 +2010.12.21,10:00,81.03,81.5,79.6,80.4,534476 +2010.12.22,10:00,80.5,80.9,80.0,80.09,734069 +2010.12.23,10:00,80.3,82.25,79.64,80.87,1252164 +2010.12.24,10:00,81.43,81.43,79.66,80.02,774374 +2010.12.27,10:00,80.0,80.0,74.63,79.12,371389 +2010.12.28,10:00,79.49,79.79,78.25,78.41,1008523 +2010.12.29,10:00,78.3,78.86,77.25,77.39,394556 +2010.12.30,10:00,77.89,80.0,76.83,79.75,1810896 +2011.01.11,10:00,79.75,81.6,78.37,81.5,1309218 +2011.01.12,10:00,81.97,82.52,80.67,81.57,582338 +2011.01.13,10:00,81.96,82.38,81.02,81.47,913054 +2011.01.14,10:00,80.82,81.98,79.6,81.79,1468127 +2011.01.17,10:00,81.95,82.11,80.82,81.0,1632831 +2011.01.18,10:00,81.43,81.43,80.0,80.18,786870 +2011.01.19,10:00,80.59,80.82,79.37,79.83,1009498 +2011.01.20,10:00,79.19,82.24,78.65,78.83,1996863 +2011.01.21,10:00,78.43,79.9,78.43,79.52,685492 +2011.01.24,10:00,79.98,80.25,75.25,77.99,3421870 +2011.01.25,10:00,78.59,79.44,77.2,78.93,509938 +2011.01.26,10:00,79.0,80.25,78.51,78.52,492139 +2011.01.27,10:00,78.54,79.5,77.59,77.78,832585 +2011.01.28,10:00,78.23,78.23,76.23,76.48,341813 +2011.01.31,10:00,76.56,77.82,74.63,77.62,2129277 +2011.02.01,10:00,78.24,78.24,76.2,77.87,1148911 +2011.02.02,10:00,78.34,78.4,76.99,77.13,710464 +2011.02.03,10:00,77.2,78.41,76.67,77.67,441517 +2011.02.04,10:00,78.14,78.3,77.51,78.03,793181 +2011.02.07,10:00,77.4,78.77,77.4,78.44,407518 +2011.02.08,10:00,78.45,78.79,77.2,77.36,751457 +2011.02.09,10:00,77.06,77.6,76.47,76.48,246370 +2011.02.10,10:00,76.59,76.59,74.22,74.59,861425 +2011.02.11,10:00,74.06,75.79,73.25,73.79,992801 +2011.02.14,10:00,74.1,75.2,72.72,72.95,726124 +2011.02.15,10:00,72.95,74.0,72.2,73.0,579614 +2011.02.16,10:00,72.5,73.09,72.05,72.45,438415 +2011.02.17,10:00,72.5,74.0,72.42,73.29,1181415 +2011.02.18,10:00,73.92,73.92,72.3,72.68,507992 +2011.02.21,10:00,68.81,73.0,68.81,72.22,353740 +2011.02.22,10:00,71.95,71.95,69.73,70.25,1207803 +2011.02.24,10:00,70.0,70.58,66.78,69.97,2475674 +2011.02.25,10:00,70.0,71.58,68.62,71.18,3122766 +2011.02.28,10:00,73.65,73.65,70.89,73.12,1241925 +2011.03.01,10:00,73.3,74.88,72.99,73.94,1443800 +2011.03.02,10:00,73.87,75.61,72.13,74.49,3552700 +2011.03.03,10:00,74.61,75.59,73.33,73.89,933800 +2011.03.04,10:00,73.71,76.6,73.71,74.15,3198900 +2011.03.05,10:00,74.69,75.0,74.1,74.72,160700 +2011.03.09,10:00,76.78,76.78,73.8,74.11,617700 +2011.03.10,10:00,73.57,74.1,72.9,73.56,1525900 +2011.03.11,10:00,73.55,74.78,72.5,74.42,4202600 +2011.03.14,10:00,74.14,76.1,73.48,74.99,8004500 +2011.03.15,10:00,73.73,76.59,71.37,75.62,9157200 +2011.03.16,10:00,76.74,78.6,75.07,78.16,6095300 +2011.03.17,10:00,77.11,78.0,76.0,76.49,1099700 +2011.03.18,10:00,76.5,76.7,74.11,74.79,1347700 +2011.03.21,10:00,75.55,75.55,73.0,74.24,1300900 +2011.03.22,10:00,74.32,74.48,73.11,73.37,437500 +2011.03.23,10:00,73.26,74.65,72.63,74.3,4545500 +2011.03.24,10:00,74.5,74.99,72.99,73.46,1736100 +2011.03.25,10:00,73.71,73.86,73.0,73.24,2091600 +2011.03.28,10:00,72.59,74.19,72.59,73.23,825800 +2011.03.29,10:00,73.6,73.89,72.0,72.2,869600 +2011.03.30,10:00,72.11,73.0,72.03,72.14,1491000 +2011.03.31,10:00,72.33,74.2,72.26,73.4,13029900 +2011.04.01,10:00,74.51,74.51,72.5,72.67,11509600 +2011.04.04,10:00,72.99,73.2,72.4,72.71,2099600 +2011.04.05,10:00,72.95,72.99,72.3,72.52,569900 +2011.04.06,10:00,72.67,73.32,72.22,73.06,641500 +2011.04.07,10:00,72.86,73.3,72.4,72.6,927400 +2011.04.08,10:00,72.85,73.34,72.61,73.21,957400 +2011.04.11,10:00,73.05,73.39,72.3,72.46,465400 +2011.04.12,10:00,72.07,72.38,71.9,72.03,762100 +2011.04.13,10:00,72.2,72.26,71.0,72.12,422800 +2011.04.14,10:00,71.72,72.69,71.34,72.61,971200 +2011.04.15,10:00,72.08,72.6,71.4,72.39,1493200 +2011.04.18,10:00,72.22,72.7,67.6,68.17,1535900 +2011.04.19,10:00,67.78,74.05,67.78,70.36,4347600 +2011.04.20,10:00,70.77,71.69,70.37,71.21,657600 +2011.04.21,10:00,71.3,71.8,69.76,70.15,5267600 +2011.04.22,10:00,70.63,70.88,69.7,70.13,473600 +2011.04.25,10:00,70.18,70.29,68.86,68.96,572300 +2011.04.26,10:00,68.5,69.1,67.35,68.24,2153800 +2011.04.27,10:00,69.48,69.5,65.87,67.1,1219300 +2011.04.28,10:00,67.91,69.49,66.5,68.82,1573200 +2011.04.29,10:00,68.45,69.8,68.12,68.64,1244400 +2011.05.03,10:00,68.53,68.9,66.96,67.13,525400 +2011.05.04,10:00,66.92,66.98,65.0,65.5,1142800 +2011.05.05,10:00,65.67,66.0,63.96,64.88,1386100 +2011.05.06,10:00,64.99,67.5,64.06,67.35,722800 +2011.05.10,10:00,67.1,67.57,65.99,67.25,534700 +2011.05.11,10:00,67.4,69.33,67.4,68.79,1602700 +2011.05.12,10:00,68.0,69.3,67.15,68.98,5203400 +2011.05.13,10:00,69.29,69.8,68.3,68.31,7551600 +2011.05.16,10:00,67.88,69.0,67.1,68.33,976300 +2011.05.17,10:00,67.89,69.41,67.89,69.0,746400 +2011.05.18,10:00,69.15,70.74,68.51,69.57,1559100 +2011.05.19,10:00,69.96,70.49,68.66,69.53,450700 +2011.05.20,10:00,69.5,69.94,68.3,68.58,475800 +2011.05.23,10:00,68.0,68.02,66.3,66.7,195100 +2011.05.24,10:00,66.08,68.19,66.02,67.58,397200 +2011.05.25,10:00,67.25,69.5,67.06,68.45,1020800 +2011.05.26,10:00,69.0,69.69,68.75,69.24,1143700 +2011.05.27,10:00,69.25,70.7,69.23,70.05,761300 +2011.05.30,10:00,70.38,74.16,70.01,72.67,4209900 +2011.05.31,10:00,72.66,73.79,72.34,72.78,5676300 +2011.06.01,10:00,78.45,78.45,71.25,71.29,511500 +2011.06.02,10:00,71.1,72.15,70.12,72.02,335700 +2011.06.03,10:00,72.44,72.5,71.0,71.13,249300 +2011.06.06,10:00,70.89,71.5,70.7,70.89,239100 +2011.06.07,10:00,70.6,71.82,70.38,71.38,150700 +2011.06.08,10:00,71.17,71.74,70.9,71.55,402600 +2011.06.09,10:00,71.64,72.5,71.4,71.63,2749300 +2011.06.10,10:00,71.88,71.95,71.38,71.54,1296300 +2011.06.14,10:00,69.73,71.76,69.73,71.37,1797100 +2011.06.15,10:00,71.3,72.0,70.6,70.62,770200 +2011.06.16,10:00,70.38,70.68,69.92,70.5,435700 +2011.06.17,10:00,70.4,70.4,69.58,69.79,517800 +2011.06.20,10:00,69.55,69.66,68.51,69.42,336700 +2011.06.21,10:00,69.03,69.99,69.03,69.68,94400 +2011.06.22,10:00,69.86,70.9,69.3,69.52,941800 +2011.06.23,10:00,69.59,72.0,67.86,68.02,1872800 +2011.06.24,10:00,68.05,69.48,68.05,68.87,352000 +2011.06.27,10:00,69.44,69.44,67.6,67.98,531400 +2011.06.28,10:00,68.03,68.46,67.37,68.0,385300 +2011.06.29,10:00,68.03,70.05,68.03,69.0,1473800 +2011.06.30,10:00,69.0,69.4,68.55,69.25,366400 +2011.07.01,10:00,69.14,69.98,68.53,69.33,398500 +2011.07.04,10:00,69.5,72.7,69.2,71.72,1548200 +2011.07.05,10:00,71.97,73.0,70.6,70.89,1296300 +2011.07.06,10:00,71.33,71.33,70.32,70.98,380200 +2011.07.07,10:00,71.33,71.72,70.04,71.42,317600 +2011.07.08,10:00,71.46,71.88,70.49,71.41,271700 +2011.07.11,10:00,72.11,72.11,70.8,70.91,1031100 +2011.07.12,10:00,70.63,70.68,70.28,70.42,352900 +2011.07.13,10:00,70.5,70.67,70.0,70.29,400800 +2011.07.14,10:00,74.94,74.94,69.93,70.08,362200 +2011.07.15,10:00,69.91,70.0,69.37,69.49,313800 +2011.07.18,10:00,69.59,69.79,68.4,68.69,505300 +2011.07.19,10:00,68.7,69.17,68.51,69.01,402300 +2011.07.20,10:00,69.74,69.77,68.71,69.33,376800 +2011.07.21,10:00,69.49,69.93,69.24,69.65,444900 +2011.07.22,10:00,71.44,71.44,69.7,70.09,573800 +2011.07.25,10:00,69.32,70.24,69.12,69.93,253700 +2011.07.26,10:00,68.12,71.9,68.12,70.91,602000 +2011.07.27,10:00,71.03,71.5,70.4,70.5,1670800 +2011.07.28,10:00,70.29,70.7,69.25,70.05,1220100 +2011.07.29,10:00,69.98,70.27,69.53,70.07,356200 +2011.08.01,10:00,70.98,71.0,70.08,70.72,607000 +2011.08.02,10:00,75.58,75.58,70.22,70.69,1747600 +2011.08.03,10:00,70.15,70.38,68.36,68.39,487800 +2011.08.04,10:00,68.49,69.1,66.0,66.02,1476100 +2011.08.05,10:00,65.0,65.99,61.11,64.77,2538700 +2011.08.08,10:00,62.95,66.44,59.51,59.99,9236500 +2011.08.09,10:00,58.5,59.88,51.01,58.6,2402100 +2011.08.10,10:00,60.95,60.95,56.11,56.47,372100 +2011.08.11,10:00,52.95,58.37,52.95,56.81,940200 +2011.08.12,10:00,57.22,58.65,56.0,58.0,721000 +2011.08.15,10:00,58.56,59.53,58.0,58.79,664900 +2011.08.16,10:00,58.8,60.2,55.5,56.83,632600 +2011.08.17,10:00,57.0,58.53,56.45,57.84,956600 +2011.08.18,10:00,57.03,57.49,55.01,55.46,992600 +2011.08.19,10:00,54.48,55.25,52.68,53.22,1235100 +2011.08.22,10:00,52.78,53.52,51.26,51.74,1450700 +2011.08.23,10:00,52.45,54.01,50.24,51.01,2208200 +2011.08.24,10:00,51.79,52.51,50.7,50.9,1383500 +2011.08.25,10:00,51.51,51.99,50.0,50.01,4902700 +2011.08.26,10:00,50.55,50.6,49.1,49.56,2357800 +2011.08.29,10:00,49.97,56.9,49.97,53.55,5529700 +2011.08.30,10:00,54.5,54.89,53.62,54.25,3269700 +2011.08.31,10:00,54.8,59.45,54.32,56.87,6038500 +2011.09.01,10:00,57.0,58.5,55.5,57.91,2469200 +2011.09.02,10:00,57.01,59.2,55.65,56.9,2750100 +2011.09.05,10:00,56.09,56.7,54.7,55.23,1188800 +2011.09.06,10:00,55.3,57.3,54.13,56.21,1805000 +2011.09.07,10:00,57.38,58.77,57.2,58.45,1198400 +2011.09.08,10:00,58.14,59.97,58.0,59.22,1266200 +2011.09.09,10:00,58.55,60.81,58.25,58.84,1712400 +2011.09.12,10:00,58.51,58.7,55.4,56.0,1890300 +2011.09.13,10:00,57.49,57.97,56.21,56.51,860600 +2011.09.14,10:00,56.42,57.3,56.06,56.25,526200 +2011.09.15,10:00,56.08,57.31,56.08,57.09,2461500 +2011.09.16,10:00,57.38,58.37,56.56,57.35,1333200 +2011.09.19,10:00,56.78,57.3,56.5,57.08,376400 +2011.09.20,10:00,57.1,58.34,57.06,57.51,751800 +2011.09.21,10:00,57.3,57.71,56.67,56.8,386400 +2011.09.22,10:00,54.26,55.72,52.0,52.36,1309300 +2011.09.23,10:00,52.2,52.83,48.0,49.2,2236900 +2011.09.26,10:00,48.0,50.33,45.51,49.07,1680200 +2011.09.27,10:00,51.49,52.0,49.66,50.82,3433600 +2011.09.28,10:00,50.16,50.93,49.51,49.7,902700 +2011.09.29,10:00,49.16,52.42,49.02,51.84,3340000 +2011.09.30,10:00,52.5,56.19,51.06,52.42,9252000 +2011.10.03,10:00,51.63,51.77,49.25,50.69,1529300 +2011.10.04,10:00,50.04,50.72,48.25,48.48,2550600 +2011.10.05,10:00,49.1,49.89,47.6,48.72,1246900 +2011.10.06,10:00,49.73,50.8,49.01,49.86,2255000 +2011.10.07,10:00,50.48,51.45,50.04,50.59,1414700 +2011.10.10,10:00,51.0,52.23,50.55,51.92,1740400 +2011.10.11,10:00,52.41,52.41,50.9,51.54,675600 +2011.10.12,10:00,52.79,52.79,51.01,52.34,3370000 +2011.10.13,10:00,52.3,52.99,51.32,51.79,1177300 +2011.10.14,10:00,51.77,52.94,51.77,52.68,1152300 +2011.10.17,10:00,53.49,53.73,52.0,52.09,748300 +2011.10.18,10:00,51.7,52.1,50.35,51.96,1200400 +2011.10.19,10:00,51.99,52.96,51.9,52.07,836800 +2011.10.20,10:00,51.55,51.55,50.01,50.95,1761300 +2011.10.21,10:00,51.83,51.83,50.89,51.09,1516000 +2011.10.24,10:00,51.14,52.64,51.0,52.14,2658200 +2011.10.25,10:00,52.24,52.52,50.2,50.83,2416800 +2011.10.26,10:00,50.9,51.9,50.61,51.01,3114800 +2011.10.27,10:00,51.9,54.34,51.42,53.82,5519200 +2011.10.28,10:00,55.24,57.2,53.5,56.96,4134200 +2011.10.31,10:00,56.3,57.2,55.44,56.5,1239500 +2011.11.01,10:00,55.51,56.78,53.66,54.42,1287700 +2011.11.02,10:00,54.52,55.86,50.78,53.1,5568800 +2011.11.03,10:00,53.09,53.09,50.5,52.19,3906700 +2011.11.07,10:00,52.77,52.87,51.66,52.42,1083600 +2011.11.08,10:00,53.3,53.47,52.52,52.84,1028200 +2011.11.09,10:00,53.0,53.35,51.0,51.08,1599100 +2011.11.10,10:00,50.5,52.5,49.3,51.51,2074800 +2011.11.11,10:00,52.29,52.29,51.15,51.77,503600 +2011.11.14,10:00,52.2,53.49,52.11,52.85,840900 +2011.11.15,10:00,52.27,52.86,50.8,51.17,1771300 +2011.11.16,10:00,51.05,51.88,50.26,51.25,1323000 +2011.11.17,10:00,51.5,51.52,50.5,51.12,1083800 +2011.11.18,10:00,50.1,50.99,50.1,50.75,1073500 +2011.11.21,10:00,50.51,50.88,49.51,50.0,4661200 +2011.11.22,10:00,50.18,50.98,49.15,49.72,6070300 +2011.11.23,10:00,49.5,50.11,49.17,49.98,1941100 +2011.11.24,10:00,49.96,50.33,49.53,50.0,1206000 +2011.11.25,10:00,53.19,53.19,48.8,49.62,1025500 +2011.11.28,10:00,50.13,51.0,50.02,50.67,1342900 +2011.11.29,10:00,50.88,50.97,49.72,50.02,924000 +2011.11.30,10:00,50.0,50.98,49.5,50.5,2053700 +2011.12.01,10:00,50.98,54.12,50.5,50.76,3615000 +2011.12.02,10:00,51.1,51.1,50.13,50.49,775700 +2011.12.05,10:00,50.15,50.78,50.15,50.62,343400 +2011.12.06,10:00,50.3,50.58,48.05,49.08,2432900 +2011.12.07,10:00,49.74,49.78,48.39,48.88,1408700 +2011.12.08,10:00,49.0,49.5,48.5,48.67,599100 +2011.12.09,10:00,48.02,48.5,45.7,47.06,1553000 +2011.12.12,10:00,47.56,47.95,45.8,45.93,1027200 +2011.12.13,10:00,45.8,46.29,45.04,45.85,1028700 +2011.12.14,10:00,46.11,46.14,45.21,45.34,736400 +2011.12.15,10:00,45.22,45.37,44.5,44.99,695600 +2011.12.16,10:00,45.2,45.37,44.57,44.96,1160500 +2011.12.19,10:00,45.0,45.16,44.5,44.79,529700 +2011.12.20,10:00,45.01,46.28,44.91,45.14,1306400 +2011.12.21,10:00,45.45,45.67,44.7,44.83,1441200 +2011.12.22,10:00,45.0,45.0,44.3,44.38,1141500 +2011.12.23,10:00,44.85,44.85,44.0,44.02,548300 +2011.12.26,10:00,44.24,46.2,43.15,45.16,2573800 +2011.12.27,10:00,45.0,47.0,44.91,45.37,1140800 +2011.12.28,10:00,45.58,47.0,45.24,46.44,1355700 +2011.12.29,10:00,46.49,48.0,45.25,47.89,2017900 +2011.12.30,10:00,48.72,51.3,48.04,50.54,9069500 +2012.01.03,10:00,51.0,52.74,50.01,50.86,1776000 +2012.01.04,10:00,50.51,53.33,50.4,52.26,2061500 +2012.01.05,10:00,52.5,52.88,50.55,50.79,764800 +2012.01.06,10:00,50.93,51.13,49.88,50.52,380000 +2012.01.09,10:00,50.7,51.06,50.27,50.51,165200 +2012.01.10,10:00,50.78,53.55,48.5,50.64,1264800 +2012.01.11,10:00,50.95,50.95,50.17,50.61,273800 +2012.01.12,10:00,50.06,51.1,50.06,50.64,813000 +2012.01.13,10:00,50.43,50.94,50.02,50.07,627400 +2012.01.16,10:00,50.0,50.0,49.12,49.79,838400 +2012.01.17,10:00,50.01,50.69,50.01,50.14,409000 +2012.01.18,10:00,50.6,50.6,49.79,50.11,247500 +2012.01.19,10:00,50.64,50.81,50.0,50.37,703500 +2012.01.20,10:00,49.98,50.6,49.98,50.17,402300 +2012.01.23,10:00,51.74,51.74,49.99,50.5,456100 +2012.01.24,10:00,50.75,51.0,49.5,49.9,961600 +2012.01.25,10:00,50.1,50.55,49.87,50.38,869100 +2012.01.26,10:00,50.1,50.8,50.1,50.43,1784600 +2012.01.27,10:00,50.03,50.32,44.7,50.1,324800 +2012.01.30,10:00,50.4,50.53,49.7,50.05,1010300 +2012.01.31,10:00,50.15,50.35,50.0,50.05,1381200 +2012.02.01,10:00,49.97,52.17,49.66,50.5,7413200 +2012.02.02,10:00,50.6,51.74,50.5,50.81,4961700 +2012.02.03,10:00,50.93,51.6,44.7,51.04,6235700 +2012.02.06,10:00,51.15,52.0,50.5,50.9,5205800 +2012.02.07,10:00,51.09,51.36,50.15,50.45,2589300 +2012.02.08,10:00,50.78,51.1,50.41,50.52,1341600 +2012.02.09,10:00,50.7,50.94,50.2,50.6,1548900 +2012.02.10,10:00,50.49,50.95,49.51,50.36,1873900 +2012.02.13,10:00,50.87,51.6,50.51,51.2,7512400 +2012.02.14,10:00,51.45,53.44,50.51,53.09,5549600 +2012.02.15,10:00,53.53,54.8,52.35,53.74,5208800 +2012.02.16,10:00,53.35,54.51,52.43,54.02,2699800 +2012.02.17,10:00,54.76,55.55,54.29,55.45,5057300 +2012.02.20,10:00,55.54,56.76,54.72,54.92,3156800 +2012.02.21,10:00,54.86,55.0,52.1,52.53,4381000 +2012.02.22,10:00,53.3,53.3,50.11,50.96,6703600 +2012.02.24,10:00,51.5,52.75,50.82,52.62,3250500 +2012.02.27,10:00,52.5,52.92,50.7,51.0,4737900 +2012.02.28,10:00,51.42,51.77,50.65,50.79,2632000 +2012.02.29,10:00,51.06,51.39,49.95,50.63,6712700 +2012.03.01,10:00,50.5,50.5,49.81,50.24,3904300 +2012.03.02,10:00,50.51,50.82,49.9,50.38,1911600 +2012.03.05,10:00,50.3,50.77,50.27,50.6,1348800 +2012.03.06,10:00,50.48,50.69,49.0,49.03,1594600 +2012.03.07,10:00,48.74,49.3,48.6,49.15,1262600 +2012.03.11,10:00,49.85,50.39,49.84,50.18,983600 +2012.03.12,10:00,50.06,50.13,49.33,49.4,1247900 +2012.03.13,10:00,49.61,50.2,49.59,49.84,1992600 +2012.03.14,10:00,50.23,50.8,49.36,49.71,1929200 +2012.03.15,10:00,49.18,49.95,49.01,49.44,1039700 +2012.03.16,10:00,49.49,50.1,48.75,49.33,1747500 +2012.03.19,10:00,49.74,49.79,47.78,48.37,3605200 +2012.03.20,10:00,48.46,48.46,46.8,47.41,1711500 +2012.03.21,10:00,47.5,47.65,46.6,46.81,1149200 +2012.03.22,10:00,44.05,48.18,44.05,46.74,22646400 +2012.03.23,10:00,47.47,48.87,46.99,47.95,4146700 +2012.03.26,10:00,48.2,48.5,47.7,48.09,6184000 +2012.03.27,10:00,48.45,49.05,47.72,48.27,8982100 +2012.03.28,10:00,49.66,49.66,47.3,47.33,370000 +2012.03.29,10:00,47.29,47.79,46.2,46.35,929000 +2012.03.30,10:00,46.7,48.05,46.6,47.75,1384700 +2012.04.02,10:00,48.99,48.99,47.35,47.66,730000 +2012.04.03,10:00,48.02,48.36,47.7,48.0,679300 +2012.04.04,10:00,47.99,48.1,46.6,46.89,759700 +2012.04.05,10:00,46.41,47.29,46.41,47.18,1117900 +2012.04.06,10:00,47.29,47.49,46.5,46.6,712400 +2012.04.09,10:00,46.8,46.89,45.99,46.7,3001400 +2012.04.10,10:00,46.68,46.85,46.28,46.3,233900 +2012.04.11,10:00,46.2,47.6,46.2,47.55,5150900 +2012.04.12,10:00,47.34,47.95,47.34,47.91,700200 +2012.04.13,10:00,48.0,50.07,47.67,49.44,7507800 +2012.04.16,10:00,48.94,49.7,48.7,48.8,5635600 +2012.04.17,10:00,48.98,49.4,48.3,48.63,1386500 +2012.04.18,10:00,49.05,49.14,47.6,47.64,5460900 +2012.04.19,10:00,47.94,48.5,47.66,48.5,2147000 +2012.04.20,10:00,48.28,49.09,48.03,48.58,547000 +2012.04.23,10:00,48.74,49.17,47.11,47.36,1099000 +2012.04.24,10:00,47.31,47.53,46.2,46.54,1034300 +2012.04.25,10:00,46.85,48.04,46.75,47.47,681900 +2012.04.26,10:00,47.42,47.7,46.0,46.72,696300 +2012.04.27,10:00,46.52,47.67,46.3,46.86,366300 +2012.05.02,10:00,48.92,49.39,47.44,48.1,1125300 +2012.05.03,10:00,48.02,48.4,47.25,48.17,421500 +2012.05.04,10:00,47.98,48.07,47.0,47.49,884100 +2012.05.05,10:00,48.91,48.91,46.75,47.01,332400 +2012.05.07,10:00,46.85,47.0,45.5,45.91,581700 +2012.05.08,10:00,46.22,46.38,45.52,45.61,1100700 +2012.05.10,10:00,46.0,46.6,45.81,46.01,898600 +2012.05.11,10:00,45.57,45.8,44.94,45.51,1425300 +2012.05.12,10:00,45.11,45.73,44.91,45.18,333000 +2012.05.14,10:00,44.91,45.13,43.75,43.9,607400 +2012.05.15,10:00,43.8,44.2,42.36,42.99,1123400 +2012.05.16,10:00,42.91,42.91,41.74,42.13,41182000 +2012.05.17,10:00,42.5,42.6,40.3,40.7,2093900 +2012.05.18,10:00,40.0,40.55,38.0,39.93,2028100 +2012.05.21,10:00,40.0,41.6,39.93,40.92,579500 +2012.05.22,10:00,41.2,41.55,40.63,41.09,862900 +2012.05.23,10:00,40.62,40.94,39.26,39.47,626700 +2012.05.24,10:00,40.5,40.95,38.81,40.52,1303500 +2012.05.25,10:00,40.82,41.25,40.28,40.96,554800 +2012.05.28,10:00,41.5,42.5,41.09,41.1,584500 +2012.05.29,10:00,41.99,42.18,41.29,42.13,625200 +2012.05.30,10:00,41.5,41.8,41.3,41.61,567100 +2012.05.31,10:00,41.5,44.77,41.4,43.84,5992300 +2012.06.01,10:00,43.01,46.24,41.8,41.93,4455800 +2012.06.04,10:00,41.3,42.5,40.56,42.07,2077900 +2012.06.05,10:00,42.5,43.73,42.31,43.09,889900 +2012.06.06,10:00,44.23,45.38,43.35,45.17,1328100 +2012.06.07,10:00,46.0,46.0,44.21,44.88,24248100 +2012.06.08,10:00,44.51,44.54,43.31,44.27,285200 +2012.06.09,10:00,44.5,45.36,44.38,44.45,300800 +2012.06.13,10:00,45.0,45.0,43.0,44.62,1105700 +2012.06.14,10:00,44.35,44.97,43.81,44.46,7501600 +2012.06.15,10:00,44.64,44.64,43.85,44.52,794400 +2012.06.18,10:00,44.85,45.47,44.63,45.4,28626200 +2012.06.19,10:00,45.39,45.51,44.72,45.32,28429800 +2012.06.20,10:00,45.38,45.38,44.25,44.31,1121900 +2012.06.21,10:00,44.13,44.74,43.43,43.62,551000 +2012.06.22,10:00,43.37,43.49,42.02,42.55,756200 +2012.06.25,10:00,42.5,43.18,41.85,42.15,1004700 +2012.06.26,10:00,42.34,42.9,42.3,42.44,626000 +2012.06.27,10:00,42.6,42.85,42.43,42.57,1172600 +2012.06.28,10:00,42.87,42.97,42.12,42.23,852900 +2012.06.29,10:00,42.65,43.86,42.5,43.47,858300 +2012.07.02,10:00,44.4,44.4,43.2,43.5,1250900 +2012.07.03,10:00,43.5,44.63,43.5,44.48,1009100 +2012.07.04,10:00,44.52,44.73,43.55,44.18,849300 +2012.07.05,10:00,43.88,44.35,43.88,43.98,676600 +2012.07.06,10:00,43.98,44.1,42.85,43.01,836900 +2012.07.09,10:00,43.0,43.69,42.83,43.35,407600 +2012.07.10,10:00,43.31,44.35,42.9,44.06,826100 +2012.07.11,10:00,43.95,43.98,43.35,43.53,266800 +2012.07.12,10:00,43.63,43.63,42.8,43.07,1449500 +2012.07.13,10:00,42.95,43.88,42.9,43.74,191200 +2012.07.16,10:00,44.2,44.2,43.4,43.75,1273100 +2012.07.17,10:00,43.75,44.93,43.4,43.78,938600 +2012.07.18,10:00,44.18,44.7,43.55,43.75,681200 +2012.07.19,10:00,44.08,44.3,43.5,44.0,1019500 +2012.07.20,10:00,43.95,43.95,43.15,43.22,655800 +2012.07.23,10:00,43.0,43.07,42.13,42.21,593200 +2012.07.24,10:00,42.35,42.8,41.25,42.2,738600 +2012.07.25,10:00,41.95,42.62,41.55,42.15,1592700 +2012.07.26,10:00,42.05,42.4,41.7,41.84,3653900 +2012.07.27,10:00,42.64,42.64,41.9,42.19,673400 +2012.07.30,10:00,42.32,42.83,42.1,42.48,974400 +2012.07.31,10:00,42.79,42.79,41.6,41.63,1407000 +2012.08.01,10:00,41.49,41.97,41.25,41.56,1201600 +2012.08.02,10:00,41.63,41.65,40.82,40.99,1703200 +2012.08.03,10:00,41.53,41.57,40.7,41.54,734500 +2012.08.06,10:00,41.5,42.62,41.45,42.3,1100800 +2012.08.07,10:00,42.25,42.5,42.01,42.39,724700 +2012.08.08,10:00,42.66,42.66,41.57,42.0,10203400 +2012.08.09,10:00,42.27,42.49,41.58,41.98,646500 +2012.08.10,10:00,42.0,42.24,41.51,41.72,694700 +2012.08.13,10:00,41.11,42.25,41.11,41.97,964200 +2012.08.14,10:00,42.21,42.39,41.5,41.64,3009100 +2012.08.15,10:00,41.5,41.78,41.2,41.49,2385500 +2012.08.16,10:00,41.5,41.85,41.39,41.66,585800 +2012.08.17,10:00,41.84,43.97,41.57,43.78,3701200 +2012.08.20,10:00,43.73,44.5,42.56,42.76,1396900 +2012.08.21,10:00,43.09,43.73,42.89,43.3,843200 +2012.08.22,10:00,43.03,43.48,42.58,43.39,372000 +2012.08.23,10:00,43.66,44.14,43.01,43.15,839500 +2012.08.24,10:00,43.0,43.3,42.51,42.99,408400 +2012.08.27,10:00,43.13,43.86,42.55,43.74,963600 +2012.08.28,10:00,43.65,44.14,43.31,43.85,3536600 +2012.08.29,10:00,43.76,43.99,43.35,43.43,449100 +2012.08.30,10:00,43.31,43.47,42.6,42.64,1884800 +2012.08.31,10:00,42.78,42.83,42.13,42.53,412000 +2012.09.03,10:00,44.0,44.0,42.36,42.81,481100 +2012.09.04,10:00,42.79,42.79,42.45,42.64,201900 +2012.09.05,10:00,42.7,42.99,42.18,42.62,1876600 +2012.09.06,10:00,42.6,42.7,42.2,42.67,1265300 +2012.09.07,10:00,42.7,43.47,42.6,43.37,1094700 +2012.09.10,10:00,43.46,43.62,42.92,43.44,806200 +2012.09.11,10:00,43.45,43.98,43.06,43.4,2355300 +2012.09.12,10:00,46.59,46.59,43.3,43.38,920900 +2012.09.13,10:00,43.5,43.53,42.97,43.29,606300 +2012.09.14,10:00,43.96,45.22,43.72,44.93,4709900 +2012.09.17,10:00,44.71,45.97,44.42,44.95,1673100 +2012.09.18,10:00,44.97,45.53,44.57,44.6,66867700 +2012.09.19,10:00,44.95,45.64,44.01,44.34,1617500 +2012.09.20,10:00,44.24,45.1,44.08,44.99,1066400 +2012.09.21,10:00,45.12,45.45,43.7,43.99,1156200 +2012.09.24,10:00,44.0,44.0,43.16,43.51,547500 +2012.09.25,10:00,43.89,43.91,43.37,43.41,1824500 +2012.09.26,10:00,43.11,43.79,42.6,42.68,1330900 +2012.09.27,10:00,42.94,43.79,42.81,43.18,1036900 +2012.09.28,10:00,43.7,43.77,43.0,43.43,678200 +2012.10.01,10:00,43.2,43.99,43.0,43.74,2535400 +2012.10.02,10:00,43.51,43.75,43.22,43.36,997600 +2012.10.03,10:00,43.74,45.28,43.12,43.47,8050800 +2012.10.04,10:00,43.81,44.04,43.05,43.18,1056200 +2012.10.05,10:00,43.4,43.97,43.27,43.57,2484100 +2012.10.08,10:00,43.21,43.4,42.99,43.33,3119600 +2012.10.09,10:00,43.47,43.98,43.12,43.16,1301500 +2012.10.10,10:00,42.97,43.38,42.94,43.24,719300 +2012.10.11,10:00,43.44,43.44,43.06,43.29,264000 +2012.10.12,10:00,43.26,43.34,42.68,42.97,658600 +2012.10.15,10:00,42.89,43.29,42.3,42.36,2273900 +2012.10.16,10:00,42.4,42.78,42.0,42.5,954000 +2012.10.17,10:00,42.84,43.14,42.34,42.7,1130700 +2012.10.18,10:00,42.8,43.0,42.4,42.43,2372200 +2012.10.19,10:00,42.4,42.65,42.19,42.26,1563000 +2012.10.22,10:00,41.99,42.35,41.57,42.02,1903600 +2012.10.23,10:00,42.07,42.47,40.38,40.58,1996600 +2012.10.24,10:00,41.05,41.05,39.92,40.18,1255900 +2012.10.25,10:00,40.31,40.42,40.02,40.16,544000 +2012.10.26,10:00,40.01,40.17,38.9,39.35,6703600 +2012.10.29,10:00,39.31,39.56,38.96,39.33,751000 +2012.10.30,10:00,39.11,39.57,38.71,38.83,871500 +2012.10.31,10:00,38.99,40.77,38.56,39.94,2230800 +2012.11.01,10:00,40.3,40.69,39.74,40.48,1584000 +2012.11.02,10:00,40.78,40.86,40.3,40.54,605200 +2012.11.06,10:00,40.5,41.69,39.91,41.45,2086700 +2012.11.07,10:00,41.55,43.29,41.3,41.74,7943800 +2012.11.08,10:00,41.0,41.44,40.8,41.19,4533700 +2012.11.09,10:00,41.32,41.48,40.3,40.7,2288300 +2012.11.12,10:00,40.98,41.19,40.32,40.7,71427300 +2012.11.13,10:00,40.65,40.71,39.5,39.66,933500 +2012.11.14,10:00,40.24,41.8,39.81,40.89,22330700 +2012.11.15,10:00,41.0,41.88,40.9,41.81,1023400 +2012.11.16,10:00,41.55,42.5,41.51,42.2,911800 +2012.11.19,10:00,42.7,42.7,42.05,42.27,963200 +2012.11.20,10:00,42.58,42.58,41.63,41.96,571800 +2012.11.21,10:00,40.65,42.25,40.65,42.15,1220300 +2012.11.22,10:00,42.28,43.04,42.11,42.62,1877100 +2012.11.23,10:00,42.98,43.1,42.49,42.87,780300 +2012.11.26,10:00,47.49,47.49,42.2,42.38,1332300 +2012.11.27,10:00,42.74,43.12,42.46,42.94,1025100 +2012.11.28,10:00,42.86,42.98,42.14,42.39,693600 +2012.11.29,10:00,42.53,42.79,42.33,42.54,698300 +2012.11.30,10:00,42.46,43.1,42.4,42.98,1483200 +2012.12.03,10:00,42.86,43.41,42.68,43.17,1650500 +2012.12.04,10:00,42.82,43.68,42.82,43.1,1215100 +2012.12.05,10:00,43.1,43.8,43.1,43.73,3739000 +2012.12.06,10:00,43.76,43.78,43.32,43.42,2149000 +2012.12.07,10:00,43.66,43.68,42.8,42.84,1301900 +2012.12.10,10:00,42.63,43.28,42.63,43.15,429600 +2012.12.11,10:00,43.01,43.5,42.38,43.44,1222400 +2012.12.12,10:00,43.49,43.75,43.14,43.5,2443300 +2012.12.13,10:00,43.5,43.86,43.2,43.5,4362500 +2012.12.14,10:00,43.27,43.7,43.2,43.56,1930600 +2012.12.17,10:00,43.53,43.65,43.25,43.46,435700 +2012.12.18,10:00,43.69,43.7,43.05,43.2,7836700 +2012.12.19,10:00,43.47,43.47,42.85,42.96,1012900 +2012.12.20,10:00,43.02,43.02,41.87,42.57,2725200 +2012.12.21,10:00,42.18,43.09,41.9,42.84,3024400 +2012.12.24,10:00,43.01,43.5,42.61,42.82,4859000 +2012.12.25,10:00,42.99,43.4,42.42,42.91,3574300 +2012.12.26,10:00,42.87,43.7,42.66,43.2,6188000 +2012.12.27,10:00,43.28,44.5,43.04,43.75,4443700 +2012.12.28,10:00,43.85,47.0,43.51,44.88,12999700 +2013.01.08,10:00,45.77,46.98,44.75,46.23,1543400 +2013.01.09,10:00,46.59,47.84,46.01,47.14,7326600 +2013.01.10,10:00,47.58,47.58,46.6,47.1,3847600 +2013.01.11,10:00,46.7,48.23,46.61,48.01,14007400 +2013.01.14,10:00,48.13,50.18,47.75,49.72,16401200 +2013.01.15,10:00,49.03,50.66,49.03,49.77,7830000 +2013.01.16,10:00,49.12,49.68,48.16,48.33,3223700 +2013.01.17,10:00,48.45,49.98,48.15,49.81,3978700 +2013.01.18,10:00,49.96,50.34,49.8,49.95,5925600 +2013.01.21,10:00,50.32,50.75,49.84,50.56,11164100 +2013.01.22,10:00,50.15,52.38,50.14,51.51,4682000 +2013.01.23,10:00,52.02,52.99,51.6,52.73,3039000 +2013.01.24,10:00,52.58,53.29,52.02,52.82,1629100 +2013.01.25,10:00,52.85,53.92,52.85,53.28,1993100 +2013.01.28,10:00,53.27,54.29,52.66,53.3,3903400 +2013.01.29,10:00,53.3,53.38,50.83,51.6,4030800 +2013.01.30,10:00,52.0,52.7,51.1,52.22,4905800 +2013.01.31,10:00,52.47,54.18,51.96,53.53,3966400 +2013.02.01,10:00,53.53,54.35,52.64,53.8,3156300 +2013.02.04,10:00,54.0,54.0,51.55,52.53,3210400 +2013.02.05,10:00,52.0,53.68,51.79,53.46,3846400 +2013.02.06,10:00,53.82,54.64,53.47,54.13,2592000 +2013.02.07,10:00,54.24,56.1,54.24,55.83,5700800 +2013.02.08,10:00,55.95,56.9,55.07,55.76,4635100 +2013.02.11,10:00,56.05,56.43,55.11,55.62,1059700 +2013.02.12,10:00,55.78,55.97,54.58,55.06,1036200 +2013.02.13,10:00,55.25,57.4,54.83,57.22,3695300 +2013.02.14,10:00,57.25,58.16,56.7,57.0,4802200 +2013.02.15,10:00,56.92,59.77,56.84,58.74,7336100 +2013.02.18,10:00,58.91,59.8,56.6,58.57,4112400 +2013.02.19,10:00,58.11,58.9,57.01,57.39,1548600 +2013.02.20,10:00,57.94,58.17,55.72,55.78,3062800 +2013.02.21,10:00,55.33,55.99,54.78,55.66,3279800 +2013.02.22,10:00,56.0,56.55,55.25,55.32,2210800 +2013.02.25,10:00,55.33,55.81,54.8,55.17,795300 +2013.02.26,10:00,54.29,55.08,53.5,54.25,1488000 +2013.02.27,10:00,53.99,54.58,53.05,53.55,1168400 +2013.02.28,10:00,54.2,54.33,52.81,53.13,1204800 +2013.03.01,10:00,52.68,52.98,50.81,52.5,2956800 +2013.03.04,10:00,51.66,52.98,51.61,52.59,1209400 +2013.03.05,10:00,52.61,55.3,52.61,55.0,4029400 +2013.03.06,10:00,55.48,56.06,54.73,55.86,5779800 +2013.03.07,10:00,55.33,56.31,55.12,55.97,2500800 +2013.03.11,10:00,56.5,56.8,55.8,56.2,2567000 +2013.03.12,10:00,56.1,56.75,55.6,56.41,3981600 +2013.03.13,10:00,56.44,57.83,56.03,56.4,4487000 +2013.03.14,10:00,53.6,56.76,53.6,56.17,1798100 +2013.03.15,10:00,56.55,56.98,54.1,54.3,3443300 +2013.03.18,10:00,53.3,54.93,52.8,54.25,1527900 +2013.03.19,10:00,54.25,55.04,53.5,54.25,729900 +2013.03.20,10:00,53.99,54.66,53.06,53.78,1389300 +2013.03.21,10:00,53.99,54.51,53.79,54.21,1806600 +2013.03.22,10:00,53.76,54.34,52.11,52.39,1030900 +2013.03.25,10:00,53.15,53.49,50.33,50.91,2342100 +2013.03.26,10:00,50.95,51.8,49.21,50.02,2828800 +2013.03.27,10:00,50.26,50.8,49.8,50.11,1042100 +2013.03.28,10:00,50.45,53.43,50.02,52.24,3105600 +2013.03.29,10:00,52.68,54.0,52.5,52.7,2506300 +2013.04.01,10:00,52.54,53.09,51.32,51.93,1537900 +2013.04.02,10:00,52.09,52.47,50.62,51.88,1662100 +2013.04.03,10:00,52.1,52.94,51.74,52.6,1702700 +2013.04.04,10:00,52.34,54.35,52.05,53.95,2912800 +2013.04.05,10:00,54.1,54.99,53.5,54.72,3060100 +2013.04.08,10:00,55.0,55.33,53.12,53.77,1944900 +2013.04.09,10:00,53.99,55.0,52.83,53.06,1612800 +2013.04.10,10:00,52.74,53.75,52.7,53.25,1889400 +2013.04.11,10:00,53.53,54.59,51.81,52.03,1439400 +2013.04.12,10:00,52.15,52.47,51.05,52.22,886100 +2013.04.15,10:00,52.04,52.04,50.02,50.23,1224500 +2013.04.16,10:00,50.0,50.51,49.04,49.93,5887600 +2013.04.17,10:00,50.35,50.5,49.3,50.37,1355400 +2013.04.18,10:00,50.28,52.47,49.83,52.15,1908000 +2013.04.19,10:00,52.83,54.04,52.45,52.61,1382200 +2013.04.22,10:00,53.0,53.74,51.55,51.7,1281100 +2013.04.23,10:00,51.7,52.48,51.15,52.24,1101900 +2013.04.24,10:00,52.51,53.99,52.39,53.48,2494900 +2013.04.25,10:00,53.99,53.99,52.45,52.91,967700 +2013.04.26,10:00,52.96,53.33,51.55,52.47,1365700 +2013.04.29,10:00,52.9,53.14,52.22,52.91,414300 +2013.04.30,10:00,52.62,53.99,52.05,53.74,2285200 +2013.05.02,10:00,53.05,53.95,52.71,53.28,429000 +2013.05.03,10:00,53.4,53.66,52.81,52.97,340400 +2013.05.06,10:00,53.0,53.49,52.5,52.82,1678200 +2013.05.07,10:00,52.41,53.19,52.41,52.48,646100 +2013.05.08,10:00,52.11,52.94,51.31,51.56,1378600 +2013.05.10,10:00,51.84,51.99,51.31,51.65,225500 +2013.05.13,10:00,51.38,51.61,50.2,50.91,1403500 +2013.05.14,10:00,50.71,51.77,50.1,50.16,1472700 +2013.05.15,10:00,50.48,50.66,50.01,50.53,775500 +2013.05.16,10:00,54.1,54.1,50.0,50.38,1578700 +2013.05.17,10:00,50.39,50.47,49.56,50.28,971300 +2013.05.20,10:00,50.39,50.88,49.5,49.71,1285900 +2013.05.21,10:00,49.66,51.63,49.56,51.55,1761800 +2013.05.22,10:00,51.5,52.63,51.12,52.2,1800300 +2013.05.23,10:00,52.01,52.01,48.82,49.0,2545200 +2013.05.24,10:00,49.28,50.5,49.03,50.04,1700900 +2013.05.27,10:00,49.9,50.65,49.9,50.46,719600 +2013.05.28,10:00,51.01,52.32,50.3,52.04,1993400 +2013.05.29,10:00,51.82,52.3,51.0,51.03,2628900 +2013.05.30,10:00,50.91,51.99,50.56,51.82,937200 +2013.05.31,10:00,52.09,52.3,51.1,51.8,1988000 +2013.06.03,10:00,51.76,51.99,50.4,50.59,1080600 +2013.06.04,10:00,50.92,52.34,50.54,52.01,2348400 +2013.06.05,10:00,51.65,52.17,51.49,51.99,800700 +2013.06.06,10:00,51.95,52.46,51.61,52.35,728100 +2013.06.07,10:00,52.43,53.5,52.26,53.47,2907300 +2013.06.10,10:00,53.02,53.9,52.11,52.35,739500 +2013.06.11,10:00,52.3,52.41,50.11,51.48,1394700 +2013.06.13,10:00,50.0,51.96,49.68,51.5,2480000 +2013.06.14,10:00,51.4,53.5,51.35,53.43,2249400 +2013.06.17,10:00,54.08,54.88,53.07,53.93,1845000 +2013.06.18,10:00,53.61,54.59,53.49,54.34,1119400 +2013.06.19,10:00,54.14,54.84,53.5,54.34,840800 +2013.06.20,10:00,54.47,54.47,52.15,52.77,1281800 +2013.06.21,10:00,52.51,54.38,52.34,54.24,1035800 +2013.06.24,10:00,54.18,55.5,53.02,53.42,962700 +2013.06.25,10:00,53.77,54.96,53.1,53.38,633500 +2013.06.26,10:00,53.96,55.3,53.93,54.84,1269600 +2013.06.27,10:00,55.22,56.15,54.63,56.01,3718500 +2013.06.28,10:00,56.17,56.86,55.87,56.51,1557800 +2013.07.01,10:00,55.98,56.77,55.01,55.6,2571100 +2013.07.02,10:00,55.99,58.65,55.75,58.02,11780700 +2013.07.03,10:00,57.69,59.0,57.51,57.95,6133600 +2013.07.04,10:00,57.85,58.6,57.8,58.15,626100 +2013.07.05,10:00,58.19,58.6,57.7,58.06,2319600 +2013.07.08,10:00,58.07,59.49,57.6,58.93,1656800 +2013.07.09,10:00,59.0,59.69,58.77,58.91,440600 +2013.07.10,10:00,59.18,59.25,58.2,58.63,653400 +2013.07.11,10:00,59.2,59.4,57.6,57.98,864900 +2013.07.12,10:00,58.3,58.69,56.86,57.85,2958800 +2013.07.15,10:00,58.18,59.89,58.0,58.59,1854700 +2013.07.16,10:00,58.54,59.42,57.57,57.74,1191000 +2013.07.17,10:00,57.89,58.19,57.34,57.54,979300 +2013.07.18,10:00,57.72,57.9,56.14,57.09,1339000 +2013.07.19,10:00,57.53,57.55,56.56,57.06,432900 +2013.07.22,10:00,56.76,57.43,56.7,56.99,1046500 +2013.07.23,10:00,56.33,57.12,56.29,56.66,1013500 +2013.07.24,10:00,57.41,57.41,54.85,55.44,1634200 +2013.07.25,10:00,55.49,55.94,54.44,54.81,1705100 +2013.07.26,10:00,52.38,55.46,52.38,55.06,865200 +2013.07.29,10:00,55.0,56.39,54.61,56.13,1350200 +2013.07.30,10:00,56.26,57.0,55.53,56.39,1607000 +2013.07.31,10:00,57.2,57.36,56.02,57.36,1875400 +2013.08.01,10:00,57.4,58.87,57.38,58.49,1048100 +2013.08.02,10:00,58.07,58.5,57.0,57.1,918100 +2013.08.05,10:00,57.53,57.55,55.71,55.91,647000 +2013.08.06,10:00,56.1,56.63,55.75,56.04,1332300 +2013.08.07,10:00,56.0,56.29,54.7,55.08,371900 +2013.08.08,10:00,55.41,56.55,53.73,55.89,2118200 +2013.08.09,10:00,56.14,56.23,55.53,56.08,351600 +2013.08.12,10:00,56.21,57.39,55.71,56.49,704700 +2013.08.13,10:00,56.35,57.2,56.33,56.53,508600 +2013.08.14,10:00,56.94,57.2,56.0,56.13,611600 +2013.08.15,10:00,56.18,56.18,55.11,55.32,721900 +2013.08.16,10:00,54.89,55.65,53.7,53.93,811700 +2013.08.19,10:00,53.65,55.1,53.33,54.29,657300 +2013.08.20,10:00,54.46,54.46,53.21,53.8,470200 +2013.08.21,10:00,53.97,54.2,52.48,52.73,756900 +2013.08.22,10:00,52.83,53.86,51.43,53.81,3716900 +2013.08.23,10:00,53.79,54.75,53.53,54.37,1380800 +2013.08.26,10:00,50.0,54.66,50.0,53.52,842900 +2013.08.27,10:00,53.13,53.46,52.53,52.7,922300 +2013.08.28,10:00,52.57,52.57,51.8,52.08,1576200 +2013.08.29,10:00,51.97,52.4,50.17,50.49,4492900 +2013.08.30,10:00,50.56,51.24,47.83,48.72,5438600 +2013.09.02,10:00,49.33,49.88,48.5,48.55,1815400 +2013.09.03,10:00,48.7,49.19,47.53,47.66,1804200 +2013.09.04,10:00,47.85,47.85,46.44,47.56,4721400 +2013.09.05,10:00,47.98,49.4,47.56,49.38,3539000 +2013.09.06,10:00,49.83,49.83,48.61,49.28,2239900 +2013.09.09,10:00,49.5,50.33,49.37,50.1,2149200 +2013.09.10,10:00,50.5,51.25,50.11,50.76,2177200 +2013.09.11,10:00,50.85,51.75,50.72,51.5,1955900 +2013.09.12,10:00,51.39,51.74,50.73,51.13,949800 +2013.09.13,10:00,50.92,51.58,50.75,51.58,762600 +2013.09.16,10:00,51.8,53.38,51.28,52.87,3271200 +2013.09.17,10:00,52.7,54.49,52.22,54.0,2966100 +2013.09.18,10:00,54.26,54.79,53.5,53.51,1980200 +2013.09.19,10:00,53.5,54.87,53.5,54.32,3063300 +2013.09.20,10:00,53.48,55.0,53.48,55.0,2041300 +2013.09.23,10:00,54.9,55.95,54.43,54.95,2225100 +2013.09.24,10:00,54.8,55.36,54.25,54.79,1143100 +2013.09.25,10:00,54.59,55.4,54.1,55.14,2170500 +2013.09.26,10:00,55.3,55.74,54.1,54.45,1179800 +2013.09.27,10:00,54.24,54.91,54.14,54.29,914900 +2013.09.30,10:00,54.15,54.65,54.01,54.65,757200 +2013.10.01,10:00,54.01,55.9,54.01,55.3,2651700 +2013.10.02,10:00,55.34,55.47,54.55,54.55,602200 +2013.10.03,10:00,54.62,55.4,54.6,55.25,1983400 +2013.10.04,10:00,55.25,55.33,54.5,55.19,988100 +2013.10.07,10:00,55.16,55.3,54.89,55.29,342400 +2013.10.08,10:00,55.22,55.58,54.75,55.1,10106400 +2013.10.09,10:00,55.15,55.25,54.65,54.99,919600 +2013.10.10,10:00,55.05,55.49,54.9,55.17,1900500 +2013.10.11,10:00,55.4,55.6,54.91,54.91,10483600 +2013.10.14,10:00,55.01,55.61,54.69,55.29,1859200 +2013.10.15,10:00,55.73,55.78,54.58,55.3,8063000 +2013.10.16,10:00,55.28,55.4,55.02,55.29,1233300 +2013.10.17,10:00,55.3,55.4,55.2,55.32,2089400 +2013.10.18,10:00,55.51,55.81,55.22,55.44,4123200 +2013.10.21,10:00,55.34,55.7,54.57,55.45,6146200 +2013.10.22,10:00,55.45,56.95,55.25,55.71,5330000 +2013.10.23,10:00,55.8,56.39,55.48,56.0,4126900 +2013.10.24,10:00,56.13,57.19,55.5,57.14,8006700 +2013.10.25,10:00,57.1,57.5,56.87,57.3,1695400 +2013.10.28,10:00,57.42,57.59,56.81,57.19,785200 +2013.10.29,10:00,57.28,58.81,56.49,57.8,33653600 +2013.10.30,10:00,58.11,58.66,56.68,56.8,4265300 +2013.10.31,10:00,56.7,57.43,55.61,57.4,2860500 +2013.11.01,10:00,57.13,57.75,56.64,57.12,2627300 +2013.11.05,10:00,57.5,57.5,56.8,56.86,729000 +2013.11.06,10:00,56.93,57.46,56.5,57.37,1348900 +2013.11.07,10:00,57.31,58.47,56.92,58.47,2110200 +2013.11.08,10:00,57.58,58.11,56.9,56.9,1728900 +2013.11.11,10:00,57.22,57.83,56.68,57.35,1258600 +2013.11.12,10:00,57.49,57.91,57.29,57.67,1172500 +2013.11.13,10:00,57.5,58.85,57.32,57.77,2883100 +2013.11.14,10:00,58.25,60.16,57.74,59.5,1845200 +2013.11.15,10:00,60.01,60.47,59.51,59.8,1285000 +2013.11.18,10:00,59.94,60.35,59.47,59.9,966900 +2013.11.19,10:00,59.8,60.18,58.26,58.57,1314800 +2013.11.20,10:00,58.1,58.55,57.46,57.66,1501200 +2013.11.21,10:00,57.97,57.97,56.38,57.79,1282600 +2013.11.22,10:00,57.79,58.63,57.79,58.34,1151600 +2013.11.25,10:00,58.47,59.19,58.15,58.2,839200 +2013.11.26,10:00,58.16,58.36,57.26,57.91,2121700 +2013.11.27,10:00,58.17,58.17,56.7,57.28,2265500 +2013.11.28,10:00,57.32,58.5,57.32,58.3,1295500 +2013.11.29,10:00,58.27,60.5,58.19,60.49,2418400 +2013.12.02,10:00,60.24,64.74,60.05,62.99,5123000 +2013.12.03,10:00,62.75,63.92,60.61,62.65,3189600 +2013.12.04,10:00,62.9,67.49,62.48,67.48,10542400 +2013.12.05,10:00,68.9,69.0,66.21,66.51,3903800 +2013.12.06,10:00,66.75,68.8,66.4,68.5,7847400 +2013.12.09,10:00,69.01,72.55,68.52,72.55,7880100 +2013.12.10,10:00,72.45,74.4,71.2,74.0,4577900 +2013.12.11,10:00,73.13,74.34,72.82,73.15,3242600 +2013.12.12,10:00,72.6,74.0,58.78,73.65,4592364 +2013.12.13,10:00,73.69,77.01,73.21,76.58,7629300 +2013.12.16,10:00,76.6,80.39,76.6,79.6,7083700 +2013.12.17,10:00,80.0,80.25,77.8,79.24,4264900 +2013.12.18,10:00,79.0,79.7,76.6,77.16,5111900 +2013.12.19,10:00,77.8,78.91,74.74,77.7,7097400 +2013.12.20,10:00,78.05,80.3,76.1,79.62,6256000 +2013.12.23,10:00,79.15,82.2,78.55,81.6,4727600 +2013.12.24,10:00,81.63,85.05,81.63,84.11,6461600 +2013.12.25,10:00,84.64,88.49,84.59,85.1,6262600 +2013.12.26,10:00,85.22,86.38,83.55,84.7,4731100 +2013.12.27,10:00,82.43,86.25,82.43,82.5,3836100 +2013.12.30,10:00,82.03,84.94,82.03,83.81,5262600 +2014.01.06,10:00,83.96,84.83,82.6,83.24,2490000 +2014.01.08,10:00,83.7,83.85,82.81,83.4,2345100 +2014.01.09,10:00,84.3,84.82,82.83,83.0,2751400 +2014.01.10,10:00,83.0,83.9,82.1,82.51,3849100 +2014.01.13,10:00,83.25,99.3,82.09,87.95,7404300 +2014.01.14,10:00,87.0,88.99,83.72,84.93,7910200 +2014.01.15,10:00,85.3,86.09,83.61,83.83,5389100 +2014.01.16,10:00,83.5,85.43,83.4,84.65,4199800 +2014.01.17,10:00,84.8,85.19,84.0,84.24,3629900 +2014.01.20,10:00,84.25,85.8,83.92,85.46,3448100 +2014.01.21,10:00,86.2,86.2,80.11,81.48,7934600 +2014.01.22,10:00,80.57,82.45,76.02,78.81,9903800 +2014.01.23,10:00,78.26,81.73,78.26,79.7,4992100 +2014.01.24,10:00,79.55,80.43,77.81,78.8,4350900 +2014.01.27,10:00,77.7,82.39,77.7,81.9,5237800 +2014.01.28,10:00,81.95,83.1,80.08,81.66,3474600 +2014.01.29,10:00,82.08,82.79,79.22,81.4,3420700 +2014.01.30,10:00,81.0,82.32,80.43,81.54,2819800 +2014.01.31,10:00,84.86,84.86,81.0,84.77,2926200 +2014.02.03,10:00,83.53,83.98,79.67,79.98,4761000 +2014.02.04,10:00,78.75,79.12,75.22,76.68,6241600 +2014.02.05,10:00,76.93,78.01,75.0,76.21,7386900 +2014.02.06,10:00,75.73,78.9,75.73,78.9,4932600 +2014.02.07,10:00,79.55,80.5,79.22,79.79,4324400 +2014.02.10,10:00,80.0,80.39,77.78,80.0,2914700 +2014.02.11,10:00,79.16,80.77,79.16,80.56,1913300 +2014.02.12,10:00,81.01,83.49,80.65,82.0,5313700 +2014.02.13,10:00,81.19,82.36,79.88,80.35,3901700 +2014.02.14,10:00,80.45,81.48,79.33,80.3,2766200 +2014.02.17,10:00,80.59,80.96,80.49,80.75,618300 +2014.02.18,10:00,80.74,81.45,79.76,80.01,2795900 +2014.02.19,10:00,82.14,82.14,77.94,78.39,1995100 +2014.02.20,10:00,77.4,78.1,77.03,77.8,2274900 +2014.02.21,10:00,78.04,78.75,77.46,77.9,1468300 +2014.02.24,10:00,77.31,86.55,76.3,76.9,1937300 +2014.02.25,10:00,77.22,77.51,76.5,77.38,1124800 +2014.02.26,10:00,77.51,78.45,77.0,77.61,2172700 +2014.02.27,10:00,77.95,78.22,72.63,72.79,5895700 +2014.02.28,10:00,73.4,73.4,69.62,71.2,5484400 +2014.03.03,10:00,65.68,68.44,58.5,58.5,11263800 +2014.03.04,10:00,59.5,63.37,59.5,60.55,9257400 +2014.03.05,10:00,61.5,63.14,61.0,62.3,6152100 +2014.03.06,10:00,62.74,66.27,60.67,62.4,10379200 +2014.03.07,10:00,62.7,63.81,60.81,61.11,4904000 +2014.03.11,10:00,60.83,63.1,57.85,59.38,9750800 +2014.03.12,10:00,58.32,59.96,57.04,58.55,6743300 +2014.03.13,10:00,58.53,59.84,52.17,52.98,11286500 +2014.03.14,10:00,51.84,51.84,46.33,46.75,17284200 +2014.03.17,10:00,47.95,49.87,44.7,46.74,22253700 +2014.03.18,10:00,47.75,49.36,46.65,48.85,28154600 +2014.03.19,10:00,49.0,54.67,48.75,53.92,38772300 +2014.03.20,10:00,53.05,57.7,52.77,56.49,26956600 +2014.03.21,10:00,55.15,56.45,52.9,55.2,18254900 +2014.03.24,10:00,55.6,56.97,52.1,53.54,11807400 +2014.03.25,10:00,53.82,55.25,52.4,54.5,9780200 +2014.03.26,10:00,54.73,56.24,54.56,55.35,8585600 +2014.03.27,10:00,55.18,57.3,53.1,53.49,11726900 +2014.03.28,10:00,53.99,54.6,53.3,53.8,7622800 +2014.03.31,10:00,53.76,55.5,53.76,55.2,3938700 +2014.04.01,10:00,55.5,56.7,55.19,55.97,6133300 +2014.04.02,10:00,56.0,56.29,54.8,55.78,5111000 +2014.04.03,10:00,55.9,56.39,55.52,55.8,3601000 +2014.04.04,10:00,56.15,56.15,55.52,56.02,3127200 +2014.04.07,10:00,55.3,55.82,52.5,53.45,8021700 +2014.04.08,10:00,53.02,53.84,52.55,53.39,5300800 +2014.04.09,10:00,54.17,54.17,52.89,53.85,4302200 +2014.04.10,10:00,54.1,54.45,53.82,54.15,3094800 +2014.04.11,10:00,53.33,54.2,52.91,53.4,2410400 +2014.04.14,10:00,52.62,53.39,52.5,52.85,2759900 +2014.04.15,10:00,52.51,52.98,49.38,49.68,5598200 +2014.04.16,10:00,50.0,52.5,50.0,51.8,5045400 +2014.04.17,10:00,52.2,53.13,51.52,53.0,5023600 +2014.04.18,10:00,54.0,54.83,53.55,53.75,3320700 +2014.04.21,10:00,53.8,54.0,52.91,53.65,2028400 +2014.04.22,10:00,53.29,53.89,51.75,52.34,3584200 +2014.04.23,10:00,52.5,52.5,51.03,51.76,2606400 +2014.04.24,10:00,51.84,52.07,50.05,50.64,4354400 +2014.04.25,10:00,50.96,50.96,49.15,49.25,3248900 +2014.04.28,10:00,49.25,50.48,47.87,50.46,4029400 +2014.04.29,10:00,50.38,51.77,50.38,50.95,2887400 +2014.04.30,10:00,50.98,52.69,50.0,50.92,6453300 +2014.05.02,10:00,49.74,51.12,49.11,50.35,1797900 +2014.05.05,10:00,49.43,50.8,49.36,50.25,1908800 +2014.05.06,10:00,50.89,51.09,50.4,50.55,3968600 +2014.05.07,10:00,50.35,52.46,50.03,52.17,8431600 +2014.05.08,10:00,52.0,53.3,50.6,51.49,6072500 +2014.05.12,10:00,51.36,52.42,51.13,51.61,2578000 +2014.05.13,10:00,51.67,52.96,51.67,52.8,5919800 +2014.05.14,10:00,52.9,53.76,52.0,53.0,3534100 +2014.05.15,10:00,53.58,54.21,52.24,52.24,5918000 +2014.05.16,10:00,52.34,53.0,52.11,52.65,1906500 +2014.05.19,10:00,53.43,53.72,52.83,53.55,3321200 +2014.05.20,10:00,53.76,53.98,53.0,53.61,3499900 +2014.05.21,10:00,53.79,54.65,53.6,54.2,4663100 +2014.05.22,10:00,54.45,54.88,51.9,53.11,6529400 +2014.05.23,10:00,53.13,53.92,52.31,53.89,2548700 +2014.05.26,10:00,53.8,54.47,53.8,53.99,4344200 +2014.05.27,10:00,53.91,53.91,52.65,53.32,3977600 +2014.05.28,10:00,53.49,54.14,53.1,54.0,2405700 +2014.05.29,10:00,54.07,55.87,54.05,55.3,7225900 +2014.05.30,10:00,55.0,55.87,54.74,55.15,2366200 +2014.06.02,10:00,55.16,58.39,55.04,57.04,8614500 +2014.06.03,10:00,56.7,57.8,56.4,57.8,2657400 +2014.06.04,10:00,58.0,58.29,56.36,57.2,5440600 +2014.06.05,10:00,56.92,57.79,56.92,57.57,1852500 +2014.06.06,10:00,57.28,57.97,56.32,57.59,2912200 +2014.06.09,10:00,57.7,59.36,57.35,58.84,3416600 +2014.06.10,10:00,58.78,59.48,58.14,58.85,2656000 +2014.06.11,10:00,59.08,59.2,58.04,58.74,2161900 +2014.06.16,10:00,58.74,58.74,56.51,56.89,5604200 +2014.06.17,10:00,56.94,57.36,55.01,55.06,3978800 +2014.06.18,10:00,55.42,55.59,55.02,55.3,2023600 +2014.06.19,10:00,55.96,56.15,55.5,55.64,3138000 +2014.06.20,10:00,55.79,56.34,55.68,55.68,1973200 +2014.06.23,10:00,56.0,56.5,55.8,56.38,1730800 +2014.06.24,10:00,56.42,58.49,56.27,58.49,4575300 +2014.06.25,10:00,58.09,58.23,56.75,56.75,2611100 +2014.06.26,10:00,57.0,57.47,55.82,56.41,2455900 +2014.06.27,10:00,56.04,56.87,55.6,55.6,2292900 +2014.06.30,10:00,56.08,56.8,55.31,56.43,2701800 +2014.07.01,10:00,56.52,57.0,56.1,56.68,1456600 +2014.07.02,10:00,56.6,57.61,56.6,57.1,2940000 +2014.07.03,10:00,57.09,57.5,56.3,57.09,2745800 +2014.07.04,10:00,57.13,57.8,56.93,57.3,5071300 +2014.07.07,10:00,55.01,58.9,54.55,58.26,5844400 +2014.07.08,10:00,58.26,59.94,57.7,59.34,5062800 +2014.07.09,10:00,60.12,60.9,57.67,59.73,6495600 +2014.07.10,10:00,59.95,60.1,58.2,58.66,3750100 +2014.07.11,10:00,59.55,59.63,58.5,59.1,1898100 +2014.07.14,10:00,59.35,59.7,58.45,59.5,1454800 +2014.07.15,10:00,59.55,59.82,58.4,59.0,1777200 +2014.07.16,10:00,59.0,59.76,58.75,59.43,1050100 +2014.07.17,10:00,59.4,59.4,57.21,57.33,3881600 +2014.07.18,10:00,56.49,56.49,54.4,54.4,5564700 +2014.07.21,10:00,54.5,55.14,52.02,52.02,5180300 +2014.07.22,10:00,52.5,54.17,52.4,53.73,3681600 +2014.07.23,10:00,54.0,54.5,53.56,53.98,2525500 +2014.07.24,10:00,53.81,53.98,53.0,53.76,1402700 +2014.07.25,10:00,53.39,54.04,52.13,52.28,2748200 +2014.07.28,10:00,51.9,52.24,50.08,50.48,2738500 +2014.07.29,10:00,50.6,51.37,50.14,50.44,2976600 +2014.07.30,10:00,50.0,51.68,49.81,50.5,3957900 +2014.07.31,10:00,50.52,51.2,50.34,50.55,2182500 +2014.08.01,10:00,50.37,50.66,48.82,49.53,4934400 +2014.08.04,10:00,49.03,49.9,49.0,49.9,4008400 +2014.08.05,10:00,49.5,49.5,46.01,46.97,17434900 +2014.08.06,10:00,46.8,47.05,44.4,44.62,9349700 +2014.08.07,10:00,45.5,45.95,41.79,44.44,11326100 +2014.08.08,10:00,45.17,45.5,43.5,44.71,4414600 +2014.08.11,10:00,45.5,46.44,45.27,46.1,5532100 +2014.08.12,10:00,46.11,46.67,44.8,45.4,5264300 +2014.08.13,10:00,45.4,46.5,44.9,46.4,5432900 +2014.08.14,10:00,46.68,48.58,46.39,48.25,8226500 +2014.08.15,10:00,48.5,50.15,48.13,48.6,9806600 +2014.08.18,10:00,48.65,49.47,48.65,49.17,2620300 +2014.08.19,10:00,49.73,50.12,49.25,49.71,4357100 +2014.08.20,10:00,49.64,50.07,49.15,49.6,2688400 +2014.08.21,10:00,49.69,50.45,49.6,50.0,3106300 +2014.08.22,10:00,50.0,50.28,48.26,48.88,3921100 +2014.08.25,10:00,49.25,49.98,48.98,49.41,2955900 +2014.08.26,10:00,49.5,49.78,45.0,48.31,1849300 +2014.08.27,10:00,48.5,49.0,48.37,48.37,2068100 +2014.08.28,10:00,46.88,48.09,46.18,46.7,4906500 +2014.08.29,10:00,46.46,47.63,46.2,46.73,3521700 +2014.09.01,10:00,46.42,47.64,46.42,47.1,3711200 +2014.09.02,10:00,47.27,47.51,46.21,46.6,1870200 +2014.09.03,10:00,46.94,48.11,46.37,47.82,7294000 +2014.09.04,10:00,47.89,48.4,46.7,47.29,6781800 +2014.09.05,10:00,47.0,48.25,46.55,47.8,6401200 +2014.09.08,10:00,47.4,47.55,46.51,46.79,3335900 +2014.09.09,10:00,46.8,47.54,46.8,47.1,1517300 +2014.09.10,10:00,47.05,47.31,46.82,47.1,1165200 +2014.09.11,10:00,47.1,47.43,45.36,45.63,4027200 +2014.09.12,10:00,46.32,46.35,44.44,46.25,3615500 +2014.09.15,10:00,46.25,46.87,45.94,46.22,1868800 +2014.09.16,10:00,46.19,46.9,46.15,46.65,2013900 +2014.09.17,10:00,47.1,47.1,45.26,46.0,4165000 +2014.09.18,10:00,46.0,46.3,45.44,45.44,2252900 +2014.09.19,10:00,45.51,46.17,44.67,45.8,4425900 +2014.09.22,10:00,45.8,46.06,45.16,45.29,1130000 +2014.09.23,10:00,45.18,45.6,45.18,45.4,1217700 +2014.09.24,10:00,45.7,45.85,44.55,44.8,3043300 +2014.09.25,10:00,45.23,45.23,44.45,44.45,3783500 +2014.09.26,10:00,44.4,44.45,43.01,43.6,5187800 +2014.09.29,10:00,43.6,44.44,43.18,43.49,3396300 +2014.09.30,10:00,43.5,43.83,43.16,43.25,2627500 +2014.10.01,10:00,43.1,43.51,42.74,42.83,1700100 +2014.10.02,10:00,42.71,43.34,42.48,42.68,2552100 +2014.10.03,10:00,42.99,43.0,42.1,42.25,2163400 +2014.10.06,10:00,42.49,42.76,42.2,42.2,2539600 +2014.10.07,10:00,42.34,42.92,41.86,42.48,3497100 +2014.10.08,10:00,42.23,42.57,41.35,41.53,5057600 +2014.10.09,10:00,42.04,42.04,40.85,40.9,2029000 +2014.10.10,10:00,40.51,40.69,39.75,40.13,3792200 +2014.10.13,10:00,40.05,40.41,39.5,39.75,2749900 +2014.10.14,10:00,37.74,40.26,37.74,39.95,2621600 +2014.10.15,10:00,39.95,41.22,39.9,40.24,4607000 +2014.10.16,10:00,40.28,41.16,39.55,39.69,3645300 +2014.10.17,10:00,39.99,40.75,39.91,40.48,2280000 +2014.10.20,10:00,40.44,40.79,39.82,40.05,2630700 +2014.10.21,10:00,40.0,40.15,39.7,39.72,1423700 +2014.10.22,10:00,39.93,40.08,38.5,38.5,4357300 +2014.10.23,10:00,37.35,38.82,36.84,37.23,6020000 +2014.10.24,10:00,37.0,37.66,36.81,37.3,2266600 +2014.10.27,10:00,37.89,38.41,37.25,37.61,4093100 +2014.10.28,10:00,37.63,38.33,37.61,38.14,3418900 +2014.10.29,10:00,38.48,38.83,37.81,38.0,3696500 +2014.10.30,10:00,37.95,38.42,37.47,38.01,3566500 +2014.10.31,10:00,38.53,38.57,37.92,38.2,4699700 +2014.11.03,10:00,38.29,38.49,38.01,38.32,1275800 +2014.11.05,10:00,38.31,39.71,37.9,39.65,6599600 +2014.11.06,10:00,39.94,42.4,39.66,41.37,14488700 +2014.11.07,10:00,41.49,41.77,40.75,41.31,7201200 +2014.11.10,10:00,41.69,43.99,41.5,43.98,8233500 +2014.11.11,10:00,44.11,45.1,43.8,44.28,10735300 +2014.11.12,10:00,44.79,44.79,43.31,43.46,5092200 +2014.11.13,10:00,43.5,43.5,41.1,41.4,8769200 +2014.11.14,10:00,41.0,42.33,40.4,41.5,9425300 +2014.11.17,10:00,41.5,41.53,40.9,41.0,2475400 +2014.11.18,10:00,40.9,41.8,40.88,41.15,4898500 +2014.11.19,10:00,41.05,41.39,39.75,39.91,3836000 +2014.11.20,10:00,39.8,42.75,39.8,42.01,7052100 +2014.11.21,10:00,42.5,43.35,42.04,42.9,6635300 +2014.11.24,10:00,42.95,43.82,41.28,41.7,4467100 +2014.11.25,10:00,41.04,45.0,41.04,42.28,3244800 +2014.11.26,10:00,42.25,42.9,41.69,41.88,3121600 +2014.11.27,10:00,40.96,42.3,40.55,41.15,3851800 +2014.11.28,10:00,40.93,41.78,40.3,41.78,5641100 +2014.12.01,10:00,41.66,42.85,40.61,41.75,6696400 +2014.12.02,10:00,41.85,42.8,41.8,41.83,6046800 +2014.12.03,10:00,41.98,42.37,40.55,40.99,4692700 +2014.12.04,10:00,41.0,41.47,40.3,40.43,4436100 +2014.12.05,10:00,40.5,40.78,38.03,38.17,7002100 +2014.12.08,10:00,38.29,39.32,36.9,37.77,5188200 +2014.12.09,10:00,37.97,37.97,35.75,37.44,5950800 +2014.12.10,10:00,37.71,39.15,37.21,38.19,8386000 +2014.12.11,10:00,38.17,38.72,36.51,37.17,7168600 +2014.12.12,10:00,36.2,37.8,36.2,37.29,4851800 +2014.12.15,10:00,37.5,38.5,35.6,35.83,4138900 +2014.12.16,10:00,35.31,35.92,26.35,29.86,24258800 +2014.12.17,10:00,30.6,31.98,29.35,30.0,9290300 +2014.12.18,10:00,30.19,34.44,30.18,31.0,18252100 +2014.12.19,10:00,31.8,32.5,30.8,32.5,7093400 +2014.12.22,10:00,32.99,35.0,32.7,33.1,12007200 +2014.12.23,10:00,33.16,34.44,32.01,33.8,9643500 +2014.12.24,10:00,34.5,34.5,32.75,33.55,2135300 +2014.12.25,10:00,33.35,34.25,33.34,33.89,1861000 +2014.12.26,10:00,33.95,34.74,33.5,33.57,2208900 +2014.12.29,10:00,33.57,33.75,32.75,32.75,2940500 +2014.12.30,10:00,32.55,32.55,30.15,32.23,2223300 +2015.01.05,10:00,31.25,33.43,31.07,33.21,982200 +2015.01.06,10:00,32.96,33.34,32.89,33.07,768000 +2015.01.08,10:00,33.44,35.18,33.2,35.17,3377000 +2015.01.09,10:00,35.24,35.77,33.54,34.0,4286300 +2015.01.12,10:00,33.55,34.66,33.1,34.45,2852900 +2015.01.13,10:00,34.4,35.19,33.84,35.0,2941300 +2015.01.14,10:00,34.0,36.6,33.91,36.55,5703800 +2015.01.15,10:00,37.0,37.85,36.57,36.65,4294500 +2015.01.16,10:00,36.75,36.8,35.8,36.05,2226200 +2015.01.19,10:00,36.47,36.74,35.97,36.34,1965700 +2015.01.20,10:00,36.31,37.28,36.31,37.2,3395600 +2015.01.21,10:00,37.3,38.5,37.17,38.1,4436500 +2015.01.22,10:00,38.45,39.55,38.1,39.55,5009100 +2015.01.23,10:00,39.55,41.7,39.55,40.15,10708300 +2015.01.26,10:00,39.8,39.8,38.14,38.26,6062300 +2015.01.27,10:00,37.0,39.0,36.6,38.0,5300300 +2015.01.28,10:00,38.2,39.29,38.02,38.11,2864800 +2015.01.29,10:00,37.89,38.3,37.1,37.3,2484900 +2015.01.30,10:00,37.6,38.25,36.87,38.25,3711900 +2015.02.02,10:00,38.62,38.75,37.25,37.34,2460800 +2015.02.03,10:00,37.53,38.0,37.32,37.55,3827700 +2015.02.04,10:00,38.0,38.2,36.95,37.09,1834400 +2015.02.05,10:00,37.4,37.95,36.12,37.75,3996300 +2015.02.06,10:00,37.78,38.43,37.55,38.0,7053800 +2015.02.09,10:00,38.0,38.42,37.15,37.6,6245300 +2015.02.10,10:00,37.53,38.37,37.31,37.83,4352900 +2015.02.11,10:00,37.85,38.4,37.57,38.0,3897600 +2015.02.12,10:00,39.14,39.8,37.62,39.39,9513100 +2015.02.13,10:00,39.8,40.8,39.5,40.4,7546700 +2015.02.16,10:00,40.7,41.39,39.61,40.41,5954700 +2015.02.17,10:00,41.5,41.86,40.12,40.15,5512800 +2015.02.18,10:00,40.55,41.15,40.25,40.98,3664300 +2015.02.19,10:00,41.09,41.09,39.31,39.93,4418200 +2015.02.20,10:00,40.05,40.48,39.74,40.0,3504100 +2015.02.24,10:00,39.12,40.1,38.1,39.6,2897300 +2015.02.25,10:00,39.75,39.82,38.63,38.99,2640800 +2015.02.26,10:00,39.61,40.28,39.24,39.5,3824500 +2015.02.27,10:00,39.6,40.59,38.8,39.19,4610500 +2015.03.02,10:00,39.22,39.92,39.22,39.5,2318300 +2015.03.03,10:00,39.63,39.9,39.05,39.89,2134100 +2015.03.04,10:00,40.14,40.14,38.43,38.55,5239000 +2015.03.05,10:00,39.11,39.11,38.15,38.47,3540800 +2015.03.06,10:00,38.47,38.96,37.0,38.96,2373000 +2015.03.10,10:00,38.97,39.0,36.65,36.65,3015300 +2015.03.11,10:00,37.0,37.85,36.65,36.65,3226600 +2015.03.12,10:00,37.5,38.83,36.9,38.45,4446700 +2015.03.13,10:00,38.45,39.56,37.09,37.18,4881000 +2015.03.16,10:00,37.11,37.33,36.41,36.5,2954800 +2015.03.17,10:00,36.62,36.81,35.01,35.01,3853600 +2015.03.18,10:00,35.2,35.72,35.03,35.1,3837200 +2015.03.19,10:00,35.55,36.3,35.0,35.0,5021600 +2015.03.20,10:00,35.3,35.45,33.5,33.5,5370500 +2015.03.23,10:00,33.98,34.9,33.8,34.0,6015200 +2015.03.24,10:00,34.2,34.88,34.0,34.24,2751200 +2015.03.25,10:00,34.21,34.5,33.51,33.6,4208400 +2015.03.26,10:00,33.97,34.29,32.12,32.5,6246200 +2015.03.27,10:00,32.94,32.94,32.4,32.7,3000500 +2015.03.30,10:00,32.84,34.15,32.72,34.04,6800900 +2015.03.31,10:00,34.36,34.62,33.3,34.0,4603200 +2015.04.01,10:00,32.1,36.15,32.1,36.14,7551800 +2015.04.02,10:00,36.32,36.88,35.75,35.76,5738200 +2015.04.03,10:00,35.95,36.59,35.42,35.76,2797500 +2015.04.06,10:00,35.93,36.5,35.42,36.5,2750200 +2015.04.07,10:00,36.6,36.73,36.11,36.6,3703700 +2015.04.08,10:00,35.49,36.5,35.49,35.75,3641900 +2015.04.09,10:00,35.8,36.15,34.9,35.1,6489500 +2015.04.10,10:00,35.31,38.0,34.55,38.0,18761000 +2015.04.13,10:00,37.98,39.0,37.13,37.13,11924600 +2015.04.14,10:00,37.28,38.09,36.9,37.7,6187500 +2015.04.15,10:00,37.7,38.97,37.7,38.5,8170000 +2015.04.16,10:00,38.79,39.45,38.5,39.16,8617200 +2015.04.17,10:00,39.35,39.4,37.69,38.28,5713500 +2015.04.20,10:00,38.27,38.45,37.51,37.75,3209200 +2015.04.21,10:00,37.95,38.0,37.32,37.72,3594300 +2015.04.22,10:00,37.74,39.3,37.56,38.99,7553100 +2015.04.23,10:00,39.0,39.24,37.96,38.65,6618400 +2015.04.24,10:00,38.65,39.4,38.07,39.2,5601800 +2015.04.27,10:00,39.25,39.85,39.22,39.33,2898400 +2015.04.28,10:00,39.23,39.5,38.59,39.0,2224700 +2015.04.29,10:00,39.01,39.7,38.92,39.5,3595200 +2015.04.30,10:00,39.44,39.59,37.67,38.15,5943300 +2015.05.05,10:00,38.38,40.79,38.31,40.2,11120500 +2015.05.06,10:00,40.02,40.58,39.81,40.41,4416500 +2015.05.07,10:00,40.14,40.53,39.91,40.02,3036700 +2015.05.08,10:00,40.0,41.15,39.13,40.7,5190900 +2015.05.12,10:00,41.0,41.36,40.36,40.5,4663400 +2015.05.13,10:00,40.85,42.1,40.64,41.49,12263500 +2015.05.14,10:00,41.87,41.87,40.5,41.09,5720200 +2015.05.15,10:00,41.07,41.5,40.45,40.61,1946200 +2015.05.18,10:00,40.73,41.08,40.14,40.52,2218200 +2015.05.19,10:00,40.21,40.5,39.34,39.9,3062100 +2015.05.20,10:00,40.5,40.63,38.53,38.85,3832600 +2015.05.21,10:00,39.0,39.51,38.69,39.28,2581200 +2015.05.22,10:00,39.38,41.29,39.3,41.2,4058000 +2015.05.25,10:00,41.1,41.74,40.71,41.1,2530300 +2015.05.26,10:00,40.74,41.35,39.93,40.23,2072700 +2015.05.27,10:00,40.36,40.97,39.93,40.4,2940400 +2015.05.28,10:00,40.65,40.92,40.3,40.75,1774200 +2015.05.29,10:00,40.78,41.24,40.35,41.1,2296900 +2015.06.01,10:00,40.86,41.23,40.5,40.53,769500 +2015.06.02,10:00,40.42,40.58,39.58,40.0,2270100 +2015.06.03,10:00,40.01,40.35,39.3,39.3,2818900 +2015.06.04,10:00,39.32,40.15,39.01,40.07,3559900 +2015.06.05,10:00,40.03,40.14,39.57,39.8,1143600 +2015.06.08,10:00,39.85,40.48,39.49,40.0,2253800 +2015.06.09,10:00,39.93,41.17,39.93,40.8,2479900 +2015.06.10,10:00,41.0,41.39,40.51,41.1,2152900 +2015.06.11,10:00,41.0,41.19,39.71,39.78,2849300 +2015.06.15,10:00,39.93,39.99,39.03,39.45,2702700 +2015.06.16,10:00,39.45,40.13,39.35,39.7,1752700 +2015.06.17,10:00,39.5,39.91,39.19,39.27,1504700 +2015.06.18,10:00,38.61,39.39,38.61,38.97,1496000 +2015.06.19,10:00,38.91,39.19,37.9,37.9,3203300 +2015.06.22,10:00,38.49,38.78,38.16,38.78,1979800 +2015.06.23,10:00,38.9,39.04,38.68,39.04,1559700 +2015.06.24,10:00,38.61,39.19,38.6,38.72,1704100 +2015.06.25,10:00,38.92,38.92,38.07,38.3,1052100 +2015.06.26,10:00,38.26,39.16,38.05,39.16,1139700 +2015.06.29,10:00,38.3,38.55,37.93,38.0,1072000 +2015.06.30,10:00,38.05,38.29,37.81,38.24,1004000 +2015.07.01,10:00,38.14,38.34,37.25,37.3,3180100 +2015.07.02,10:00,37.39,37.47,36.82,37.0,1775900 +2015.07.03,10:00,37.06,37.3,36.7,37.05,1418600 +2015.07.06,10:00,36.63,36.98,36.35,36.67,1389600 +2015.07.07,10:00,36.51,36.98,36.5,36.81,1733000 +2015.07.08,10:00,36.61,38.45,36.01,38.0,3761100 +2015.07.09,10:00,38.0,38.68,37.6,38.05,2589700 +2015.07.10,10:00,38.41,38.45,37.8,38.07,2053500 +2015.07.13,10:00,38.1,38.39,38.02,38.1,1317500 +2015.07.14,10:00,38.1,39.14,38.02,38.94,3221600 +2015.07.15,10:00,38.81,39.34,38.65,38.96,1485000 +2015.07.16,10:00,39.2,39.86,39.01,39.55,1529600 +2015.07.17,10:00,39.75,39.92,39.47,39.55,1168000 +2015.07.20,10:00,39.45,39.5,38.52,38.82,1743800 +2015.07.21,10:00,38.55,39.3,38.55,39.1,1397200 +2015.07.22,10:00,39.18,39.19,38.8,39.0,1346400 +2015.07.23,10:00,39.02,39.36,39.02,39.33,1315500 +2015.07.24,10:00,39.32,39.33,38.85,39.13,2299700 +2015.07.27,10:00,39.13,39.22,38.3,38.6,1359000 +2015.07.28,10:00,38.6,39.0,38.09,38.12,1622300 +2015.07.29,10:00,38.12,39.19,37.85,38.97,2587400 +2015.07.30,10:00,39.08,39.56,38.61,39.22,3580200 +2015.07.31,10:00,39.0,39.48,39.0,39.35,1790600 +2015.08.03,10:00,39.3,39.98,38.75,39.3,2669500 +2015.08.04,10:00,39.3,39.45,39.05,39.3,1364800 +2015.08.05,10:00,39.1,40.5,38.88,40.5,4233000 +2015.08.06,10:00,40.49,41.05,39.9,39.9,2971900 +2015.08.07,10:00,40.06,40.86,40.01,40.52,1385500 +2015.08.10,10:00,40.38,40.65,40.12,40.23,1351000 +2015.08.11,10:00,40.23,40.78,40.0,40.19,979100 +2015.08.12,10:00,40.19,40.24,39.76,40.18,650100 +2015.08.13,10:00,40.25,40.51,39.96,40.09,930700 +2015.08.14,10:00,40.01,40.18,31.93,39.87,1023200 +2015.08.17,10:00,40.08,40.1,39.71,39.8,654200 +2015.08.18,10:00,39.72,40.0,39.55,39.95,599800 +2015.08.19,10:00,40.0,40.1,39.73,39.9,574700 +2015.08.20,10:00,39.9,39.98,39.3,39.8,1171900 +2015.08.21,10:00,39.3,39.79,38.57,39.0,1649100 +2015.08.24,10:00,37.7,38.85,37.36,37.73,2748300 +2015.08.25,10:00,37.72,39.2,37.72,38.74,2459200 +2015.08.26,10:00,39.39,39.39,38.3,38.95,611400 +2015.08.27,10:00,39.18,39.36,38.58,38.8,1191500 +2015.08.28,10:00,39.17,39.17,38.36,39.04,1970300 +2015.08.31,10:00,38.96,40.45,38.6,40.0,3825400 +2015.09.01,10:00,40.15,40.35,37.51,37.7,16003600 +2015.09.02,10:00,37.77,38.4,35.38,36.27,28898900 +2015.09.03,10:00,36.2,36.7,35.25,35.7,11654400 +2015.09.04,10:00,35.69,35.9,34.7,34.85,14437900 +2015.09.07,10:00,35.0,35.35,33.75,34.1,13819900 +2015.09.08,10:00,33.98,34.23,32.87,33.51,19184100 +2015.09.09,10:00,33.9,35.04,33.4,34.97,21559700 +2015.09.10,10:00,34.9,35.88,34.65,35.66,11211100 +2015.09.11,10:00,35.6,35.83,35.4,35.55,3356300 +2015.09.14,10:00,35.6,36.25,35.5,36.25,6298700 +2015.09.15,10:00,36.25,36.3,35.82,36.2,3351900 +2015.09.16,10:00,36.3,36.68,35.97,36.15,4809800 +2015.09.17,10:00,36.24,36.24,35.53,35.83,5856300 +2015.09.18,10:00,35.8,36.53,35.14,36.53,4146100 +2015.09.21,10:00,35.97,36.28,35.38,35.95,2428100 +2015.09.22,10:00,35.91,35.93,35.2,35.51,1802400 +2015.09.23,10:00,35.24,35.79,35.2,35.31,1337500 +2015.09.24,10:00,35.45,35.63,34.41,34.67,3016300 +2015.09.25,10:00,34.71,35.7,34.71,35.33,2623600 +2015.09.28,10:00,35.11,35.26,34.53,34.53,1610200 +2015.09.29,10:00,34.53,34.73,33.85,34.6,3018900 +2015.09.30,10:00,34.75,36.1,34.45,35.23,5084800 +2015.10.01,10:00,35.5,36.25,35.17,36.1,16219200 +2015.10.02,10:00,37.5,39.4,37.04,38.8,38901500 +2015.10.05,10:00,39.2,39.75,38.03,38.92,9020900 +2015.10.06,10:00,39.15,39.78,38.55,39.43,5741000 +2015.10.07,10:00,39.12,40.86,39.1,40.8,13543800 +2015.10.08,10:00,40.68,41.75,40.56,41.6,8006000 +2015.10.09,10:00,41.6,44.15,41.19,43.31,12940100 +2015.10.12,10:00,43.4,44.71,42.54,44.42,14112900 +2015.10.13,10:00,44.4,45.18,43.67,44.9,14025500 +2015.10.14,10:00,44.78,48.38,44.3,47.39,23614600 +2015.10.15,10:00,47.5,49.6,47.5,49.0,14375100 +2015.10.16,10:00,49.49,50.19,48.13,48.9,15577300 +2015.10.19,10:00,48.8,49.0,46.76,48.11,9010600 +2015.10.20,10:00,48.3,50.0,47.82,49.31,12451100 +2015.10.21,10:00,47.5,47.87,45.56,47.8,17558000 +2015.10.22,10:00,47.96,49.5,47.96,49.23,8704000 +2015.10.23,10:00,49.67,49.83,47.71,48.26,5177100 +2015.10.26,10:00,48.5,49.15,47.25,48.07,4779000 +2015.10.27,10:00,48.27,48.7,46.15,47.23,8734800 +2015.10.28,10:00,46.57,47.7,46.25,47.52,3208200 +2015.10.29,10:00,47.45,47.49,46.46,47.44,2913100 +2015.10.30,10:00,47.0,49.17,46.52,49.0,3687500 +2015.11.02,10:00,48.91,49.8,48.01,49.3,3513200 +2015.11.03,10:00,49.89,53.5,49.75,52.52,28269500 +2015.11.05,10:00,52.6,53.35,51.25,51.96,5271500 +2015.11.06,10:00,51.5,52.73,50.55,51.94,3929400 +2015.11.09,10:00,51.77,52.9,51.76,52.41,2744000 +2015.11.10,10:00,52.09,52.63,51.66,51.84,2475900 +2015.11.11,10:00,51.84,54.39,51.25,53.53,12179500 +2015.11.12,10:00,53.65,54.09,52.6,53.47,3381700 +2015.11.13,10:00,53.45,54.14,52.81,53.39,2897400 +2015.11.16,10:00,52.8,53.64,51.17,52.3,5620200 +2015.11.17,10:00,52.6,55.4,52.2,54.9,7596500 +2015.11.18,10:00,54.95,57.57,54.6,57.09,8527300 +2015.11.19,10:00,57.4,58.5,56.0,56.45,7335300 +2015.11.20,10:00,56.03,57.86,55.35,57.86,5757300 +2015.11.23,10:00,57.77,58.66,57.12,57.52,4631200 +2015.11.24,10:00,57.88,58.77,52.5,55.77,8762400 +2015.11.25,10:00,55.1,57.3,55.1,56.67,4020200 +2015.11.26,10:00,56.7,57.42,54.45,55.12,3601500 +2015.11.27,10:00,55.12,55.9,54.06,55.42,2589300 +2015.11.30,10:00,55.25,58.91,55.25,58.91,9329200 +2015.12.01,10:00,58.79,61.85,58.05,61.0,16025900 +2015.12.02,10:00,61.0,61.65,56.71,57.6,14787500 +2015.12.03,10:00,57.5,57.85,56.0,56.51,6776600 +2015.12.04,10:00,56.7,57.93,56.1,57.33,5203100 +2015.12.07,10:00,57.3,59.1,56.63,59.0,5631000 +2015.12.08,10:00,58.7,59.59,56.82,56.91,4675600 +2015.12.09,10:00,57.1,59.3,57.02,58.4,4664400 +2015.12.10,10:00,58.79,59.86,57.89,59.84,4061600 +2015.12.11,10:00,59.71,60.74,57.3,58.5,8261500 +2015.12.14,10:00,58.08,58.4,57.11,58.0,2834500 +2015.12.15,10:00,58.08,59.14,47.77,57.2,6647100 +2015.12.16,10:00,57.2,57.97,56.15,56.45,2421500 +2015.12.17,10:00,56.47,57.93,56.13,57.15,4060600 +2015.12.18,10:00,56.83,57.69,56.15,56.51,2460600 +2015.12.21,10:00,56.82,57.58,56.63,56.9,2318500 +2015.12.22,10:00,57.45,57.5,56.4,57.5,1944400 +2015.12.23,10:00,57.69,58.43,57.0,57.01,2222900 +2015.12.24,10:00,57.3,57.47,56.52,56.8,663300 +2015.12.25,10:00,56.8,57.21,56.31,56.74,630700 +2015.12.28,10:00,56.61,56.87,55.25,56.29,1531100 +2015.12.29,10:00,56.16,56.42,55.55,56.11,734400 +2015.12.30,10:00,55.97,56.37,55.85,56.1,1041100 +2016.01.04,10:00,55.98,56.41,55.47,56.2,933200 +2016.01.05,10:00,55.7,56.32,54.45,54.45,3146900 +2016.01.06,10:00,54.5,54.57,53.24,54.05,3016000 +2016.01.11,10:00,53.4,53.41,51.52,52.06,2739500 +2016.01.12,10:00,51.96,53.3,51.0,53.25,2957000 +2016.01.13,10:00,53.12,55.32,53.12,55.0,4632600 +2016.01.14,10:00,54.57,54.87,52.82,53.6,3081100 +2016.01.15,10:00,53.4,54.75,51.0,51.98,3862200 +2016.01.18,10:00,51.31,52.28,50.2,50.4,3533200 +2016.01.19,10:00,51.0,53.1,50.94,52.06,4058400 +2016.01.20,10:00,51.85,52.32,50.73,52.0,2137600 +2016.01.21,10:00,52.44,53.0,50.79,50.99,4067200 +2016.01.22,10:00,52.3,52.87,51.21,52.03,4818200 +2016.01.25,10:00,52.6,52.67,50.8,51.1,4227100 +2016.01.26,10:00,50.9,51.48,50.54,51.28,2005500 +2016.01.27,10:00,51.49,51.6,50.6,50.99,3620000 +2016.01.28,10:00,51.0,51.43,50.08,50.89,6588200 +2016.01.29,10:00,51.2,51.2,50.27,50.5,2664000 +2016.02.01,10:00,50.95,55.24,50.72,54.77,20490500 +2016.02.02,10:00,54.4,55.89,53.15,54.1,7932300 +2016.02.03,10:00,54.0,55.25,53.29,53.84,3796100 +2016.02.04,10:00,54.1,55.05,53.85,54.89,3864700 +2016.02.05,10:00,54.7,57.3,54.53,57.3,6567000 +2016.02.08,10:00,57.3,58.65,56.0,57.35,5878800 +2016.02.09,10:00,57.5,57.93,55.2,56.66,5789200 +2016.02.10,10:00,56.5,56.8,55.02,55.8,3214200 +2016.02.11,10:00,55.52,56.0,52.82,53.64,5647300 +2016.02.12,10:00,53.9,54.82,53.75,54.41,4201600 +2016.02.15,10:00,54.94,55.64,53.84,53.88,2984600 +2016.02.16,10:00,54.5,54.96,53.85,54.13,2395600 +2016.02.17,10:00,54.4,54.89,53.59,53.59,2451900 +2016.02.18,10:00,54.3,54.8,53.7,54.15,2548700 +2016.02.19,10:00,54.15,54.27,53.04,53.32,2293300 +2016.02.20,10:00,53.4,53.5,53.23,53.4,408000 +2016.02.22,10:00,53.69,54.8,53.4,54.8,2511300 +2016.02.24,10:00,54.07,54.4,53.51,53.7,1718700 +2016.02.25,10:00,53.89,54.39,53.1,54.05,2492800 +2016.02.26,10:00,54.33,55.8,54.09,55.35,5167900 +2016.02.29,10:00,55.45,57.69,54.81,57.1,7224100 +2016.03.01,10:00,57.2,61.37,57.1,61.19,18209000 +2016.03.02,10:00,61.8,62.99,60.7,61.1,12155500 +2016.03.03,10:00,61.16,62.17,60.61,61.61,5612100 +2016.03.04,10:00,61.77,65.6,61.72,65.49,11526400 +2016.03.07,10:00,66.15,68.46,65.09,65.94,10338200 +2016.03.09,10:00,65.8,66.96,62.45,62.45,13521700 +2016.03.10,10:00,62.6,64.62,62.6,63.77,10657900 +2016.03.11,10:00,65.0,66.21,63.7,64.77,9131300 +2016.03.14,10:00,65.0,65.61,63.01,65.55,5170600 +2016.03.15,10:00,65.48,67.5,65.48,66.3,8512500 +2016.03.16,10:00,66.97,69.98,66.4,69.98,12406500 +2016.03.17,10:00,70.0,72.0,69.33,70.19,7442700 +2016.03.18,10:00,70.78,71.49,69.4,70.51,5921000 +2016.03.21,10:00,70.71,74.17,70.12,73.53,10993300 +2016.03.22,10:00,74.1,74.85,72.08,73.69,10563400 +2016.03.23,10:00,73.14,73.95,72.7,72.94,4275400 +2016.03.24,10:00,72.9,73.76,71.54,73.76,4230900 +2016.03.25,10:00,74.1,74.8,72.75,73.21,2138700 +2016.03.28,10:00,73.6,73.79,72.25,72.56,1557000 +2016.03.29,10:00,72.75,74.14,72.01,73.69,4476200 +2016.03.30,10:00,74.16,74.27,73.05,74.1,2597900 +2016.03.31,10:00,74.1,74.5,73.31,74.48,3746800 +2016.04.01,10:00,74.25,76.32,73.72,74.55,5759200 +2016.04.04,10:00,74.89,75.59,74.47,74.65,2515400 +2016.04.05,10:00,74.65,75.47,73.11,75.4,4655200 +2016.04.06,10:00,75.3,79.99,75.27,79.14,10102200 +2016.04.07,10:00,78.85,79.91,76.89,78.0,4634900 +2016.04.08,10:00,78.0,80.0,77.55,79.0,6268100 +2016.04.11,10:00,78.93,82.44,78.93,82.2,6317000 +2016.04.12,10:00,82.2,83.71,77.69,79.32,11659200 +2016.04.13,10:00,79.55,80.26,77.83,78.55,3917300 +2016.04.14,10:00,78.41,79.19,77.01,78.63,3640200 +2016.04.15,10:00,77.84,79.5,77.61,78.0,2911800 +2016.04.18,10:00,77.08,77.92,76.21,76.68,3376400 +2016.04.19,10:00,77.1,80.48,77.1,77.62,4745700 +2016.04.20,10:00,77.7,78.64,76.7,77.26,6024300 +2016.04.21,10:00,78.0,78.84,74.2,74.8,4865300 +2016.04.22,10:00,75.15,78.28,75.05,78.21,6805900 +2016.04.25,10:00,78.59,78.59,76.11,76.28,3387200 +2016.04.26,10:00,76.28,76.59,75.16,75.16,5897500 +2016.04.27,10:00,75.3,76.53,74.8,75.0,4171600 +2016.04.28,10:00,75.3,76.19,74.96,76.04,2438500 +2016.04.29,10:00,76.18,77.48,75.94,77.48,3884000 +2016.05.04,10:00,77.0,77.87,76.1,76.89,4447900 +2016.05.05,10:00,77.74,78.5,77.25,78.4,3164400 +2016.05.06,10:00,78.37,79.37,77.55,78.5,2882200 +2016.05.10,10:00,78.27,80.68,78.11,79.87,5603900 +2016.05.11,10:00,79.45,80.75,78.78,78.9,4200000 +2016.05.12,10:00,79.2,81.38,78.77,81.0,3310700 +2016.05.13,10:00,80.6,81.34,80.02,80.51,3772400 +2016.05.16,10:00,80.63,82.05,80.52,81.8,2253200 +2016.05.17,10:00,82.2,82.41,79.8,80.56,3726000 +2016.05.18,10:00,80.7,80.78,78.0,78.69,4878500 +2016.05.19,10:00,78.0,79.67,77.32,78.1,3225900 +2016.05.20,10:00,78.05,79.5,77.69,78.8,2880900 +2016.05.23,10:00,78.5,81.72,78.38,81.18,3068300 +2016.05.24,10:00,81.0,81.7,80.35,81.5,3407300 +2016.05.25,10:00,81.1,82.24,80.5,80.6,2150900 +2016.05.26,10:00,80.7,82.94,80.7,82.68,3768600 +2016.05.27,10:00,82.95,83.0,80.64,81.0,3994700 +2016.05.30,10:00,81.71,81.96,80.84,81.01,1154300 +2016.05.31,10:00,81.03,82.58,80.8,81.7,2632100 +2016.06.01,10:00,82.49,85.54,81.36,83.0,6489500 +2016.06.02,10:00,82.98,84.62,82.98,84.4,1730100 +2016.06.03,10:00,84.69,88.47,84.41,88.2,7622900 +2016.06.06,10:00,88.47,90.72,86.85,87.92,3802800 +2016.06.07,10:00,88.04,88.36,84.35,86.53,5306700 +2016.06.08,10:00,86.51,88.8,83.11,84.04,5887300 +2016.06.09,10:00,84.79,86.25,83.75,85.0,2240900 +2016.06.10,10:00,84.61,84.86,83.25,83.92,1297200 +2016.06.14,10:00,82.92,84.99,82.47,83.99,3033800 +2016.06.15,10:00,83.85,85.93,83.72,84.47,3214900 +2016.06.16,10:00,84.76,87.69,84.21,87.0,3480200 +2016.06.17,10:00,87.0,87.8,84.7,84.7,2750800 +2016.06.20,10:00,85.0,86.4,85.0,85.9,2113100 +2016.06.21,10:00,85.8,86.12,83.45,83.52,2118700 +2016.06.22,10:00,84.3,85.99,83.0,84.17,3346200 +2016.06.23,10:00,84.9,85.78,83.29,85.7,2312000 +2016.06.24,10:00,83.85,84.76,81.3,83.42,3229400 +2016.06.27,10:00,83.45,84.6,79.52,83.0,3956000 +2016.06.28,10:00,83.24,83.55,80.43,81.2,2906800 +2016.06.29,10:00,81.04,83.42,80.52,83.41,2739700 +2016.06.30,10:00,83.42,85.94,82.57,85.5,3750400 +2016.07.01,10:00,85.49,87.18,84.32,86.01,1620700 +2016.07.04,10:00,86.24,87.41,84.9,85.17,1705200 +2016.07.05,10:00,85.11,86.5,84.92,86.48,1313200 +2016.07.06,10:00,86.5,86.97,85.12,86.45,1846100 +2016.07.07,10:00,86.5,87.44,86.28,87.44,1232000 +2016.07.08,10:00,86.79,89.78,86.06,89.0,2849600 +2016.07.11,10:00,89.0,89.98,87.17,87.73,3286100 +2016.07.12,10:00,87.88,89.79,87.62,89.79,1352500 +2016.07.13,10:00,89.01,90.47,89.0,90.46,2429600 +2016.07.14,10:00,90.88,91.37,87.78,87.78,2834500 +2016.07.15,10:00,87.78,88.11,86.34,87.18,4944400 +2016.07.18,10:00,88.27,88.48,86.81,86.9,2215300 +2016.07.19,10:00,87.75,88.38,86.39,87.58,3004400 +2016.07.20,10:00,86.8,88.33,86.8,86.86,2583200 +2016.07.21,10:00,87.5,87.91,84.8,85.2,4179900 +2016.07.22,10:00,85.22,87.4,85.0,86.88,2457900 +2016.07.25,10:00,87.5,87.74,85.91,86.6,3373800 +2016.07.26,10:00,87.0,87.15,86.1,86.1,2471600 +2016.07.27,10:00,86.2,86.5,85.1,85.4,3799400 +2016.07.28,10:00,86.1,87.08,85.5,86.08,2159100 +2016.07.29,10:00,86.19,86.98,84.51,85.7,4517400 +2016.08.01,10:00,85.75,86.9,85.62,86.25,973200 +2016.08.02,10:00,86.05,86.61,85.27,86.0,1570700 +2016.08.03,10:00,86.04,86.76,85.02,86.5,1225400 +2016.08.04,10:00,86.37,87.04,85.57,86.55,2514600 +2016.08.05,10:00,86.72,87.15,86.02,87.0,1708500 +2016.08.08,10:00,87.2,87.83,85.05,86.0,2979500 +2016.08.09,10:00,86.0,86.23,85.3,86.0,1440800 +2016.08.10,10:00,86.4,86.4,85.2,85.45,2174200 +2016.08.11,10:00,85.4,86.1,85.2,85.5,810000 +2016.08.12,10:00,85.99,86.35,85.6,85.79,1212800 +2016.08.15,10:00,86.0,86.17,85.04,85.25,1136900 +2016.08.16,10:00,85.12,85.42,83.54,83.6,2248400 +2016.08.17,10:00,83.59,84.0,81.15,82.37,3333700 +2016.08.18,10:00,82.52,83.6,81.86,83.39,2462300 +2016.08.19,10:00,83.44,83.58,82.3,83.25,961900 +2016.08.22,10:00,83.25,83.25,82.3,82.95,1097400 +2016.08.23,10:00,83.4,86.1,82.76,85.18,5298500 +2016.08.24,10:00,85.01,88.99,85.01,88.23,6123800 +2016.08.25,10:00,88.4,90.99,87.66,90.99,3623500 +2016.08.26,10:00,90.99,94.43,90.99,94.0,5744000 +2016.08.29,10:00,94.0,95.0,91.8,94.2,4861100 +2016.08.30,10:00,94.78,100.0,94.65,99.0,12227700 +2016.08.31,10:00,99.0,101.0,98.25,98.65,5308200 +2016.09.01,10:00,98.9,100.4,98.66,100.27,3434000 +2016.09.02,10:00,100.76,101.98,99.61,101.95,3485900 +2016.09.05,10:00,102.56,104.78,102.22,104.7,2304600 +2016.09.06,10:00,105.0,105.0,102.66,103.97,2727300 +2016.09.07,10:00,104.0,108.18,103.41,107.35,5458900 +2016.09.08,10:00,107.57,109.79,104.83,105.98,3666800 +2016.09.09,10:00,106.09,106.46,102.83,103.8,2722400 +2016.09.12,10:00,103.6,106.2,102.08,106.0,1693400 +2016.09.13,10:00,106.12,107.05,104.0,104.03,1129300 +2016.09.14,10:00,104.03,105.64,101.39,103.07,2507600 +2016.09.15,10:00,103.48,106.06,102.65,104.51,2128900 +2016.09.16,10:00,105.65,105.65,103.08,104.2,1411000 +2016.09.19,10:00,104.95,108.2,104.31,107.53,1995900 +2016.09.20,10:00,107.08,108.95,106.0,108.09,1533700 +2016.09.21,10:00,108.2,112.1,108.2,111.5,5183400 +2016.09.22,10:00,112.25,115.0,111.2,113.0,7250000 +2016.09.23,10:00,112.8,115.74,112.61,114.25,4043400 +2016.09.26,10:00,114.5,117.35,112.65,117.0,4135700 +2016.09.27,10:00,116.89,118.65,116.3,117.0,4304700 +2016.09.28,10:00,117.0,117.58,114.21,116.0,5171000 +2016.09.29,10:00,117.0,118.93,115.27,117.49,6845600 +2016.09.30,10:00,117.2,119.0,116.14,116.93,5586800 +2016.10.03,10:00,116.94,119.56,116.23,119.2,3214000 +2016.10.04,10:00,119.0,122.4,118.46,122.4,4086400 +2016.10.05,10:00,123.0,125.5,120.08,121.2,6440200 +2016.10.06,10:00,120.62,123.13,120.0,122.0,3474200 +2016.10.07,10:00,121.98,122.22,118.5,118.77,3403000 +2016.10.10,10:00,118.77,119.2,115.6,115.8,3275500 +2016.10.11,10:00,115.52,122.0,115.52,121.9,5570100 +2016.10.12,10:00,122.0,122.42,118.75,119.4,5335100 +2016.10.13,10:00,119.9,120.36,116.0,116.45,4393500 +2016.10.14,10:00,116.9,118.3,114.5,116.0,5576300 +2016.10.17,10:00,115.55,119.05,115.34,118.92,4763000 +2016.10.18,10:00,119.5,120.32,116.2,118.07,4001800 +2016.10.19,10:00,118.89,120.29,117.69,120.22,3125100 +2016.10.20,10:00,120.03,124.78,119.27,124.0,5091900 +2016.10.21,10:00,123.64,127.05,122.9,126.69,4653800 +2016.10.24,10:00,127.0,130.84,125.7,129.99,4439200 +2016.10.25,10:00,130.0,131.5,127.25,128.67,4145700 +2016.10.26,10:00,128.36,130.98,127.77,128.12,4524000 +2016.10.27,10:00,128.05,129.3,125.1,126.0,3741900 +2016.10.28,10:00,126.0,130.0,125.05,129.19,2896300 +2016.10.31,10:00,130.38,130.6,127.53,129.95,2798100 +2016.11.01,10:00,130.6,135.33,128.8,134.04,5431200 +2016.11.02,10:00,134.0,136.57,130.01,135.3,10101800 +2016.11.03,10:00,134.54,136.9,130.85,130.85,4042600 +2016.11.07,10:00,130.71,133.1,127.1,128.0,3905300 +2016.11.08,10:00,128.0,128.99,125.1,125.15,3558600 +2016.11.09,10:00,122.7,130.16,121.75,129.1,4971500 +2016.11.10,10:00,129.92,130.88,127.3,128.9,6062800 +2016.11.11,10:00,128.82,131.0,125.87,129.6,5754100 +2016.11.14,10:00,130.0,132.45,127.26,129.5,3531600 +2016.11.15,10:00,129.0,130.65,128.62,130.0,1810700 +2016.11.16,10:00,129.49,130.3,129.04,129.99,1166700 +2016.11.17,10:00,129.9,130.19,128.04,128.8,2864100 +2016.11.18,10:00,128.16,129.91,127.66,129.91,1053100 +2016.11.21,10:00,130.94,131.2,129.55,130.19,1479500 +2016.11.22,10:00,130.89,130.89,129.2,129.2,1601600 +2016.11.23,10:00,129.72,132.29,129.13,130.86,4364000 +2016.11.24,10:00,130.66,132.97,130.13,130.86,3148700 +2016.11.25,10:00,131.68,131.79,129.35,130.0,2052700 +2016.11.28,10:00,130.49,132.2,129.5,130.16,3464500 +2016.11.29,10:00,130.15,133.5,130.01,131.74,3781700 +2016.11.30,10:00,132.98,141.9,132.31,134.83,17722100 +2016.12.01,10:00,135.99,138.36,135.05,135.7,5719800 +2016.12.02,10:00,135.7,136.7,134.61,135.9,2387700 +2016.12.05,10:00,136.46,139.9,135.0,139.0,4020200 +2016.12.06,10:00,139.51,141.0,137.74,139.5,4199200 +2016.12.07,10:00,139.5,143.85,138.39,141.9,8697600 +2016.12.08,10:00,142.7,146.58,142.13,146.58,4584400 +2016.12.09,10:00,146.0,149.2,145.95,147.68,5235900 +2016.12.12,10:00,153.0,154.9,148.53,150.2,8740400 +2016.12.13,10:00,149.05,152.74,148.47,152.6,6129000 +2016.12.14,10:00,150.6,153.74,146.1,146.2,6970800 +2016.12.15,10:00,146.89,151.43,146.36,150.51,4787100 +2016.12.16,10:00,150.4,153.88,149.63,149.8,4656600 +2016.12.19,10:00,150.2,152.19,148.82,148.82,2034100 +2016.12.20,10:00,149.3,158.24,147.22,157.84,7771000 +2016.12.21,10:00,157.41,162.09,157.02,158.36,4965400 +2016.12.22,10:00,158.5,159.76,155.59,155.63,1909200 +2016.12.23,10:00,155.31,158.0,152.65,153.3,3055900 +2016.12.26,10:00,153.4,156.36,151.56,153.8,1598300 +2016.12.27,10:00,155.0,155.23,151.77,152.99,1665300 +2016.12.28,10:00,153.45,154.11,150.9,152.98,2167600 +2016.12.29,10:00,152.51,153.44,151.05,152.0,1999500 +2016.12.30,10:00,152.02,153.71,152.01,152.85,1561900 +2017.01.03,10:00,153.98,157.95,151.33,151.68,3548200 +2017.01.04,10:00,152.87,153.27,148.01,148.4,4469800 +2017.01.05,10:00,149.02,150.04,148.01,148.01,3250500 +2017.01.06,10:00,148.21,148.69,146.16,146.31,2184900 +2017.01.09,10:00,147.02,149.7,143.03,143.13,4593900 +2017.01.10,10:00,143.21,148.64,140.0,148.07,4136100 +2017.01.11,10:00,148.07,150.48,145.23,147.03,5031900 +2017.01.12,10:00,147.5,157.91,145.71,157.91,8190600 +2017.01.13,10:00,157.23,161.6,154.78,156.9,8317800 +2017.01.16,10:00,157.3,160.45,155.22,159.01,4908800 +2017.01.17,10:00,159.77,160.0,156.56,158.63,3328900 +2017.01.18,10:00,159.3,164.95,158.29,163.54,6540600 +2017.01.19,10:00,163.0,164.33,158.72,160.85,4848400 +2017.01.20,10:00,160.0,162.83,158.02,160.5,3319700 +2017.01.23,10:00,160.5,161.36,158.71,160.2,1791900 +2017.01.24,10:00,159.02,161.65,159.02,161.4,2681900 +2017.01.25,10:00,161.3,166.93,160.96,166.71,5197600 +2017.01.26,10:00,166.61,169.13,165.09,165.5,3444000 +2017.01.27,10:00,165.5,168.5,165.05,168.5,3310700 +2017.01.30,10:00,168.5,172.0,167.31,170.9,3782400 +2017.01.31,10:00,171.3,174.17,171.0,174.17,2981700 +2017.02.01,10:00,174.15,175.4,171.55,175.0,2754000 +2017.02.02,10:00,175.25,178.1,174.45,176.9,3607000 +2017.02.03,10:00,177.1,179.5,173.15,178.5,5301600 +2017.02.06,10:00,178.55,179.8,175.6,179.0,3018100 +2017.02.07,10:00,177.2,177.6,170.25,173.5,6429900 +2017.02.08,10:00,172.35,173.85,170.75,172.0,3395100 +2017.02.09,10:00,172.85,178.5,172.0,178.5,3824300 +2017.02.10,10:00,178.15,179.9,176.65,179.5,2857900 +2017.02.13,10:00,178.5,180.0,176.25,177.4,1809800 +2017.02.14,10:00,177.45,179.5,173.75,175.2,2543900 +2017.02.15,10:00,173.15,174.95,171.1,172.85,3881500 +2017.02.16,10:00,172.05,173.75,171.0,171.2,2379000 +2017.02.17,10:00,172.45,175.0,171.35,173.1,3088200 +2017.02.20,10:00,173.2,174.25,171.0,171.25,1212000 +2017.02.21,10:00,171.0,172.6,167.05,170.9,2088200 +2017.02.22,10:00,171.55,171.6,168.0,168.25,2090300 +2017.02.24,10:00,169.0,169.2,165.25,167.0,1883700 +2017.02.27,10:00,167.0,168.25,163.0,165.05,2714000 +2017.02.28,10:00,165.4,167.0,160.5,165.2,4110000 +2017.03.01,10:00,166.4,177.4,165.45,177.35,5307300 +2017.03.02,10:00,177.2,181.9,172.05,174.0,11575800 +2017.03.03,10:00,173.9,174.0,168.85,168.85,6497300 +2017.03.06,10:00,169.05,172.0,166.8,167.1,2132400 +2017.03.07,10:00,167.3,167.8,159.3,161.15,4787200 +2017.03.09,10:00,162.0,162.65,151.05,152.65,7358500 +2017.03.10,10:00,153.5,155.65,148.4,149.2,5046700 +2017.03.13,10:00,149.45,157.6,146.35,157.4,4927500 +2017.03.14,10:00,157.6,159.3,153.3,154.6,3645200 +2017.03.15,10:00,155.95,156.75,152.7,153.1,3288600 +2017.03.16,10:00,154.2,159.95,154.2,159.4,5627900 +2017.03.17,10:00,158.3,162.25,158.0,161.55,4112400 +2017.03.20,10:00,161.35,161.95,157.55,159.3,1924500 +2017.03.21,10:00,159.95,161.55,158.55,159.0,1842600 +2017.03.22,10:00,158.1,165.25,157.0,164.25,4081200 +2017.03.23,10:00,165.0,167.3,162.15,165.45,3059400 +2017.03.24,10:00,167.0,169.4,164.7,167.6,1630800 +2017.03.27,10:00,167.0,167.0,163.45,165.0,2364600 +2017.03.28,10:00,165.0,167.2,164.7,165.65,1273400 +2017.03.29,10:00,166.9,168.8,166.25,166.25,1435000 +2017.03.30,10:00,167.5,169.4,166.5,168.8,1578200 +2017.03.31,10:00,169.25,171.0,167.6,168.0,3229400 +2017.04.03,10:00,168.5,170.6,167.15,168.3,2557900 +2017.04.04,10:00,168.85,169.95,168.2,168.7,1669000 +2017.04.05,10:00,169.2,174.95,169.2,174.95,2959200 +2017.04.06,10:00,174.55,177.8,174.15,177.5,2826100 +2017.04.07,10:00,176.05,176.3,170.4,171.9,3857800 +2017.04.10,10:00,170.1,171.0,163.05,163.55,4829100 +2017.04.11,10:00,162.25,169.3,160.75,166.35,3064500 +2017.04.12,10:00,168.25,169.05,162.5,164.2,4142800 +2017.04.13,10:00,165.2,167.6,160.1,166.3,4612600 +2017.04.14,10:00,166.3,166.65,161.7,161.75,1111500 +2017.04.17,10:00,161.3,163.85,160.3,163.8,2732400 +2017.04.18,10:00,163.8,166.8,161.35,163.05,2572000 +2017.04.19,10:00,163.75,164.75,161.5,162.05,1598200 +2017.04.20,10:00,162.05,164.3,161.55,163.5,1831400 +2017.04.21,10:00,164.0,168.2,164.0,167.35,1698300 +2017.04.24,10:00,168.35,171.85,168.35,171.85,1839400 +2017.04.25,10:00,172.1,176.45,171.05,176.45,2083200 +2017.04.26,10:00,177.0,179.95,175.85,179.95,3969000 +2017.04.27,10:00,179.3,179.4,173.6,175.85,3381300 +2017.04.28,10:00,177.0,178.9,175.45,175.75,2419700 +2017.05.02,10:00,175.3,184.4,175.3,180.0,5168300 +2017.05.03,10:00,179.0,182.3,178.1,181.25,2684300 +2017.05.04,10:00,181.25,185.45,179.05,183.15,4264900 +2017.05.05,10:00,181.95,188.95,180.25,187.6,4032700 +2017.05.10,10:00,187.8,191.2,185.6,189.8,4362600 +2017.05.11,10:00,189.5,191.0,186.6,187.5,2692900 +2017.05.12,10:00,187.5,190.4,183.1,184.15,4828200 +2017.05.15,10:00,186.05,187.15,180.35,181.9,2686000 +2017.05.16,10:00,182.0,185.7,181.15,184.4,2125700 +2017.05.17,10:00,184.0,187.45,183.55,186.0,3673700 +2017.05.18,10:00,185.5,189.3,185.5,189.3,4088600 +2017.05.19,10:00,189.8,193.0,186.0,189.1,5874300 +2017.05.22,10:00,190.0,190.8,182.3,190.3,3726100 +2017.05.23,10:00,187.7,195.25,187.7,195.0,3883400 +2017.05.24,10:00,194.95,196.1,192.2,193.8,2198500 +2017.05.25,10:00,194.05,196.2,193.0,195.15,1646200 +2017.05.26,10:00,195.85,197.1,189.4,190.1,4159700 +2017.05.29,10:00,190.05,190.05,184.45,189.5,2868100 +2017.05.30,10:00,189.85,193.3,187.0,191.05,2479800 +2017.05.31,10:00,191.25,191.25,185.95,188.6,4548000 +2017.06.01,10:00,187.5,189.85,186.0,188.2,1989000 +2017.06.02,10:00,188.7,194.0,185.2,185.8,3282200 +2017.06.05,10:00,185.95,190.35,185.85,189.05,2250100 +2017.06.06,10:00,188.95,190.3,187.35,190.0,1609000 +2017.06.07,10:00,189.15,191.25,187.15,189.0,2964300 +2017.06.08,10:00,189.95,192.65,188.1,192.1,2637100 +2017.06.09,10:00,192.1,193.3,190.6,192.85,1842300 +2017.06.13,10:00,193.9,193.9,188.3,189.0,2716400 +2017.06.14,10:00,189.6,190.1,187.05,190.0,3950400 +2017.06.15,10:00,186.65,189.05,178.65,182.2,6767000 +2017.06.16,10:00,181.0,186.25,171.2,174.65,8423100 +2017.06.19,10:00,175.05,181.95,170.15,181.5,6960300 +2017.06.20,10:00,181.7,183.3,180.0,181.4,1996800 +2017.06.21,10:00,181.2,192.0,181.0,191.0,9242500 +2017.06.22,10:00,192.0,195.0,190.3,194.3,3966700 +2017.06.23,10:00,194.95,194.95,191.3,191.35,5221700 +2017.06.26,10:00,192.1,194.0,185.95,186.75,3643300 +2017.06.27,10:00,186.75,191.0,184.75,189.5,3294600 +2017.06.28,10:00,190.0,190.8,187.75,190.05,2130700 +2017.06.29,10:00,191.95,193.35,190.4,193.0,1742400 +2017.06.30,10:00,192.85,195.3,191.25,195.3,3949800 +2017.07.03,10:00,195.3,199.3,194.5,197.8,2719300 +2017.07.04,10:00,197.85,199.75,196.8,198.8,1870300 +2017.07.05,10:00,199.0,204.7,198.05,204.25,4310700 +2017.07.06,10:00,204.3,215.4,203.55,215.25,12139200 +2017.07.07,10:00,215.0,215.8,211.65,213.0,6053200 +2017.07.10,10:00,213.7,220.85,213.0,217.5,6405800 +2017.07.11,10:00,217.65,220.6,213.5,217.2,8029200 +2017.07.12,10:00,217.0,225.0,216.75,225.0,6346100 +2017.07.13,10:00,209.95,216.75,209.25,211.5,8892200 +2017.07.14,10:00,211.0,213.95,210.55,212.8,3513000 +2017.07.17,10:00,212.0,212.6,205.1,209.2,6410900 +2017.07.18,10:00,209.0,209.9,206.8,208.7,1816000 +2017.07.19,10:00,209.75,217.7,208.7,212.7,9064000 +2017.07.20,10:00,214.75,217.15,213.55,214.7,2878700 +2017.07.21,10:00,214.2,215.7,207.7,208.5,4259000 +2017.07.24,10:00,207.5,209.65,201.55,204.6,4170300 +2017.07.25,10:00,204.95,206.8,202.05,204.55,3335500 +2017.07.26,10:00,204.5,208.75,204.5,208.0,2897500 +2017.07.27,10:00,208.95,212.0,207.0,207.75,2402600 +2017.07.28,10:00,207.2,207.45,202.3,203.35,3313600 +2017.07.31,10:00,203.0,204.85,200.05,201.7,3905800 +2017.08.01,10:00,202.2,206.5,201.6,206.4,3841200 +2017.08.02,10:00,206.35,207.1,204.3,205.55,2044100 +2017.08.03,10:00,204.8,205.85,203.45,204.3,1752200 +2017.08.04,10:00,204.3,205.6,201.7,205.45,2537800 +2017.08.07,10:00,205.0,206.45,204.15,205.4,1200100 +2017.08.08,10:00,205.0,210.6,204.4,210.05,3610000 +2017.08.09,10:00,210.3,211.75,206.65,208.9,2438500 +2017.08.10,10:00,209.5,210.35,205.7,205.85,1793000 +2017.08.11,10:00,205.0,205.7,201.2,202.9,2894700 +2017.08.14,10:00,203.2,205.5,203.15,205.25,1056300 +2017.08.15,10:00,205.0,207.15,203.5,206.85,3037000 +2017.08.16,10:00,207.25,209.7,205.65,209.7,2829700 +2017.08.17,10:00,209.6,211.7,209.1,210.95,1591000 +2017.08.18,10:00,209.85,212.85,207.95,212.65,2551000 +2017.08.21,10:00,212.1,214.95,211.7,213.05,1621200 +2017.08.22,10:00,213.2,214.65,212.8,213.0,697000 +2017.08.23,10:00,213.95,214.45,208.55,209.3,1956300 +2017.08.24,10:00,208.7,209.35,205.6,206.4,3363600 +2017.08.25,10:00,207.0,207.4,202.1,204.0,4864300 +2017.08.28,10:00,204.35,206.95,202.7,203.15,2682700 +2017.08.29,10:00,202.35,205.4,200.4,204.7,3289600 +2017.08.30,10:00,200.8,201.0,193.45,198.0,14788400 +2017.08.31,10:00,198.0,198.1,191.8,191.8,11350000 +2017.09.01,10:00,193.45,195.35,187.5,190.0,6963400 +2017.09.04,10:00,189.9,194.1,186.4,193.25,3398500 +2017.09.05,10:00,193.7,202.9,193.0,200.75,9520500 +2017.09.06,10:00,201.45,201.85,196.25,199.65,6343200 +2017.09.07,10:00,199.3,200.9,197.0,197.05,4988100 +2017.09.08,10:00,197.0,197.5,195.05,195.85,3996300 +2017.09.11,10:00,196.5,198.0,194.35,197.5,4751200 +2017.09.12,10:00,197.7,198.45,195.3,197.85,4699600 +2017.09.13,10:00,197.8,198.8,194.95,196.5,4406500 +2017.09.14,10:00,197.0,197.0,192.0,196.25,4855700 +2017.09.15,10:00,195.75,196.15,193.65,194.5,4619300 +2017.09.18,10:00,194.0,196.5,193.8,195.15,4984300 +2017.09.19,10:00,195.8,196.85,189.3,190.0,6290300 +2017.09.20,10:00,186.0,194.55,186.0,188.0,27768800 +2017.09.21,10:00,188.05,188.5,186.1,187.0,5915800 +2017.09.22,10:00,186.95,186.95,183.65,183.95,5175500 +2017.09.25,10:00,183.55,184.9,182.25,183.55,5640500 +2017.09.26,10:00,184.0,189.8,183.7,184.05,12038800 +2017.09.27,10:00,185.0,185.75,183.2,185.3,3683700 +2017.09.28,10:00,185.05,185.3,183.1,183.8,3299000 +2017.09.29,10:00,183.05,184.0,179.3,183.95,7325200 +2017.10.02,10:00,183.4,186.35,183.4,184.75,4313400 +2017.10.03,10:00,185.0,187.5,184.8,186.0,3978700 +2017.10.04,10:00,186.0,187.75,182.6,184.3,5582700 +2017.10.05,10:00,184.35,184.35,181.4,181.7,5641400 +2017.10.06,10:00,181.4,182.7,180.55,181.0,3801700 +2017.10.09,10:00,181.3,181.9,180.7,181.6,2365800 +2017.10.10,10:00,181.3,183.85,181.2,181.75,2890300 +2017.10.11,10:00,182.0,183.6,181.9,183.55,4960100 +2017.10.12,10:00,183.6,183.75,179.6,181.0,7986600 +2017.10.13,10:00,180.6,181.45,179.75,180.6,3554500 +2017.10.16,10:00,180.65,182.0,180.25,181.25,2323200 +2017.10.17,10:00,181.65,182.0,180.95,181.1,1737400 +2017.10.18,10:00,181.2,182.3,181.0,181.7,2903100 +2017.10.19,10:00,181.85,182.05,180.4,180.4,1504800 +2017.10.20,10:00,180.8,182.85,179.75,182.5,2498200 +2017.10.23,10:00,182.85,185.95,182.5,184.7,5382100 +2017.10.24,10:00,185.7,185.7,183.25,184.0,3202800 +2017.10.25,10:00,184.1,185.7,183.5,184.5,2342600 +2017.10.26,10:00,184.7,185.0,179.5,182.55,4659900 +2017.10.27,10:00,183.0,183.85,181.0,182.8,2666500 +2017.10.30,10:00,182.9,184.8,181.65,184.35,2977900 +2017.10.31,10:00,184.35,185.3,179.65,180.0,8604000 +2017.11.01,10:00,179.05,179.25,164.6,164.9,26765800 +2017.11.02,10:00,164.1,165.7,162.0,164.5,15619000 +2017.11.03,10:00,164.9,165.4,161.05,162.4,7908100 +2017.11.07,10:00,162.55,163.15,155.6,158.45,16701900 +2017.11.08,10:00,158.45,164.8,155.1,163.0,12924700 +2017.11.09,10:00,164.0,168.45,163.65,164.5,9710800 +2017.11.10,10:00,165.25,166.85,163.15,163.4,4065700 +2017.11.13,10:00,163.4,164.0,160.1,161.0,4449500 +2017.11.14,10:00,160.8,162.0,156.75,157.0,9414900 +2017.11.15,10:00,155.5,161.2,154.05,159.2,5696200 +2017.11.16,10:00,159.2,165.1,157.0,164.4,5805600 +2017.11.17,10:00,164.4,166.85,161.25,164.55,6017900 +2017.11.20,10:00,164.55,165.6,163.55,164.6,2634900 +2017.11.21,10:00,164.6,166.7,164.25,166.25,3820800 +2017.11.22,10:00,166.45,168.6,160.65,163.95,8010200 +2017.11.23,10:00,164.0,164.45,162.1,162.3,2532500 +2017.11.24,10:00,162.15,162.85,157.65,159.85,10583200 +2017.11.27,10:00,158.95,160.05,156.25,157.0,4481300 +2017.11.28,10:00,157.0,158.1,155.3,157.2,6951500 +2017.11.29,10:00,157.8,159.15,156.3,158.6,3840700 +2017.11.30,10:00,158.45,158.6,146.85,152.5,20848500 +2017.12.01,10:00,152.55,154.9,147.05,148.15,15100500 +2017.12.04,10:00,148.1,148.55,143.2,144.6,9784500 +2017.12.05,10:00,143.55,149.2,141.75,146.4,10209600 +2017.12.06,10:00,146.3,147.6,144.2,144.7,7923000 +2017.12.07,10:00,144.5,145.3,143.55,144.35,3414200 +2017.12.08,10:00,144.8,146.3,143.8,144.35,3116900 +2017.12.11,10:00,144.4,145.25,143.15,143.55,3566600 +2017.12.12,10:00,144.2,144.25,140.1,140.1,6955700 +2017.12.13,10:00,140.45,141.65,136.6,137.0,10328900 +2017.12.14,10:00,137.85,142.55,136.25,141.8,8577100 +2017.12.15,10:00,141.8,145.7,140.7,143.6,10139300 +2017.12.18,10:00,144.05,146.5,140.85,142.0,7660500 +2017.12.19,10:00,142.75,143.35,140.35,141.35,3170000 +2017.12.20,10:00,142.0,142.0,138.0,138.0,6821200 +2017.12.21,10:00,137.95,139.3,137.1,138.8,4964700 +2017.12.22,10:00,138.8,140.0,138.15,138.8,4161400 +2017.12.25,10:00,139.05,140.45,137.25,138.85,2892100 +2017.12.26,10:00,138.8,139.8,138.05,139.0,1973700 +2017.12.27,10:00,139.65,139.8,138.15,138.5,3471700 +2017.12.28,10:00,138.55,139.15,137.75,139.0,2650200 +2017.12.29,10:00,139.2,140.0,138.4,138.45,1910300 +2018.01.03,10:00,139.1,140.95,138.6,140.4,2126700 +2018.01.04,10:00,140.4,149.35,140.4,148.9,9782700 +2018.01.05,10:00,149.2,149.5,146.2,147.3,6599600 +2018.01.09,10:00,147.2,151.8,146.6,150.5,8481100 +2018.01.10,10:00,150.8,151.8,146.0,149.3,9191700 +2018.01.11,10:00,149.55,150.45,147.35,148.3,4309600 +2018.01.12,10:00,148.3,149.4,144.65,145.6,6164000 +2018.01.15,10:00,145.6,148.65,145.2,146.6,6186700 +2018.01.16,10:00,146.6,147.3,140.2,140.75,14647500 +2018.01.17,10:00,140.3,141.3,138.25,138.45,9677900 +2018.01.18,10:00,138.35,139.8,136.65,137.2,9498500 +2018.01.19,10:00,136.9,141.25,135.0,138.7,11534800 +2018.01.22,10:00,139.6,140.45,138.5,138.6,5541900 +2018.01.23,10:00,139.0,140.2,137.65,138.3,5186900 +2018.01.24,10:00,138.75,139.4,137.85,138.05,4562700 +2018.01.25,10:00,138.0,138.55,137.1,137.1,5254400 +2018.01.26,10:00,137.05,137.7,133.6,134.2,8641500 +2018.01.29,10:00,130.6,137.8,130.6,137.6,10258400 +2018.01.30,10:00,137.35,137.4,133.1,133.2,9358600 +2018.01.31,10:00,133.3,135.9,132.75,133.3,7774400 +2018.02.01,10:00,134.05,136.35,133.6,135.35,4500700 +2018.02.02,10:00,135.1,135.8,132.4,133.5,6780700 +2018.02.05,10:00,133.05,139.0,131.85,138.4,13437300 +2018.02.06,10:00,136.0,136.4,131.05,135.5,10876700 +2018.02.07,10:00,136.3,137.75,135.85,136.45,3435800 +2018.02.08,10:00,136.0,138.0,134.75,137.5,5542900 +2018.02.09,10:00,135.75,140.0,135.75,139.3,7901600 +2018.02.12,10:00,139.95,141.0,138.0,139.0,7765600 +2018.02.13,10:00,139.0,140.45,138.5,140.3,2995000 +2018.02.14,10:00,140.4,141.05,136.85,137.7,8643300 +2018.02.15,10:00,137.8,138.8,136.3,136.85,3236400 +2018.02.16,10:00,137.2,137.5,136.5,137.3,2784600 +2018.02.19,10:00,137.0,138.5,136.7,137.35,2084300 +2018.02.20,10:00,137.35,138.0,136.8,138.0,2218000 +2018.02.21,10:00,137.95,138.75,137.6,138.75,2219700 +2018.02.22,10:00,138.75,142.0,138.2,140.1,9208600 +2018.02.26,10:00,141.9,143.05,140.2,140.8,4769800 +2018.02.27,10:00,141.3,141.8,138.8,139.1,4154100 +2018.02.28,10:00,138.95,141.6,137.1,141.45,5689300 +2018.03.01,10:00,140.9,152.45,139.7,151.95,30886500 +2018.03.02,10:00,151.75,154.25,150.0,152.0,14512500 +2018.03.05,10:00,153.5,153.95,148.4,150.0,7298200 +2018.03.06,10:00,150.8,151.45,147.85,149.4,5722800 +2018.03.07,10:00,148.55,152.7,148.0,148.9,6326 +2018.03.09,10:00,152.7,158.0,150.55,155.15,46597 +2018.03.12,10:00,158.0,159.65,157.4,158.1,60930 +2018.03.13,10:00,158.0,164.0,157.2,159.85,63902 +2018.03.14,10:00,159.85,165.35,159.2,162.4,175101 +2018.03.15,10:00,162.45,163.25,159.25,160.35,103884 +2018.03.16,10:00,160.35,162.95,158.5,161.3,62182 +2018.03.19,10:00,162.6,162.75,159.35,160.3,27889 +2018.03.20,10:00,160.3,161.15,158.85,159.75,23720 +2018.03.21,10:00,159.75,163.25,159.75,160.5,53377 +2018.03.22,10:00,160.6,160.6,155.55,157.35,53645 +2018.03.23,10:00,157.3,159.85,151.9,153.25,81679 +2018.03.26,10:00,158.05,161.45,155.85,160.8,34157 +2018.03.27,10:00,160.8,160.8,153.75,156.6,61309 +2018.03.28,10:00,156.6,156.6,152.75,153.95,46336 +2018.03.29,10:00,153.95,155.5,153.65,154.25,28249 +2018.03.30,10:00,154.25,155.7,154.25,155.6,17644 +2018.04.02,10:00,155.6,157.2,154.75,156.5,12610 +2018.04.03,10:00,156.5,156.75,153.7,154.5,26770 +2018.04.04,10:00,154.5,156.6,154.5,156.15,23504 +2018.04.05,10:00,156.15,158.5,154.1,157.6,29491 +2018.04.06,10:00,157.6,158.2,156.25,157.2,27651 +2018.04.09,10:00,157.2,157.2,137.55,145.8,129234 +2018.04.10,10:00,145.8,148.0,140.55,144.05,203848 +2018.04.11,10:00,144.1,147.5,140.7,143.7,101861 +2018.04.12,10:00,143.8,148.2,143.8,146.8,62893 +2018.04.13,10:00,146.8,148.8,142.65,145.4,45597 +2018.04.16,10:00,142.45,146.7,141.2,144.55,19419 +2018.04.17,10:00,144.65,148.7,144.65,147.6,33299 +2018.04.18,10:00,147.7,154.45,147.25,153.65,44530 +2018.04.19,10:00,153.65,155.75,149.65,151.1,36205 +2018.04.20,10:00,151.0,151.15,148.55,149.55,36751 +2018.04.23,10:00,150.05,150.05,146.7,148.2,18730 +2018.04.24,10:00,148.25,149.3,146.15,148.1,42209 +2018.04.25,10:00,148.1,148.1,143.35,144.5,40432 +2018.04.26,10:00,144.5,145.9,143.6,144.6,38515 +2018.04.27,10:00,144.55,146.75,144.2,144.95,28421 +2018.04.28,10:00,144.95,145.65,144.05,145.0,20379 +2018.04.30,10:00,145.2,146.25,143.15,144.2,16534 +2018.05.02,10:00,145.2,147.3,144.0,146.35,17662 +2018.05.03,10:00,146.3,147.25,143.5,146.55,39537 +2018.05.04,10:00,146.5,146.5,141.25,142.7,62005 +2018.05.07,10:00,141.75,149.95,141.4,142.1,21824 +2018.05.08,10:00,142.0,142.0,140.0,141.6,18990 +2018.05.10,10:00,140.85,141.8,139.05,139.3,37228 +2018.05.11,10:00,139.3,140.45,137.05,138.9,74119 +2018.05.14,10:00,137.55,137.55,132.05,136.2,82841 +2018.05.15,10:00,136.2,140.15,134.6,136.5,47413 +2018.05.16,10:00,136.5,138.45,136.5,138.2,59377 +2018.05.17,10:00,138.2,138.55,136.55,137.2,30975 +2018.05.18,10:00,137.1,137.9,136.15,137.55,18393 +2018.05.21,10:00,136.1,137.75,136.05,136.7,12509 +2018.05.22,10:00,136.7,136.85,134.2,134.95,36805 +2018.05.23,10:00,134.95,135.3,132.55,133.4,33425 +2018.05.24,10:00,133.45,133.45,130.65,132.3,46364 +2018.05.25,10:00,132.35,141.5,131.3,132.0,32392 +2018.05.28,10:00,132.45,133.85,131.3,131.75,24689 +2018.05.29,10:00,131.85,132.65,131.1,131.9,35164 +2018.05.30,10:00,131.9,139.85,131.9,138.1,174672 +2018.05.31,10:00,138.15,141.5,138.05,140.75,95530 +2018.06.01,10:00,140.75,140.75,139.15,139.7,52965 +2018.06.04,10:00,139.9,140.35,137.1,138.65,23799 +2018.06.05,10:00,138.65,139.45,137.1,138.55,48022 +2018.06.06,10:00,138.65,141.5,138.65,140.55,31218 +2018.06.07,10:00,140.55,145.8,140.55,144.05,58332 +2018.06.08,10:00,144.0,145.6,142.65,143.9,81888 +2018.06.09,10:00,143.9,144.95,143.8,144.35,4229 +2018.06.11,10:00,144.35,145.45,141.8,142.7,31249 +2018.06.13,10:00,143.05,145.2,143.05,144.05,24541 +2018.06.14,10:00,144.05,144.55,143.25,143.55,17830 +2018.06.15,10:00,143.65,144.75,139.5,140.5,55084 +2018.06.18,10:00,139.75,140.95,139.1,139.65,23282 +2018.06.19,10:00,139.6,139.95,136.35,138.0,51928 +2018.06.20,10:00,137.85,141.4,137.85,141.0,28305 +2018.06.21,10:00,141.0,142.3,139.9,140.55,27161 +2018.06.22,10:00,140.55,141.3,139.85,140.55,22327 +2018.06.25,10:00,141.0,143.1,139.6,140.75,40748 +2018.06.26,10:00,141.25,141.5,140.6,140.65,15329 +2018.06.27,10:00,141.45,141.45,140.0,141.15,26423 +2018.06.28,10:00,141.85,142.3,139.25,139.8,37274 +2018.06.29,10:00,140.1,141.3,139.8,139.8,50945 +2018.07.02,10:00,140.4,140.65,139.85,140.15,47556 +2018.07.03,10:00,140.45,143.25,140.0,143.05,66922 +2018.07.04,10:00,143.2,143.45,138.4,140.0,141330 +2018.07.05,10:00,129.0,129.2,125.25,129.2,164064 +2018.07.06,10:00,128.8,130.85,128.35,129.55,59066 +2018.07.09,10:00,129.55,130.4,127.25,128.3,60141 +2018.07.10,10:00,128.0,128.4,126.55,126.55,40747 +2018.07.11,10:00,126.75,126.8,124.25,124.3,50504 +2018.07.12,10:00,124.85,126.25,123.5,124.8,45096 +2018.07.13,10:00,125.0,127.65,123.1,123.25,58996 +2018.07.16,10:00,123.25,124.1,122.6,123.0,43524 +2018.07.17,10:00,123.25,125.15,120.8,124.25,62072 +2018.07.18,10:00,124.55,125.3,122.55,123.0,44873 +2018.07.19,10:00,123.0,123.1,120.3,121.0,29999 +2018.07.20,10:00,121.0,122.3,120.1,121.45,28249 +2018.07.23,10:00,121.6,123.8,121.6,123.8,35355 +2018.07.24,10:00,124.0,124.75,122.15,122.15,24062 +2018.07.25,10:00,122.0,122.25,120.65,121.3,25529 +2018.07.26,10:00,121.35,122.85,121.35,122.7,30575 +2018.07.27,10:00,122.7,123.5,121.5,122.2,16691 +2018.07.30,10:00,122.0,122.75,121.35,121.7,18532 +2018.07.31,10:00,121.9,123.0,121.35,122.95,21655 +2018.08.01,10:00,123.0,125.0,121.0,121.0,46789 +2018.08.02,10:00,120.5,120.6,115.8,116.0,103065 +2018.08.03,10:00,116.2,118.1,113.65,118.1,57950 +2018.08.06,10:00,118.45,118.85,113.75,114.3,42669 +2018.08.07,10:00,114.6,115.85,113.5,114.25,22036 +2018.08.08,10:00,114.25,114.85,111.0,111.85,49517 +2018.08.09,10:00,108.0,111.65,98.15,109.7,215587 +2018.08.10,10:00,109.7,110.25,104.65,105.0,57781 +2018.08.13,10:00,104.5,107.05,103.55,105.75,36500 +2018.08.14,10:00,105.95,107.25,105.0,107.25,20373 +2018.08.15,10:00,107.6,115.75,107.15,107.4,147651 +2018.08.16,10:00,108.25,110.8,106.3,110.5,56360 +2018.08.17,10:00,110.65,111.5,108.1,109.0,26601 +2018.08.20,10:00,109.5,110.4,108.5,108.95,11889 +2018.08.21,10:00,109.25,109.5,106.8,108.35,25130 +2018.08.22,10:00,108.0,108.8,107.1,108.6,16234 +2018.08.23,10:00,108.35,108.5,105.2,105.65,27158 +2018.08.24,10:00,105.0,106.1,100.65,104.45,48608 +2018.08.27,10:00,104.5,106.5,104.25,106.2,16305 +2018.08.28,10:00,106.65,107.7,106.1,106.55,17392 +2018.08.29,10:00,106.35,111.8,105.5,111.8,30006 +2018.08.30,10:00,112.3,119.8,111.75,115.5,172000 +2018.08.31,10:00,116.0,116.0,112.6,115.5,46427 +2018.09.03,10:00,115.45,115.7,113.8,114.55,11891 +2018.09.04,10:00,114.7,115.45,111.2,112.75,27931 +2018.09.05,10:00,112.75,113.0,110.55,111.5,22827 +2018.09.06,10:00,111.4,111.4,108.1,108.1,24205 +2018.09.07,10:00,108.05,109.7,107.55,108.55,18003 +2018.09.10,10:00,109.1,109.45,105.65,106.5,20853 +2018.09.11,10:00,105.65,106.5,104.55,105.1,27773 +2018.09.12,10:00,105.5,108.0,103.3,107.2,41552 +2018.09.13,10:00,107.2,109.5,106.1,107.1,45399 +2018.09.14,10:00,107.0,107.25,104.8,105.75,34432 +2018.09.17,10:00,105.75,106.85,105.2,106.05,16767 +2018.09.18,10:00,106.0,109.5,106.0,109.15,52934 +2018.09.19,10:00,109.5,113.5,108.6,111.4,64893 +2018.09.20,10:00,111.5,112.55,110.2,111.0,66870 +2018.09.21,10:00,110.95,111.0,108.25,111.0,38947 +2018.09.24,10:00,110.65,111.3,108.55,108.95,33240 +2018.09.25,10:00,108.75,109.35,106.6,106.65,41468 +2018.09.26,10:00,106.7,107.5,106.0,106.7,27063 +2018.09.27,10:00,106.9,108.45,106.2,107.05,34396 +2018.09.28,10:00,107.6,107.65,105.25,106.55,32174 +2018.10.01,10:00,106.55,106.85,105.8,106.2,15325 +2018.10.02,10:00,106.25,107.95,105.55,106.4,23105 +2018.10.03,10:00,106.4,107.6,106.1,107.1,20228 +2018.10.04,10:00,107.1,108.2,106.4,106.4,23963 +2018.10.05,10:00,106.35,106.35,103.45,104.65,32283 +2018.10.08,10:00,104.6,104.7,101.5,102.65,32669 +2018.10.09,10:00,103.0,103.95,102.05,102.1,20828 +2018.10.10,10:00,102.0,105.05,101.7,102.15,34106 +2018.10.11,10:00,101.0,102.15,100.1,100.9,35654 +2018.10.12,10:00,101.0,104.15,101.0,102.0,32010 +2018.10.15,10:00,101.9,102.9,100.15,100.15,34080 +2018.10.16,10:00,100.2,101.25,98.5,99.0,43319 +2018.10.17,10:00,100.15,100.45,97.65,98.0,37154 +2018.10.18,10:00,97.6,97.85,95.2,96.0,66869 +2018.10.19,10:00,95.9,97.25,94.7,95.5,40392 +2018.10.22,10:00,94.9,96.7,91.5,92.4,43469 +2018.10.23,10:00,91.15,92.45,89.45,92.3,56860 +2018.10.24,10:00,92.65,94.0,91.8,92.9,43916 +2018.10.25,10:00,91.6,93.8,90.65,91.85,31237 +2018.10.26,10:00,91.9,92.5,89.95,91.6,34311 +2018.10.29,10:00,90.4,94.7,90.4,94.05,51736 +2018.10.30,10:00,94.05,98.25,93.7,98.25,72577 +2018.10.31,10:00,98.4,99.9,96.5,97.25,74625 +2018.11.01,10:00,97.88,98.5,96.0,96.88,58147 +2018.11.02,10:00,97.0,101.78,95.72,101.78,106819 +2018.11.06,10:00,101.6,103.8,100.24,102.4,451106 +2018.11.07,10:00,102.0,102.18,98.88,100.6,602622 +2018.11.08,10:00,100.3,100.94,97.62,98.5,564350 +2018.11.09,10:00,98.16,98.16,95.14,95.14,559193 +2018.11.12,10:00,95.92,98.0,95.7,96.9,416749 +2018.11.13,10:00,97.0,97.92,95.64,97.4,351929 +2018.11.14,10:00,97.96,103.3,97.24,103.3,1086877 +2018.11.15,10:00,103.3,104.1,101.56,102.74,580284 +2018.11.16,10:00,102.8,103.2,100.44,101.2,446630 +2018.11.19,10:00,102.1,102.6,98.54,98.72,402223 +2018.11.20,10:00,98.5,102.5,98.24,102.2,558355 +2018.11.21,10:00,102.2,109.44,102.1,108.8,2125216 +2018.11.22,10:00,108.82,109.9,106.5,109.9,759520 +2018.11.23,10:00,109.9,113.9,109.38,113.74,1171954 +2018.11.26,10:00,113.4,113.76,108.38,110.9,1013159 +2018.11.27,10:00,110.22,115.8,110.2,113.28,1030587 +2018.11.28,10:00,113.02,114.86,111.52,113.6,434980 +2018.11.29,10:00,114.02,116.56,113.14,113.14,960618 +2018.11.30,10:00,112.56,119.44,112.4,114.4,1421107 +2018.12.03,10:00,114.38,115.0,110.04,111.84,962083 +2018.12.04,10:00,111.8,111.8,106.7,106.7,1093126 +2018.12.05,10:00,106.92,109.72,106.92,107.8,681838 +2018.12.06,10:00,108.2,109.28,105.5,106.44,500650 +2018.12.07,10:00,107.08,108.56,103.7,103.7,741850 +2018.12.10,10:00,104.48,105.48,99.66,101.02,1098645 +2018.12.11,10:00,101.34,103.38,100.66,102.72,447399 +2018.12.12,10:00,103.0,103.3,101.02,101.8,340551 +2018.12.13,10:00,102.0,103.2,101.12,102.0,373681 +2018.12.14,10:00,101.58,102.2,100.0,102.1,401754 +2018.12.17,10:00,102.12,102.44,100.62,101.04,233074 +2018.12.18,10:00,100.6,105.4,100.6,101.6,841306 +2018.12.19,10:00,102.4,104.5,101.54,102.0,749100 +2018.12.20,10:00,102.0,103.0,101.0,102.02,463399 +2018.12.21,10:00,103.28,103.36,101.38,102.2,343982 +2018.12.24,10:00,102.2,102.34,101.62,102.1,175087 +2018.12.25,10:00,102.1,103.0,100.0,100.8,426484 +2018.12.26,10:00,100.98,101.92,100.62,101.02,260809 +2018.12.27,10:00,102.0,102.2,100.2,100.5,347850 +2018.12.28,10:00,101.0,101.44,100.4,101.0,297363 +2018.12.29,10:00,101.0,101.4,100.66,101.18,71310 +2019.01.03,10:00,101.9,101.9,100.72,101.5,171019 +2019.01.04,10:00,101.5,101.68,100.8,101.1,132099 +2019.01.08,10:00,101.5,101.84,100.8,101.1,126518 +2019.01.09,10:00,101.14,103.18,100.86,102.06,553773 +2019.01.10,10:00,102.88,105.14,102.46,105.14,623535 +2019.01.11,10:00,105.14,106.5,104.6,104.66,580822 +2019.01.14,10:00,104.68,106.96,103.76,106.22,464966 +2019.01.15,10:00,106.7,107.2,105.22,106.98,610084 +2019.01.16,10:00,106.4,109.26,106.14,108.4,584719 +2019.01.17,10:00,108.34,109.84,107.56,109.06,608347 +2019.01.18,10:00,109.58,110.3,106.74,107.0,787053 +2019.01.21,10:00,107.08,107.48,105.6,105.8,470121 +2019.01.22,10:00,105.8,106.96,105.24,105.24,302195 +2019.01.23,10:00,105.24,106.54,105.22,105.4,295624 +2019.01.24,10:00,105.78,106.04,104.78,105.38,344449 +2019.01.25,10:00,105.78,106.76,104.92,105.7,318543 +2019.01.28,10:00,105.9,106.8,105.06,105.8,257936 +2019.01.29,10:00,105.76,106.3,105.26,106.1,194280 +2019.01.30,10:00,106.1,109.08,106.02,108.6,841505 +2019.01.31,10:00,109.08,109.7,107.1,107.92,584284 +2019.02.01,10:00,108.06,108.56,105.08,105.22,773944 +2019.02.04,10:00,105.68,106.22,102.42,102.44,969902 +2019.02.05,10:00,100.3,103.3,100.02,102.26,1188256 +2019.02.06,10:00,102.8,102.8,101.78,102.0,459894 +2019.02.07,10:00,101.6,102.2,101.12,101.62,338095 +2019.02.08,10:00,102.46,102.46,101.52,101.9,212887 +2019.02.11,10:00,102.0,102.48,101.68,101.78,249104 +2019.02.12,10:00,102.0,102.7,101.62,102.7,396945 +2019.02.13,10:00,102.12,102.42,100.0,100.14,660927 +2019.02.14,10:00,100.0,101.86,99.06,101.36,585080 +2019.02.15,10:00,101.68,102.32,100.66,101.62,307320 +2019.02.18,10:00,101.6,102.48,100.72,100.74,200878 +2019.02.19,10:00,100.76,101.24,99.56,100.0,494503 +2019.02.20,10:00,101.0,101.24,99.72,100.04,430465 +2019.02.21,10:00,100.2,100.48,99.76,100.0,441166 +2019.02.22,10:00,100.32,100.32,99.92,100.12,205980 +2019.02.25,10:00,100.12,100.38,99.36,100.04,491211 +2019.02.26,10:00,100.04,100.22,98.36,98.98,480669 +2019.02.27,10:00,99.0,99.44,95.96,97.7,969601 +2019.02.28,10:00,97.42,97.56,95.78,97.1,436020 +2019.03.01,10:00,96.54,97.74,96.54,96.76,349994 +2019.03.04,10:00,96.6,98.88,96.6,98.36,392709 +2019.03.05,10:00,96.4,97.0,94.5,96.26,760780 +2019.03.06,10:00,96.8,98.78,96.28,98.12,714492 +2019.03.07,10:00,98.3,99.9,97.3,99.68,695242 +2019.03.11,10:00,99.7,102.5,99.24,102.1,1010857 +2019.03.12,10:00,102.5,102.62,100.12,100.22,343278 +2019.03.13,10:00,100.4,100.9,99.4,100.5,342795 +2019.03.14,10:00,99.94,101.3,98.2,99.66,505635 +2019.03.15,10:00,99.14,100.38,99.04,100.08,371015 +2019.03.18,10:00,100.04,100.52,99.12,99.92,373860 +2019.03.19,10:00,99.82,100.38,99.24,99.46,186940 +2019.03.20,10:00,99.52,99.92,98.2,98.22,425396 +2019.03.21,10:00,98.54,98.6,97.16,97.3,487898 +2019.03.22,10:00,97.7,97.7,96.58,97.66,341050 +2019.03.25,10:00,96.6,98.46,96.26,97.0,397503 +2019.03.26,10:00,97.1,97.56,96.84,97.02,164519 +2019.03.27,10:00,97.36,97.4,96.06,96.1,383488 +2019.03.28,10:00,96.06,97.0,95.86,96.7,142281 +2019.03.29,10:00,96.88,97.38,96.06,96.3,347268 +2019.04.01,10:00,96.68,97.78,96.34,97.78,235315 +2019.04.02,10:00,97.5,98.88,97.5,98.36,268403 +2019.04.03,10:00,98.9,99.34,97.72,98.5,287064 +2019.04.04,10:00,98.04,98.96,97.86,98.36,103334 +2019.04.05,10:00,98.98,99.66,97.88,99.54,270430 +2019.04.08,10:00,99.8,99.88,98.44,98.58,145502 +2019.04.09,10:00,98.58,98.98,96.76,97.24,289992 +2019.04.10,10:00,97.24,98.22,96.82,97.32,306991 +2019.04.11,10:00,97.36,98.62,97.0,98.4,273503 +2019.04.12,10:00,98.52,98.9,97.34,98.22,296294 +2019.04.15,10:00,97.84,98.88,97.7,98.72,246859 +2019.04.16,10:00,99.0,99.4,98.1,99.12,295187 +2019.04.17,10:00,99.3,99.38,98.28,98.62,172361 +2019.04.18,10:00,98.7,99.1,98.0,98.0,101064 +2019.04.19,10:00,98.48,98.48,97.5,97.6,71945 +2019.04.22,10:00,97.84,98.3,97.52,97.6,141548 +2019.04.23,10:00,97.74,97.86,96.56,96.8,277462 +2019.04.24,10:00,96.8,97.12,96.14,96.32,219278 +2019.04.25,10:00,96.5,97.14,96.0,96.34,255716 +2019.04.26,10:00,96.4,97.12,96.0,97.12,248701 +2019.04.29,10:00,96.86,97.5,96.54,96.98,184350 +2019.04.30,10:00,96.74,97.3,96.32,96.32,390295 +2019.05.02,10:00,96.44,96.86,95.52,96.86,143382 +2019.05.03,10:00,96.9,96.98,96.14,96.7,140982 +2019.05.06,10:00,93.6,95.56,92.7,94.94,625254 +2019.05.07,10:00,95.0,95.42,94.3,94.5,255630 +2019.05.08,10:00,94.5,94.98,94.24,94.24,247654 +2019.05.10,10:00,94.3,94.58,92.9,92.9,249724 +2019.05.13,10:00,93.5,93.7,91.16,91.28,344281 +2019.05.14,10:00,91.22,92.9,91.22,91.6,267603 +2019.05.15,10:00,92.0,92.3,90.08,90.08,380587 +2019.05.16,10:00,90.38,92.96,90.12,91.68,522663 +2019.05.17,10:00,91.68,92.48,91.02,91.96,242844 +2019.05.20,10:00,92.2,92.2,90.84,91.08,231715 +2019.05.21,10:00,91.28,91.6,90.32,90.76,220383 +2019.05.22,10:00,90.58,91.38,90.2,91.0,215555 +2019.05.23,10:00,91.3,91.48,90.6,90.74,270296 +2019.05.24,10:00,90.98,91.72,90.94,91.0,334351 +2019.05.27,10:00,91.2,91.44,90.64,91.2,145750 +2019.05.28,10:00,91.2,91.58,90.68,90.68,301424 +2019.05.29,10:00,90.5,91.2,89.7,91.12,324960 +2019.05.30,10:00,91.12,91.48,90.36,90.42,129148 +2019.05.31,10:00,90.5,94.6,90.5,93.8,1435066 +2019.06.03,10:00,93.4,96.8,93.22,96.8,1574400 +2019.06.04,10:00,97.04,98.5,95.76,96.34,572193 +2019.06.05,10:00,96.4,96.84,94.5,96.1,348993 +2019.06.06,10:00,95.98,97.36,95.56,96.02,374395 +2019.06.07,10:00,96.0,96.7,95.24,95.86,208495 +2019.06.10,10:00,95.8,96.62,95.0,95.4,232251 +2019.06.11,10:00,95.5,96.86,95.12,95.6,368766 +2019.06.13,10:00,95.7,98.4,95.44,98.18,716365 +2019.06.14,10:00,98.32,98.8,97.16,97.66,547288 +2019.06.17,10:00,97.94,100.82,97.78,100.38,1072541 +2019.06.18,10:00,100.0,101.82,99.02,99.3,920818 +2019.06.19,10:00,99.32,99.92,98.34,99.26,508900 +2019.06.20,10:00,98.88,99.88,97.32,98.9,758380 +2019.06.21,10:00,99.2,100.66,98.98,100.04,697829 +2019.06.24,10:00,100.2,100.88,99.82,100.24,242472 +2019.06.25,10:00,100.18,102.2,99.9,101.3,763131 +2019.06.26,10:00,101.3,102.4,101.04,101.52,317212 +2019.06.27,10:00,101.54,102.8,101.3,102.32,454041 +2019.06.28,10:00,102.34,102.74,101.22,101.76,276532 +2019.07.01,10:00,102.12,102.3,100.06,101.46,489319 +2019.07.02,10:00,101.06,101.38,100.7,100.9,296190 +2019.07.03,10:00,101.48,104.6,101.22,104.6,1247887 +2019.07.04,10:00,102.52,110.8,102.44,110.6,2831731 +2019.07.05,10:00,110.94,112.8,108.2,110.0,1492450 +2019.07.08,10:00,108.98,110.32,107.54,108.5,508485 +2019.07.09,10:00,108.0,108.76,105.56,106.94,635512 +2019.07.10,10:00,106.9,109.84,106.42,108.62,701912 +2019.07.11,10:00,109.16,109.48,106.7,107.82,473333 +2019.07.12,10:00,107.52,109.8,107.0,109.08,478996 +2019.07.15,10:00,109.5,111.32,108.5,108.5,448732 +2019.07.16,10:00,108.7,109.34,107.56,107.7,409309 +2019.07.17,10:00,107.6,108.34,106.26,108.2,295076 +2019.07.18,10:00,107.96,108.64,107.04,107.54,144347 +2019.07.19,10:00,107.86,108.62,107.62,108.02,204500 +2019.07.22,10:00,108.0,108.54,107.6,108.2,157622 +2019.07.23,10:00,108.08,108.22,107.36,108.1,351880 +2019.07.24,10:00,108.32,109.82,106.54,106.78,412612 +2019.07.25,10:00,107.3,108.36,105.68,107.5,342348 +2019.07.26,10:00,107.98,108.14,107.2,107.58,148664 +2019.07.29,10:00,107.7,108.3,107.22,107.3,98880 +2019.07.30,10:00,107.0,107.5,106.6,106.72,156810 +2019.07.31,10:00,106.7,108.08,106.7,106.94,371263 +2019.08.01,10:00,107.24,109.74,106.32,107.7,372504 +2019.08.02,10:00,105.56,107.26,104.5,106.62,485201 +2019.08.05,10:00,106.62,106.82,102.6,103.5,488958 +2019.08.06,10:00,103.38,106.0,103.2,104.7,372759 +2019.08.07,10:00,104.56,105.82,103.6,105.28,428579 +2019.08.08,10:00,105.36,109.08,105.12,108.88,622058 +2019.08.09,10:00,109.28,110.36,107.4,108.8,668727 +2019.08.12,10:00,109.1,111.0,109.1,110.5,503326 +2019.08.13,10:00,110.3,111.96,110.08,110.36,638545 +2019.08.14,10:00,110.6,111.36,110.18,110.86,470541 +2019.08.15,10:00,110.98,112.42,110.5,112.3,605070 +2019.08.16,10:00,112.3,112.48,108.8,110.4,524369 +2019.08.19,10:00,110.98,111.26,108.76,109.4,267420 +2019.08.20,10:00,109.48,109.6,108.22,109.24,346997 +2019.08.21,10:00,108.6,111.7,108.6,111.3,382137 +2019.08.22,10:00,111.4,111.84,102.0,110.0,894599 +2019.08.23,10:00,110.0,110.36,108.32,108.56,289870 +2019.08.26,10:00,108.5,109.52,107.6,109.38,197660 +2019.08.27,10:00,109.3,109.84,108.54,109.02,440513 +2019.08.28,10:00,108.86,109.6,108.7,109.4,415694 +2019.08.29,10:00,109.5,109.7,108.56,109.0,343243 +2019.08.30,10:00,108.8,110.32,107.72,109.74,810783 +2019.09.02,10:00,109.56,109.74,107.8,107.84,423411 +2019.09.03,10:00,107.8,108.0,104.9,106.52,794242 +2019.09.04,10:00,106.44,106.76,104.7,106.22,476530 +2019.09.05,10:00,105.98,106.3,105.3,105.86,288804 +2019.09.06,10:00,105.94,105.94,104.4,104.48,330567 +2019.09.09,10:00,104.72,106.58,104.72,106.38,391166 +2019.09.10,10:00,106.46,106.46,105.7,105.7,302553 +2019.09.11,10:00,105.72,106.5,105.72,106.5,221017 +2019.09.12,10:00,106.7,106.7,106.36,106.36,204091 +2019.09.13,10:00,106.56,106.56,106.46,106.46,190418 +2019.09.16,10:00,106.0,106.0,102.06,102.06,1695471 +2019.09.17,10:00,102.02,104.36,101.56,102.6,998172 +2019.09.18,10:00,103.32,103.32,102.12,102.5,409420 +2019.09.19,10:00,102.64,103.08,101.6,101.9,543269 +2019.09.20,10:00,102.1,103.0,101.66,102.64,317851 +2019.09.23,10:00,102.8,102.94,101.66,102.36,245832 +2019.09.24,10:00,102.6,103.16,101.7,101.7,224675 +2019.09.25,10:00,101.86,102.66,101.24,102.0,236850 +2019.09.26,10:00,102.36,103.32,102.14,102.98,299637 +2019.09.27,10:00,102.78,104.26,102.68,103.4,431754 +2019.09.30,10:00,103.86,104.1,102.74,103.18,251439 +2019.10.01,10:00,103.76,103.96,103.24,103.5,248606 +2019.10.02,10:00,103.6,103.88,102.2,102.6,331728 +2019.10.03,10:00,102.24,102.6,100.14,100.34,400268 +2019.10.04,10:00,100.98,101.42,99.2,99.3,344229 +2019.10.07,10:00,99.66,100.22,98.08,99.26,386427 +2019.10.08,10:00,99.3,100.68,99.12,99.5,235925 +2019.10.09,10:00,99.62,101.52,99.34,100.02,386011 +2019.10.10,10:00,100.3,101.32,99.82,101.26,159195 +2019.10.11,10:00,101.58,101.86,100.0,100.18,173422 +2019.10.14,10:00,100.4,103.38,98.46,102.8,865266 +2019.10.15,10:00,102.8,104.1,101.84,103.2,510767 +2019.10.16,10:00,103.34,104.7,102.78,104.34,541455 +2019.10.17,10:00,104.5,106.1,104.02,105.88,529363 +2019.10.18,10:00,105.5,106.02,104.18,104.8,470150 +2019.10.21,10:00,104.98,105.4,104.28,104.8,239557 +2019.10.22,10:00,104.6,105.08,103.3,103.5,484507 +2019.10.23,10:00,103.46,104.68,103.2,103.5,379065 +2019.10.24,10:00,103.7,104.58,102.72,103.0,357733 +2019.10.25,10:00,103.3,103.5,102.34,102.8,226992 +2019.10.28,10:00,103.02,103.48,102.46,103.0,319252 +2019.10.29,10:00,103.06,105.3,103.04,104.5,526361 +2019.10.30,10:00,104.6,105.94,104.34,105.8,397516 +2019.10.31,10:00,105.76,107.94,105.7,106.9,748643 +2019.11.01,10:00,107.1,107.26,104.66,105.26,691703 +2019.11.05,10:00,106.0,107.34,104.8,106.04,401905 +2019.11.06,10:00,106.64,106.88,105.68,106.22,243458 +2019.11.07,10:00,106.22,107.26,106.1,106.34,297688 +2019.11.08,10:00,106.34,106.8,105.32,106.16,232720 +2019.11.11,10:00,106.12,106.72,103.84,104.58,390361 +2019.11.12,10:00,104.28,105.2,103.8,104.34,354749 +2019.11.13,10:00,104.18,105.36,103.6,104.0,266726 +2019.11.14,10:00,104.6,105.38,104.14,105.28,314981 +2019.11.15,10:00,105.32,106.22,104.54,105.4,246356 +2019.11.18,10:00,105.4,106.8,105.4,106.8,282828 +2019.11.19,10:00,106.76,107.0,105.72,106.1,195713 +2019.11.20,10:00,104.94,105.36,103.64,104.2,483282 +2019.11.21,10:00,104.18,104.86,104.0,104.46,131380 +2019.11.22,10:00,104.46,105.48,104.4,104.66,177582 +2019.11.25,10:00,105.1,105.78,104.88,105.5,201517 +2019.11.26,10:00,105.54,106.36,105.28,105.28,395551 +2019.11.27,10:00,105.52,105.96,105.2,105.42,182783 +2019.11.28,10:00,105.6,106.06,104.56,104.56,204912 +2019.11.29,10:00,104.5,105.58,102.6,102.84,664556 +2019.12.02,10:00,103.0,104.24,101.74,102.24,703278 +2019.12.03,10:00,102.28,102.4,100.48,100.7,470370 +2019.12.04,10:00,101.0,101.44,99.76,101.2,545713 +2019.12.05,10:00,101.18,102.42,101.18,102.18,172872 +2019.12.06,10:00,102.36,102.66,101.7,102.2,104702 +2019.12.09,10:00,102.32,103.2,101.88,103.08,177427 +2019.12.10,10:00,102.7,103.14,101.2,102.02,285186 +2019.12.11,10:00,102.2,104.04,101.92,103.94,758085 +2019.12.12,10:00,104.04,105.86,104.04,105.1,1069858 +2019.12.13,10:00,105.46,105.7,104.24,104.98,414080 +2019.12.16,10:00,105.1,105.44,104.42,105.1,541275 +2019.12.17,10:00,104.96,106.02,104.9,105.76,563715 +2019.12.18,10:00,105.5,105.84,104.8,105.0,382693 +2019.12.19,10:00,105.4,105.4,104.04,104.48,416679 +2019.12.20,10:00,104.4,104.84,103.2,103.7,372013 +2019.12.23,10:00,103.74,104.24,103.52,104.08,330898 +2019.12.24,10:00,104.1,104.2,103.04,103.08,327022 +2019.12.25,10:00,103.1,103.48,102.8,103.34,182033 +2019.12.26,10:00,102.9,104.08,102.9,103.94,156734 +2019.12.27,10:00,103.88,104.36,103.42,103.78,306975 +2019.12.30,10:00,103.78,104.18,103.5,103.5,192007 +2020.01.03,10:00,103.32,103.9,103.12,103.34,250289 +2020.01.06,10:00,103.22,103.8,103.0,103.52,190506 +2020.01.08,10:00,103.02,103.68,102.42,102.88,304154 +2020.01.09,10:00,103.2,105.18,103.14,104.5,664319 +2020.01.10,10:00,104.82,105.88,104.22,105.04,578832 +2020.01.13,10:00,105.5,105.78,105.1,105.3,399466 +2020.01.14,10:00,105.6,110.2,105.36,108.5,2036716 +2020.01.15,10:00,108.6,111.78,108.5,110.7,1654352 +2020.01.16,10:00,111.02,112.0,109.82,109.86,683670 +2020.01.17,10:00,109.86,111.34,109.32,110.74,510478 +2020.01.20,10:00,110.9,115.58,110.68,115.0,1764001 +2020.01.21,10:00,115.0,115.16,113.26,113.9,704269 +2020.01.22,10:00,114.28,115.38,112.54,114.58,1100334 +2020.01.23,10:00,114.2,117.2,112.66,115.5,1484058 +2020.01.24,10:00,116.0,116.26,114.7,114.82,676155 +2020.01.27,10:00,112.9,112.9,108.3,110.7,2564315 +2020.01.28,10:00,110.8,110.8,107.02,108.8,1565095 +2020.01.29,10:00,109.28,109.68,107.74,108.0,1459902 +2020.01.30,10:00,107.02,109.4,105.74,107.8,1680949 +2020.01.31,10:00,108.52,108.8,107.04,107.4,713123 +2020.02.03,10:00,106.96,109.9,106.46,109.3,985434 +2020.02.04,10:00,110.28,113.34,109.78,111.94,1879254 +2020.02.05,10:00,112.5,118.28,112.22,117.46,2812463 +2020.02.06,10:00,118.08,120.8,117.66,118.98,1883677 +2020.02.07,10:00,119.0,119.8,117.0,119.62,833547 +2020.02.10,10:00,119.7,121.0,117.26,118.3,1287195 +2020.02.11,10:00,118.44,119.48,116.16,117.38,1007025 +2020.02.12,10:00,117.78,119.82,117.32,119.52,595634 +2020.02.13,10:00,119.1,121.64,118.4,119.5,971816 +2020.02.14,10:00,119.7,119.86,118.14,119.4,359782 +2020.02.17,10:00,119.7,120.4,119.5,120.3,347698 +2020.02.18,10:00,120.1,120.1,116.52,117.7,683099 +2020.02.19,10:00,117.52,119.2,116.76,117.4,607151 +2020.02.20,10:00,118.02,118.4,115.4,115.96,631706 +2020.02.21,10:00,115.7,116.48,114.3,115.86,466852 +2020.02.25,10:00,112.5,113.86,109.5,109.8,1701911 +2020.02.26,10:00,109.0,109.0,104.58,108.22,1874302 +2020.02.27,10:00,106.7,107.04,100.14,100.24,2974379 +2020.02.28,10:00,97.66,98.22,90.1,92.94,4395550 +2020.03.02,10:00,95.46,99.7,91.32,93.18,4065161 +2020.03.03,10:00,95.98,96.5,92.76,93.84,2260194 +2020.03.04,10:00,93.5,93.58,91.32,92.6,1379096 +2020.03.05,10:00,93.0,93.64,88.52,89.54,2390501 +2020.03.06,10:00,86.0,87.26,83.04,85.08,3835338 +2020.03.10,10:00,77.0,84.94,75.02,80.2,3651423 +2020.03.11,10:00,80.22,81.78,76.8,77.82,2581479 +2020.03.12,10:00,72.0,75.0,67.76,71.08,4162652 +2020.03.13,10:00,69.66,76.18,69.0,73.96,3153576 +2020.03.16,10:00,71.5,71.5,65.0,68.68,4114355 +2020.03.17,10:00,67.02,69.78,62.7,64.58,4475151 +2020.03.18,10:00,63.28,63.28,56.52,56.7,6443289 +2020.03.19,10:00,55.84,59.84,51.02,58.62,6672349 +2020.03.20,10:00,59.9,69.46,59.9,64.32,9755705 +2020.03.23,10:00,60.04,66.2,58.0,62.7,6399260 +2020.03.24,10:00,66.0,69.22,65.04,68.42,4555737 +2020.03.25,10:00,71.1,78.56,66.0,72.68,12736818 +2020.03.26,10:00,71.24,72.56,67.62,70.6,4805364 +2020.03.27,10:00,71.0,72.0,65.8,66.78,4512087 +2020.03.30,10:00,65.68,66.7,62.88,65.48,3534777 +2020.03.31,10:00,66.04,69.2,66.04,68.38,4134312 +2020.04.01,10:00,67.0,68.3,66.5,68.0,2077497 +2020.04.02,10:00,69.56,71.4,66.16,68.8,3245011 +2020.04.03,10:00,68.6,70.68,68.04,69.86,2622051 +2020.04.06,10:00,70.28,73.36,69.06,72.72,3266512 +2020.04.07,10:00,74.44,77.9,74.16,75.82,5284235 +2020.04.08,10:00,75.06,77.0,74.84,77.0,2347468 +2020.04.09,10:00,77.72,79.58,77.32,78.48,2895841 +2020.04.10,10:00,78.0,78.84,76.82,78.8,1096605 +2020.04.13,10:00,78.8,79.5,75.26,76.5,2094914 +2020.04.14,10:00,76.74,77.5,75.08,75.36,1623785 +2020.04.15,10:00,75.04,75.12,71.72,72.1,3621742 +2020.04.16,10:00,72.44,74.44,70.7,73.42,2338962 +2020.04.17,10:00,74.94,75.48,72.52,74.2,1788721 +2020.04.20,10:00,74.18,74.3,72.82,73.28,1051117 +2020.04.21,10:00,72.02,74.44,71.4,73.94,1794908 +2020.04.22,10:00,73.9,75.96,73.36,75.12,1508193 +2020.04.23,10:00,75.5,76.52,74.34,75.0,1425286 +2020.04.24,10:00,74.96,74.98,73.2,73.62,1107896 +2020.04.27,10:00,74.0,74.8,73.8,74.38,613542 +2020.04.28,10:00,74.5,75.9,74.1,75.44,1117221 +2020.04.29,10:00,75.7,76.88,75.32,76.5,1404907 +2020.04.30,10:00,76.8,77.86,74.42,75.76,1986774 +2020.05.04,10:00,75.0,75.0,73.2,74.4,1039031 +2020.05.05,10:00,75.0,75.88,74.52,75.7,636867 +2020.05.06,10:00,75.9,76.24,75.02,75.3,559948 +2020.05.07,10:00,75.48,75.98,73.6,74.1,1526560 +2020.05.08,10:00,74.78,74.78,72.3,72.88,1539945 +2020.05.12,10:00,73.0,73.42,71.9,72.32,1216007 +2020.05.13,10:00,72.4,73.36,71.4,72.0,1466279 +2020.05.14,10:00,71.9,72.9,71.66,72.16,923501 +2020.05.15,10:00,72.32,72.8,70.7,70.94,1550839 +2020.05.18,10:00,71.82,71.9,70.04,71.56,1961888 +2020.05.19,10:00,72.0,73.2,71.78,72.62,1619113 +2020.05.20,10:00,72.84,73.48,72.2,73.02,1420936 +2020.05.21,10:00,73.28,74.0,72.14,72.68,1436112 +2020.05.22,10:00,72.18,73.1,70.9,73.0,1196499 +2020.05.25,10:00,73.38,73.9,72.72,73.6,1173985 +2020.05.26,10:00,74.0,75.24,73.72,74.46,1977952 +2020.05.27,10:00,74.46,79.7,74.16,77.9,5784487 +2020.05.28,10:00,78.58,79.7,77.86,79.2,2503833 +2020.05.29,10:00,79.1,79.54,76.88,78.06,2117034 +2020.06.01,10:00,78.42,82.7,78.42,81.88,3714139 +2020.06.02,10:00,82.66,85.0,81.9,84.4,3904907 +2020.06.03,10:00,85.04,87.6,84.7,86.6,3745661 +2020.06.04,10:00,86.6,89.0,85.1,85.96,3320027 +2020.06.05,10:00,86.5,89.88,85.64,89.8,3526218 +2020.06.08,10:00,90.54,95.7,90.16,95.7,7403146 +2020.06.09,10:00,96.72,97.74,91.58,92.4,6005877 +2020.06.10,10:00,92.62,93.98,87.58,89.28,5857558 +2020.06.11,10:00,87.94,88.84,85.24,87.7,3519719 +2020.06.15,10:00,85.5,88.24,83.62,87.64,2966702 +2020.06.16,10:00,89.0,90.86,88.7,89.6,2659655 +2020.06.17,10:00,90.26,90.34,84.68,85.0,3028241 +2020.06.18,10:00,82.88,84.14,80.34,81.0,6471049 +2020.06.19,10:00,81.5,83.2,81.16,81.7,2975553 +2020.06.22,10:00,81.72,83.98,80.26,81.14,1850295 +2020.06.23,10:00,82.04,82.48,80.4,81.34,1684893 +2020.06.25,10:00,79.78,80.8,78.22,80.0,2155986 +2020.06.26,10:00,80.5,81.44,78.76,79.62,1467728 +2020.06.29,10:00,79.0,83.0,77.44,82.5,3779074 +2020.06.30,10:00,82.82,83.62,80.98,81.82,2364457 +2020.07.02,10:00,82.36,84.22,81.4,82.1,1888654 +2020.07.03,10:00,80.9,81.38,79.56,80.84,1989110 +2020.07.06,10:00,81.36,82.64,80.5,80.8,1836402 +2020.07.07,10:00,81.0,81.42,80.12,80.12,904048 +2020.07.08,10:00,80.36,81.38,80.12,80.44,748877 +2020.07.09,10:00,80.9,82.0,80.4,80.52,1281256 +2020.07.10,10:00,80.5,81.76,80.22,81.3,877549 +2020.07.13,10:00,81.62,82.7,80.44,81.22,954140 +2020.07.14,10:00,81.0,81.68,79.64,81.0,1364477 +2020.07.15,10:00,81.8,83.3,81.26,82.36,1548818 +2020.07.16,10:00,82.44,83.32,82.08,82.58,786110 +2020.07.17,10:00,82.08,83.34,82.08,83.1,765466 +2020.07.20,10:00,83.26,84.96,82.6,84.74,1300150 +2020.07.21,10:00,85.2,87.94,84.88,87.6,2637309 +2020.07.22,10:00,88.0,88.78,85.2,85.9,1934201 +2020.07.23,10:00,86.12,86.92,84.7,86.1,978043 +2020.07.24,10:00,85.44,89.4,84.28,88.22,3263420 +2020.07.27,10:00,88.64,89.5,86.44,87.3,1596686 +2020.07.28,10:00,87.3,87.66,82.86,83.6,4578872 +2020.07.29,10:00,83.46,84.36,82.1,83.56,1642596 +2020.07.30,10:00,83.68,83.8,81.7,82.24,1701073 +2020.07.31,10:00,82.54,83.54,82.18,82.54,1181336 +2020.08.03,10:00,83.2,84.28,83.18,83.74,1180243 +2020.08.04,10:00,83.72,84.08,81.72,81.9,2018553 +2020.08.05,10:00,82.08,82.72,80.52,82.0,2151550 +2020.08.06,10:00,80.0,83.12,78.22,81.98,3454982 +2020.08.07,10:00,81.8,82.18,81.38,81.5,1332254 +2020.08.10,10:00,81.6,83.2,81.56,83.04,1650652 +2020.08.11,10:00,83.2,83.8,82.7,83.7,1354656 +2020.08.12,10:00,83.58,89.18,83.12,85.5,6858607 +2020.08.13,10:00,85.5,88.0,85.48,86.22,2075899 +2020.08.14,10:00,86.12,86.9,85.14,85.86,817395 +2020.08.17,10:00,86.22,86.6,84.4,85.06,577305 +2020.08.18,10:00,85.06,85.14,83.12,83.48,972185 +2020.08.19,10:00,83.56,83.92,82.46,83.6,617991 +2020.08.20,10:00,83.48,83.84,82.8,82.84,488861 +2020.08.21,10:00,83.22,83.88,82.6,83.16,442902 +2020.08.24,10:00,83.94,84.36,83.46,84.0,470381 +2020.08.25,10:00,84.18,91.18,81.82,83.16,638150 +2020.08.26,10:00,83.04,83.94,82.86,83.2,585049 +2020.08.27,10:00,83.38,83.4,82.38,82.9,421546 +2020.08.28,10:00,83.02,83.08,81.9,82.6,443385 +2020.08.31,10:00,82.62,82.88,80.0,80.8,1098117 +2020.09.01,10:00,80.84,82.4,80.24,82.0,772252 +2020.09.02,10:00,82.02,82.6,80.88,81.78,507052 +2020.09.03,10:00,81.5,82.5,80.78,81.8,759514 +2020.09.04,10:00,81.28,82.32,80.6,81.66,410033 +2020.09.07,10:00,81.8,82.32,81.32,81.92,187753 +2020.09.08,10:00,81.94,82.26,80.68,81.54,529178 +2020.09.09,10:00,81.14,82.2,80.96,82.08,407452 +2020.09.10,10:00,82.1,82.12,81.16,81.98,361025 +2020.09.11,10:00,81.54,82.8,81.4,81.88,450225 +2020.09.14,10:00,82.0,82.5,80.7,82.34,939056 +2020.09.15,10:00,82.22,82.44,81.78,82.4,439878 +2020.09.16,10:00,82.14,83.76,82.14,82.9,628819 +2020.09.17,10:00,82.32,83.08,82.02,82.02,520149 +2020.09.18,10:00,82.4,82.4,81.2,81.5,622984 +2020.09.21,10:00,80.98,81.0,77.58,79.0,1219171 +2020.09.22,10:00,79.12,79.3,76.86,77.36,868554 +2020.09.23,10:00,77.66,77.88,76.48,77.42,699057 +2020.09.24,10:00,77.46,77.46,75.54,76.04,880839 +2020.09.25,10:00,76.0,76.46,73.1,74.14,1253108 +2020.09.28,10:00,74.2,76.38,73.24,75.3,902357 +2020.09.29,10:00,76.44,76.44,73.58,74.2,971457 +2020.09.30,10:00,74.12,74.7,73.7,73.9,501953 +2020.10.01,10:00,74.36,74.36,70.5,70.5,1325138 +2020.10.02,10:00,70.0,71.64,68.0,68.6,2337523 +2020.10.05,10:00,69.0,69.2,65.0,65.3,3646718 +2020.10.06,10:00,65.66,69.14,65.02,67.64,3612920 +2020.10.07,10:00,67.7,68.3,64.72,65.34,2754560 +2020.10.08,10:00,64.0,64.92,61.8,62.02,4953849 +2020.10.09,10:00,60.66,61.5,59.0,60.0,11113438 +2020.10.12,10:00,60.92,60.94,59.4,59.7,3849424 +2020.10.13,10:00,59.5,59.8,57.66,58.2,5191016 +2020.10.14,10:00,57.8,59.34,57.12,58.7,4016157 +2020.10.15,10:00,59.2,59.6,57.16,57.66,3192958 +2020.10.16,10:00,58.14,59.14,57.66,58.38,2591543 +2020.10.19,10:00,58.2,58.88,57.9,58.5,1559132 +2020.10.20,10:00,58.56,58.7,57.48,58.02,2381175 +2020.10.21,10:00,58.14,58.86,58.0,58.44,1170767 +2020.10.22,10:00,58.4,59.62,58.26,59.24,2407739 +2020.10.23,10:00,59.48,60.58,59.48,59.7,2026609 +2020.10.26,10:00,59.72,60.3,58.04,58.28,2244250 +2020.10.27,10:00,58.6,58.66,57.1,57.78,2310807 +2020.10.28,10:00,57.46,57.7,55.02,55.3,4176518 +2020.10.29,10:00,55.16,57.44,54.5,56.2,2653645 +2020.10.30,10:00,55.9,57.88,55.3,56.9,3736727 +2020.11.02,10:00,57.24,57.26,55.1,56.38,2344356 +2020.11.03,10:00,56.92,58.7,56.54,58.44,2668932 +2020.11.05,10:00,58.68,60.1,58.08,59.62,3394538 +2020.11.06,10:00,59.0,59.86,58.4,59.5,2094111 +2020.11.09,10:00,60.0,68.1,58.8,64.7,15787830 +2020.11.10,10:00,64.94,66.2,63.72,65.0,5522253 +2020.11.11,10:00,65.36,67.78,65.34,67.3,5278563 +2020.11.12,10:00,66.48,66.8,64.8,66.3,2944104 +2020.11.13,10:00,65.4,67.3,64.36,66.86,4224130 +2020.11.16,10:00,67.7,70.2,67.7,68.9,6337193 +2020.11.17,10:00,69.68,70.04,66.34,67.3,4457644 +2020.11.18,10:00,67.3,69.8,66.94,69.36,4536879 +2020.11.19,10:00,68.36,69.22,67.1,68.2,2895064 +2020.11.20,10:00,68.2,69.22,68.02,68.9,1472447 +2020.11.23,10:00,69.0,70.1,68.82,69.22,2303128 +2020.11.24,10:00,69.72,72.62,69.36,71.9,5619936 +2020.11.25,10:00,72.74,74.98,70.76,71.48,6731702 +2020.11.26,10:00,72.26,73.08,70.32,71.3,3362119 +2020.11.27,10:00,71.14,72.28,70.4,72.1,2308508 +2020.11.30,10:00,71.6,72.62,70.7,72.18,2476958 +2020.12.01,10:00,72.1,72.42,71.46,71.9,1864729 +2020.12.02,10:00,72.0,72.5,71.7,72.02,1580171 +2020.12.03,10:00,72.28,74.32,72.24,73.5,3426665 +2020.12.04,10:00,74.2,75.48,73.34,74.2,3689937 +2020.12.07,10:00,74.22,75.12,73.6,73.9,2568954 +2020.12.08,10:00,74.0,74.0,71.36,72.22,2860833 +2020.12.09,10:00,72.96,73.26,71.52,72.0,2008609 +2020.12.10,10:00,71.98,72.4,71.1,71.82,1964957 +2020.12.11,10:00,71.96,73.08,71.1,71.26,2294929 +2020.12.14,10:00,71.88,72.24,69.54,70.5,3633365 +2020.12.15,10:00,70.8,71.1,69.6,70.08,1854163 +2020.12.16,10:00,70.1,71.48,69.76,70.98,1840637 +2020.12.17,10:00,71.5,72.2,70.6,70.6,2321017 +2020.12.18,10:00,71.0,72.38,70.74,71.0,3698865 +2020.12.21,10:00,70.82,70.9,66.54,68.16,5539850 +2020.12.22,10:00,67.98,69.7,67.5,69.08,2115879 +2020.12.23,10:00,68.62,69.88,68.32,69.52,1165692 +2020.12.24,10:00,69.5,69.66,68.72,69.04,918764 +2020.12.25,10:00,69.34,69.34,68.68,68.96,547515 +2020.12.28,10:00,69.24,70.26,69.12,69.5,1094887 +2020.12.29,10:00,69.84,71.64,69.5,70.38,2164107 +2020.12.30,10:00,70.76,71.98,70.66,71.18,1866001 +2021.01.04,10:00,71.76,73.1,71.6,72.32,1772446 +2021.01.05,10:00,72.0,72.86,71.8,72.84,1312066 +2021.01.06,10:00,72.88,73.78,72.62,73.3,1847885 +2021.01.08,10:00,73.3,73.82,73.0,73.3,1630061 +2021.01.11,10:00,73.38,74.56,72.68,73.74,2611091 +2021.01.12,10:00,73.94,74.54,73.12,73.54,1656697 +2021.01.13,10:00,74.12,74.38,72.92,73.36,1325418 +2021.01.14,10:00,73.4,73.76,72.74,73.2,1463773 +2021.01.15,10:00,73.0,73.6,72.08,72.6,1450600 +2021.01.18,10:00,72.5,73.0,72.22,72.44,1010226 +2021.01.19,10:00,72.96,74.3,72.68,73.4,2437841 +2021.01.20,10:00,73.68,74.28,73.3,73.8,1275438 +2021.01.21,10:00,73.84,73.98,72.24,72.52,1326893 +2021.01.22,10:00,72.46,72.74,71.12,72.16,1773140 +2021.01.25,10:00,72.18,72.46,70.2,71.1,2570096 diff --git a/tests/test_PriceGenerator.py b/tests/test_PriceGenerator.py new file mode 100644 index 0000000..634c2e8 --- /dev/null +++ b/tests/test_PriceGenerator.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- + +import pytest +import os +import pandas as pd +import numpy as np +from datetime import datetime, timedelta +from dateutil.tz import tzlocal +import random + +from pricegenerator import PriceGenerator as pg + + +class TestFeatures: + + @pytest.fixture(scope='function', autouse=True) + def init(self): + pg.uLogger.level = 50 # Disable debug logging while test, logger CRITICAL = 50 + pg.uLogger.handlers[0].level = 50 # Disable debug logging for STDOUT + + self.model = pg.PriceGenerator() # init generator for the next tests + + def test_Generate(self): + self.model.Generate() + assert isinstance(self.model.prices, pd.DataFrame) is True, "Expected Pandas DataFrame when Generate()!" + + def test_LoadFromFile(self): + self.model.LoadFromFile(os.path.join("tests", "AFLT_day.csv")) + assert isinstance(self.model.prices, pd.DataFrame) is True, "Expected Pandas DataFrame when LoadFromFile()!" + assert self.model.horizon == 2775, "Expected 2775 string in test file 'AFLT_day.csv'! 'Horizon' field also must be equal to 2775!" + assert self.model.ticker == "AFLT_day.csv", "Expected 'ticker' field is equal to 'AFLT_day.csv' after loading!" + + def test_SaveToFile(self): + self.model.horizon = 5 + self.model.Generate() + suffix = random.uniform(0, 1000000000) + name = "test{}.csv".format(suffix) + self.model.SaveToFile(name) + assert os.path.exists(name), "Expected .csv-file '{}' after saving but it is not exist!".format(name) + with open(name, "r") as fH: + horizon = len(fH.readlines()) + assert horizon == 5, "Expected 5 lines in file '{}' but there is {}!".format(name, horizon) + + def test_RenderBokeh(self): + self.model.horizon = 5 + self.model.Generate() + suffix = random.uniform(0, 1000000000) + name = "test_render_bokeh{}.html".format(suffix) + nameMD = "{}.md".format(name) + self.model.RenderBokeh(fileName=name, viewInBrowser=False) + assert os.path.exists(name), "Expected .html-file '{}' after saving but it is not exist!".format(name) + assert os.path.exists(nameMD), "Expected markdown file '{}' after saving but it is not exist!".format(nameMD) + + def test_PandasDFheaders(self): + headers = ["datetime", "open", "high", "low", "close", "volume"] + self.model.Generate() + assert list(self.model.prices) == headers, "Expected headers: {}".format(headers) + + def test_DetectPrecision(self): + testData = [ + [np.array([1, 2, 3], dtype=float), 1], # precision can be 1 + [np.array([1., 2., 3.], dtype=float), 1], # precision can be 1 + [np.array([1.1, 2.2, 3.3], dtype=float), 1], # precision can be 1 + [np.array([1.11, 2.2, 3.3], dtype=float), 1], # precision can be 1 + [np.array([1.11, 2.22, 3.3], dtype=float), 2], # precision can be 2 + [np.array([1.11, 2.22, 3.33], dtype=float), 2], # precision can be 2 + [np.array([1.11, 2.22, 3.3, 4.4], dtype=float), 2], # precision can be 2 by default because mode() error + [np.array([1.111, 2.22, 3.333, 4.444], dtype=float), 3], # precision can be 3 + [np.array([1.111, 2.222, 3.3, 4.4], dtype=float), 2], # precision can be 2 by default because mode() error + [np.array([1.1111, 2.2222, 3.3333, 4.4], dtype=float), 4], # precision can be 4 + [np.array([1.1111, 2., 3., 4.], dtype=float), 1], # precision can be 1 + [np.array([1.1111, 2.2222, 3., 4.], dtype=float), 2], # precision can be 2 by default because mode() error + [np.array([1.1111, 2.2222, 3.1, 4.44], dtype=float), 4], # precision can be 4 + ] + for test in testData: + self.model.DetectPrecision(test[0]) + assert self.model.precision == test[1], "Expected precision = {} for chain:\n{}".format(test[1], test[0]) + + def test_precision(self): + testData = [1, 2, 3, 4] + for test in testData: + self.model.precision = test # set test data as "precision" field in PriceGenerator() class + self.model.Generate() + self.model.DetectPrecision(self.model.prices.close.values) # re-calc and update "precision" field + assert test == self.model.precision, "Expected precision = {} for chain:\n{}".format(test, self.model.prices.close.values) + + def test_timeframe(self): + testData = [ + timedelta(seconds=1), timedelta(seconds=15), timedelta(seconds=30), timedelta(seconds=60), + timedelta(minutes=1), timedelta(minutes=15), timedelta(minutes=30), timedelta(minutes=60), + timedelta(hours=1), timedelta(hours=4), timedelta(hours=12), timedelta(hours=24), + timedelta(days=1), timedelta(days=5), timedelta(days=7), timedelta(days=30), timedelta(days=31), + ] + for test in testData: + self.model.timeframe = test # set test data as "timeframe" field in PriceGenerator() class + self.model.Generate() + # auto-detect time delta between last two neighbour candles: + timeframe = min( + self.model.prices.iloc[-1].datetime - self.model.prices.iloc[-2].datetime, + self.model.prices.iloc[-2].datetime - self.model.prices.iloc[-3].datetime + ) + assert test == timeframe, "Expected timeframe between last two neighbour candles: {}".format(timeframe) + + def test_timeStart(self): + testData = [ + datetime.now(tzlocal()), # current time + datetime.now(tzlocal()).replace(microsecond=0, second=0, minute=0), # current time rounded to day start + datetime.strptime("2021-01-01 00:00:00", "%Y-%m-%d %H:%M:%S"), + datetime.strptime("2021-02-03 04:05:06", "%Y-%m-%d %H:%M:%S"), + datetime.strptime("2021-01-01 23:59:59", "%Y-%m-%d %H:%M:%S"), + datetime.strptime("2021-01-01 00:00:01", "%Y-%m-%d %H:%M:%S"), + ] + for test in testData: + self.model.timeStart = test # set test data as "timeStart" field in PriceGenerator() class + self.model.Generate() + assert test.timestamp() == self.model.prices.datetime[0].timestamp(), "Expected datetime = {}".format(test) + + def test_horizon(self): + testData = [[-1, 5], [0, 5], [1, 5], [4, 5], [5, 5], [6, 6], [10, 10], [99, 99], [333, 333]] + for test in testData: + self.model.horizon = test[0] # set test data as "horizon" field in PriceGenerator() class + self.model.Generate() # horizon update during generating and must be >=5 + assert test[1] == self.model.horizon, "Expected class field 'horizon' = {} for requested horizon: {}".format(test[1], test[0]) + + def test_minClose_maxClose(self): + testData = [[0, 1], [1, 10], [100, 101]] + for test in testData: + self.model.minClose = test[0] # set test data as "minClose" field in PriceGenerator() class + self.model.maxClose = test[1] # set test data as "maxClose" field in PriceGenerator() class + self.model.initClose = None # always re-calc start close value + self.model.Generate() # minClose <= all close prices <= maxClose + assert (self.model.prices.close < test[0]).any() == False, "There are some values generated less than minClose: {}! All close values:\n{}".format(test[0], list(self.model.prices.close)) + assert (self.model.prices.close > test[1]).any() == False, "There are some values generated more than maxClose: {}! All close values:\n{}".format(test[1], list(self.model.prices.close)) + + def test_initClose(self): + testData = [None, 0, 1, 5., 9.9, 10] + for test in testData: + self.model.minClose = 0 + self.model.maxClose = 10 + self.model.initClose = test # set test data as "initClose" field in PriceGenerator() class + self.model.Generate() # open price of first candle must be equal self.initClose or if None: minClose <= 1st open price <= maxClose + assert self.model.minClose <= self.model.prices.open[0] <= self.model.maxClose, "minClose <= 1st open price <= maxClose, but 1st open price = {}".format(test) + if test is not None: + assert test == self.model.prices.open[0], "close price of first candle must be equal 'initClose' = {}, but 1st close price = {}".format(test, self.model.prices.close[0]) + + def test_maxOutlier(self): + testData = [None, 0, 1, 10, 100] + for test in testData: + self.model.horizon = 10 + self.model.minClose = 10 + self.model.maxClose = 110 + self.model.maxCandleBody = 10 + self.model.initClose = 50 + self.model.maxOutlier = test # set test data as "maxOutlier" field in PriceGenerator() class + self.model.Generate() # if maxOutlier == None then used (maxClose - minClose) / 10 + if test is None: + correctOutliers = (self.model.maxClose - self.model.minClose) / 10 + assert self.model.maxOutlier == correctOutliers, "if maxOutlier == None then used (maxClose - minClose) / 10 = {} but {} given!".format(correctOutliers, self.model.maxOutlier) + else: + upperOutliers = [] + lowerOutliers = [] + for item in range(self.model.horizon): + upperOutliers.append(self.model.prices.high[item] - max(self.model.prices.open[item], self.model.prices.close[item])) + lowerOutliers.append(min(self.model.prices.open[item], self.model.prices.close[item]) - self.model.prices.low[item]) + maxHighOutliers = max(upperOutliers) + maxLowOutliers = max(lowerOutliers) + maxHalfBodies = max(list(abs(self.model.prices.open - self.model.prices.close) / 2)) + assert maxHighOutliers <= test + maxHalfBodies, "All candle 'tails' must be less than maxOutlier + maxHalfBodies = {} + {}, but there are some values more than maxOutlier!\nList of upper tails: {}".format(test, maxHalfBodies, upperOutliers) + assert maxLowOutliers <= test + maxHalfBodies, "All candle 'tails' must be less than maxOutlier + maxHalfBodies = {} + {}, but there are some values more than maxOutlier!\nList of lower tails: {}".format(test, maxHalfBodies, lowerOutliers) + + def test_maxCandleBody(self): + testData = [None, 0, 1, 10, 100] + for test in testData: + self.model.horizon = 10 + self.model.minClose = 10 + self.model.maxClose = 110 + self.model.maxOutlier = 10 + self.model.initClose = 50 + self.model.maxCandleBody = test # set test data as "maxCandleBody" field in PriceGenerator() class + self.model.Generate() # if maxOutlier == None then used (maxClose - minClose) / 10 + if test is None: + correctMaxCandleBody = self.model.maxOutlier * 0.9 + assert self.model.maxCandleBody == correctMaxCandleBody, "if maxCandleBody == None then used maxOutlier * 90% = {} but {} given!".format(correctMaxCandleBody, self.model.maxCandleBody) + else: + bodies = list(abs(self.model.prices.open - self.model.prices.close)) + maxBody = max(bodies) + assert maxBody <= test, "All candles bodies must be less than maxCandleBody = {}, but there are some values more than maxCandleBody!\nList of bodies: {}".format(test, bodies) + + def test_maxVolume(self): + testData = [[-1, 0], [None, 0], [0, 0], [1, 1], [10, 10], [100, 100]] + for test in testData: + self.model.horizon = 10 + self.model.minClose = 10 + self.model.maxClose = 110 + self.model.maxOutlier = 10 + self.model.initClose = 50 + self.model.maxCandleBody = 20 + self.model.maxVolume = test[0] # set test data as "maxVolume" field in PriceGenerator() class + self.model.Generate() + assert self.model.prices.volume.max() <= test[1], "All candles volumes must be less than maxVolume = {}, but there are some values more than maxVolume!\nList of volumes: {}".format(test[1], list(self.model.prices.volume))