diff --git a/.env.example b/.env.example index c695e62..46bd059 100644 --- a/.env.example +++ b/.env.example @@ -13,7 +13,7 @@ # ── SOURCE 2: FRED ─────────────────────────────────────────────── # Free registration: https://fred.stlouisfed.org/docs/api/api_key.html # Click "Request API Key" after creating a free account. -FRED_API_KEY=891f55aef63158096a05cae73dc3290b +FRED_API_KEY=your_fred_api_key_here # ── SOURCE 3: GDELT via Google BigQuery ────────────────────────── diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..9199a1c --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,37 @@ +name: tests + +on: + push: + pull_request: + +jobs: + research: + name: pipeline + unit tests (Python 3.12) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + - run: pip install -r requirements-research.txt + - run: pytest -q + - name: Rebuild models and dashboard data from raw prices + run: python run_pipeline.py --fast volatility + - name: Fail if committed models drifted from what the code produces + run: git diff --exit-code -- models/ + + dashboard: + name: dashboard (Python ${{ matrix.python }}) + runs-on: ubuntu-latest + strategy: + matrix: + python: ["3.11", "3.13"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python }} + cache: pip + - run: pip install -r dashboard/requirements.txt pytest + - run: pytest -q tests/test_dashboard.py tests/test_volatility.py diff --git a/.gitignore b/.gitignore index 9fe8042..852c100 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ notebooks/data/raw/ # Parquet cache files *.parquet + +# Streamlit secrets (use st.secrets; never commit) +.streamlit/secrets.toml diff --git a/.streamlit/config.toml b/.streamlit/config.toml new file mode 100644 index 0000000..cc6bff7 --- /dev/null +++ b/.streamlit/config.toml @@ -0,0 +1,12 @@ +[theme] +base = "dark" +primaryColor = "#00c8f8" +backgroundColor = "#0b0f17" +secondaryBackgroundColor = "#131a26" +textColor = "#dce8f5" + +[browser] +gatherUsageStats = false + +[client] +toolbarMode = "viewer" diff --git a/README.md b/README.md index 12a99ac..e8a652c 100644 --- a/README.md +++ b/README.md @@ -1,287 +1,79 @@ -# FinSentinel — Market Intelligence System +# FinSentinel — stress, fragility and volatility in BTC and NIFTY 50 -**Financial Sentiment & Market Dynamics Research** -BTC · NIFTY 50 · GMSI · MFI · Shock Propagation +A research project on **how volatile BTC-USD and the NIFTY 50 index will be next week**, and whether +**news-based stress** and **market fragility** measures add anything to that picture. +Daily data: BTC 2015–2025, NIFTY 2010–2025. -[![Live Dashboard](https://img.shields.io/badge/Live%20Dashboard-FinSentinel-00d4ff?style=flat-square&logo=streamlit)](https://financial-sentiment-market-analysis.streamlit.app/) -[![SSRN](https://img.shields.io/badge/Paper%201-In%20Progress-f59e0b?style=flat-square)](https://ssrn.com) -[![Python](https://img.shields.io/badge/Python-3.11-3b82f6?style=flat-square&logo=python)](https://python.org) -[![License](https://img.shields.io/badge/License-MIT-10b981?style=flat-square)](LICENSE) +Dashboard: `streamlit run dashboard/app.py` · Deployment guide: [`docs/DEPLOY.md`](docs/DEPLOY.md) · +Start reading: [`docs/README.md`](docs/README.md) --- -## 🔗 Live Dashboard +## Results (all reproducible with `python run_pipeline.py`) -**[financial-sentiment-market-analysis.streamlit.app](https://financial-sentiment-market-analysis.streamlit.app/)** - -Real-time analysis of global stress, market fragility, and shock propagation across BTC and NIFTY 50. - ---- - -## Overview - -This project investigates **why and how markets move** — not price prediction. - -The core research question: *How does global stress interact with market fragility and positioning to produce volatility?* - -Built on three original contributions: - -| Contribution | Description | -|---|---| -| **GMSI** | Global Market Stress Index — pure exogenous composite from GDELT events, FinBERT/VADER sentiment, and attention signals. Zero price-derived inputs. | -| **MFI** | Market Fragility Index — composite of volatility persistence (AC₁), vol-of-vol (CoV), and tail risk frequency. Interpretable, no-lookahead. | -| **Shock Propagation** | Forward volatility decay analysis after top-5% return events, conditioned on GMSI regime. Approximate half-life estimation. | - ---- - -## Key Findings - -### Finding 1 — The Complacency Effect *(Paper 1)* -Low GMSI (calm stress signal) predicts **higher** forward volatility, not lower. - -``` -E[7d Vol | GMSI Quintile] -Q1 (Low Stress): BTC = 0.0325 NIFTY = 0.0105 ← Highest -Q3 (Medium): BTC = 0.0278 NIFTY = 0.0080 -Q5 (High Stress): BTC = 0.0294 NIFTY = 0.0076 ← Lowest -``` - -Mechanism: low measured stress → investor complacency → under-hedged positioning → larger shock impact when any event eventually arrives. - -### Finding 2 — Statistically Significant via Placebo Test *(Paper 1)* -500-permutation placebo test: real Spearman correlation (BTC: −0.084, NIFTY: −0.058) falls in the bottom 2–5% of the null distribution. The relationship is not by chance. - -### Finding 3 — The AC1 Paradox *(Paper 2)* -Volatility persistence (AC₁ of |returns|) **decreases** as stress increases: - -``` -NIFTY Vol Persistence by Regime: - Low Stress: AC1 = 0.148 ← Shocks linger longest - Medium: AC1 = 0.117 - High Stress: AC1 = 0.083 ← Shocks decay fastest -``` - -Markets in high-stress regimes are alert and mean-revert quickly. Markets in low-stress regimes are complacent — shocks find no prepared hedges and persist. - -### Finding 4 — BTC Shock Secondary Wave *(Paper 2)* -BTC forward volatility peaks at **t+3** after a shock, not t+1. NIFTY peaks immediately at t+1 and decays monotonically. BTC's delayed peak reflects retail investor lag — narrative accumulates before trading execution. - ---- - -## Dashboard Pages - -| Page | Content | +| Question | Answer from the data | |---|---| -| **Overview** | Key findings, asset prices, regime timeline | -| **GMSI & Conditional Vol** | Real conditional expectation charts by GMSI quintile | -| **Placebo & Robustness** | 500-permutation null distribution vs real correlations | -| **Market Fragility (MFI)** | MFI time series 2016–2024, component decomposition | -| **Shock Propagation** | Forward vol decay curves, regime-conditioned shock response | -| **Regime Analysis** | Volatility distributions, Wasserstein distances, AC1 paradox | -| **Methodology** | Full pipeline diagram, GMSI construction, statistical methods | +| Can next-week volatility be forecast? | **A little, mostly from its own past.** A 4-parameter HAR model on trailing 5/22/60-day realised volatility gets out-of-sample R² (log σ) of **0.047 (BTC)** and **0.100 (NIFTY)** in purged walk-forward tests. It beats a Random Forest (−0.026 / 0.062), a persistence forecast and the historical mean on RMSE, MAE, R² and QLIKE. | +| Where does it fail? | Event weeks it cannot see coming: the March 2020 COVID crash (largest misses for both assets), the Aug 2024 global sell-off (BTC) and the June 2024 Indian election-result week (NIFTY). It shrinks toward the mean: it over-predicts calm weeks and under-predicts turbulent ones. | +| How long do shocks last? | After a top-5% daily move, BTC's absolute returns stay **~1.5–1.7× normal for three weeks**; NIFTY's start at **2.0×** and fade to **1.3×** after 21 days. | +| Does the news-based stress index (GMSI) predict volatility? | **Weakly at best.** Its lowest-stress quintile precedes the highest forward volatility (Spearman ρ = −0.084 BTC, −0.058 NIFTY), but once autocorrelation is handled the significance is borderline for BTC (**p ≈ 0.05**) and absent for NIFTY (**p ≈ 0.16**). The "complacency effect" is a hypothesis, not a finding. | +| Does sentiment (FinBERT/VADER) help? | **Untested.** Headlines exist for only ~3 months (Oct 2024 – Jan 2025), about 13 usable rows. The sentiment Random Forest is archived. | ---- +> **Corrections.** Earlier versions of this repository and dashboard reported fragility, shock-decay and +> "AC₁ paradox" results that had been generated from **simulated data** by a silent fallback. They also showed +> p-values from a placebo test that is invalid for persistent series, and served a Random Forest that predicted +> a constant. All of these were removed or recomputed. The full audit is in [`docs/ISSUES.md`](docs/ISSUES.md). -## Project Architecture +## Repository layout ``` -financial-sentiment-market-analysis/ -│ -├── dashboard/ # Live Streamlit dashboard -│ ├── app.py # Main dashboard (1200 lines) -│ ├── requirements.txt # Dashboard-only dependencies -│ ├── runtime.txt # Python 3.11 pin -│ └── assets/ # Real research figures -│ ├── cond_exp_BTC.png -│ ├── cond_exp_NIFTY.png -│ ├── fig1_mfi_btc.png -│ ├── fig3_regime_shock_nifty.png -│ ├── fig4_regime_stats_nifty.png -│ ├── fig5_mfi_components_btc.png -│ ├── fig6_shock_decay_comparison.png -│ ├── gmsi_sanity_checks.png -│ ├── placebo_test_BTC.png -│ └── placebo_test_NIFTY.png -│ -├── notebooks/ -│ ├── 01_data_collection.ipynb -│ ├── 02_preprocessing.ipynb -│ ├── 03_sentiment_analysis.ipynb -│ ├── 04_time_alignment.ipynb -│ ├── 05_correlation_analysis.ipynb -│ ├── 06_volatility_forecasting.ipynb -│ ├── 07_model_evaluation.ipynb -│ └── 08_market_dynamics_analysis.ipynb # MFI + Shock Propagation -│ -├── data_pipeline/ -│ ├── fetch_all.py # Master pipeline runner -│ ├── sources/ -│ │ ├── fetch_yfinance.py -│ │ ├── fetch_fred.py -│ │ ├── fetch_gdelt.py -│ │ ├── fetch_trends.py -│ │ ├── fetch_alphavantage.py -│ │ ├── fetch_reddit.py -│ │ ├── fetch_newsapi.py -│ │ └── fetch_quandl.py -│ └── utils/ -│ ├── cache.py -│ ├── manifest.py -│ └── logger.py -│ -├── data/ -│ ├── raw/ # Source CSVs (gitignored) -│ └── processed/ # Aligned master dataset (gitignored) -│ -├── models/ # Saved model artifacts -├── scripts/ # Automation scripts -├── requirements.txt # Full project dependencies -└── README.md +run_pipeline.py one command: raw prices → models/ + dashboard/data/ +pipeline/ tested library code shared by training, scripts and dashboard + volatility.py features, target, HAR model (JSON), input validation, forecast() + market_dynamics.py Market Fragility Index, shocks, regimes (past-only) + stats.py circular-shift permutation test, calibrated AR(1) null + sentiment.py FinBERT polarity by label name, text cleaning + data.py paths + validated price loaders + feature_engineering.py, train_rf_model.py, evaluate.py archived sentiment-RF experiment +dashboard/ Streamlit app (app.py, data.py, views/), pinned requirements +models/har_{btc,nifty}.json served models (plain JSON, no pickle) +data/raw/ committed prices, headlines, Google Trends +scripts/ GDELT download, GMSI construction/validation, market-dynamics figures +notebooks/ archived exploration (each starts with its known issues) +analysis/ forensic audit scripts + outputs (reproduce docs/ numbers) +tests/ pytest unit + Streamlit AppTest + Playwright smoke test +docs/ architecture, data, model, issues, deployment, interview prep ``` ---- - -## Data Sources - -| Source | Data | Notes | -|---|---|---| -| **yfinance** | BTC-USD, ^NSEI OHLCV | 2016–present, log returns, rolling vol | -| **FRED** | VIX, credit spreads, yield curve, TED spread | Macro fragility validation | -| **GDELT GKG** | Event counts, avg_tone, negative_share, conflict themes | BigQuery, 2015–present | -| **NewsAPI** | Financial headlines | FinBERT + VADER scoring pipeline | -| **Google Trends** | Search volume for 14 financial terms | Attention/fear proxy | -| **Alpha Vantage** | GDP, Fed Funds Rate, CPI | Macro gap-fill | - -**GMSI construction uses zero price-derived inputs.** Previous version had mechanical coupling (correlation ~0.9 with volatility). The corrected exogenous GMSI uses only event intensity, sentiment, and attention signals. - ---- - -## Methodology - -### GMSI — Global Market Stress Index - -``` -GMSI = w₁·EventIntensity + w₂·NegativeShare + w₃·GoldsteinInv - + w₄·FinBERT + w₅·VADER + w₆·SentimentSurprise + w₇·Attention - -Weights = PCA loading scores on first principal component. -Normalization = expanding min-max (zero look-ahead). -``` - -### MFI — Market Fragility Index - -``` -MFI = (A_norm + B_norm + C_norm) / 3 - -A: AC₁(|rₜ|) rolling 30d — Volatility Persistence -B: CoV(σ₇ᵈ) rolling 30d — Vol-of-Vol -C: P(|rₜ| > 2σ₃₀) rolling 30d — Tail Risk Frequency - -Each component: expanding min-max normalization. No look-ahead. -``` - -### Statistical Validation -- **Conditional expectation** E[Vol | GMSI quintile] — non-parametric, no distributional assumptions -- **Spearman rank correlation** — robust to fat tails -- **Placebo permutation test** (500 shuffles) — empirical null distribution -- **Wasserstein distance** between regime volatility distributions - ---- - -## Research Papers (In Progress) - -### Paper 1 — The Complacency Effect -*"When Calm Breeds Risk: Asymmetric Volatility Response to Global Stress Signals in Cryptocurrency and Equity Markets"* - -**Status:** Analysis complete → Writing -**Target:** Finance Research Letters / SSRN preprint -**Core finding:** Q1 (Low GMSI) predicts highest forward volatility. Confirmed via placebo test. - -### Paper 2 — Market Fragility as a Dynamical Property -*"Market Fragility as a Dynamical Property: Shock Propagation and Regime-Dependent Volatility Persistence"* - -**Status:** Analysis complete → Writing -**Target:** Quantitative Finance / Physica A -**Core finding:** MFI construction, shock half-life estimation, AC1 paradox across regimes. - ---- - -## Run Locally +## Run it ```bash -# Clone -git clone https://github.com/VT69/financial-sentiment-market-analysis.git -cd financial-sentiment-market-analysis +# training / analysis (Python 3.12+) +pip install -r requirements-research.txt +python run_pipeline.py # ~1 min: walk-forward eval, models, MFI, shocks, GMSI calibration +pytest -q -# Dashboard only (no heavy dependencies) +# dashboard (Python 3.11–3.14) pip install -r dashboard/requirements.txt streamlit run dashboard/app.py -# Full pipeline -pip install -r requirements.txt -cp .env.example .env # Add your API keys -python data_pipeline/fetch_all.py --source yfinance -python data_pipeline/fetch_all.py --source fred +# optional +pip install -r data_pipeline/requirements.txt && python data_pipeline/fetch_all.py --source yfinance +pip install -r requirements-nlp.txt # FinBERT re-scoring (torch / transformers) ``` ---- +The GMSI scripts (`scripts/reconstruct_gmsi.py`, `validate_gmsi.py`, `regime_analysis.py`) need GDELT-derived +files in `data/processed/` that are not committed (several GB of raw event files). They fail with a clear message +when the files are missing. -## Environment Setup +## Data sources and terms +- **Yahoo Finance via `yfinance`**: prices. Personal / research use only. +- **GDELT** (DOC API headlines; 1.0 event files): open data, attribution requested. +- **Google Trends**: monthly interest exports. -```bash -cp .env.example .env -``` - -Required keys (all free tiers): - -| Variable | Source | -|---|---| -| `FRED_API_KEY` | [fred.stlouisfed.org](https://fred.stlouisfed.org/docs/api/api_key.html) | -| `NEWSAPI_KEY` | [newsapi.org](https://newsapi.org/register) | -| `ALPHA_VANTAGE_KEY` | [alphavantage.co](https://www.alphavantage.co/support/#api-key) | -| `QUANDL_API_KEY` | [data.nasdaq.com](https://data.nasdaq.com/sign-up) | -| `REDDIT_CLIENT_ID` | [reddit.com/prefs/apps](https://www.reddit.com/prefs/apps) | -| `GOOGLE_APPLICATION_CREDENTIALS` | GCP service account (for GDELT BigQuery) | - ---- - -## Tech Stack - -**Analysis:** Python · Pandas · NumPy · SciPy · Statsmodels -**NLP:** HuggingFace Transformers · FinBERT · VADER -**Visualization:** Plotly · Matplotlib · Seaborn -**Dashboard:** Streamlit -**Data:** yfinance · fredapi · google-cloud-bigquery · pytrends -**Pipeline:** Modular fetch scripts · 24hr local caching · JSON manifest - ---- - -## Current Status - -``` -✅ Data pipeline (yfinance, FRED, GDELT, NewsAPI, Google Trends) -✅ GMSI constructed — exogenous, validated, leakage-free -✅ MFI built and validated against VIX -✅ Shock propagation analysis complete -✅ Placebo tests run — findings statistically significant -✅ Live dashboard deployed -🔄 Paper 1 — writing in progress -🔄 Paper 2 — writing in progress -⏳ FRED integration (API key pending) -⏳ HMM regime detection (Paper 3) -⏳ Volatility surface analysis (BTC options via Deribit) -``` - ---- +API keys for the optional fetchers go in `.env` (template: `.env.example`). Never commit `.env`. ## Author +Vaibhav Tiwari · B.Tech AI & ML, VIT Bhopal University · [github.com/VT69](https://github.com/VT69) -**Vaibhav Tiwari** -B.Tech AI & ML, VIT Bhopal University -📧 [vaibhavtiwari159@gmail.com](mailto:vaibhavtiwari159@gmail.com) -🔗 [linkedin.com/in/vt004](https://www.linkedin.com/in/vt004) -💻 [github.com/VT69](https://github.com/VT69) - ---- - -*This project is part of an ongoing research program in quantitative market dynamics. The dashboard and pipeline are designed to be modular and extensible for future research phases.* +*Research code. Not investment advice; not suitable for trading or risk decisions.* diff --git a/README_DATA.md b/README_DATA.md index 01e5a4b..4eec2a8 100644 --- a/README_DATA.md +++ b/README_DATA.md @@ -85,7 +85,7 @@ data/raw/ **Columns per CSV:** `open, high, low, close, volume, adj_close, log_return, vol_7d, vol_14d, vol_30d, vol_60d` -Rolling volatility is annualised (×√252). `log_return = ln(close / close_prev)`. +Rolling volatility is annualised with √365 for crypto (BTC-USD, ETH-USD) and √252 for everything else. `log_return = ln(close / close_prev)`. --- @@ -215,7 +215,7 @@ On quota hit (HTTP 429 or API-level rate message), the pipeline saves completed | Field | Value | |---|---| -| Library | `nasdaqdatalink` | +| Library | `nasdaqdatalink` (pip: `nasdaq-data-link`) | | API Key | `QUANDL_API_KEY` — free at [data.nasdaq.com](https://data.nasdaq.com/sign-up) | **Datasets attempted:** diff --git a/Untitled.ipynb b/Untitled.ipynb deleted file mode 100644 index 363fcab..0000000 --- a/Untitled.ipynb +++ /dev/null @@ -1,6 +0,0 @@ -{ - "cells": [], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/analysis/common.py b/analysis/common.py new file mode 100644 index 0000000..c7020a4 --- /dev/null +++ b/analysis/common.py @@ -0,0 +1,146 @@ +""" +analysis/common.py — shared loaders and faithful re-implementations of the +repo's own transformations, so the analysis scripts reproduce exactly what the +original notebooks/pipeline did (not an idealised version). + +Every function below cites the original code it mirrors. +""" +from __future__ import annotations + +import re +import subprocess +from pathlib import Path + +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[1] +RAW = ROOT / "data" / "raw" +OUT = ROOT / "analysis" / "outputs" +OUT.mkdir(parents=True, exist_ok=True) + +SEED = 42 +AUDITED_COMMIT = "e1eb270" # the commit audited in docs/; later commits fix or delete the files below + + +def legacy_bytes(repo_path: str) -> bytes: + """Content of `repo_path` as it was at the audited commit (needs a git checkout with history).""" + try: + return subprocess.run(["git", "show", f"{AUDITED_COMMIT}:{repo_path}"], cwd=ROOT, + check=True, capture_output=True).stdout + except (OSError, subprocess.CalledProcessError) as exc: + raise RuntimeError(f"Cannot read {repo_path}@{AUDITED_COMMIT}: run inside a full git clone " + f"(git fetch --unshallow if needed). {exc}") from exc + + +# ── Loaders ────────────────────────────────────────────────────────────────── + +def load_prices(asset: str) -> pd.DataFrame: + """data/raw/{btc,nifty}_prices.csv as committed (written by notebooks/01_data_collection.ipynb cell 3).""" + df = pd.read_csv(RAW / f"{asset.lower()}_prices.csv", parse_dates=["date"]) + return df.sort_values("date").reset_index(drop=True) + + +def load_text() -> pd.DataFrame: + return pd.read_csv(RAW / "text_data.csv") + + +def load_trends(asset: str) -> pd.DataFrame: + return pd.read_csv(RAW / f"{asset.lower()}_google_trends.csv") + + +# ── notebooks/02_preprocessing.ipynb cell 3-4 ─────────────────────────────── + +def clean_text(text): + if not isinstance(text, str): + return "" + text = text.lower() + text = re.sub(r"http\S+|www\S+", "", text) + text = re.sub(r"[^a-zA-Z\s]", "", text) + text = re.sub(r"\s+", " ", text).strip() + return text + + +def preprocess_text(text_df: pd.DataFrame) -> pd.DataFrame: + df = text_df.copy() + df["clean_text"] = df["text"].apply(clean_text) + return df[df["clean_text"].str.len() > 10] + + +# ── VADER (notebooks/03_sentiment_analysis.ipynb cell 5) ───────────────────── + +def vader_scores(texts: pd.Series) -> pd.Series: + from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer + v = SentimentIntensityAnalyzer() + return texts.apply(lambda t: v.polarity_scores(t)["compound"]) + + +# ── notebooks/04_time_alignment.ipynb cells 3,5-8 ──────────────────────────── + +def align_btc(prices: pd.DataFrame, sent: pd.DataFrame) -> pd.DataFrame: + """Reproduces btc_sentiment_aligned.csv. `sent` must have timestamp, asset, + finbert_score, vader_score columns.""" + p = prices.copy() + p["return"] = np.log(p["close"]).diff() # nb04 cell 3 overwrites pct return with log return + p = p.dropna() + s = sent.copy() + s["timestamp"] = pd.to_datetime(s["timestamp"], utc=True) + daily = (s.groupby([s["timestamp"].dt.date, "asset"]) + .agg({"finbert_score": "mean", "vader_score": "mean"}) + .reset_index().rename(columns={"timestamp": "date"})) + daily["date"] = pd.to_datetime(daily["date"]) + p["date"] = pd.to_datetime(p["date"]).dt.tz_localize(None) + m = pd.merge(p, daily[daily["asset"] == "BTC"], on="date", how="inner") + for lag in [1, 2, 3, 5]: + m[f"finbert_lag_{lag}"] = m["finbert_score"].shift(lag) + m[f"vader_lag_{lag}"] = m["vader_score"].shift(lag) + return m.dropna() + + +# ── pipeline/feature_engineering.py:3-56 (verbatim logic, print removed) ──── + +PIPELINE_FEATURES = [ + "finbert_score", "vader_score", + "finbert_surprise", "vader_surprise", + "abs_return", "sq_return", + "sent_x_vol5", "sent_x_vol22", "sent_x_absret", +] + + +def build_features(df: pd.DataFrame, target_horizon: int = 5): + df = df.sort_values("date").reset_index(drop=True) + df["vol_5"] = df["return"].rolling(5).std() + df["vol_22"] = df["return"].rolling(22).std() + df["vol_60"] = df["return"].rolling(60).std() + df["vol_target"] = df["return"].rolling(5).std().shift(-target_horizon) + df["log_vol_target"] = np.log(df["vol_target"] + 1e-6) + df["abs_return"] = np.abs(df["return"]) + df["sq_return"] = df["return"] ** 2 + df["finbert_surprise"] = df["finbert_score"] - df["finbert_score"].rolling(5).mean() + df["vader_surprise"] = df["vader_score"] - df["vader_score"].rolling(5).mean() + df["sent_x_vol5"] = df["finbert_score"] * df["vol_5"] + df["sent_x_vol22"] = df["finbert_score"] * df["vol_22"] + df["sent_x_absret"] = df["finbert_score"] * df["abs_return"] + df = df.dropna().reset_index(drop=True) + return df[PIPELINE_FEATURES], df["log_vol_target"], PIPELINE_FEATURES, df + + +# ── Price-only feature frame over the FULL history (for honest re-evaluation) ─ + +def price_feature_frame(prices: pd.DataFrame, horizon: int = 5) -> pd.DataFrame: + """Same price features + target definition as pipeline/feature_engineering.py, + but computed over the full committed price history (sentiment does not exist + before 2024-10-03, so it cannot be included here).""" + df = prices[["date", "close"]].copy() + df["return"] = np.log(df["close"]).diff() + df["abs_return"] = df["return"].abs() + df["sq_return"] = df["return"] ** 2 + df["vol_5"] = df["return"].rolling(5).std() + df["vol_22"] = df["return"].rolling(22).std() + df["vol_60"] = df["return"].rolling(60).std() + df["vol_target"] = df["return"].rolling(5).std().shift(-horizon) + df["log_vol_target"] = np.log(df["vol_target"] + 1e-6) + return df.dropna().reset_index(drop=True) + + +PRICE_FEATURES = ["abs_return", "sq_return", "vol_5", "vol_22", "vol_60"] diff --git a/analysis/data_profile.py b/analysis/data_profile.py new file mode 100644 index 0000000..c1e5942 --- /dev/null +++ b/analysis/data_profile.py @@ -0,0 +1,502 @@ +""" +analysis/data_profile.py — exhaustive, reproducible profile of every dataset +committed to this repository. + +Run from the repo root: + pip install -r analysis/requirements.txt + python analysis/data_profile.py + +Everything printed here is also written to analysis/outputs/ (CSV / TXT / PNG, +plus profile_summary.json). docs/DATA_REPORT.md quotes these outputs. + +What CAN'T be profiled (not committed / not reachable): everything under +data/processed/ (gitignored), the GDELT events files used to build GMSI, and +FinBERT scores (model download blocked in the analysis sandbox). Where a +FinBERT value is needed to reproduce row counts, VADER is used as a clearly +labelled stand-in; no FinBERT statistic is reported. +""" +from __future__ import annotations + +import csv +import io +import json +import math +import sys +import unicodedata +from contextlib import redirect_stdout + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import seaborn as sns +from scipy import stats + +sys.path.insert(0, str(__import__("pathlib").Path(__file__).resolve().parent)) +from common import (OUT, RAW, SEED, PRICE_FEATURES, align_btc, build_features, # noqa: E402 + load_prices, load_text, load_trends, preprocess_text, + price_feature_frame, vader_scores) + +np.random.seed(SEED) +pd.set_option("display.width", 200) +pd.set_option("display.max_columns", 50) +SUMMARY: dict = {} + +SEMANTICS = { + # prices (notebooks/01_data_collection.ipynb cell 3) + "date": ("Trading/calendar day of the bar (yfinance index)", "high"), + "open": ("Opening price of the day, quote currency (USD for BTC, INR index points for NIFTY)", "high"), + "high": ("Intraday high", "high"), + "low": ("Intraday low", "high"), + "close": ("Close price (yfinance default auto_adjust; index has no dividends)", "high"), + "volume": ("Traded volume (USD notional for BTC-USD; NIFTY index volume as reported by Yahoo)", "medium"), + "return": ("Simple return close.pct_change() — NOT log; notebooks later overwrite it with log return", "high"), + # text (notebooks/01a_text_data_collection.ipynb) + "timestamp": ("GDELT 'seendate' of the headline, UTC", "high"), + "text": ("Headline title only (no body)", "high"), + "source": ("Intended: publisher name. Empty in the committed file", "high"), + "asset": ("Which query produced the headline: BTC or NIFTY", "high"), + "channel": ("Collection channel label", "high"), + # trends + "google_trend": ("Google Trends interest, 0-100, relative to the peak month of the queried window", "high"), +} + + +def section(title): + print("\n" + "=" * 100 + f"\n{title}\n" + "=" * 100) + + +def save_df(df, name, index=True): + df.to_csv(OUT / f"{name}.csv", index=index) + + +# ═════════════════════════════════════════════════════════════════════════════ +# 1. File-level metadata +# ═════════════════════════════════════════════════════════════════════════════ + +def file_meta(): + section("1. FILE METADATA (data/raw)") + rows = [] + for p in sorted(RAW.iterdir()): + b = p.read_bytes() + try: + b.decode("ascii"); enc = "ascii (subset of utf-8)" + except UnicodeDecodeError: + try: + b.decode("utf-8"); enc = "utf-8 (non-ASCII present)" + except UnicodeDecodeError: + enc = "not utf-8" + delim, header = None, None + if p.suffix == ".csv": + sample = b[:4096].decode("utf-8", errors="replace") + delim = repr(csv.Sniffer().sniff(sample).delimiter) + header = sample.splitlines()[0] + rows.append({"file": p.name, "bytes": len(b), "lines": b.count(b"\n") + (0 if b.endswith(b"\n") else 1), + "encoding": enc, "delimiter": delim, "header": header}) + meta = pd.DataFrame(rows) + print(meta.to_string(index=False)) + save_df(meta, "file_metadata", index=False) + SUMMARY["files"] = meta.to_dict(orient="records") + + +# ═════════════════════════════════════════════════════════════════════════════ +# 2. Structure / inventory +# ═════════════════════════════════════════════════════════════════════════════ + +def inventory(df, name): + n = len(df) + rows = [] + for c in df.columns: + nn = int(df[c].notna().sum()) + nu = int(df[c].nunique(dropna=True)) + ex = df[c].dropna().astype(str).unique()[:3] + sem, conf = SEMANTICS.get(c, ("(derived)", "n/a")) + rows.append({"column": c, "dtype": str(df[c].dtype), "non_null": nn, "null": n - nn, + "null_pct": round(100 * (n - nn) / n, 2) if n else None, "n_unique": nu, + "cardinality_ratio": round(nu / n, 4) if n else None, + "examples": " | ".join(e[:40] for e in ex), "meaning": sem, "confidence": conf}) + inv = pd.DataFrame(rows) + save_df(inv, f"inventory_{name}", index=False) + return inv + + +def structure(df, name): + section(f"2. STRUCTURE — {name}") + mem = df.memory_usage(deep=True).sum() + print(f"shape: {df.shape[0]} rows x {df.shape[1]} cols | memory (deep): {mem/1024:.1f} KiB") + buf = io.StringIO() + df.info(buf=buf) + print(buf.getvalue()) + (OUT / f"info_{name}.txt").write_text(buf.getvalue()) + inv = inventory(df, name) + print(inv.drop(columns=["examples"]).to_string(index=False)) + SUMMARY.setdefault("shapes", {})[name] = {"rows": df.shape[0], "cols": df.shape[1], + "memory_kib": round(mem / 1024, 1)} + + +# ═════════════════════════════════════════════════════════════════════════════ +# 3. Numeric profile +# ═════════════════════════════════════════════════════════════════════════════ + +def numeric_profile(df, name): + section(f"3. NUMERIC PROFILE — {name}") + rows = [] + for c in df.select_dtypes(include="number").columns: + s = df[c].dropna().astype(float) + if s.empty: + continue + q1, q2, q3 = s.quantile([.25, .5, .75]) + iqr = q3 - q1 + z = (s - s.mean()) / s.std(ddof=1) if s.std(ddof=1) > 0 else s * 0 + mode = s.mode() + rows.append({ + "column": c, "count": len(s), "mean": s.mean(), "median": q2, + "mode": mode.iloc[0] if len(mode) else np.nan, "mode_count": int((s == mode.iloc[0]).sum()) if len(mode) else 0, + "std": s.std(ddof=1), "var": s.var(ddof=1), "min": s.min(), "max": s.max(), "range": s.max() - s.min(), + "q1": q1, "q2": q2, "q3": q3, "iqr": iqr, + "p01": s.quantile(.01), "p05": s.quantile(.05), "p95": s.quantile(.95), "p99": s.quantile(.99), + "skew": stats.skew(s, bias=False), "kurtosis_excess": stats.kurtosis(s, bias=False), + "cv": s.std(ddof=1) / s.mean() if s.mean() != 0 else np.nan, + "zeros": int((s == 0).sum()), "negatives": int((s < 0).sum()), + "outliers_iqr_1.5": int(((s < q1 - 1.5 * iqr) | (s > q3 + 1.5 * iqr)).sum()), + "outliers_abs_z_gt_3": int((z.abs() > 3).sum()), + }) + prof = pd.DataFrame(rows).set_index("column") + with pd.option_context("display.float_format", lambda v: f"{v:.6g}"): + print(prof.T.to_string()) + save_df(prof, f"numeric_profile_{name}") + SUMMARY.setdefault("numeric", {})[name] = json.loads(prof.to_json()) + return prof + + +def price_plausibility(df, asset): + section(f"3b. PLAUSIBILITY CHECKS — {asset} prices") + d = df.copy() + out = {} + out["date_min"] = str(d["date"].min().date()); out["date_max"] = str(d["date"].max().date()) + out["future_dates_vs_2026-10-09"] = int((d["date"] > pd.Timestamp("2026-10-09")).sum()) + out["duplicate_dates"] = int(d["date"].duplicated().sum()) + out["nonpositive_prices"] = int((d[["open", "high", "low", "close"]] <= 0).any(axis=1).sum()) + out["high_lt_low"] = int((d["high"] < d["low"]).sum()) + out["close_outside_low_high"] = int(((d["close"] > d["high"] + 1e-9) | (d["close"] < d["low"] - 1e-9)).sum()) + out["open_outside_low_high"] = int(((d["open"] > d["high"] + 1e-9) | (d["open"] < d["low"] - 1e-9)).sum()) + out["volume_zero_rows"] = int((d["volume"] == 0).sum()) + if out["volume_zero_rows"]: + z = d.loc[d["volume"] == 0, "date"] + out["volume_zero_first_last"] = [str(z.min().date()), str(z.max().date())] + out["volume_zero_by_year"] = {int(k): int(v) for k, v in z.dt.year.value_counts().sort_index().items()} + # stored 'return' vs recomputed pct_change on the same file + recomputed = d["close"].pct_change() + diff = (d["return"] - recomputed).abs() + out["stored_return_vs_pct_change_maxabsdiff_excl_first"] = float(diff.iloc[1:].max()) + out["stored_return_first_row"] = float(d["return"].iloc[0]) + gaps = d["date"].diff().dt.days.value_counts().sort_index() + out["day_gap_histogram"] = {int(k): int(v) for k, v in gaps.items()} + full = pd.date_range(d["date"].min(), d["date"].max(), freq="D") + out["calendar_days_missing"] = int(len(full) - d["date"].nunique()) + if asset == "BTC": + miss = full.difference(d["date"]) + out["btc_missing_dates_sample"] = [str(x.date()) for x in miss[:10]] + lr = np.log(d["close"]).diff().abs() + top = d.assign(abs_log_ret=lr).nlargest(5, "abs_log_ret")[["date", "close", "abs_log_ret"]] + out["largest_abs_log_returns"] = [{"date": str(r.date.date()), "close": round(r.close, 2), + "abs_log_ret": round(r.abs_log_ret, 4)} for r in top.itertuples()] + out["rows_per_year"] = {int(k): int(v) for k, v in d["date"].dt.year.value_counts().sort_index().items()} + for k, v in out.items(): + print(f" {k}: {v}") + SUMMARY.setdefault("plausibility", {})[asset] = out + + +# ═════════════════════════════════════════════════════════════════════════════ +# 4. Categorical + text profile +# ═════════════════════════════════════════════════════════════════════════════ + +def entropy_bits(vc): + p = vc / vc.sum() + return float(-(p * np.log2(p)).sum()) + + +def categorical_profile(df, cols, name): + section(f"4. CATEGORICAL PROFILE — {name}") + res = {} + for c in cols: + s = df[c] + raw = s.astype("string") + vc = s.value_counts(dropna=False) + rel = (vc / len(s)).round(4) + nonnull = s.dropna() + variants = {} + if len(nonnull): + norm = nonnull.astype(str).str.strip().str.lower() + for k, g in nonnull.astype(str).groupby(norm): + u = sorted(set(g)) + if len(u) > 1: + variants[k] = u + na_like = int(raw.str.strip().str.upper().isin(["", "N/A", "NA", "NAN", "NONE", "NULL"]).sum()) + info = { + "value_counts": {str(k): int(v) for k, v in vc.items()}, + "relative_freq": {str(k): float(v) for k, v in rel.items()}, + "mode": str(nonnull.mode().iloc[0]) if len(nonnull) else None, + "entropy_bits": entropy_bits(nonnull.value_counts()) if len(nonnull) else None, + "n_categories": int(nonnull.nunique()), + "rare_lt_1pct": int((nonnull.value_counts(normalize=True) < 0.01).sum()) if len(nonnull) else 0, + "case_or_whitespace_variants": variants, + "na_like_strings": na_like, "true_NaN": int(s.isna().sum()), + } + res[c] = info + print(f"\n[{c}]") + for k, v in info.items(): + print(f" {k}: {v}") + SUMMARY.setdefault("categorical", {})[name] = res + return res + + +SCRIPT_NAMES = ["LATIN", "DEVANAGARI", "HEBREW", "ARABIC", "CJK", "HANGUL", "CYRILLIC", "BENGALI", + "TAMIL", "TELUGU", "GUJARATI", "KANNADA", "MALAYALAM", "GURMUKHI", "THAI", "GREEK", + "HIRAGANA", "KATAKANA", "ORIYA"] + + +def dominant_script(text): + counts = {} + for ch in str(text): + if ch.isalpha(): + name = unicodedata.name(ch, "") + sc = next((s for s in SCRIPT_NAMES if name.startswith(s) or s in name.split()), "OTHER") + counts[sc] = counts.get(sc, 0) + 1 + return max(counts, key=counts.get) if counts else "NONE" + + +def text_profile(text): + section("4b. TEXT PROFILE — data/raw/text_data.csv") + t = text.copy() + t["ts"] = pd.to_datetime(t["timestamp"], utc=True) + out = {"rows": len(t), "ts_min": str(t["ts"].min()), "ts_max": str(t["ts"].max()), + "distinct_utc_days": int(t["ts"].dt.date.nunique())} + t["script"] = t["text"].apply(dominant_script) + out["dominant_script_counts"] = t["script"].value_counts().to_dict() + out["dominant_script_by_asset"] = {a: g["script"].value_counts().to_dict() for a, g in t.groupby("asset")} + t["len_chars"] = t["text"].astype(str).str.len() + out["headline_len_chars"] = t["len_chars"].describe().round(2).to_dict() + out["exact_duplicate_rows"] = int(t.duplicated(subset=["timestamp", "text", "asset"]).sum()) + out["duplicate_text_any_time"] = int(t.duplicated(subset=["text"]).sum()) + pp = preprocess_text(text) + out["rows_after_clean_len_gt_10 (nb02 reports 1377)"] = len(pp) + out["rows_dropped_by_clean_filter"] = len(text) - len(pp) + dropped = text.loc[~text.index.isin(pp.index)].copy() + dropped["script"] = dropped["text"].apply(dominant_script) + out["dropped_rows_by_script"] = dropped["script"].value_counts().to_dict() + kept = text.loc[pp.index].copy() + kept["script"] = kept["text"].apply(dominant_script) + out["kept_non_latin_rows (garbled by ascii-only regex)"] = int((kept["script"] != "LATIN").sum()) + out["near_duplicate_clean_text"] = int(pp.duplicated(subset=["clean_text"]).sum()) + per_day = pd.to_datetime(pp["timestamp"], utc=True).dt.date + pdc = pp.groupby([per_day, "asset"]).size().unstack(fill_value=0) + out["headlines_per_day_per_asset"] = pdc.describe().round(2).to_dict() + out["days_with_headlines"] = {a: int((pdc[a] > 0).sum()) for a in pdc.columns} + save_df(pdc, "text_headlines_per_day") + for k, v in out.items(): + print(f" {k}: {v}") + SUMMARY["text"] = out + return pp + + +# ═════════════════════════════════════════════════════════════════════════════ +# 5. Reconstruct the ML training table + target deep dive + baseline +# ═════════════════════════════════════════════════════════════════════════════ + +def reconstruct_training_table(pp): + section("5. RECONSTRUCTED TRAINING TABLE (nb02 → nb03 → nb04 → pipeline/feature_engineering.py)") + sent = pp.copy() + sent["vader_score"] = vader_scores(sent["clean_text"]) + sent["finbert_score"] = sent["vader_score"] # STAND-IN: FinBERT not reproducible here (see module docstring) + btc = load_prices("BTC") + aligned = align_btc(btc, sent) + X, y, feats, full = build_features(aligned.copy(), target_horizon=5) + n_test = math.ceil(0.2 * len(X)) # sklearn train_test_split(test_size=0.2) uses ceil for the test fold + info = { + "vader_on_clean_text": sent["vader_score"].describe().round(4).to_dict(), + "aligned_rows (nb05 printed BTC shape (75, 15))": len(aligned), + "aligned_date_range": [str(aligned["date"].min().date()), str(aligned["date"].max().date())], + "rows_after_build_features_dropna": len(X), + "train_rows": len(X) - n_test, "test_rows": n_test, + "train_dates": [str(full["date"].iloc[0].date()), str(full["date"].iloc[len(X) - n_test - 1].date())] if len(X) else None, + "test_dates": [str(full["date"].iloc[len(X) - n_test].date()), str(full["date"].iloc[-1].date())] if len(X) else None, + "why_so_few": "rolling(60) in pipeline/feature_engineering.py:17 consumes 59 of the aligned rows; " + "shift(-5) target consumes the last 5", + } + for k, v in info.items(): + print(f" {k}: {v}") + full.to_csv(OUT / "btc_training_table_reconstructed.csv", index=False) + aligned.to_csv(OUT / "btc_sentiment_aligned_reconstructed.csv", index=False) + SUMMARY["training_table"] = info + + # Target deep dive on the actual training target + section("5b. TARGET — log_vol_target in the reconstructed training table") + print(y.describe().to_string()) + yv = np.exp(y.values) - 1e-6 + ytr, yte = y.iloc[:-n_test], y.iloc[-n_test:] + pred = np.full(len(yte), ytr.mean()) + base = {"dummy_mean_rmse_vol_space": float(np.sqrt(np.mean((np.exp(pred) - np.exp(yte)) ** 2))), + "dummy_mean_mae_vol_space": float(np.mean(np.abs(np.exp(pred) - np.exp(yte)))), + "y_train_values": [round(v, 5) for v in ytr.tolist()], "y_test_values": [round(v, 5) for v in yte.tolist()], + "vol_space_min_max": [float(yv.min()), float(yv.max())]} + for k, v in base.items(): + print(f" {k}: {v}") + SUMMARY["training_target_baseline"] = base + return aligned + + +def research_target(asset): + section(f"5c. FULL-HISTORY TARGET — {asset} 5-day realised vol, 5 days ahead (same definition as pipeline)") + f = price_feature_frame(load_prices(asset)) + out = {} + for col in ["vol_target", "log_vol_target"]: + s = f[col] + jb = stats.jarque_bera(s) + out[col] = {"n": len(s), "mean": s.mean(), "median": s.median(), "std": s.std(), + "skew": stats.skew(s), "excess_kurtosis": stats.kurtosis(s), + "jarque_bera_stat": float(jb.statistic), "jarque_bera_p": float(jb.pvalue)} + for k, v in out.items(): + print(f" {k}: { {a: (round(b, 6) if isinstance(b, float) else b) for a, b in v.items()} }") + fig, ax = plt.subplots(1, 2, figsize=(11, 3.6)) + sns.histplot(f["vol_target"], kde=True, ax=ax[0], bins=60); ax[0].set_title(f"{asset}: vol_target (raw)") + sns.histplot(f["log_vol_target"], kde=True, ax=ax[1], bins=60); ax[1].set_title(f"{asset}: log(vol_target)") + plt.tight_layout(); plt.savefig(OUT / f"target_distribution_{asset.lower()}.png", dpi=90); plt.close() + SUMMARY.setdefault("research_target", {})[asset] = out + return f + + +# ═════════════════════════════════════════════════════════════════════════════ +# 6. Relationships +# ═════════════════════════════════════════════════════════════════════════════ + +def relationships(f, asset): + section(f"6. RELATIONSHIPS — {asset} price features vs target (full history)") + from sklearn.feature_selection import mutual_info_regression + from statsmodels.stats.outliers_influence import variance_inflation_factor + cols = PRICE_FEATURES + ["log_vol_target"] + pear = f[cols].corr("pearson"); spear = f[cols].corr("spearman") + print("Pearson:\n", pear.round(3).to_string()); print("Spearman:\n", spear.round(3).to_string()) + save_df(pear, f"corr_pearson_{asset.lower()}"); save_df(spear, f"corr_spearman_{asset.lower()}") + fig, ax = plt.subplots(1, 2, figsize=(12, 4.6)) + sns.heatmap(pear, annot=True, fmt=".2f", cmap="coolwarm", center=0, ax=ax[0]); ax[0].set_title(f"{asset} Pearson") + sns.heatmap(spear, annot=True, fmt=".2f", cmap="coolwarm", center=0, ax=ax[1]); ax[1].set_title(f"{asset} Spearman") + plt.tight_layout(); plt.savefig(OUT / f"corr_heatmap_{asset.lower()}.png", dpi=90); plt.close() + pairs = (pear.loc[PRICE_FEATURES, PRICE_FEATURES].where(np.triu(np.ones((5, 5)), 1).astype(bool)) + .stack().abs().sort_values(ascending=False)) + print("Top |Pearson| feature pairs:\n", pairs.round(3).head(6).to_string()) + X = f[PRICE_FEATURES].assign(const=1.0) + vif = pd.Series([variance_inflation_factor(X.values, i) for i in range(len(PRICE_FEATURES))], index=PRICE_FEATURES) + print("VIF:\n", vif.round(2).to_string()) + mi = pd.Series(mutual_info_regression(f[PRICE_FEATURES], f["log_vol_target"], random_state=SEED), index=PRICE_FEATURES) + rank = pd.DataFrame({"pearson_with_target": pear.loc[PRICE_FEATURES, "log_vol_target"], + "spearman_with_target": spear.loc[PRICE_FEATURES, "log_vol_target"], + "mutual_info": mi}).sort_values("mutual_info", ascending=False) + print("Feature ↔ target ranking:\n", rank.round(4).to_string()) + save_df(rank, f"feature_target_ranking_{asset.lower()}") + SUMMARY.setdefault("relationships", {})[asset] = { + "top_pairs": {f"{a}~{b}": round(v, 4) for (a, b), v in pairs.head(6).items()}, + "vif": vif.round(3).to_dict(), "ranking": json.loads(rank.round(5).to_json())} + + +# ═════════════════════════════════════════════════════════════════════════════ +# 7. Missingness across the daily calendar the project actually joins on +# ═════════════════════════════════════════════════════════════════════════════ + +def missingness(text_pp): + section("7. MISSINGNESS — joined daily calendar 2015-01-01 … 2025-12-31") + cal = pd.DataFrame(index=pd.date_range("2015-01-01", "2025-12-31", freq="D")) + btc = load_prices("BTC").set_index("date"); nif = load_prices("NIFTY").set_index("date") + cal["btc_close"] = btc["close"]; cal["nifty_close"] = nif["close"] + ts = pd.to_datetime(text_pp["timestamp"], utc=True).dt.tz_localize(None).dt.normalize() + for a in ["BTC", "NIFTY"]: + cnt = ts[text_pp["asset"] == a].value_counts() + cal[f"{a.lower()}_headlines"] = cnt.reindex(cal.index) + for a in ["BTC", "NIFTY"]: + g = load_trends(a).drop_duplicates() # nifty file repeats 2025-11/2025-12 (see DUPLICATES) + g["date"] = pd.to_datetime(g["date"] + "-01") + cal[f"{a.lower()}_trend_monthly"] = g.set_index("date")["google_trend"].reindex(cal.index) + miss = cal.isna() + pct = (100 * miss.mean()).round(2) + print("% missing per column:\n", pct.to_string()) + co = miss.astype(int).T.dot(miss.astype(int)) + print("Co-missing day counts:\n", co.to_string()) + print("Missing-indicator correlation:\n", miss.astype(int).corr().round(3).to_string()) + nif_missing_dow = cal.index[miss["nifty_close"]].dayofweek.value_counts().sort_index() + print("NIFTY-missing days by weekday (0=Mon):", nif_missing_dow.to_dict()) + wk = miss.resample("W").mean() # weekly share of missing days: avoids pixel aliasing of 4k daily columns + fig, ax = plt.subplots(figsize=(11, 3.4)) + im = ax.imshow(wk.T.values, aspect="auto", interpolation="nearest", cmap="Greys", vmin=0, vmax=1) + ax.set_yticks(range(len(cal.columns))); ax.set_yticklabels(cal.columns, fontsize=8) + yrs = [i for i, d in enumerate(wk.index) if i == 0 or d.year != wk.index[i - 1].year] + ax.set_xticks(yrs); ax.set_xticklabels([wk.index[i].year for i in yrs], fontsize=8) + plt.colorbar(im, ax=ax, label="share of days missing in week") + ax.set_title("Missingness matrix — weekly share of missing days (black = all missing)") + plt.tight_layout(); plt.savefig(OUT / "missingness_matrix.png", dpi=90); plt.close() + SUMMARY["missingness"] = {"pct_missing": pct.to_dict(), "nifty_missing_by_weekday": {int(k): int(v) for k, v in nif_missing_dow.items()}} + + +# ═════════════════════════════════════════════════════════════════════════════ +# 8. Visuals +# ═════════════════════════════════════════════════════════════════════════════ + +def numeric_plots(df, name): + cols = [c for c in df.select_dtypes(include="number").columns] + fig, axes = plt.subplots(len(cols), 2, figsize=(11, 2.3 * len(cols))) + for i, c in enumerate(cols): + s = df[c].dropna() + sns.histplot(s, kde=True, bins=60, ax=axes[i, 0]); axes[i, 0].set_title(f"{name}.{c} hist+KDE", fontsize=9) + sns.boxplot(x=s, ax=axes[i, 1]); axes[i, 1].set_title(f"{name}.{c} boxplot", fontsize=9) + plt.tight_layout(); plt.savefig(OUT / f"numeric_dist_{name}.png", dpi=80); plt.close() + + +def categorical_plots(text): + fig, axes = plt.subplots(1, 3, figsize=(12, 3.2)) + text["asset"].value_counts().plot.bar(ax=axes[0], title="asset") + text["channel"].value_counts().plot.bar(ax=axes[1], title="channel") + text["text"].apply(dominant_script).value_counts().plot.bar(ax=axes[2], title="dominant script of headline") + plt.tight_layout(); plt.savefig(OUT / "categorical_bars_text.png", dpi=90); plt.close() + + +# ═════════════════════════════════════════════════════════════════════════════ + +def main(): + log = io.StringIO() + + class Tee(io.TextIOBase): + def write(self, s): + sys.__stdout__.write(s); log.write(s); return len(s) + + with redirect_stdout(Tee()): + file_meta() + btc, nif, text = load_prices("BTC"), load_prices("NIFTY"), load_text() + gt_b, gt_n = load_trends("BTC"), load_trends("NIFTY") + for df, nm in [(btc, "btc_prices"), (nif, "nifty_prices"), (text, "text_data"), + (gt_b, "btc_google_trends"), (gt_n, "nifty_google_trends")]: + structure(df, nm) + for df, nm in [(btc, "btc_prices"), (nif, "nifty_prices"), (gt_b, "btc_google_trends"), (gt_n, "nifty_google_trends")]: + numeric_profile(df, nm) + price_plausibility(btc, "BTC"); price_plausibility(nif, "NIFTY") + categorical_profile(text, ["source", "asset", "channel"], "text_data") + pp = text_profile(text) + reconstruct_training_table(pp) + for a in ["BTC", "NIFTY"]: + relationships(research_target(a), a) + missingness(pp) + section("8. DUPLICATES") + dup = {nm: {"exact_duplicate_rows": int(df.duplicated().sum()), + "duplicate_dates": int(df["date"].duplicated().sum()) if "date" in df else None} + for df, nm in [(btc, "btc_prices"), (nif, "nifty_prices"), (gt_b, "btc_trends"), (gt_n, "nifty_trends")]} + dup["text_data"] = {"exact_duplicate_rows": int(text.duplicated().sum()), + "duplicate_text_values": int(text["text"].duplicated().sum())} + print(dup); SUMMARY["duplicates"] = dup + numeric_plots(btc, "btc_prices"); numeric_plots(nif, "nifty_prices") + categorical_plots(text) + (OUT / "data_profile_stdout.txt").write_text(log.getvalue()) + (OUT / "profile_summary.json").write_text(json.dumps(SUMMARY, indent=2, default=str)) + print(f"\nWrote outputs to {OUT}") + + +if __name__ == "__main__": + main() diff --git a/analysis/model_eval.py b/analysis/model_eval.py new file mode 100644 index 0000000..afd3dbb --- /dev/null +++ b/analysis/model_eval.py @@ -0,0 +1,289 @@ +""" +analysis/model_eval.py — re-runs and audits every model / statistical test in +the repo that can be re-run from committed data. + + python analysis/data_profile.py # first: builds the reconstructed training table + python analysis/model_eval.py + +Sections + A. Inspect the committed artifact models/rf_btc.pkl + B. Re-run run_pipeline.py's training on the reconstructed table + C. Honest walk-forward re-evaluation on the FULL price history (price features only) + D. Is the repo's placebo test (scripts/validate_gmsi.py:77-96) valid? Null simulation +Outputs → analysis/outputs/model_eval_*.{txt,csv,png}, model_eval_summary.json +""" +from __future__ import annotations + +import io +import json +import math +import sys +from contextlib import redirect_stdout +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from scipy import stats + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from common import (OUT, PIPELINE_FEATURES, PRICE_FEATURES, SEED, # noqa: E402 + legacy_bytes, load_prices, price_feature_frame) + +from sklearn.dummy import DummyRegressor # noqa: E402 +from sklearn.ensemble import RandomForestRegressor # noqa: E402 +from sklearn.inspection import permutation_importance # noqa: E402 +from sklearn.linear_model import LinearRegression # noqa: E402 +from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score # noqa: E402 +from sklearn.model_selection import TimeSeriesSplit # noqa: E402 + +RF_PARAMS = dict(n_estimators=600, max_depth=8, min_samples_leaf=10, max_features="sqrt", + random_state=42, n_jobs=-1) # pipeline/train_rf_model.py:8-15 verbatim +SUMMARY: dict = {} + + +def section(t): + print("\n" + "=" * 100 + f"\n{t}\n" + "=" * 100) + + +def vol_metrics(y_log_true, y_log_pred): + """Same space as pipeline/train_rf_model.py:20-24 (exp of log-vol) + log-space R² + QLIKE.""" + a, p = np.exp(y_log_true), np.exp(y_log_pred) + a2, p2 = a ** 2, p ** 2 + return {"rmse_vol": float(np.sqrt(mean_squared_error(a, p))), "mae_vol": float(mean_absolute_error(a, p)), + "r2_log": float(r2_score(y_log_true, y_log_pred)), + "qlike": float(np.mean(a2 / p2 - np.log(a2 / p2) - 1))} + + +# ═════════════════════════════════════════════════════════════════════════════ +def section_a(): + section("A. COMMITTED ARTIFACT models/rf_btc.pkl (as of the audited commit)") + import joblib + import sklearn + raw = legacy_bytes("models/rf_btc.pkl") # deleted after the audit; read from the audited commit + m = joblib.load(io.BytesIO(raw)) + depths = sorted({e.get_depth() for e in m.estimators_}) + nodes = sorted({e.tree_.node_count for e in m.estimators_}) + roots = np.array([e.tree_.value[0, 0, 0] for e in m.estimators_]) + probe = pd.DataFrame(np.random.default_rng(SEED).normal(scale=1e3, size=(1000, m.n_features_in_)), + columns=m.feature_names_in_) + preds = m.predict(probe) + info = {"file_bytes": len(raw), "pickled_with_sklearn": raw.split(b"_sklearn_version")[1][3:8].decode(), + "loaded_with_sklearn": sklearn.__version__, "class": type(m).__name__, "params": m.get_params(), + "feature_names_in_": list(m.feature_names_in_), "n_trees": len(m.estimators_), + "distinct_tree_depths": depths, "distinct_node_counts": nodes, + "feature_importances_": m.feature_importances_.tolist(), + "distinct_bootstrap_sizes_at_root": sorted({int(e.tree_.n_node_samples[0]) for e in m.estimators_}), + "per_tree_root_value_min_max": [float(roots.min()), float(roots.max())], + "prediction_on_1000_random_inputs_unique": sorted(set(np.round(preds, 10))), + "exp(prediction)=forecast_vol": float(np.exp(preds[0]))} + for k, v in info.items(): + print(f" {k}: {v}") + SUMMARY["A_artifact"] = info + + +# ═════════════════════════════════════════════════════════════════════════════ +def section_b(): + section("B. RE-RUN run_pipeline.py training on the reconstructed table") + full = pd.read_csv(OUT / "btc_training_table_reconstructed.csv", parse_dates=["date"]) + X, y = full[PIPELINE_FEATURES], full["log_vol_target"] + n_test = math.ceil(0.2 * len(X)) + Xtr, Xte, ytr, yte = X.iloc[:-n_test], X.iloc[-n_test:], y.iloc[:-n_test], y.iloc[-n_test:] + rf = RandomForestRegressor(**RF_PARAMS).fit(Xtr, ytr) + dummy = DummyRegressor().fit(Xtr, ytr) + info = {"n_train": len(Xtr), "n_test": len(Xte), + "min_rows_needed_for_one_split (2*min_samples_leaf)": 2 * RF_PARAMS["min_samples_leaf"], + "tree_depths": sorted({e.get_depth() for e in rf.estimators_}), + "importances": rf.feature_importances_.tolist(), + "rf_test_preds": rf.predict(Xte).tolist(), "dummy_test_preds": dummy.predict(Xte).tolist(), + "rf_metrics": vol_metrics(yte.values, rf.predict(Xte)), + "dummy_metrics": vol_metrics(yte.values, dummy.predict(Xte)), + "note": "FinBERT columns hold VADER as a stand-in; irrelevant here because no tree can split."} + for k, v in info.items(): + print(f" {k}: {v}") + SUMMARY["B_rerun_pipeline"] = info + + +# ═════════════════════════════════════════════════════════════════════════════ +def walk_forward(asset, n_splits=5, horizon=5): + f = price_feature_frame(load_prices(asset), horizon=horizon) + X, y = f[PRICE_FEATURES], f["log_vol_target"] + lin_cols = ["vol_5", "vol_22", "vol_60"] + # gap=horizon purges training rows whose 5-day-ahead target window overlaps the test fold + tss = TimeSeriesSplit(n_splits=n_splits, gap=horizon) + rows, last = [], None + for k, (tr, te) in enumerate(tss.split(X)): + Xtr, Xte, ytr, yte = X.iloc[tr], X.iloc[te], y.iloc[tr], y.iloc[te] + models = { + "dummy_mean": DummyRegressor().fit(Xtr, ytr), + "persistence_log_vol5": None, + "HAR_ols_log(vol5,22,60)": LinearRegression().fit(np.log(Xtr[lin_cols] + 1e-6), ytr), + "rf_repo_params": RandomForestRegressor(**RF_PARAMS).fit(Xtr, ytr), + } + for name, mdl in models.items(): + if name == "persistence_log_vol5": + p_te, p_tr = np.log(Xte["vol_5"] + 1e-6), np.log(Xtr["vol_5"] + 1e-6) + elif name.startswith("HAR"): + p_te, p_tr = mdl.predict(np.log(Xte[lin_cols] + 1e-6)), mdl.predict(np.log(Xtr[lin_cols] + 1e-6)) + else: + p_te, p_tr = mdl.predict(Xte), mdl.predict(Xtr) + m_te, m_tr = vol_metrics(yte.values, np.asarray(p_te)), vol_metrics(ytr.values, np.asarray(p_tr)) + rows.append({"asset": asset, "fold": k, "train_end": str(f["date"].iloc[tr[-1]].date()), + "test": f"{f['date'].iloc[te[0]].date()}→{f['date'].iloc[te[-1]].date()}", + "n_train": len(tr), "n_test": len(te), "model": name, + **{f"test_{a}": b for a, b in m_te.items()}, **{f"train_{a}": b for a, b in m_tr.items()}}) + last = (f.iloc[te], Xte, yte, models["rf_repo_params"], models["dummy_mean"], Xtr, ytr) + return pd.DataFrame(rows), last, f + + +def section_c(): + section("C. WALK-FORWARD RE-EVALUATION (price features only, full history, TimeSeriesSplit(5, gap=5))") + allres = [] + for asset in ["BTC", "NIFTY"]: + res, last, f = walk_forward(asset) + allres.append(res) + agg = res.groupby("model")[["test_rmse_vol", "test_mae_vol", "test_r2_log", "test_qlike", + "train_rmse_vol", "train_r2_log"]].mean().sort_values("test_qlike") + print(f"\n{asset} — mean over 5 folds:\n", agg.round(5).to_string()) + print(f"{asset} — per fold test R² (log):\n", + res.pivot(index="fold", columns="model", values="test_r2_log").round(3).to_string()) + SUMMARY.setdefault("C_walk_forward", {})[asset] = json.loads(agg.round(6).to_json()) + + df_te, Xte, yte, rf, dummy, Xtr, ytr = last + # importances on the last fold + imp = pd.Series(rf.feature_importances_, index=PRICE_FEATURES) + pim = permutation_importance(rf, Xte, yte, n_repeats=20, random_state=SEED, scoring="neg_mean_squared_error") + imps = pd.DataFrame({"impurity": imp, "permutation_mean": pim.importances_mean, + "permutation_std": pim.importances_std}).sort_values("permutation_mean", ascending=False) + print(f"{asset} — RF importances (last fold):\n", imps.round(5).to_string()) + SUMMARY["C_walk_forward"][asset + "_importances"] = json.loads(imps.round(6).to_json()) + + # error analysis by regime of realised target (last fold) + pred = rf.predict(Xte) + e = pd.DataFrame({"date": df_te["date"].values, "y": yte.values, "pred": pred, + "abs_err_vol": np.abs(np.exp(yte.values) - np.exp(pred))}) + e["actual_quintile"] = pd.qcut(e["y"], 5, labels=["Q1 calm", "Q2", "Q3", "Q4", "Q5 turbulent"]) + by_q = e.groupby("actual_quintile", observed=True).agg(n=("y", "size"), mae_vol=("abs_err_vol", "mean"), + bias_log=("pred", "mean")) + by_q["bias_log"] = by_q["bias_log"] - e.groupby("actual_quintile", observed=True)["y"].mean() + print(f"{asset} — RF error by quintile of ACTUAL future vol (last fold):\n", by_q.round(5).to_string()) + worst = e.nlargest(5, "abs_err_vol")[["date", "abs_err_vol"]] + worst["actual_vol"] = np.exp(e.loc[worst.index, "y"]); worst["pred_vol"] = np.exp(e.loc[worst.index, "pred"]) + print(f"{asset} — 5 worst misses:\n", worst.round(5).to_string(index=False)) + SUMMARY["C_walk_forward"][asset + "_error_by_quintile"] = json.loads(by_q.round(6).to_json()) + + # learning curve: last-fold test set, growing training window + sizes, lc = [250, 500, 1000, 2000, len(Xtr)], [] + for s in sizes: + m = RandomForestRegressor(**RF_PARAMS).fit(Xtr.iloc[-s:], ytr.iloc[-s:]) + lc.append({"n_train": s, "train_r2_log": r2_score(ytr.iloc[-s:], m.predict(Xtr.iloc[-s:])), + "test_r2_log": r2_score(yte, m.predict(Xte))}) + lc = pd.DataFrame(lc); print(f"{asset} — learning curve:\n", lc.round(4).to_string(index=False)) + SUMMARY["C_walk_forward"][asset + "_learning_curve"] = lc.round(5).to_dict(orient="records") + fig, ax = plt.subplots(1, 3, figsize=(16, 3.6)) + ax[2].scatter(pred, yte.values - pred, s=4, alpha=.5) + ax[2].axhline(0, color="k", lw=.8) + ax[2].set_xlabel("RF prediction (log vol)"); ax[2].set_ylabel("residual (actual − pred, log)") + ax[2].set_title("residuals vs prediction (last fold)") + ax[0].plot(df_te["date"], np.exp(yte), lw=.7, label="actual 5d vol (t+1..t+5)") + ax[0].plot(df_te["date"], np.exp(pred), lw=.9, label="RF forecast") + ax[0].axhline(np.exp(dummy.predict(Xte)[0]), color="k", ls="--", lw=.8, label="dummy mean") + ax[0].legend(fontsize=7); ax[0].set_title(f"{asset} last walk-forward fold") + ax[1].plot(lc["n_train"], lc["train_r2_log"], "o-", label="train R² (log)") + ax[1].plot(lc["n_train"], lc["test_r2_log"], "o-", label="test R² (log)") + ax[1].set_xscale("log"); ax[1].legend(fontsize=7); ax[1].set_title("learning curve") + plt.tight_layout(); plt.savefig(OUT / f"model_eval_{asset.lower()}.png", dpi=90); plt.close() + pd.concat(allres).to_csv(OUT / "model_eval_walk_forward.csv", index=False) + + +# ═════════════════════════════════════════════════════════════════════════════ +def _perm_pvals(x, y, n_perm, rng, mode): + """Spearman via ranks; returns two-sided empirical p as in scripts/validate_gmsi.py:95.""" + rx = stats.rankdata(x); ry = stats.rankdata(y) + rx = (rx - rx.mean()) / rx.std(); ry = (ry - ry.mean()) / ry.std() + real = float(np.mean(rx * ry)) + n = len(rx) + if mode == "iid_shuffle": # what the repo does + idx = np.argsort(rng.random((n_perm, n)), axis=1) + else: # circular shift: keeps the autocorrelation of x intact + shifts = rng.integers(30, n - 30, n_perm) + idx = (np.arange(n)[None, :] + shifts[:, None]) % n + null = (rx[idx] * ry[None, :]).mean(axis=1) + return real, float(np.mean(np.abs(null) >= abs(real))) + + +def section_d(n_sims=200, n_perm=1000): + section("D. PLACEBO-TEST VALIDITY — real BTC forward vol vs an INDEPENDENT AR(1) fake 'GMSI'") + # forward 7d vol exactly as scripts/construct_vsi_full.py:26 + scripts/validate_gmsi.py:23 + p = load_prices("BTC") + r = np.log(p["close"] / p["close"].shift(1)) + fwd = r.rolling(7, min_periods=1).std().shift(-7).dropna().values + n = len(fwd) + acf1 = float(pd.Series(fwd).autocorr(1)) + print(f" BTC fwd-7d-vol series: n={n}, lag-1 autocorrelation={acf1:.3f}") + rng = np.random.default_rng(SEED) + rows = [] + for phi in [0.0, 0.5, 0.9, 0.98]: + rej = {"iid_shuffle": 0, "circular_shift": 0} + for _ in range(n_sims): + e = rng.normal(size=n); g = np.empty(n); g[0] = e[0] + for t in range(1, n): + g[t] = phi * g[t - 1] + e[t] + for mode in rej: + _, pv = _perm_pvals(g, fwd, n_perm, rng, mode) + rej[mode] += pv < 0.05 + rows.append({"fake_gmsi_ar1_phi": phi, "n_sims": n_sims, + "false_positive_rate_iid_shuffle (repo)": rej["iid_shuffle"] / n_sims, + "false_positive_rate_circular_shift": rej["circular_shift"] / n_sims}) + print(" ", rows[-1], flush=True) + res = pd.DataFrame(rows); res.to_csv(OUT / "model_eval_placebo_validity.csv", index=False) + SUMMARY["D_placebo_validity"] = {"fwd_vol_acf1": acf1, "n": n, "results": res.to_dict(orient="records")} + + +def section_e(n_sims=2000, phi=0.82): + section(f"E. CALIBRATED NULL for the published GMSI correlations (AR(1) phi={phi} fake GMSI)") + # phi=0.82 ≈ lag-1 ACF visible in reports/figures/gmsi_sanity_checks.png (bottom-left panel). + # That ACF decays far slower than 0.82^k (≈0.2 at lag 30), so this null is a LOWER bound on + # the true null spread — p-values below are therefore optimistic for the repo's claim. + published = {"BTC": -0.0837, "NIFTY": -0.0580} # scripts/validate_gmsi.py output, dashboard/app.py:389-390 + rng = np.random.default_rng(SEED) + out = {} + for asset, rho in published.items(): + p = load_prices(asset) + r = np.log(p["close"] / p["close"].shift(1)) + fwd = r.rolling(7, min_periods=1).std().shift(-7).dropna().values + n = len(fwd); ry = stats.rankdata(fwd); ry = (ry - ry.mean()) / ry.std() + null = np.empty(n_sims) + for i in range(n_sims): + e = rng.normal(size=n); g = np.empty(n); g[0] = e[0] + for t in range(1, n): + g[t] = phi * g[t - 1] + e[t] + rx = stats.rankdata(g); rx = (rx - rx.mean()) / rx.std() + null[i] = np.mean(rx * ry) + iid_sd = 1 / np.sqrt(n - 1) + out[asset] = {"n": n, "published_spearman": rho, "null_sd_ar1": float(null.std()), + "null_sd_iid_shuffle_theory": float(iid_sd), + "variance_inflation_vs_iid": float((null.std() / iid_sd) ** 2), + "two_sided_p_ar1_null": float(np.mean(np.abs(null) >= abs(rho))), + "two_sided_p_iid_normal_approx": float(2 * stats.norm.sf(abs(rho) / iid_sd))} + print(f" {asset}: {out[asset]}", flush=True) + SUMMARY["E_calibrated_null"] = {"phi": phi, "n_sims": n_sims, **out} + + +def main(): + log = io.StringIO() + + class Tee(io.TextIOBase): + def write(self, s): + sys.__stdout__.write(s); log.write(s); return len(s) + + with redirect_stdout(Tee()): + section_a(); section_b(); section_c(); section_d(); section_e() + (OUT / "model_eval_stdout.txt").write_text(log.getvalue()) + (OUT / "model_eval_summary.json").write_text(json.dumps(SUMMARY, indent=2, default=str)) + + +if __name__ == "__main__": + main() diff --git a/analysis/outputs/btc_sentiment_aligned_reconstructed.csv b/analysis/outputs/btc_sentiment_aligned_reconstructed.csv new file mode 100644 index 0000000..cdc0059 --- /dev/null +++ b/analysis/outputs/btc_sentiment_aligned_reconstructed.csv @@ -0,0 +1,78 @@ +date,open,high,low,close,volume,return,asset,finbert_score,vader_score,finbert_lag_1,vader_lag_1,finbert_lag_2,vader_lag_2,finbert_lag_3,vader_lag_3,finbert_lag_5,vader_lag_5 +2024-10-08,62221.64453125,63174.3046875,61843.5625,62131.96875,28134475157,-0.0016835665376202513,BTC,0.03974615384615384,0.03974615384615384,-0.25443333333333334,-0.25443333333333334,0.08333333333333333,0.08333333333333333,0.22047499999999998,0.22047499999999998,0.22069285714285716,0.22069285714285716 +2024-10-09,62131.7265625,62508.8359375,60314.61328125,60582.1015625,27670982363,-0.025261155468463414,BTC,0.001271428571428582,0.001271428571428582,0.03974615384615384,0.03974615384615384,-0.25443333333333334,-0.25443333333333334,0.08333333333333333,0.08333333333333333,-0.07530909090909091,-0.07530909090909091 +2024-10-10,60581.9296875,61236.72265625,58895.20703125,60274.5,30452813570,-0.005090366975952776,BTC,-0.015658823529411774,-0.015658823529411774,0.001271428571428582,0.001271428571428582,0.03974615384615384,0.03974615384615384,-0.25443333333333334,-0.25443333333333334,0.22047499999999998,0.22047499999999998 +2024-10-11,60275.4609375,63400.87109375,60046.125,62445.08984375,30327141594,0.035378479360446136,BTC,0.19314285714285714,0.19314285714285714,-0.015658823529411774,-0.015658823529411774,0.001271428571428582,0.001271428571428582,0.03974615384615384,0.03974615384615384,0.08333333333333333,0.08333333333333333 +2024-10-12,62444.6171875,63448.78515625,62443.26953125,63193.0234375,16744110886,0.011906298332258203,BTC,0.0,0.0,0.19314285714285714,0.19314285714285714,-0.015658823529411774,-0.015658823529411774,0.001271428571428582,0.001271428571428582,-0.25443333333333334,-0.25443333333333334 +2024-10-13,63192.9453125,63272.65234375,62035.63671875,62851.375,18177529690,-0.00542109412935865,BTC,0.04939,0.04939,0.0,0.0,0.19314285714285714,0.19314285714285714,-0.015658823529411774,-0.015658823529411774,0.03974615384615384,0.03974615384615384 +2024-10-14,62848.3984375,66482.4921875,62442.15234375,66046.125,43706958056,0.04958054928829014,BTC,0.022933333333333337,0.022933333333333337,0.04939,0.04939,0.0,0.0,0.19314285714285714,0.19314285714285714,0.001271428571428582,0.001271428571428582 +2024-10-15,66050.3671875,67881.6796875,64809.1953125,67041.109375,48863870879,0.01495264242203831,BTC,0.0,0.0,0.022933333333333337,0.022933333333333337,0.04939,0.04939,0.0,0.0,-0.015658823529411774,-0.015658823529411774 +2024-10-16,67042.4609375,68375.2890625,66758.7265625,67612.71875,38195189534,0.008490108547450248,BTC,0.03535555555555556,0.03535555555555556,0.0,0.0,0.022933333333333337,0.022933333333333337,0.04939,0.04939,0.19314285714285714,0.19314285714285714 +2024-10-17,67617.078125,67912.2109375,66647.390625,67399.8359375,32790898511,-0.0031535287872266338,BTC,-0.05666666666666667,-0.05666666666666667,0.03535555555555556,0.03535555555555556,0.0,0.0,0.022933333333333337,0.022933333333333337,0.0,0.0 +2024-10-18,67419.109375,68969.75,67177.8203125,68418.7890625,36857165014,0.015004897049664123,BTC,0.220475,0.220475,-0.05666666666666667,-0.05666666666666667,0.03535555555555556,0.03535555555555556,0.0,0.0,0.04939,0.04939 +2024-10-19,68418.9765625,68668.0078125,68024.640625,68362.734375,14443497908,-0.0008196237215276625,BTC,0.33525,0.33525,0.220475,0.220475,-0.05666666666666667,-0.05666666666666667,0.03535555555555556,0.03535555555555556,0.022933333333333337,0.022933333333333337 +2024-10-20,68364.1796875,69359.0078125,68105.71875,69001.703125,18975847518,0.009303330181939629,BTC,0.16304,0.16304,0.33525,0.33525,0.220475,0.220475,-0.05666666666666667,-0.05666666666666667,0.0,0.0 +2024-10-21,69002.0,69462.734375,66829.8515625,67367.8515625,37498611780,-0.023963262921302686,BTC,0.060200000000000004,0.060200000000000004,0.16304,0.16304,0.33525,0.33525,0.220475,0.220475,0.03535555555555556,0.03535555555555556 +2024-10-22,67360.703125,67801.578125,66581.3671875,67361.40625,31808472566,-9.567799317800052e-05,BTC,0.0023333333333333353,0.0023333333333333353,0.060200000000000004,0.060200000000000004,0.16304,0.16304,0.33525,0.33525,-0.05666666666666667,-0.05666666666666667 +2024-10-23,67362.375,67402.7421875,65188.03515625,66432.1953125,32263980353,-0.013890438213698175,BTC,0.032,0.032,0.0023333333333333353,0.0023333333333333353,0.060200000000000004,0.060200000000000004,0.16304,0.16304,0.220475,0.220475 +2024-10-24,66653.703125,68798.9609375,66454.1015625,68161.0546875,31414428647,0.025691547967452877,BTC,0.10527142857142859,0.10527142857142859,0.032,0.032,0.0023333333333333353,0.0023333333333333353,0.060200000000000004,0.060200000000000004,0.33525,0.33525 +2024-10-25,68165.296875,68722.15625,65521.79296875,66642.4140625,41469984306,-0.02253213347279548,BTC,0.11333333333333334,0.11333333333333334,0.10527142857142859,0.10527142857142859,0.032,0.032,0.0023333333333333353,0.0023333333333333353,0.16304,0.16304 +2024-10-27,67023.4765625,68221.3125,66847.2265625,67929.296875,16721307878,0.013555484057567568,BTC,0.027166666666666655,0.027166666666666655,0.11333333333333334,0.11333333333333334,0.10527142857142859,0.10527142857142859,0.032,0.032,0.060200000000000004,0.060200000000000004 +2024-10-28,67922.671875,70212.265625,67535.1328125,69907.7578125,38799856657,0.02870921510255542,BTC,0.08650000000000001,0.08650000000000001,0.027166666666666655,0.027166666666666655,0.11333333333333334,0.11333333333333334,0.10527142857142859,0.10527142857142859,0.0023333333333333353,0.0023333333333333353 +2024-10-29,69910.046875,73577.2109375,69729.9140625,72720.4921875,58541874402,0.039446590577762564,BTC,0.04904999999999998,0.04904999999999998,0.08650000000000001,0.08650000000000001,0.027166666666666655,0.027166666666666655,0.11333333333333334,0.11333333333333334,0.032,0.032 +2024-10-30,72715.3671875,72905.296875,71411.734375,72339.5390625,40646637831,-0.00525236341818669,BTC,-0.047580000000000004,-0.047580000000000004,0.04904999999999998,0.04904999999999998,0.08650000000000001,0.08650000000000001,0.027166666666666655,0.027166666666666655,0.10527142857142859,0.10527142857142859 +2024-10-31,72335.046875,72662.3125,69590.5,70215.1875,40627912076,-0.02980622089692453,BTC,0.16331428571428575,0.16331428571428575,-0.047580000000000004,-0.047580000000000004,0.04904999999999998,0.04904999999999998,0.08650000000000001,0.08650000000000001,0.11333333333333334,0.11333333333333334 +2024-11-01,70216.8984375,71559.015625,68779.703125,69482.46875,49989795365,-0.010490161236779372,BTC,0.1258,0.1258,0.16331428571428575,0.16331428571428575,-0.047580000000000004,-0.047580000000000004,0.04904999999999998,0.04904999999999998,0.027166666666666655,0.027166666666666655 +2024-11-02,69486.0234375,69867.3515625,69033.71875,69289.2734375,18184612091,-0.002784362785529737,BTC,0.025675,0.025675,0.1258,0.1258,0.16331428571428575,0.16331428571428575,-0.047580000000000004,-0.047580000000000004,0.08650000000000001,0.08650000000000001 +2024-11-06,69358.5,76460.15625,69322.03125,75639.078125,118592653963,0.08666903126846393,BTC,0.5859,0.5859,0.025675,0.025675,0.1258,0.1258,0.16331428571428575,0.16331428571428575,0.04904999999999998,0.04904999999999998 +2024-11-10,76775.546875,81474.421875,76565.4296875,80474.1875,82570594495,0.04700704537184386,BTC,0.0,0.0,0.5859,0.5859,0.025675,0.025675,0.1258,0.1258,-0.047580000000000004,-0.047580000000000004 +2024-11-11,80471.4140625,89604.5,80283.25,88701.484375,117966845037,0.09734014312496164,BTC,0.009846153846153846,0.009846153846153846,0.0,0.0,0.5859,0.5859,0.025675,0.025675,0.16331428571428575,0.16331428571428575 +2024-11-12,88705.5625,89956.8828125,85155.109375,87955.8125,133673285375,-0.008442066269106263,BTC,0.04667,0.04667,0.009846153846153846,0.009846153846153846,0.0,0.0,0.5859,0.5859,0.1258,0.1258 +2024-11-13,87929.96875,93434.3515625,86256.9296875,90584.1640625,123559027869,0.029444850487761798,BTC,0.16665999999999997,0.16665999999999997,0.04667,0.04667,0.009846153846153846,0.009846153846153846,0.0,0.0,0.025675,0.025675 +2024-11-14,90574.8828125,91765.21875,86682.8125,87250.4296875,87616705248,-0.03749692231881241,BTC,0.11315,0.11315,0.16665999999999997,0.16665999999999997,0.04667,0.04667,0.009846153846153846,0.009846153846153846,0.5859,0.5859 +2024-11-15,87284.1796875,91868.7421875,87124.8984375,91066.0078125,78243109518,0.04280211829142644,BTC,0.2347,0.2347,0.11315,0.11315,0.16665999999999997,0.16665999999999997,0.04667,0.04667,0.0,0.0 +2024-11-16,91064.3671875,91763.9453125,90094.2265625,90558.4765625,44333192814,-0.005588812244118557,BTC,-0.07585000000000001,-0.07585000000000001,0.2347,0.2347,0.11315,0.11315,0.16665999999999997,0.16665999999999997,0.009846153846153846,0.009846153846153846 +2024-11-18,89843.71875,92596.7890625,89393.59375,90542.640625,75535775084,0.007725465406075216,BTC,0.0758888888888889,0.0758888888888889,-0.07585000000000001,-0.07585000000000001,0.2347,0.2347,0.11315,0.11315,0.04667,0.04667 +2024-11-19,90536.8125,94002.8671875,90426.984375,92343.7890625,74521048295,0.01969754318365169,BTC,-0.074,-0.074,0.0758888888888889,0.0758888888888889,-0.07585000000000001,-0.07585000000000001,0.2347,0.2347,0.16665999999999997,0.16665999999999997 +2024-11-20,92341.890625,94902.0234375,91619.5,94339.4921875,71730956426,0.02138144499843264,BTC,0.20984166666666668,0.20984166666666668,-0.074,-0.074,0.0758888888888889,0.0758888888888889,-0.07585000000000001,-0.07585000000000001,0.11315,0.11315 +2024-11-21,94334.640625,99014.21875,94132.6015625,98504.7265625,106024505582,0.04320463738221214,BTC,0.13219999999999998,0.13219999999999998,0.20984166666666668,0.20984166666666668,-0.074,-0.074,0.0758888888888889,0.0758888888888889,0.2347,0.2347 +2024-11-22,98496.4296875,99655.5,97222.6640625,98997.6640625,78473580551,0.0049917220950614904,BTC,0.12792222222222221,0.12792222222222221,0.13219999999999998,0.13219999999999998,0.20984166666666668,0.20984166666666668,-0.074,-0.074,-0.07585000000000001,-0.07585000000000001 +2024-11-23,99006.7421875,99014.6796875,97232.890625,97777.28125,44414644677,-0.012404002529793345,BTC,0.7579,0.7579,0.12792222222222221,0.12792222222222221,0.13219999999999998,0.13219999999999998,0.20984166666666668,0.20984166666666668,0.0758888888888889,0.0758888888888889 +2024-11-24,97778.09375,98647.1796875,95788.078125,98013.8203125,51712020623,0.0024162403264789134,BTC,0.26022,0.26022,0.7579,0.7579,0.12792222222222221,0.12792222222222221,0.13219999999999998,0.13219999999999998,-0.074,-0.074 +2024-11-25,98033.4453125,98935.03125,92642.9140625,93102.296875,80909462490,-0.051409637293289734,BTC,0.06691666666666667,0.06691666666666667,0.26022,0.26022,0.7579,0.7579,0.12792222222222221,0.12792222222222221,0.20984166666666668,0.20984166666666668 +2024-11-26,93087.28125,94991.75,90770.8125,91985.3203125,91656519855,-0.012069852534281722,BTC,-0.08058421052631579,-0.08058421052631579,0.06691666666666667,0.06691666666666667,0.26022,0.26022,0.7579,0.7579,0.13219999999999998,0.13219999999999998 +2024-11-27,91978.140625,97361.1796875,91778.6640625,95962.53125,71133452438,0.04232881330495708,BTC,0.07495454545454545,0.07495454545454545,-0.08058421052631579,-0.08058421052631579,0.06691666666666667,0.06691666666666667,0.26022,0.26022,0.12792222222222221,0.12792222222222221 +2024-11-28,95954.9453125,96650.203125,94677.3515625,95652.46875,52260008261,-0.0032363100031336245,BTC,0.08193333333333333,0.08193333333333333,0.07495454545454545,0.07495454545454545,-0.08058421052631579,-0.08058421052631579,0.06691666666666667,0.06691666666666667,0.7579,0.7579 +2024-11-29,95653.953125,98693.171875,95407.8828125,97461.5234375,54968682476,0.018736162907208254,BTC,0.007863157894736841,0.007863157894736841,0.08193333333333333,0.08193333333333333,0.07495454545454545,0.07495454545454545,-0.08058421052631579,-0.08058421052631579,0.26022,0.26022 +2024-11-30,97468.8125,97499.34375,96144.21875,96449.0546875,31634227866,-0.010442730465097583,BTC,0.3612,0.3612,0.007863157894736841,0.007863157894736841,0.08193333333333333,0.08193333333333333,0.07495454545454545,0.07495454545454545,0.06691666666666667,0.06691666666666667 +2024-12-01,96461.3359375,97888.125,95770.1875,97279.7890625,36590695296,0.008576311620290156,BTC,0.26335,0.26335,0.3612,0.3612,0.007863157894736841,0.007863157894736841,0.08193333333333333,0.08193333333333333,-0.08058421052631579,-0.08058421052631579 +2024-12-02,97276.0078125,98152.6015625,94482.8671875,95865.3046875,72680784305,-0.01464711979836153,BTC,0.10115,0.10115,0.26335,0.26335,0.3612,0.3612,0.007863157894736841,0.007863157894736841,0.07495454545454545,0.07495454545454545 +2024-12-03,95854.59375,96297.203125,93629.5625,96002.1640625,67067810961,0.0014266034685608275,BTC,0.0066125,0.0066125,0.10115,0.10115,0.26335,0.26335,0.3612,0.3612,0.08193333333333333,0.08193333333333333 +2024-12-04,95988.53125,99207.328125,94660.5234375,98768.53125,77199817112,0.028408310872006126,BTC,0.0789125,0.0789125,0.0066125,0.0066125,0.10115,0.10115,0.26335,0.26335,0.007863157894736841,0.007863157894736841 +2024-12-05,98741.5390625,103900.46875,91998.78125,96593.5703125,149218945580,-0.022266865312221995,BTC,0.03742857142857143,0.03742857142857143,0.0789125,0.0789125,0.0066125,0.0066125,0.10115,0.10115,0.3612,0.3612 +2024-12-06,97074.2265625,102039.8828125,96514.875,99920.7109375,94534772658,0.03386480176780893,BTC,-0.07085,-0.07085,0.03742857142857143,0.03742857142857143,0.0789125,0.0789125,0.0066125,0.0066125,0.26335,0.26335 +2024-12-07,99916.7109375,100563.3828125,99030.8828125,99923.3359375,44177510897,2.6270484823953666e-05,BTC,-0.09866666666666667,-0.09866666666666667,-0.07085,-0.07085,0.03742857142857143,0.03742857142857143,0.0789125,0.0789125,0.10115,0.10115 +2024-12-08,99921.9140625,101399.9921875,98771.515625,101236.015625,44125751925,0.013051327819740166,BTC,0.14689166666666667,0.14689166666666667,-0.09866666666666667,-0.09866666666666667,-0.07085,-0.07085,0.03742857142857143,0.03742857142857143,0.0066125,0.0066125 +2024-12-09,101237.0625,101272.5078125,94355.9140625,97432.71875,110676473908,-0.038292503466212935,BTC,0.16097096774193548,0.16097096774193548,0.14689166666666667,0.14689166666666667,-0.09866666666666667,-0.09866666666666667,-0.07085,-0.07085,0.0789125,0.0789125 +2024-12-10,97441.234375,98270.15625,94321.2578125,96675.4296875,104823780634,-0.007802793553988607,BTC,-0.01758333333333333,-0.01758333333333333,0.16097096774193548,0.16097096774193548,0.14689166666666667,0.14689166666666667,-0.09866666666666667,-0.09866666666666667,0.03742857142857143,0.03742857142857143 +2024-12-11,96656.0625,101913.359375,95747.2265625,101173.03125,85391409936,0.04547294957076353,BTC,-0.01293846153846154,-0.01293846153846154,-0.01758333333333333,-0.01758333333333333,0.16097096774193548,0.16097096774193548,0.14689166666666667,0.14689166666666667,-0.07085,-0.07085 +2024-12-12,101167.8046875,102524.9140625,99339.953125,100043.0,72073983533,-0.011232138149603443,BTC,0.006233333333333328,0.006233333333333328,-0.01293846153846154,-0.01293846153846154,-0.01758333333333333,-0.01758333333333333,0.16097096774193548,0.16097096774193548,-0.09866666666666667,-0.09866666666666667 +2024-12-13,100046.6484375,101888.8046875,99233.28125,101459.2578125,56894751583,0.014057223472295988,BTC,0.14612727272727272,0.14612727272727272,0.006233333333333328,0.006233333333333328,-0.01293846153846154,-0.01293846153846154,-0.01758333333333333,-0.01758333333333333,0.14689166666666667,0.14689166666666667 +2024-12-14,101451.4375,102618.8828125,100634.0546875,101372.96875,40422968793,-0.0008508417934169898,BTC,0.12891562499999998,0.12891562499999998,0.14612727272727272,0.14612727272727272,0.006233333333333328,0.006233333333333328,-0.01293846153846154,-0.01293846153846154,0.16097096774193548,0.16097096774193548 +2024-12-16,104293.578125,107780.578125,103322.984375,106029.71875,91020417816,0.016460567443029817,BTC,0.0,0.0,0.12891562499999998,0.12891562499999998,0.14612727272727272,0.14612727272727272,0.006233333333333328,0.006233333333333328,-0.01758333333333333,-0.01758333333333333 +2024-12-17,106030.6875,108268.4453125,105291.734375,106140.6015625,68589364868,0.0010452246330352466,BTC,0.06352,0.06352,0.0,0.0,0.12891562499999998,0.12891562499999998,0.14612727272727272,0.14612727272727272,-0.01293846153846154,-0.01293846153846154 +2024-12-18,106147.296875,106470.609375,100041.5390625,100041.5390625,93865656139,-0.05917915465376922,BTC,-0.15105,-0.15105,0.06352,0.06352,0.0,0.0,0.12891562499999998,0.12891562499999998,0.006233333333333328,0.006233333333333328 +2024-12-19,100070.6875,102748.1484375,95587.6796875,97490.953125,97221662392,-0.025825905125143933,BTC,0.0,0.0,-0.15105,-0.15105,0.06352,0.06352,0.0,0.0,0.14612727272727272,0.14612727272727272 +2024-12-20,97484.6953125,98098.9140625,92175.1796875,97755.9296875,105634083408,0.002714273553184654,BTC,0.046,0.046,0.0,0.0,-0.15105,-0.15105,0.06352,0.06352,0.12891562499999998,0.12891562499999998 +2024-12-21,97756.1953125,99507.1015625,96426.5234375,97224.7265625,51765334294,-0.005448791172121048,BTC,0.0,0.0,0.046,0.046,0.0,0.0,-0.15105,-0.15105,0.0,0.0 +2024-12-22,97218.3203125,97360.265625,94202.1875,95104.9375,43147981314,-0.02204418038201439,BTC,0.17828,0.17828,0.0,0.0,0.046,0.046,0.0,0.0,0.06352,0.06352 +2024-12-23,95099.390625,96416.2109375,92403.1328125,94686.2421875,65239002919,-0.004412175449120426,BTC,-0.07656666666666667,-0.07656666666666667,0.17828,0.17828,0.0,0.0,0.046,0.046,-0.15105,-0.15105 +2024-12-24,94684.34375,99404.0625,93448.015625,98676.09375,47114953674,0.0412739940682787,BTC,-0.031724999999999996,-0.031724999999999996,-0.07656666666666667,-0.07656666666666667,0.17828,0.17828,0.0,0.0,0.0,0.0 +2024-12-25,98675.9140625,99478.75,97593.46875,99299.1953125,33700394629,0.006294761562736895,BTC,0.2155,0.2155,-0.031724999999999996,-0.031724999999999996,-0.07656666666666667,-0.07656666666666667,0.17828,0.17828,0.046,0.046 +2024-12-26,99297.6953125,99884.5703125,95137.8828125,95795.515625,47054980873,-0.03592159329680378,BTC,0.008899999999999998,0.008899999999999998,0.2155,0.2155,-0.031724999999999996,-0.031724999999999996,-0.07656666666666667,-0.07656666666666667,0.0,0.0 +2024-12-27,95704.9765625,97294.84375,93310.7421875,94164.859375,52419934565,-0.01716880486495498,BTC,0.1736625,0.1736625,0.008899999999999998,0.008899999999999998,0.2155,0.2155,-0.031724999999999996,-0.031724999999999996,0.17828,0.17828 +2024-12-28,94160.1875,95525.8984375,94014.2890625,95163.9296875,24107436185,0.010553910906912378,BTC,-0.054877777777777775,-0.054877777777777775,0.1736625,0.1736625,0.008899999999999998,0.008899999999999998,0.2155,0.2155,-0.07656666666666667,-0.07656666666666667 +2024-12-29,95174.0546875,95174.875,92881.7890625,93530.2265625,29635885267,-0.01731631736860173,BTC,0.11655,0.11655,-0.054877777777777775,-0.054877777777777775,0.1736625,0.1736625,0.008899999999999998,0.008899999999999998,-0.031724999999999996,-0.031724999999999996 +2024-12-30,93527.1953125,94903.3203125,91317.1328125,92643.2109375,56188003691,-0.009528989191728954,BTC,0.13771176470588234,0.13771176470588234,0.11655,0.11655,-0.054877777777777775,-0.054877777777777775,0.1736625,0.1736625,0.2155,0.2155 +2024-12-31,92643.25,96090.6015625,91914.03125,93429.203125,43625106843,0.008448290052871954,BTC,0.07020869565217391,0.07020869565217391,0.13771176470588234,0.13771176470588234,0.11655,0.11655,-0.054877777777777775,-0.054877777777777775,0.008899999999999998,0.008899999999999998 +2025-01-01,93425.1015625,94929.8671875,92788.125,94419.7578125,24519888919,0.010546386456946166,BTC,0.0007714285714285658,0.0007714285714285658,0.07020869565217391,0.07020869565217391,0.13771176470588234,0.13771176470588234,0.11655,0.11655,0.1736625,0.1736625 diff --git a/analysis/outputs/btc_training_table_reconstructed.csv b/analysis/outputs/btc_training_table_reconstructed.csv new file mode 100644 index 0000000..c515f2e --- /dev/null +++ b/analysis/outputs/btc_training_table_reconstructed.csv @@ -0,0 +1,14 @@ +date,open,high,low,close,volume,return,asset,finbert_score,vader_score,finbert_lag_1,vader_lag_1,finbert_lag_2,vader_lag_2,finbert_lag_3,vader_lag_3,finbert_lag_5,vader_lag_5,vol_5,vol_22,vol_60,vol_target,log_vol_target,abs_return,sq_return,finbert_surprise,vader_surprise,sent_x_vol5,sent_x_vol22,sent_x_absret +2024-12-14,101451.4375,102618.8828125,100634.0546875,101372.96875,40422968793,-0.0008508417934169898,BTC,0.12891562499999998,0.12891562499999998,0.14612727272727272,0.14612727272727272,0.006233333333333328,0.006233333333333328,-0.01293846153846154,-0.01293846153846154,0.16097096774193548,0.16097096774193548,0.02312372935837378,0.02391919557435657,0.027675779171967126,0.03003806203666794,-3.505256676386328,0.0008508417934169898,7.239317574250396e-07,0.07876473776223772,0.07876473776223772,0.0029810100225656044,0.003083558046965411,0.00010968680157447211 +2024-12-16,104293.578125,107780.578125,103322.984375,106029.71875,91020417816,0.016460567443029817,BTC,0.0,0.0,0.12891562499999998,0.12891562499999998,0.14612727272727272,0.14612727272727272,0.006233333333333328,0.006233333333333328,-0.01758333333333333,-0.01758333333333333,0.02148481697970085,0.023936114720185152,0.027668373343513582,0.026000560866537428,-3.6495987094342204,0.016460567443029817,0.00027095028054653316,-0.05366755390442892,-0.05366755390442892,0.0,0.0,0.0 +2024-12-17,106030.6875,108268.4453125,105291.734375,106140.6015625,68589364868,0.0010452246330352466,BTC,0.06352,0.06352,0.0,0.0,0.12891562499999998,0.12891562499999998,0.14612727272727272,0.14612727272727272,-0.01293846153846154,-0.01293846153846154,0.011408755503584157,0.023937827196448543,0.027335480618604864,0.023883349437881406,-3.734531869777998,0.0010452246330352466,1.092494533503666e-06,-0.005439246212121218,-0.005439246212121218,0.0007246841495876656,0.0015205307835184114,6.639266869039885e-05 +2024-12-18,106147.296875,106470.609375,100041.5390625,100041.5390625,93865656139,-0.05917915465376922,BTC,-0.15105,-0.15105,0.06352,0.06352,0.0,0.0,0.12891562499999998,0.12891562499999998,0.006233333333333328,0.006233333333333328,0.030864505438381228,0.02480980497781709,0.028656092609379923,0.012288998918154425,-4.398969443430689,0.05917915465376922,0.003502172345534735,-0.18855257954545457,-0.18855257954545457,-0.004662083546467484,-0.003747521041899271,-0.00893901131045184 +2024-12-19,100070.6875,102748.1484375,95587.6796875,97490.953125,97221662392,-0.025825905125143933,BTC,0.0,0.0,-0.15105,-0.15105,0.06352,0.06352,0.0,0.0,0.14612727272727272,0.14612727272727272,0.02961236622711386,0.025348115664753805,0.028744889745997027,0.023541516585815957,-3.7489472760750067,0.025825905125143933,0.0006669773755329357,-0.008277125000000019,-0.008277125000000019,0.0,0.0,0.0 +2024-12-20,97484.6953125,98098.9140625,92175.1796875,97755.9296875,105634083408,0.002714273553184654,BTC,0.046,0.046,0.0,0.0,-0.15105,-0.15105,0.06352,0.06352,0.12891562499999998,0.12891562499999998,0.03003806203666794,0.02364847078707162,0.028741291169230177,0.023607199053346458,-3.746161209771383,0.002714273553184654,7.367280921517647e-06,0.05430599999999998,0.05430599999999998,0.0013817508536867252,0.0010878296562052945,0.0001248565834464941 +2024-12-21,97756.1953125,99507.1015625,96426.5234375,97224.7265625,51765334294,-0.005448791172121048,BTC,0.0,0.0,0.046,0.046,0.0,0.0,-0.15105,-0.15105,0.0,0.0,0.026000560866537428,0.023665574917982934,0.02874148724209315,0.02955959325229183,-3.5213131136755194,0.005448791172121048,2.9689325237384265e-05,0.008305999999999977,0.008305999999999977,0.0,0.0,0.0 +2024-12-22,97218.3203125,97360.265625,94202.1875,95104.9375,43147981314,-0.02204418038201439,BTC,0.17828,0.17828,0.0,0.0,0.046,0.046,0.0,0.0,0.06352,0.06352,0.023883349437881406,0.023679927537602573,0.028410304042633023,0.02884452495368189,-3.545800412316616,0.02204418038201439,0.00048594588871478806,0.16363399999999997,0.16363399999999997,0.004257923537785497,0.004221657481403787,0.003930036478505525 +2024-12-23,95099.390625,96416.2109375,92403.1328125,94686.2421875,65239002919,-0.004412175449120426,BTC,-0.07656666666666667,-0.07656666666666667,0.17828,0.17828,0.0,0.0,0.046,0.046,-0.15105,-0.15105,0.012288998918154425,0.02361728524114142,0.028409656711373545,0.02930279690311569,-3.530038184217749,0.004412175449120426,1.946729219382103e-05,-0.10610933333333336,-0.10610933333333336,-0.0009409276838333572,-0.0018082968066300616,-0.00033782556688765394 +2024-12-24,94684.34375,99404.0625,93448.015625,98676.09375,47114953674,0.0412739940682787,BTC,-0.031724999999999996,-0.031724999999999996,-0.07656666666666667,-0.07656666666666667,0.17828,0.17828,0.0,0.0,0.0,0.0,0.023541516585815957,0.02529266649571513,0.028789608528402483,0.01912001461784338,-3.956967306980033,0.0412739940682787,0.001703542586348305,-0.05492266666666669,-0.05492266666666669,-0.0007468546136850111,-0.0008024098445765625,-0.0013094174618161415 +2024-12-25,98675.9140625,99478.75,97593.46875,99299.1953125,33700394629,0.006294761562736895,BTC,0.2155,0.2155,-0.031724999999999996,-0.031724999999999996,-0.07656666666666667,-0.07656666666666667,0.17828,0.17828,0.046,0.046,0.023607199053346458,0.02513419755170916,0.028766752586761285,0.016766063793618988,-4.0883388053209355,0.006294761562736895,3.962402313170983e-05,0.1584023333333333,0.1584023333333333,0.005087351395996162,0.005416419572393324,0.0013565211167698007 +2024-12-26,99297.6953125,99884.5703125,95137.8828125,95795.515625,47054980873,-0.03592159329680378,BTC,0.008899999999999998,0.008899999999999998,0.2155,0.2155,-0.031724999999999996,-0.031724999999999996,-0.07656666666666667,-0.07656666666666667,0.0,0.0,0.02955959325229183,0.02628968185387937,0.0292367202433474,0.013629598764626018,-4.295438104332055,0.03592159329680378,0.001290360864980978,-0.049977666666666684,-0.049977666666666684,0.0002630803799453972,0.00023397816849952635,0.00031970218034155354 +2024-12-27,95704.9765625,97294.84375,93310.7421875,94164.859375,52419934565,-0.01716880486495498,BTC,0.1736625,0.1736625,0.008899999999999998,0.008899999999999998,0.2155,0.2155,-0.031724999999999996,-0.031724999999999996,0.17828,0.17828,0.02884452495368189,0.025616765146873378,0.02936690314231498,0.013068854619822958,-4.337446874604277,0.01716880486495498,0.0002947678604909017,0.11570833333333332,0.11570833333333332,0.005009212314768781,0.0044486714773188975,0.002981577574860244 diff --git a/analysis/outputs/categorical_bars_text.png b/analysis/outputs/categorical_bars_text.png new file mode 100644 index 0000000..810532a Binary files /dev/null and b/analysis/outputs/categorical_bars_text.png differ diff --git a/analysis/outputs/corr_heatmap_btc.png b/analysis/outputs/corr_heatmap_btc.png new file mode 100644 index 0000000..36a7b61 Binary files /dev/null and b/analysis/outputs/corr_heatmap_btc.png differ diff --git a/analysis/outputs/corr_heatmap_nifty.png b/analysis/outputs/corr_heatmap_nifty.png new file mode 100644 index 0000000..5c63689 Binary files /dev/null and b/analysis/outputs/corr_heatmap_nifty.png differ diff --git a/analysis/outputs/corr_pearson_btc.csv b/analysis/outputs/corr_pearson_btc.csv new file mode 100644 index 0000000..23e045e --- /dev/null +++ b/analysis/outputs/corr_pearson_btc.csv @@ -0,0 +1,7 @@ +,abs_return,sq_return,vol_5,vol_22,vol_60,log_vol_target +abs_return,1.0,0.7712076773047863,0.5401682871245256,0.3940446658312966,0.3064460952463945,0.2783837790310818 +sq_return,0.7712076773047863,1.0,0.40650884362129525,0.266948437674685,0.19341768655148925,0.17348197109131977 +vol_5,0.5401682871245256,0.40650884362129525,1.0,0.6928104265678855,0.5174093666522314,0.4215716238331127 +vol_22,0.3940446658312966,0.266948437674685,0.6928104265678855,1.0,0.769051709101388,0.45555300074897587 +vol_60,0.3064460952463945,0.19341768655148925,0.5174093666522314,0.769051709101388,1.0,0.41080488751193667 +log_vol_target,0.2783837790310818,0.17348197109131977,0.4215716238331127,0.45555300074897587,0.41080488751193667,1.0 diff --git a/analysis/outputs/corr_pearson_nifty.csv b/analysis/outputs/corr_pearson_nifty.csv new file mode 100644 index 0000000..48b689a --- /dev/null +++ b/analysis/outputs/corr_pearson_nifty.csv @@ -0,0 +1,7 @@ +,abs_return,sq_return,vol_5,vol_22,vol_60,log_vol_target +abs_return,1.0,0.7615623947854838,0.575436144835673,0.4311569804748325,0.32234321880779876,0.2530097777101766 +sq_return,0.7615623947854838,1.0,0.4943492981779437,0.36504935789083287,0.2495051856210732,0.19667858497899426 +vol_5,0.575436144835673,0.4943492981779437,1.0,0.7255866001437362,0.5317710721538007,0.3832591896454696 +vol_22,0.4311569804748325,0.36504935789083287,0.7255866001437362,1.0,0.7941578386366361,0.43675293579369723 +vol_60,0.32234321880779876,0.2495051856210732,0.5317710721538007,0.7941578386366361,1.0,0.3761534521070546 +log_vol_target,0.2530097777101766,0.19667858497899426,0.3832591896454696,0.43675293579369723,0.3761534521070546,1.0 diff --git a/analysis/outputs/corr_spearman_btc.csv b/analysis/outputs/corr_spearman_btc.csv new file mode 100644 index 0000000..ea24293 --- /dev/null +++ b/analysis/outputs/corr_spearman_btc.csv @@ -0,0 +1,7 @@ +,abs_return,sq_return,vol_5,vol_22,vol_60,log_vol_target +abs_return,1.0,1.0,0.4863478429445689,0.3742917693910502,0.2952201186203727,0.2652189874312711 +sq_return,1.0,1.0,0.4863478429445689,0.3742917693910502,0.2952201186203727,0.2652189874312711 +vol_5,0.4863478429445689,0.4863478429445689,1.0,0.6994996924154023,0.5231612970594803,0.4294049326615619 +vol_22,0.3742917693910502,0.3742917693910502,0.6994996924154023,1.0,0.7690997232886543,0.47027958290057664 +vol_60,0.2952201186203727,0.2952201186203727,0.5231612970594803,0.7690997232886543,1.0,0.4038960148873358 +log_vol_target,0.2652189874312711,0.2652189874312711,0.4294049326615619,0.47027958290057664,0.4038960148873358,1.0 diff --git a/analysis/outputs/corr_spearman_nifty.csv b/analysis/outputs/corr_spearman_nifty.csv new file mode 100644 index 0000000..b913036 --- /dev/null +++ b/analysis/outputs/corr_spearman_nifty.csv @@ -0,0 +1,7 @@ +,abs_return,sq_return,vol_5,vol_22,vol_60,log_vol_target +abs_return,1.0,1.0,0.42760046490782155,0.31559711382646305,0.24104929741841347,0.17962472038439947 +sq_return,1.0,1.0,0.42760046490782155,0.31559711382646305,0.24104929741841347,0.17962472038439947 +vol_5,0.42760046490782155,0.42760046490782155,1.0,0.6328307141180417,0.4926597482396145,0.3424996213908484 +vol_22,0.31559711382646305,0.31559711382646305,0.6328307141180417,1.0,0.8002432784709715,0.45374147059418085 +vol_60,0.24104929741841347,0.24104929741841347,0.4926597482396145,0.8002432784709715,1.0,0.3896916229333901 +log_vol_target,0.17962472038439947,0.17962472038439947,0.3424996213908484,0.45374147059418085,0.3896916229333901,1.0 diff --git a/analysis/outputs/data_profile_stdout.txt b/analysis/outputs/data_profile_stdout.txt new file mode 100644 index 0000000..b75ca38 --- /dev/null +++ b/analysis/outputs/data_profile_stdout.txt @@ -0,0 +1,501 @@ + +==================================================================================================== +1. FILE METADATA (data/raw) +==================================================================================================== + file bytes lines encoding delimiter header + btc_google_trends.csv 1439 133 ascii (subset of utf-8) ',' date,google_trend + btc_prices.csv 423823 4017 ascii (subset of utf-8) ',' date,open,high,low,close,volume,return + manifest.json 13789 618 ascii (subset of utf-8) NaN NaN +nifty_google_trends.csv 2146 195 ascii (subset of utf-8) ',' date,google_trend + nifty_prices.csv 379817 3928 ascii (subset of utf-8) ',' date,open,high,low,close,volume,return + pipeline.log 7828 80 utf-8 (non-ASCII present) NaN NaN + text_data.csv 241848 1501 utf-8 (non-ASCII present) ',' timestamp,text,source,asset,channel + +==================================================================================================== +2. STRUCTURE — btc_prices +==================================================================================================== +shape: 4016 rows x 7 cols | memory (deep): 219.8 KiB + +RangeIndex: 4016 entries, 0 to 4015 +Data columns (total 7 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 4016 non-null datetime64[us] + 1 open 4016 non-null float64 + 2 high 4016 non-null float64 + 3 low 4016 non-null float64 + 4 close 4016 non-null float64 + 5 volume 4016 non-null int64 + 6 return 4016 non-null float64 +dtypes: datetime64[us](1), float64(5), int64(1) +memory usage: 219.8 KB + +column dtype non_null null null_pct n_unique cardinality_ratio meaning confidence + date datetime64[us] 4016 0 0.0 4016 1.0000 Trading/calendar day of the bar (yfinance index) high + open float64 4016 0 0.0 4013 0.9993 Opening price of the day, quote currency (USD for BTC, INR index points for NIFTY) high + high float64 4016 0 0.0 4013 0.9993 Intraday high high + low float64 4016 0 0.0 4014 0.9995 Intraday low high + close float64 4016 0 0.0 4013 0.9993 Close price (yfinance default auto_adjust; index has no dividends) high +volume int64 4016 0 0.0 4016 1.0000 Traded volume (USD notional for BTC-USD; NIFTY index volume as reported by Yahoo) medium +return float64 4016 0 0.0 4016 1.0000 Simple return close.pct_change() — NOT log; notebooks later overwrite it with log return high + +==================================================================================================== +2. STRUCTURE — nifty_prices +==================================================================================================== +shape: 3927 rows x 7 cols | memory (deep): 214.9 KiB + +RangeIndex: 3927 entries, 0 to 3926 +Data columns (total 7 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 3927 non-null datetime64[us] + 1 open 3927 non-null float64 + 2 high 3927 non-null float64 + 3 low 3927 non-null float64 + 4 close 3927 non-null float64 + 5 volume 3927 non-null int64 + 6 return 3927 non-null float64 +dtypes: datetime64[us](1), float64(5), int64(1) +memory usage: 214.9 KB + +column dtype non_null null null_pct n_unique cardinality_ratio meaning confidence + date datetime64[us] 3927 0 0.0 3927 1.0000 Trading/calendar day of the bar (yfinance index) high + open float64 3927 0 0.0 3897 0.9924 Opening price of the day, quote currency (USD for BTC, INR index points for NIFTY) high + high float64 3927 0 0.0 3896 0.9921 Intraday high high + low float64 3927 0 0.0 3894 0.9916 Intraday low high + close float64 3927 0 0.0 3887 0.9898 Close price (yfinance default auto_adjust; index has no dividends) high +volume int64 3927 0 0.0 2206 0.5618 Traded volume (USD notional for BTC-USD; NIFTY index volume as reported by Yahoo) medium +return float64 3927 0 0.0 3924 0.9992 Simple return close.pct_change() — NOT log; notebooks later overwrite it with log return high + +==================================================================================================== +2. STRUCTURE — text_data +==================================================================================================== +shape: 1500 rows x 5 cols | memory (deep): 550.8 KiB + +RangeIndex: 1500 entries, 0 to 1499 +Data columns (total 5 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 timestamp 1500 non-null str + 1 text 1499 non-null str + 2 source 0 non-null float64 + 3 asset 1500 non-null str + 4 channel 1500 non-null str +dtypes: float64(1), str(4) +memory usage: 58.7 KB + + column dtype non_null null null_pct n_unique cardinality_ratio meaning confidence +timestamp str 1500 0 0.00 1133 0.7553 GDELT 'seendate' of the headline, UTC high + text str 1499 1 0.07 1390 0.9267 Headline title only (no body) high + source float64 0 1500 100.00 0 0.0000 Intended: publisher name. Empty in the committed file high + asset str 1500 0 0.00 2 0.0013 Which query produced the headline: BTC or NIFTY high + channel str 1500 0 0.00 1 0.0007 Collection channel label high + +==================================================================================================== +2. STRUCTURE — btc_google_trends +==================================================================================================== +shape: 132 rows x 2 cols | memory (deep): 8.4 KiB + +RangeIndex: 132 entries, 0 to 131 +Data columns (total 2 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 132 non-null str + 1 google_trend 132 non-null int64 +dtypes: int64(1), str(1) +memory usage: 2.2 KB + + column dtype non_null null null_pct n_unique cardinality_ratio meaning confidence + date str 132 0 0.0 132 1.0000 Trading/calendar day of the bar (yfinance index) high +google_trend int64 132 0 0.0 46 0.3485 Google Trends interest, 0-100, relative to the peak month of the queried window high + +==================================================================================================== +2. STRUCTURE — nifty_google_trends +==================================================================================================== +shape: 194 rows x 2 cols | memory (deep): 12.3 KiB + +RangeIndex: 194 entries, 0 to 193 +Data columns (total 2 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 194 non-null str + 1 google_trend 194 non-null int64 +dtypes: int64(1), str(1) +memory usage: 3.2 KB + + column dtype non_null null null_pct n_unique cardinality_ratio meaning confidence + date str 194 0 0.0 192 0.9897 Trading/calendar day of the bar (yfinance index) high +google_trend int64 194 0 0.0 73 0.3763 Google Trends interest, 0-100, relative to the peak month of the queried window high + +==================================================================================================== +3. NUMERIC PROFILE — btc_prices +==================================================================================================== +column open high low close volume return +count 4016 4016 4016 4016 4016 4016 +mean 27518 28072.6 26932.6 27538.9 2.22034e+10 0.00203044 +median 11352 11570.4 11015.3 11358.4 1.77768e+10 0.00124827 +mode 233.422 244.251 429.077 236.153 7.86065e+06 -0.371695 +mode_count 2 2 2 2 1 1 +std 31747.8 32290.5 31170 31758.7 2.29131e+10 0.0352221 +var 1.00792e+09 1.04267e+09 9.7157e+08 1.00862e+09 5.25008e+20 0.00124059 +min 176.897 211.731 171.51 178.103 7.86065e+06 -0.371695 +max 124752 126198 123196 124753 3.50968e+11 0.252472 +range 124575 125986 123025 124574 3.5096e+11 0.624167 +q1 3671.53 3754.55 3619.76 3673.18 2.21954e+09 -0.0121418 +q2 11352 11570.4 11015.3 11358.4 1.77768e+10 0.00124827 +q3 42807.8 43575.5 41906.5 42840.4 3.37298e+10 0.0160721 +iqr 39136.3 39820.9 38286.8 39167.2 3.15102e+10 0.0282139 +p01 226.552 230.625 222.713 226.709 1.51479e+07 -0.100603 +p05 256.338 261.653 251.684 256.327 2.66025e+07 -0.0528328 +p95 101769 104025 99766.5 101752 6.59738e+10 0.0555936 +p99 116816 117874 115248 116820 9.44825e+10 0.104195 +skew 1.30637 1.2927 1.32118 1.30491 2.01318 -0.120367 +kurtosis_excess 0.725912 0.676827 0.779216 0.720562 12.7903 7.97923 +cv 1.15371 1.15025 1.15733 1.15323 1.03196 17.347 +zeros 0 0 0 0 0 1 +negatives 0 0 0 0 0 1896 +outliers_iqr_1.5 204 209 205 202 80 379 +outliers_abs_z_gt_3 4 3 5 4 53 70 + +==================================================================================================== +3. NUMERIC PROFILE — nifty_prices +==================================================================================================== +column open high low close volume return +count 3927 3927 3927 3927 3927 3927 +mean 11843.6 11900.2 11770.4 11836.6 240987 0.000462066 +median 10101 10155.7 10049.1 10113.7 213500 0.000587859 +mode 4878.6 5016.25 4924.3 5274.85 0 0 +mode_count 2 2 2 3 774 4 +std 6228.66 6250.88 6201.78 6227.35 202284 0.0103975 +var 3.87962e+07 3.90734e+07 3.8462e+07 3.87799e+07 4.09189e+10 0.000108107 +min 4623.15 4623.15 4531.15 4544.2 0 -0.129805 +max 26325.8 26325.8 26172.4 26216.1 1.811e+06 0.0876321 +range 21702.7 21702.7 21641.3 21671.9 1.811e+06 0.217437 +q1 6207.62 6258.1 6179.85 6216.15 131700 -0.00474398 +q2 10101 10155.7 10049.1 10113.7 213500 0.000587859 +q3 17005.3 17112.2 16847 16983.4 312150 0.00610318 +iqr 10797.7 10854.1 10667.1 10767.2 180450 0.0108472 +p01 4841.48 4879.32 4787.58 4840.12 0 -0.0263197 +p05 5148.53 5179.53 5101.47 5139.46 0 -0.015553 +p95 24642 24764.1 24535.5 24653.2 642600 0.0162392 +p99 25866.3 25946.7 25786.6 25866.4 873090 0.0261422 +skew 0.823708 0.824033 0.826457 0.824812 1.47719 -0.687598 +kurtosis_excess -0.532591 -0.533351 -0.525815 -0.531072 4.28317 11.8025 +cv 0.525909 0.525273 0.526894 0.526111 0.839399 22.5021 +zeros 0 0 0 0 774 4 +negatives 0 0 0 0 0 1834 +outliers_iqr_1.5 0 0 0 0 285 156 +outliers_abs_z_gt_3 0 0 0 0 49 47 + +==================================================================================================== +3. NUMERIC PROFILE — btc_google_trends +==================================================================================================== +column google_trend +count 132 +mean 22.7121 +median 21 +mode 2 +mode_count 13 +std 16.9145 +var 286.1 +min 2 +max 100 +range 98 +q1 11.75 +q2 21 +q3 33 +iqr 21.25 +p01 2 +p05 2 +p95 52 +p99 67.45 +skew 1.14125 +kurtosis_excess 2.46385 +cv 0.744734 +zeros 0 +negatives 0 +outliers_iqr_1.5 2 +outliers_abs_z_gt_3 1 + +==================================================================================================== +3. NUMERIC PROFILE — nifty_google_trends +==================================================================================================== +column google_trend +count 194 +mean 36.6546 +median 26 +mode 13 +mode_count 15 +std 25.7758 +var 664.393 +min 8 +max 100 +range 92 +q1 13.25 +q2 26 +q3 59 +iqr 45.75 +p01 8.93 +p05 10 +p95 82 +p99 98 +skew 0.698444 +kurtosis_excess -0.79657 +cv 0.703208 +zeros 0 +negatives 0 +outliers_iqr_1.5 0 +outliers_abs_z_gt_3 0 + +==================================================================================================== +3b. PLAUSIBILITY CHECKS — BTC prices +==================================================================================================== + date_min: 2015-01-02 + date_max: 2025-12-30 + future_dates_vs_2026-10-09: 0 + duplicate_dates: 0 + nonpositive_prices: 0 + high_lt_low: 0 + close_outside_low_high: 0 + open_outside_low_high: 0 + volume_zero_rows: 0 + stored_return_vs_pct_change_maxabsdiff_excl_first: 3.0964814046186007e-16 + stored_return_first_row: 0.0024917184690256 + day_gap_histogram: {1: 4015} + calendar_days_missing: 0 + btc_missing_dates_sample: [] + largest_abs_log_returns: [{'date': '2020-03-12', 'close': 4970.79, 'abs_log_ret': 0.4647}, {'date': '2015-01-14', 'close': 178.1, 'abs_log_ret': 0.2376}, {'date': '2017-12-07', 'close': 17899.7, 'abs_log_ret': 0.2251}, {'date': '2017-07-20', 'close': 2817.6, 'abs_log_ret': 0.2146}, {'date': '2017-09-14', 'close': 3154.95, 'abs_log_ret': 0.2075}] + rows_per_year: {2015: 364, 2016: 366, 2017: 365, 2018: 365, 2019: 365, 2020: 366, 2021: 365, 2022: 365, 2023: 365, 2024: 366, 2025: 364} + +==================================================================================================== +3b. PLAUSIBILITY CHECKS — NIFTY prices +==================================================================================================== + date_min: 2010-01-05 + date_max: 2025-12-30 + future_dates_vs_2026-10-09: 0 + duplicate_dates: 0 + nonpositive_prices: 0 + high_lt_low: 0 + close_outside_low_high: 0 + open_outside_low_high: 0 + volume_zero_rows: 774 + volume_zero_first_last: ['2010-01-05', '2024-07-03'] + volume_zero_by_year: {2010: 249, 2011: 242, 2012: 242, 2013: 13, 2017: 1, 2018: 13, 2020: 2, 2021: 4, 2022: 1, 2023: 2, 2024: 5} + stored_return_vs_pct_change_maxabsdiff_excl_first: 9.996344030316351e-17 + stored_return_first_row: 0.0087343192778044 + day_gap_histogram: {1: 2967, 2: 120, 3: 735, 4: 95, 5: 8, 6: 1} + calendar_days_missing: 1912 + largest_abs_log_returns: [{'date': '2020-03-23', 'close': 7610.25, 'abs_log_ret': 0.139}, {'date': '2020-03-12', 'close': 9590.15, 'abs_log_ret': 0.0867}, {'date': '2020-04-07', 'close': 8792.2, 'abs_log_ret': 0.084}, {'date': '2020-03-16', 'close': 9197.4, 'abs_log_ret': 0.0792}, {'date': '2020-03-25', 'close': 8317.85, 'abs_log_ret': 0.0641}] + rows_per_year: {2010: 249, 2011: 242, 2012: 242, 2013: 247, 2014: 240, 2015: 244, 2016: 244, 2017: 248, 2018: 245, 2019: 241, 2020: 250, 2021: 248, 2022: 248, 2023: 245, 2024: 246, 2025: 248} + +==================================================================================================== +4. CATEGORICAL PROFILE — text_data +==================================================================================================== + +[source] + value_counts: {'nan': 1500} + relative_freq: {'nan': 1.0} + mode: None + entropy_bits: None + n_categories: 0 + rare_lt_1pct: 0 + case_or_whitespace_variants: {} + na_like_strings: 0 + true_NaN: 1500 + +[asset] + value_counts: {'NIFTY': 750, 'BTC': 750} + relative_freq: {'NIFTY': 0.5, 'BTC': 0.5} + mode: BTC + entropy_bits: 1.0 + n_categories: 2 + rare_lt_1pct: 0 + case_or_whitespace_variants: {} + na_like_strings: 0 + true_NaN: 0 + +[channel] + value_counts: {'news_gdelt': 1500} + relative_freq: {'news_gdelt': 1.0} + mode: news_gdelt + entropy_bits: -0.0 + n_categories: 1 + rare_lt_1pct: 0 + case_or_whitespace_variants: {} + na_like_strings: 0 + true_NaN: 0 + +==================================================================================================== +4b. TEXT PROFILE — data/raw/text_data.csv +==================================================================================================== + rows: 1500 + ts_min: 2024-10-03 01:15:00+00:00 + ts_max: 2025-01-01 16:30:00+00:00 + distinct_utc_days: 91 + dominant_script_counts: {'LATIN': 1261, 'DEVANAGARI': 150, 'HANGUL': 52, 'GUJARATI': 14, 'CYRILLIC': 7, 'TAMIL': 5, 'CJK': 3, 'KANNADA': 2, 'MALAYALAM': 2, 'HEBREW': 2, 'TELUGU': 1, 'ARABIC': 1} + dominant_script_by_asset: {'BTC': {'LATIN': 687, 'HANGUL': 52, 'CYRILLIC': 6, 'CJK': 2, 'HEBREW': 2, 'ARABIC': 1}, 'NIFTY': {'LATIN': 574, 'DEVANAGARI': 150, 'GUJARATI': 14, 'TAMIL': 5, 'KANNADA': 2, 'MALAYALAM': 2, 'CYRILLIC': 1, 'CJK': 1, 'TELUGU': 1}} + headline_len_chars: {'count': 1499.0, 'mean': 87.9, 'std': 37.25, 'min': 21.0, '25%': 64.0, '50%': 79.0, '75%': 102.0, 'max': 253.0} + exact_duplicate_rows: 65 + duplicate_text_any_time: 109 + rows_after_clean_len_gt_10 (nb02 reports 1377): 1377 + rows_dropped_by_clean_filter: 123 + dropped_rows_by_script: {'HANGUL': 52, 'DEVANAGARI': 50, 'CYRILLIC': 7, 'TAMIL': 5, 'CJK': 3, 'HEBREW': 2, 'LATIN': 1, 'TELUGU': 1, 'MALAYALAM': 1, 'ARABIC': 1} + kept_non_latin_rows (garbled by ascii-only regex): 117 + near_duplicate_clean_text: 192 + headlines_per_day_per_asset: {'BTC': {'count': 91.0, 'mean': 7.54, 'std': 6.39, 'min': 0.0, '25%': 3.0, '50%': 6.0, '75%': 10.0, 'max': 32.0}, 'NIFTY': {'count': 91.0, 'mean': 7.59, 'std': 5.28, 'min': 0.0, '25%': 3.0, '50%': 7.0, '75%': 11.0, 'max': 23.0}} + days_with_headlines: {'BTC': 82, 'NIFTY': 87} + +==================================================================================================== +5. RECONSTRUCTED TRAINING TABLE (nb02 → nb03 → nb04 → pipeline/feature_engineering.py) +==================================================================================================== + vader_on_clean_text: {'count': 1377.0, 'mean': 0.1567, 'std': 0.307, 'min': -0.9136, '25%': 0.0, '50%': 0.0, '75%': 0.4019, 'max': 0.891} + aligned_rows (nb05 printed BTC shape (75, 15)): 77 + aligned_date_range: ['2024-10-08', '2025-01-01'] + rows_after_build_features_dropna: 13 + train_rows: 10 + test_rows: 3 + train_dates: ['2024-12-14', '2024-12-24'] + test_dates: ['2024-12-25', '2024-12-27'] + why_so_few: rolling(60) in pipeline/feature_engineering.py:17 consumes 59 of the aligned rows; shift(-5) target consumes the last 5 + +==================================================================================================== +5b. TARGET — log_vol_target in the reconstructed training table +==================================================================================================== +count 13.000000 +mean -3.850678 +std 0.329382 +min -4.398969 +25% -4.088339 +50% -3.746161 +75% -3.545800 +max -3.505257 + dummy_mean_rmse_vol_space: 0.009553206183977425 + dummy_mean_mae_vol_space: 0.009413657530969635 + y_train_values: [-3.50526, -3.6496, -3.73453, -4.39897, -3.74895, -3.74616, -3.52131, -3.5458, -3.53004, -3.95697] + y_test_values: [-4.08834, -4.29544, -4.33745] + vol_space_min_max: [0.012288998918154423, 0.030038062036667947] + +==================================================================================================== +5c. FULL-HISTORY TARGET — BTC 5-day realised vol, 5 days ahead (same definition as pipeline) +==================================================================================================== + vol_target: {'n': 3951, 'mean': np.float64(0.028584), 'median': np.float64(0.023812), 'std': np.float64(0.020172), 'skew': np.float64(2.36187), 'excess_kurtosis': np.float64(12.327075), 'jarque_bera_stat': 28689.282749, 'jarque_bera_p': 0.0} + log_vol_target: {'n': 3951, 'mean': np.float64(-3.775089), 'median': np.float64(-3.737509), 'std': np.float64(0.683985), 'skew': np.float64(-0.290712), 'excess_kurtosis': np.float64(0.166451), 'jarque_bera_stat': 60.213355, 'jarque_bera_p': 0.0} + +==================================================================================================== +6. RELATIONSHIPS — BTC price features vs target (full history) +==================================================================================================== +Pearson: + abs_return sq_return vol_5 vol_22 vol_60 log_vol_target +abs_return 1.000 0.771 0.540 0.394 0.306 0.278 +sq_return 0.771 1.000 0.407 0.267 0.193 0.173 +vol_5 0.540 0.407 1.000 0.693 0.517 0.422 +vol_22 0.394 0.267 0.693 1.000 0.769 0.456 +vol_60 0.306 0.193 0.517 0.769 1.000 0.411 +log_vol_target 0.278 0.173 0.422 0.456 0.411 1.000 +Spearman: + abs_return sq_return vol_5 vol_22 vol_60 log_vol_target +abs_return 1.000 1.000 0.486 0.374 0.295 0.265 +sq_return 1.000 1.000 0.486 0.374 0.295 0.265 +vol_5 0.486 0.486 1.000 0.699 0.523 0.429 +vol_22 0.374 0.374 0.699 1.000 0.769 0.470 +vol_60 0.295 0.295 0.523 0.769 1.000 0.404 +log_vol_target 0.265 0.265 0.429 0.470 0.404 1.000 +Top |Pearson| feature pairs: + abs_return sq_return 0.771 +vol_22 vol_60 0.769 +vol_5 vol_22 0.693 +abs_return vol_5 0.540 +vol_5 vol_60 0.517 +sq_return vol_5 0.407 +VIF: + abs_return 2.93 +sq_return 2.48 +vol_5 2.30 +vol_22 3.45 +vol_60 2.45 +Feature ↔ target ranking: + pearson_with_target spearman_with_target mutual_info +vol_22 0.4556 0.4703 0.2968 +vol_60 0.4108 0.4039 0.2748 +vol_5 0.4216 0.4294 0.1574 +sq_return 0.1735 0.2652 0.0652 +abs_return 0.2784 0.2652 0.0561 + +==================================================================================================== +5c. FULL-HISTORY TARGET — NIFTY 5-day realised vol, 5 days ahead (same definition as pipeline) +==================================================================================================== + vol_target: {'n': 3862, 'mean': np.float64(0.008657), 'median': np.float64(0.007425), 'std': np.float64(0.005817), 'skew': np.float64(4.253701), 'excess_kurtosis': np.float64(36.345499), 'jarque_bera_stat': 224216.645953, 'jarque_bera_p': 0.0} + log_vol_target: {'n': 3862, 'mean': np.float64(-4.904175), 'median': np.float64(-4.90271), 'std': np.float64(0.545554), 'skew': np.float64(0.099876), 'excess_kurtosis': np.float64(0.769044), 'jarque_bera_stat': 101.591543, 'jarque_bera_p': 0.0} + +==================================================================================================== +6. RELATIONSHIPS — NIFTY price features vs target (full history) +==================================================================================================== +Pearson: + abs_return sq_return vol_5 vol_22 vol_60 log_vol_target +abs_return 1.000 0.762 0.575 0.431 0.322 0.253 +sq_return 0.762 1.000 0.494 0.365 0.250 0.197 +vol_5 0.575 0.494 1.000 0.726 0.532 0.383 +vol_22 0.431 0.365 0.726 1.000 0.794 0.437 +vol_60 0.322 0.250 0.532 0.794 1.000 0.376 +log_vol_target 0.253 0.197 0.383 0.437 0.376 1.000 +Spearman: + abs_return sq_return vol_5 vol_22 vol_60 log_vol_target +abs_return 1.000 1.000 0.428 0.316 0.241 0.180 +sq_return 1.000 1.000 0.428 0.316 0.241 0.180 +vol_5 0.428 0.428 1.000 0.633 0.493 0.342 +vol_22 0.316 0.316 0.633 1.000 0.800 0.454 +vol_60 0.241 0.241 0.493 0.800 1.000 0.390 +log_vol_target 0.180 0.180 0.342 0.454 0.390 1.000 +Top |Pearson| feature pairs: + vol_22 vol_60 0.794 +abs_return sq_return 0.762 +vol_5 vol_22 0.726 +abs_return vol_5 0.575 +vol_5 vol_60 0.532 +sq_return vol_5 0.494 +VIF: + abs_return 2.73 +sq_return 2.42 +vol_5 2.61 +vol_22 4.15 +vol_60 2.75 +Feature ↔ target ranking: + pearson_with_target spearman_with_target mutual_info +vol_60 0.3762 0.3897 0.2336 +vol_22 0.4368 0.4537 0.2070 +vol_5 0.3833 0.3425 0.1212 +abs_return 0.2530 0.1796 0.0333 +sq_return 0.1967 0.1796 0.0297 + +==================================================================================================== +7. MISSINGNESS — joined daily calendar 2015-01-01 … 2025-12-31 +==================================================================================================== +% missing per column: + btc_close 0.05 +nifty_close 32.63 +btc_headlines 97.96 +nifty_headlines 97.83 +btc_trend_monthly 96.71 +nifty_trend_monthly 96.71 +Co-missing day counts: + btc_close nifty_close btc_headlines nifty_headlines btc_trend_monthly nifty_trend_monthly +btc_close 2 2 2 2 1 1 +nifty_close 2 1311 1287 1285 1262 1262 +btc_headlines 2 1287 3936 3927 3807 3807 +nifty_headlines 2 1285 3927 3931 3802 3802 +btc_trend_monthly 1 1262 3807 3802 3886 3886 +nifty_trend_monthly 1 1262 3807 3802 3886 3886 +Missing-indicator correlation: + btc_close nifty_close btc_headlines nifty_headlines btc_trend_monthly nifty_trend_monthly +btc_close 1.000 0.032 0.003 0.003 -0.058 -0.058 +nifty_close 0.032 1.000 0.010 0.009 -0.018 -0.018 +btc_headlines 0.003 0.010 1.000 0.922 0.003 0.003 +nifty_headlines 0.003 0.009 0.922 1.000 0.001 0.001 +btc_trend_monthly -0.058 -0.018 0.003 0.001 1.000 1.000 +nifty_trend_monthly -0.058 -0.018 0.003 0.001 1.000 1.000 +NIFTY-missing days by weekday (0=Mon): {0: 34, 1: 29, 2: 31, 3: 29, 4: 41, 5: 573, 6: 574} + +==================================================================================================== +8. DUPLICATES +==================================================================================================== +{'btc_prices': {'exact_duplicate_rows': 0, 'duplicate_dates': 0}, 'nifty_prices': {'exact_duplicate_rows': 0, 'duplicate_dates': 0}, 'btc_trends': {'exact_duplicate_rows': 0, 'duplicate_dates': 0}, 'nifty_trends': {'exact_duplicate_rows': 2, 'duplicate_dates': 2}, 'text_data': {'exact_duplicate_rows': 65, 'duplicate_text_values': 109}} diff --git a/analysis/outputs/feature_target_ranking_btc.csv b/analysis/outputs/feature_target_ranking_btc.csv new file mode 100644 index 0000000..ab43d1f --- /dev/null +++ b/analysis/outputs/feature_target_ranking_btc.csv @@ -0,0 +1,6 @@ +,pearson_with_target,spearman_with_target,mutual_info +vol_22,0.45555300074897587,0.47027958290057664,0.29675253051919803 +vol_60,0.41080488751193667,0.4038960148873358,0.27481448174004885 +vol_5,0.4215716238331127,0.4294049326615619,0.15741854666987365 +sq_return,0.17348197109131977,0.2652189874312711,0.06524067809267642 +abs_return,0.2783837790310818,0.2652189874312711,0.05614607732553978 diff --git a/analysis/outputs/feature_target_ranking_nifty.csv b/analysis/outputs/feature_target_ranking_nifty.csv new file mode 100644 index 0000000..7c682ca --- /dev/null +++ b/analysis/outputs/feature_target_ranking_nifty.csv @@ -0,0 +1,6 @@ +,pearson_with_target,spearman_with_target,mutual_info +vol_60,0.3761534521070546,0.3896916229333901,0.23362511290363575 +vol_22,0.43675293579369723,0.45374147059418085,0.20699306347366253 +vol_5,0.3832591896454696,0.3424996213908484,0.12124043861332634 +abs_return,0.2530097777101766,0.17962472038439947,0.03329622416462108 +sq_return,0.19667858497899426,0.17962472038439947,0.029674197597813645 diff --git a/analysis/outputs/file_metadata.csv b/analysis/outputs/file_metadata.csv new file mode 100644 index 0000000..f378f1d --- /dev/null +++ b/analysis/outputs/file_metadata.csv @@ -0,0 +1,8 @@ +file,bytes,lines,encoding,delimiter,header +btc_google_trends.csv,1439,133,ascii (subset of utf-8),"','","date,google_trend" +btc_prices.csv,423823,4017,ascii (subset of utf-8),"','","date,open,high,low,close,volume,return" +manifest.json,13789,618,ascii (subset of utf-8),, +nifty_google_trends.csv,2146,195,ascii (subset of utf-8),"','","date,google_trend" +nifty_prices.csv,379817,3928,ascii (subset of utf-8),"','","date,open,high,low,close,volume,return" +pipeline.log,7828,80,utf-8 (non-ASCII present),, +text_data.csv,241848,1501,utf-8 (non-ASCII present),"','","timestamp,text,source,asset,channel" diff --git a/analysis/outputs/info_btc_google_trends.txt b/analysis/outputs/info_btc_google_trends.txt new file mode 100644 index 0000000..6d39801 --- /dev/null +++ b/analysis/outputs/info_btc_google_trends.txt @@ -0,0 +1,9 @@ + +RangeIndex: 132 entries, 0 to 131 +Data columns (total 2 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 132 non-null str + 1 google_trend 132 non-null int64 +dtypes: int64(1), str(1) +memory usage: 2.2 KB diff --git a/analysis/outputs/info_btc_prices.txt b/analysis/outputs/info_btc_prices.txt new file mode 100644 index 0000000..4862ede --- /dev/null +++ b/analysis/outputs/info_btc_prices.txt @@ -0,0 +1,14 @@ + +RangeIndex: 4016 entries, 0 to 4015 +Data columns (total 7 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 4016 non-null datetime64[us] + 1 open 4016 non-null float64 + 2 high 4016 non-null float64 + 3 low 4016 non-null float64 + 4 close 4016 non-null float64 + 5 volume 4016 non-null int64 + 6 return 4016 non-null float64 +dtypes: datetime64[us](1), float64(5), int64(1) +memory usage: 219.8 KB diff --git a/analysis/outputs/info_nifty_google_trends.txt b/analysis/outputs/info_nifty_google_trends.txt new file mode 100644 index 0000000..88d950e --- /dev/null +++ b/analysis/outputs/info_nifty_google_trends.txt @@ -0,0 +1,9 @@ + +RangeIndex: 194 entries, 0 to 193 +Data columns (total 2 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 194 non-null str + 1 google_trend 194 non-null int64 +dtypes: int64(1), str(1) +memory usage: 3.2 KB diff --git a/analysis/outputs/info_nifty_prices.txt b/analysis/outputs/info_nifty_prices.txt new file mode 100644 index 0000000..e475a67 --- /dev/null +++ b/analysis/outputs/info_nifty_prices.txt @@ -0,0 +1,14 @@ + +RangeIndex: 3927 entries, 0 to 3926 +Data columns (total 7 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 date 3927 non-null datetime64[us] + 1 open 3927 non-null float64 + 2 high 3927 non-null float64 + 3 low 3927 non-null float64 + 4 close 3927 non-null float64 + 5 volume 3927 non-null int64 + 6 return 3927 non-null float64 +dtypes: datetime64[us](1), float64(5), int64(1) +memory usage: 214.9 KB diff --git a/analysis/outputs/info_text_data.txt b/analysis/outputs/info_text_data.txt new file mode 100644 index 0000000..65e48c6 --- /dev/null +++ b/analysis/outputs/info_text_data.txt @@ -0,0 +1,12 @@ + +RangeIndex: 1500 entries, 0 to 1499 +Data columns (total 5 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 timestamp 1500 non-null str + 1 text 1499 non-null str + 2 source 0 non-null float64 + 3 asset 1500 non-null str + 4 channel 1500 non-null str +dtypes: float64(1), str(4) +memory usage: 58.7 KB diff --git a/analysis/outputs/inventory_btc_google_trends.csv b/analysis/outputs/inventory_btc_google_trends.csv new file mode 100644 index 0000000..8c98d77 --- /dev/null +++ b/analysis/outputs/inventory_btc_google_trends.csv @@ -0,0 +1,3 @@ +column,dtype,non_null,null,null_pct,n_unique,cardinality_ratio,examples,meaning,confidence +date,str,132,0,0.0,132,1.0,2015-01 | 2015-02 | 2015-03,Trading/calendar day of the bar (yfinance index),high +google_trend,int64,132,0,0.0,46,0.3485,2 | 3 | 4,"Google Trends interest, 0-100, relative to the peak month of the queried window",high diff --git a/analysis/outputs/inventory_btc_prices.csv b/analysis/outputs/inventory_btc_prices.csv new file mode 100644 index 0000000..c2ebb89 --- /dev/null +++ b/analysis/outputs/inventory_btc_prices.csv @@ -0,0 +1,8 @@ +column,dtype,non_null,null,null_pct,n_unique,cardinality_ratio,examples,meaning,confidence +date,datetime64[us],4016,0,0.0,4016,1.0,2015-01-02 | 2015-01-03 | 2015-01-04,Trading/calendar day of the bar (yfinance index),high +open,float64,4016,0,0.0,4013,0.9993,314.0790100097656 | 314.84600830078125 | 281.14599609375,"Opening price of the day, quote currency (USD for BTC, INR index points for NIFTY)",high +high,float64,4016,0,0.0,4013,0.9993,315.8389892578125 | 315.1499938964844 | 287.2300109863281,Intraday high,high +low,float64,4016,0,0.0,4014,0.9995,313.56500244140625 | 281.0820007324219 | 257.61199951171875,Intraday low,high +close,float64,4016,0,0.0,4013,0.9993,315.0320129394531 | 281.0820007324219 | 264.19500732421875,Close price (yfinance default auto_adjust; index has no dividends),high +volume,int64,4016,0,0.0,4016,1.0,7860650 | 33054400 | 55629100,Traded volume (USD notional for BTC-USD; NIFTY index volume as reported by Yahoo),medium +return,float64,4016,0,0.0,4016,1.0,0.0024917184690256 | -0.1077668643584999 | -0.0600785299812876,Simple return close.pct_change() — NOT log; notebooks later overwrite it with log return,high diff --git a/analysis/outputs/inventory_nifty_google_trends.csv b/analysis/outputs/inventory_nifty_google_trends.csv new file mode 100644 index 0000000..fdfa60e --- /dev/null +++ b/analysis/outputs/inventory_nifty_google_trends.csv @@ -0,0 +1,3 @@ +column,dtype,non_null,null,null_pct,n_unique,cardinality_ratio,examples,meaning,confidence +date,str,194,0,0.0,192,0.9897,2010-01 | 2010-02 | 2010-03,Trading/calendar day of the bar (yfinance index),high +google_trend,int64,194,0,0.0,73,0.3763,22 | 25 | 21,"Google Trends interest, 0-100, relative to the peak month of the queried window",high diff --git a/analysis/outputs/inventory_nifty_prices.csv b/analysis/outputs/inventory_nifty_prices.csv new file mode 100644 index 0000000..57adb83 --- /dev/null +++ b/analysis/outputs/inventory_nifty_prices.csv @@ -0,0 +1,8 @@ +column,dtype,non_null,null,null_pct,n_unique,cardinality_ratio,examples,meaning,confidence +date,datetime64[us],3927,0,0.0,3927,1.0,2010-01-05 | 2010-01-06 | 2010-01-07,Trading/calendar day of the bar (yfinance index),high +open,float64,3927,0,0.0,3897,0.9924,5277.14990234375 | 5278.14990234375 | 5281.7998046875,"Opening price of the day, quote currency (USD for BTC, INR index points for NIFTY)",high +high,float64,3927,0,0.0,3896,0.9921,5288.35009765625 | 5310.85009765625 | 5302.5498046875,Intraday high,high +low,float64,3927,0,0.0,3894,0.9916,5242.39990234375 | 5260.0498046875 | 5244.75,Intraday low,high +close,float64,3927,0,0.0,3887,0.9898,5277.89990234375 | 5281.7998046875 | 5263.10009765625,Close price (yfinance default auto_adjust; index has no dividends),high +volume,int64,3927,0,0.0,2206,0.5618,0 | 130900 | 129000,Traded volume (USD notional for BTC-USD; NIFTY index volume as reported by Yahoo),medium +return,float64,3927,0,0.0,3924,0.9992,0.0087343192778044 | 0.000738911767163 | -0.0035404043550939,Simple return close.pct_change() — NOT log; notebooks later overwrite it with log return,high diff --git a/analysis/outputs/inventory_text_data.csv b/analysis/outputs/inventory_text_data.csv new file mode 100644 index 0000000..088f418 --- /dev/null +++ b/analysis/outputs/inventory_text_data.csv @@ -0,0 +1,6 @@ +column,dtype,non_null,null,null_pct,n_unique,cardinality_ratio,examples,meaning,confidence +timestamp,str,1500,0,0.0,1133,0.7553,2024-10-03 01:15:00+00:00 | 2024-10-03 03:00:00+00:00 | 2024-10-03 06:00:00+00:00,"GDELT 'seendate' of the headline, UTC",high +text,str,1499,1,0.07,1390,0.9267,"Momentum Funds : Momentum funds with 4x | Indian stock market : 10 key things that | Nifty 50 , Sensex today : What to expect",Headline title only (no body),high +source,float64,0,1500,100.0,0,0.0,,Intended: publisher name. Empty in the committed file,high +asset,str,1500,0,0.0,2,0.0013,NIFTY | BTC,Which query produced the headline: BTC or NIFTY,high +channel,str,1500,0,0.0,1,0.0007,news_gdelt,Collection channel label,high diff --git a/analysis/outputs/missingness_matrix.png b/analysis/outputs/missingness_matrix.png new file mode 100644 index 0000000..03ee80c Binary files /dev/null and b/analysis/outputs/missingness_matrix.png differ diff --git a/analysis/outputs/model_eval_btc.png b/analysis/outputs/model_eval_btc.png new file mode 100644 index 0000000..4720d41 Binary files /dev/null and b/analysis/outputs/model_eval_btc.png differ diff --git a/analysis/outputs/model_eval_nifty.png b/analysis/outputs/model_eval_nifty.png new file mode 100644 index 0000000..1f35232 Binary files /dev/null and b/analysis/outputs/model_eval_nifty.png differ diff --git a/analysis/outputs/model_eval_placebo_validity.csv b/analysis/outputs/model_eval_placebo_validity.csv new file mode 100644 index 0000000..4d6b070 --- /dev/null +++ b/analysis/outputs/model_eval_placebo_validity.csv @@ -0,0 +1,5 @@ +fake_gmsi_ar1_phi,n_sims,false_positive_rate_iid_shuffle (repo),false_positive_rate_circular_shift +0.0,200,0.07,0.07 +0.5,200,0.225,0.07 +0.9,200,0.575,0.06 +0.98,200,0.74,0.055 diff --git a/analysis/outputs/model_eval_stdout.txt b/analysis/outputs/model_eval_stdout.txt new file mode 100644 index 0000000..30c553b --- /dev/null +++ b/analysis/outputs/model_eval_stdout.txt @@ -0,0 +1,141 @@ + +==================================================================================================== +A. COMMITTED ARTIFACT models/rf_btc.pkl +==================================================================================================== + file_bytes: 232081 + pickled_with_sklearn: 1.8.0 + loaded_with_sklearn: 1.8.0 + class: RandomForestRegressor + params: {'bootstrap': True, 'ccp_alpha': 0.0, 'criterion': 'squared_error', 'max_depth': 8, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 10, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'monotonic_cst': None, 'n_estimators': 600, 'n_jobs': -1, 'oob_score': False, 'random_state': 42, 'verbose': 0, 'warm_start': False} + feature_names_in_: ['finbert_score', 'vader_score', 'finbert_surprise', 'vader_surprise', 'abs_return', 'sq_return', 'sent_x_vol5', 'sent_x_vol22', 'sent_x_absret'] + n_trees: 600 + distinct_tree_depths: [0] + distinct_node_counts: [1] + feature_importances_: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + distinct_bootstrap_sizes_at_root: [2, 3, 4, 5, 6, 7, 8] + per_tree_root_value_min_max: [-4.0869378769113265, -3.5244746866824848] + prediction_on_1000_random_inputs_unique: [np.float64(-3.7299326974)] + exp(prediction)=forecast_vol: 0.023994450670334223 + +==================================================================================================== +B. RE-RUN run_pipeline.py training on the reconstructed table +==================================================================================================== + n_train: 10 + n_test: 3 + min_rows_needed_for_one_split (2*min_samples_leaf): 20 + tree_depths: [0] + importances: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + rf_test_preds: [-3.72977313853664, -3.72977313853664, -3.72977313853664] + dummy_test_preds: [-3.7337584202065544, -3.7337584202065544, -3.7337584202065544] + rf_metrics: {'rmse_vol': 0.009647275176848151, 'mae_vol': 0.009509107111323722, 'r2_log': -21.991733545212437, 'qlike': 0.39039006380420965} + dummy_metrics: {'rmse_vol': 0.009553206183977429, 'mae_vol': 0.00941365753096964, 'r2_log': -21.649801323959675, 'qlike': 0.38537335497183167} + note: FinBERT columns hold VADER as a stand-in; irrelevant here because no tree can split. + +==================================================================================================== +C. WALK-FORWARD RE-EVALUATION (price features only, full history, TimeSeriesSplit(5, gap=5)) +==================================================================================================== + +BTC — mean over 5 folds: + test_rmse_vol test_mae_vol test_r2_log test_qlike train_rmse_vol train_r2_log +model +HAR_ols_log(vol5,22,60) 0.01878 0.01270 0.04738 1.14964 0.01960 0.28236 +rf_repo_params 0.01912 0.01316 -0.02647 1.22098 0.01726 0.50850 +persistence_log_vol5 0.02156 0.01532 -0.36742 1.79893 0.02282 -0.03831 +dummy_mean 0.02124 0.01501 -0.38470 1.96597 0.02250 0.00000 +BTC — per fold test R² (log): + model HAR_ols_log(vol5,22,60) dummy_mean persistence_log_vol5 rf_repo_params +fold +0 -0.059 -1.288 -0.039 -0.115 +1 0.164 -0.001 -0.229 0.110 +2 0.039 -0.275 -0.494 -0.094 +3 0.007 -0.219 -0.597 -0.044 +4 0.086 -0.141 -0.478 0.010 +BTC — RF importances (last fold): + impurity permutation_mean permutation_std +vol_22 0.39511 0.02290 0.00595 +abs_return 0.06794 -0.00184 0.00104 +sq_return 0.06488 -0.00194 0.00124 +vol_60 0.21338 -0.00365 0.00260 +vol_5 0.25869 -0.00687 0.00315 +BTC — RF error by quintile of ACTUAL future vol (last fold): + n mae_vol bias_log +actual_quintile +Q1 calm 132 0.00902 0.65218 +Q2 131 0.00634 0.29034 +Q3 132 0.00344 -0.01897 +Q4 131 0.00653 -0.17922 +Q5 turbulent 132 0.01704 -0.54011 +BTC — 5 worst misses: + date abs_err_vol actual_vol pred_vol +2024-08-03 0.05422 0.07428 0.02006 +2024-08-04 0.05046 0.07074 0.02028 +2025-02-28 0.04509 0.06627 0.02118 +2024-03-15 0.04487 0.07418 0.02931 +2025-03-01 0.04434 0.06683 0.02249 +BTC — learning curve: + n_train train_r2_log test_r2_log + 250 0.4079 -0.0446 + 500 0.4021 -0.0430 + 1000 0.4381 0.0185 + 2000 0.4145 0.0429 + 3288 0.4410 0.0103 + +NIFTY — mean over 5 folds: + test_rmse_vol test_mae_vol test_r2_log test_qlike train_rmse_vol train_r2_log +model +HAR_ols_log(vol5,22,60) 0.00488 0.00311 0.10007 0.54790 0.00453 0.20681 +rf_repo_params 0.00519 0.00322 0.06198 0.68385 0.00388 0.41281 +dummy_mean 0.00558 0.00363 -0.18624 0.89047 0.00524 0.00000 +persistence_log_vol5 0.00574 0.00396 -0.43896 1.26951 0.00542 -0.34204 +NIFTY — per fold test R² (log): + model HAR_ols_log(vol5,22,60) dummy_mean persistence_log_vol5 rf_repo_params +fold +0 0.024 -0.193 -0.607 0.046 +1 0.155 -0.325 -0.406 0.110 +2 0.321 -0.001 -0.000 0.153 +3 0.159 -0.008 -0.564 0.121 +4 -0.159 -0.403 -0.618 -0.121 +NIFTY — RF importances (last fold): + impurity permutation_mean permutation_std +vol_60 0.24023 0.00799 0.00271 +abs_return 0.06263 -0.00019 0.00063 +sq_return 0.05247 -0.00022 0.00047 +vol_5 0.19591 -0.00588 0.00142 +vol_22 0.44876 -0.01181 0.00508 +NIFTY — RF error by quintile of ACTUAL future vol (last fold): + n mae_vol bias_log +actual_quintile +Q1 calm 129 0.00357 0.77680 +Q2 128 0.00164 0.29340 +Q3 129 0.00090 0.04732 +Q4 128 0.00121 -0.12142 +Q5 turbulent 129 0.00521 -0.45999 +NIFTY — 5 worst misses: + date abs_err_vol actual_vol pred_vol +2024-05-31 0.03299 0.03914 0.00615 +2024-05-29 0.03251 0.03856 0.00605 +2024-05-30 0.03228 0.03839 0.00611 +2024-06-03 0.02878 0.03648 0.00770 +2024-05-28 0.02773 0.03361 0.00588 +NIFTY — learning curve: + n_train train_r2_log test_r2_log + 250 0.4073 -0.1229 + 500 0.4533 -0.1242 + 1000 0.4962 -0.1820 + 2000 0.4483 -0.1130 + 3214 0.3988 -0.1207 + +==================================================================================================== +D. PLACEBO-TEST VALIDITY — real BTC forward vol vs an INDEPENDENT AR(1) fake 'GMSI' +==================================================================================================== + BTC fwd-7d-vol series: n=4009, lag-1 autocorrelation=0.928 + {'fake_gmsi_ar1_phi': 0.0, 'n_sims': 200, 'false_positive_rate_iid_shuffle (repo)': 0.07, 'false_positive_rate_circular_shift': 0.07} + {'fake_gmsi_ar1_phi': 0.5, 'n_sims': 200, 'false_positive_rate_iid_shuffle (repo)': 0.225, 'false_positive_rate_circular_shift': 0.07} + {'fake_gmsi_ar1_phi': 0.9, 'n_sims': 200, 'false_positive_rate_iid_shuffle (repo)': 0.575, 'false_positive_rate_circular_shift': 0.06} + {'fake_gmsi_ar1_phi': 0.98, 'n_sims': 200, 'false_positive_rate_iid_shuffle (repo)': 0.74, 'false_positive_rate_circular_shift': 0.055} + +==================================================================================================== +E. CALIBRATED NULL for the published GMSI correlations (AR(1) phi=0.82 fake GMSI) +==================================================================================================== + BTC: {'n': 4009, 'published_spearman': -0.0837, 'null_sd_ar1': 0.041356584957607, 'null_sd_iid_shuffle_theory': 0.015795600590164088, 'variance_inflation_vs_iid': 6.855151414377907, 'two_sided_p_ar1_null': 0.046, 'two_sided_p_iid_normal_approx': 1.1647446754438945e-07} + NIFTY: {'n': 3920, 'published_spearman': -0.058, 'null_sd_ar1': 0.040443714699268114, 'null_sd_iid_shuffle_theory': 0.015973951748802794, 'variance_inflation_vs_iid': 6.410285015950444, 'two_sided_p_ar1_null': 0.147, 'two_sided_p_iid_normal_approx': 0.0002824223730048351} diff --git a/analysis/outputs/model_eval_summary.json b/analysis/outputs/model_eval_summary.json new file mode 100644 index 0000000..fa24d6d --- /dev/null +++ b/analysis/outputs/model_eval_summary.json @@ -0,0 +1,392 @@ +{ + "A_artifact": { + "file_bytes": 232081, + "pickled_with_sklearn": "1.8.0", + "loaded_with_sklearn": "1.8.0", + "class": "RandomForestRegressor", + "params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "criterion": "squared_error", + "max_depth": 8, + "max_features": "sqrt", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_samples_leaf": 10, + "min_samples_split": 2, + "min_weight_fraction_leaf": 0.0, + "monotonic_cst": null, + "n_estimators": 600, + "n_jobs": -1, + "oob_score": false, + "random_state": 42, + "verbose": 0, + "warm_start": false + }, + "feature_names_in_": [ + "finbert_score", + "vader_score", + "finbert_surprise", + "vader_surprise", + "abs_return", + "sq_return", + "sent_x_vol5", + "sent_x_vol22", + "sent_x_absret" + ], + "n_trees": 600, + "distinct_tree_depths": [ + 0 + ], + "distinct_node_counts": [ + 1 + ], + "feature_importances_": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "distinct_bootstrap_sizes_at_root": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "per_tree_root_value_min_max": [ + -4.0869378769113265, + -3.5244746866824848 + ], + "prediction_on_1000_random_inputs_unique": [ + -3.7299326974 + ], + "exp(prediction)=forecast_vol": 0.023994450670334223 + }, + "B_rerun_pipeline": { + "n_train": 10, + "n_test": 3, + "min_rows_needed_for_one_split (2*min_samples_leaf)": 20, + "tree_depths": [ + 0 + ], + "importances": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "rf_test_preds": [ + -3.72977313853664, + -3.72977313853664, + -3.72977313853664 + ], + "dummy_test_preds": [ + -3.7337584202065544, + -3.7337584202065544, + -3.7337584202065544 + ], + "rf_metrics": { + "rmse_vol": 0.009647275176848151, + "mae_vol": 0.009509107111323722, + "r2_log": -21.991733545212437, + "qlike": 0.39039006380420965 + }, + "dummy_metrics": { + "rmse_vol": 0.009553206183977429, + "mae_vol": 0.00941365753096964, + "r2_log": -21.649801323959675, + "qlike": 0.38537335497183167 + }, + "note": "FinBERT columns hold VADER as a stand-in; irrelevant here because no tree can split." + }, + "C_walk_forward": { + "BTC": { + "test_rmse_vol": { + "HAR_ols_log(vol5,22,60)": 0.018781, + "rf_repo_params": 0.019117, + "persistence_log_vol5": 0.021557, + "dummy_mean": 0.021241 + }, + "test_mae_vol": { + "HAR_ols_log(vol5,22,60)": 0.012697, + "rf_repo_params": 0.013162, + "persistence_log_vol5": 0.01532, + "dummy_mean": 0.01501 + }, + "test_r2_log": { + "HAR_ols_log(vol5,22,60)": 0.047382, + "rf_repo_params": -0.026473, + "persistence_log_vol5": -0.367417, + "dummy_mean": -0.384705 + }, + "test_qlike": { + "HAR_ols_log(vol5,22,60)": 1.149635, + "rf_repo_params": 1.220978, + "persistence_log_vol5": 1.798933, + "dummy_mean": 1.965969 + }, + "train_rmse_vol": { + "HAR_ols_log(vol5,22,60)": 0.019603, + "rf_repo_params": 0.017256, + "persistence_log_vol5": 0.022816, + "dummy_mean": 0.022502 + }, + "train_r2_log": { + "HAR_ols_log(vol5,22,60)": 0.282363, + "rf_repo_params": 0.508498, + "persistence_log_vol5": -0.038307, + "dummy_mean": 0.0 + } + }, + "BTC_importances": { + "impurity": { + "vol_22": 0.395108, + "abs_return": 0.067938, + "sq_return": 0.064884, + "vol_60": 0.213381, + "vol_5": 0.25869 + }, + "permutation_mean": { + "vol_22": 0.022903, + "abs_return": -0.001843, + "sq_return": -0.001942, + "vol_60": -0.003649, + "vol_5": -0.006873 + }, + "permutation_std": { + "vol_22": 0.005952, + "abs_return": 0.001039, + "sq_return": 0.001242, + "vol_60": 0.0026, + "vol_5": 0.003149 + } + }, + "BTC_error_by_quintile": { + "n": { + "Q1 calm": 132, + "Q2": 131, + "Q3": 132, + "Q4": 131, + "Q5 turbulent": 132 + }, + "mae_vol": { + "Q1 calm": 0.009022, + "Q2": 0.006337, + "Q3": 0.003438, + "Q4": 0.006532, + "Q5 turbulent": 0.01704 + }, + "bias_log": { + "Q1 calm": 0.652177, + "Q2": 0.29034, + "Q3": -0.018975, + "Q4": -0.179223, + "Q5 turbulent": -0.540107 + } + }, + "BTC_learning_curve": [ + { + "n_train": 250, + "train_r2_log": 0.40787, + "test_r2_log": -0.04455 + }, + { + "n_train": 500, + "train_r2_log": 0.40208, + "test_r2_log": -0.04304 + }, + { + "n_train": 1000, + "train_r2_log": 0.43814, + "test_r2_log": 0.01845 + }, + { + "n_train": 2000, + "train_r2_log": 0.41453, + "test_r2_log": 0.04288 + }, + { + "n_train": 3288, + "train_r2_log": 0.44096, + "test_r2_log": 0.01032 + } + ], + "NIFTY": { + "test_rmse_vol": { + "HAR_ols_log(vol5,22,60)": 0.00488, + "rf_repo_params": 0.00519, + "dummy_mean": 0.005578, + "persistence_log_vol5": 0.005737 + }, + "test_mae_vol": { + "HAR_ols_log(vol5,22,60)": 0.003113, + "rf_repo_params": 0.003222, + "dummy_mean": 0.003628, + "persistence_log_vol5": 0.003955 + }, + "test_r2_log": { + "HAR_ols_log(vol5,22,60)": 0.100069, + "rf_repo_params": 0.061983, + "dummy_mean": -0.18624, + "persistence_log_vol5": -0.438958 + }, + "test_qlike": { + "HAR_ols_log(vol5,22,60)": 0.547901, + "rf_repo_params": 0.683852, + "dummy_mean": 0.890473, + "persistence_log_vol5": 1.269509 + }, + "train_rmse_vol": { + "HAR_ols_log(vol5,22,60)": 0.004527, + "rf_repo_params": 0.003881, + "dummy_mean": 0.005238, + "persistence_log_vol5": 0.005416 + }, + "train_r2_log": { + "HAR_ols_log(vol5,22,60)": 0.206813, + "rf_repo_params": 0.412811, + "dummy_mean": 0.0, + "persistence_log_vol5": -0.342044 + } + }, + "NIFTY_importances": { + "impurity": { + "vol_60": 0.240228, + "abs_return": 0.062633, + "sq_return": 0.052468, + "vol_5": 0.195913, + "vol_22": 0.448757 + }, + "permutation_mean": { + "vol_60": 0.007985, + "abs_return": -0.000191, + "sq_return": -0.000217, + "vol_5": -0.005876, + "vol_22": -0.01181 + }, + "permutation_std": { + "vol_60": 0.00271, + "abs_return": 0.000631, + "sq_return": 0.00047, + "vol_5": 0.001423, + "vol_22": 0.005082 + } + }, + "NIFTY_error_by_quintile": { + "n": { + "Q1 calm": 129, + "Q2": 128, + "Q3": 129, + "Q4": 128, + "Q5 turbulent": 129 + }, + "mae_vol": { + "Q1 calm": 0.003575, + "Q2": 0.001641, + "Q3": 0.000896, + "Q4": 0.001208, + "Q5 turbulent": 0.005206 + }, + "bias_log": { + "Q1 calm": 0.776802, + "Q2": 0.293399, + "Q3": 0.047322, + "Q4": -0.121422, + "Q5 turbulent": -0.459992 + } + }, + "NIFTY_learning_curve": [ + { + "n_train": 250, + "train_r2_log": 0.40728, + "test_r2_log": -0.12291 + }, + { + "n_train": 500, + "train_r2_log": 0.45332, + "test_r2_log": -0.12423 + }, + { + "n_train": 1000, + "train_r2_log": 0.49616, + "test_r2_log": -0.18198 + }, + { + "n_train": 2000, + "train_r2_log": 0.44831, + "test_r2_log": -0.11298 + }, + { + "n_train": 3214, + "train_r2_log": 0.3988, + "test_r2_log": -0.12073 + } + ] + }, + "D_placebo_validity": { + "fwd_vol_acf1": 0.9280664037785994, + "n": 4009, + "results": [ + { + "fake_gmsi_ar1_phi": 0.0, + "n_sims": 200, + "false_positive_rate_iid_shuffle (repo)": 0.07, + "false_positive_rate_circular_shift": 0.07 + }, + { + "fake_gmsi_ar1_phi": 0.5, + "n_sims": 200, + "false_positive_rate_iid_shuffle (repo)": 0.225, + "false_positive_rate_circular_shift": 0.07 + }, + { + "fake_gmsi_ar1_phi": 0.9, + "n_sims": 200, + "false_positive_rate_iid_shuffle (repo)": 0.575, + "false_positive_rate_circular_shift": 0.06 + }, + { + "fake_gmsi_ar1_phi": 0.98, + "n_sims": 200, + "false_positive_rate_iid_shuffle (repo)": 0.74, + "false_positive_rate_circular_shift": 0.055 + } + ] + }, + "E_calibrated_null": { + "phi": 0.82, + "n_sims": 2000, + "BTC": { + "n": 4009, + "published_spearman": -0.0837, + "null_sd_ar1": 0.041356584957607, + "null_sd_iid_shuffle_theory": 0.015795600590164088, + "variance_inflation_vs_iid": 6.855151414377907, + "two_sided_p_ar1_null": 0.046, + "two_sided_p_iid_normal_approx": 1.1647446754438945e-07 + }, + "NIFTY": { + "n": 3920, + "published_spearman": -0.058, + "null_sd_ar1": 0.040443714699268114, + "null_sd_iid_shuffle_theory": 0.015973951748802794, + "variance_inflation_vs_iid": 6.410285015950444, + "two_sided_p_ar1_null": 0.147, + "two_sided_p_iid_normal_approx": 0.0002824223730048351 + } + } +} \ No newline at end of file diff --git a/analysis/outputs/model_eval_walk_forward.csv b/analysis/outputs/model_eval_walk_forward.csv new file mode 100644 index 0000000..e95a2ff --- /dev/null +++ b/analysis/outputs/model_eval_walk_forward.csv @@ -0,0 +1,41 @@ +asset,fold,train_end,test,n_train,n_test,model,test_rmse_vol,test_mae_vol,test_r2_log,test_qlike,train_rmse_vol,train_mae_vol,train_r2_log,train_qlike +BTC,0,2016-12-17,2016-12-23→2018-10-11,656,658,dummy_mean,0.03356787945401567,0.024316794472238203,-1.2876171066033475,5.579801449213393,0.01810330013865958,0.011633936386515453,0.0,1.8330042771407338 +BTC,0,2016-12-17,2016-12-23→2018-10-11,656,658,persistence_log_vol5,0.025808140687938533,0.018828072630987482,-0.038596152683993745,1.3084618233250684,0.019077072344313346,0.013044503981467833,-0.16686130846146763,3.1810405442971543 +BTC,0,2016-12-17,2016-12-23→2018-10-11,656,658,"HAR_ols_log(vol5,22,60)",0.026771713927454012,0.018169943644844824,-0.05874089160143847,1.816455046047481,0.016471866692029775,0.010464333216806431,0.2125106223851928,1.4934928952719053 +BTC,0,2016-12-17,2016-12-23→2018-10-11,656,658,rf_repo_params,0.02728620010454959,0.018604537868456762,-0.1151537151868649,1.928335890538254,0.014061633897982964,0.008488185463875222,0.5143041358805003,0.7779441477062962 +BTC,1,2018-10-06,2018-10-12→2020-07-30,1314,658,dummy_mean,0.026788689833216514,0.01621349592800256,-0.000588581817410283,1.9338265634504224,0.024069772419486456,0.016744538231844113,0.0,1.6805346914719406 +BTC,1,2018-10-06,2018-10-12→2020-07-30,1314,658,persistence_log_vol5,0.029644967852131127,0.018361002579356262,-0.22890778777921472,3.1537798873583607,0.02271677008214164,0.01596430129829493,0.11539660972127908,2.2883750178460662 +BTC,1,2018-10-06,2018-10-12→2020-07-30,1314,658,"HAR_ols_log(vol5,22,60)",0.024832235003032447,0.014421993416640268,0.16353395721075936,1.7830511529286022,0.01984755599344221,0.01311573285585795,0.35930690760002926,1.200154965021458 +BTC,1,2018-10-06,2018-10-12→2020-07-30,1314,658,rf_repo_params,0.024799671817323336,0.01502491666247964,0.11023242861762217,1.8070401273567598,0.01693376340606602,0.010629880921468065,0.5910968979883298,0.6839565027494021 +BTC,2,2020-07-25,2020-07-31→2022-05-19,1972,658,dummy_mean,0.019593994462547195,0.014312513243579149,-0.27522088759921326,1.0886636641474408,0.02496276581375397,0.016533209043978894,0.0,1.7446694789119788 +BTC,2,2020-07-25,2020-07-31→2022-05-19,1972,658,persistence_log_vol5,0.020172567129666613,0.015420283333796395,-0.49378472993358646,1.1855583373951055,0.025238140173083796,0.01676612960693324,-0.003200611967983269,2.5980039358197384 +BTC,2,2020-07-25,2020-07-31→2022-05-19,1972,658,"HAR_ols_log(vol5,22,60)",0.016842909877015706,0.012379991506714282,0.03855277091444986,0.718930947568476,0.021761504015946582,0.013578675245814327,0.2953662445165157,1.3788427398492262 +BTC,2,2020-07-25,2020-07-31→2022-05-19,1972,658,rf_repo_params,0.0174483233547515,0.01310393803473354,-0.09398311095172573,0.7856571674287084,0.019215602965930573,0.011369828869591266,0.5163771664203467,0.8375722282772916 +BTC,3,2022-05-14,2022-05-20→2024-03-07,2630,658,dummy_mean,0.014624010911665661,0.011285095949267337,-0.21860460896842215,0.7304758992645836,0.02323304296435363,0.015812658579652892,0.0,1.3796582172880687 +BTC,3,2022-05-14,2022-05-20→2024-03-07,2630,658,persistence_log_vol5,0.01799065199777672,0.013195621424840374,-0.5973222778298519,2.371132677760885,0.02408091404227448,0.016439205270822616,-0.0397584371945392,2.2498383311039114 +BTC,3,2022-05-14,2022-05-20→2024-03-07,2630,658,"HAR_ols_log(vol5,22,60)",0.014274662043360553,0.010325510041726348,0.007245058599742671,0.8958354809271004,0.020436742013599202,0.013242904503751509,0.2832959588525342,1.138308463195515 +BTC,3,2022-05-14,2022-05-20→2024-03-07,2630,658,rf_repo_params,0.014587270683105776,0.010596918847851666,-0.04377718882311843,1.0379018308590615,0.018408384960259056,0.011476818235091038,0.47974791555591945,0.7462915788510636 +BTC,4,2024-03-02,2024-03-08→2025-12-25,3288,658,dummy_mean,0.01163022051361218,0.008919898364640612,-0.1414914237265501,0.49707619908863476,0.022142788793915263,0.014943358198880636,0.0,1.3977507527607442 +BTC,4,2024-03-02,2024-03-08→2025-12-25,3288,658,persistence_log_vol5,0.014170180409455814,0.01079473187961151,-0.4784727213755462,0.9757299355558144,0.022967395543940446,0.015767763150673682,-0.09711368646215135,2.2729518679033673 +BTC,4,2024-03-02,2024-03-08→2025-12-25,3288,658,"HAR_ols_log(vol5,22,60)",0.011183640272980772,0.008187709318069548,0.08631884105371446,0.5339044068692744,0.01949707113700801,0.012668367861557804,0.26133486883258505,1.1240405854597326 +BTC,4,2024-03-02,2024-03-08→2025-12-25,3288,658,rf_repo_params,0.011462322675983683,0.008480321407485667,0.010316317837581801,0.545956773437522,0.01766191674722339,0.011113148978549285,0.4409628979220246,0.7817928966738358 +NIFTY,0,2012-11-12,2012-11-22→2015-07-14,642,643,dummy_mean,0.00449634191186238,0.0034959202716317054,-0.19339499779917024,0.47783426332685475,0.004483152578998141,0.003497775464785898,0.0,0.40159337275149887 +NIFTY,0,2012-11-12,2012-11-22→2015-07-14,642,643,persistence_log_vol5,0.005136169303884165,0.004022109747228686,-0.6065713287183241,1.3582900103409923,0.005275964953068336,0.004122258220406018,-0.427733225613391,0.7487891901850917 +NIFTY,0,2012-11-12,2012-11-22→2015-07-14,642,643,"HAR_ols_log(vol5,22,60)",0.004092671112569834,0.003162552187822598,0.02353599062047529,0.42739274872299476,0.004072622263144088,0.0031685241768382283,0.16175921177905095,0.3239348955249894 +NIFTY,0,2012-11-12,2012-11-22→2015-07-14,642,643,rf_repo_params,0.004063569485036759,0.0031145339728591583,0.04580326401524015,0.41542150942497746,0.0035339784101851824,0.002679287994901306,0.3920613196082441,0.23433943421183392 +NIFTY,1,2015-07-07,2015-07-15→2018-02-23,1285,643,dummy_mean,0.004075451281571819,0.003198218184764296,-0.32530549561614186,0.49272587968296283,0.004607955276857088,0.003467836166759233,0.0,0.523425344704232 +NIFTY,1,2015-07-07,2015-07-15→2018-02-23,1285,643,persistence_log_vol5,0.004326674516000255,0.0032161508316559495,-0.40604351398877303,1.1104324780549624,0.00520130669975301,0.004061432489488307,-0.441926649442937,1.0527352426872565 +NIFTY,1,2015-07-07,2015-07-15→2018-02-23,1285,643,"HAR_ols_log(vol5,22,60)",0.003470938384976103,0.0024762280181859875,0.15502830296525227,0.4016580170823557,0.004140914073000055,0.0031620400011483406,0.15851893552363072,0.41078528699542666 +NIFTY,1,2015-07-07,2015-07-15→2018-02-23,1285,643,rf_repo_params,0.0035370381710282325,0.0025279646259593956,0.11037540960251979,0.40729447066101854,0.0035165222192658037,0.002646422577585941,0.4026410029328211,0.2875642204619463 +NIFTY,2,2018-02-16,2018-02-26→2020-10-09,1928,643,dummy_mean,0.010126921758272662,0.004867067960059698,-0.001489636083696677,2.212919176050456,0.004550413636718335,0.0033647748562056273,0.0,0.6005304948086204 +NIFTY,2,2018-02-16,2018-02-26→2020-10-09,1928,643,persistence_log_vol5,0.00794028156575701,0.005027274997675613,-0.00011081443035121374,0.9571249730394171,0.004930289076629374,0.003785901206962436,-0.33304596041582024,1.0725908345113746 +NIFTY,2,2018-02-16,2018-02-26→2020-10-09,1928,643,"HAR_ols_log(vol5,22,60)",0.008141851248071616,0.0041278143733151414,0.32118237212115186,0.7518891952787962,0.003965419366273296,0.0029478743735640483,0.21849516152195936,0.4296116888522165 +NIFTY,2,2018-02-16,2018-02-26→2020-10-09,1928,643,rf_repo_params,0.00958621361650265,0.00460118892387102,0.15313198506944892,1.4078333510568795,0.003443616281777821,0.00249941517373522,0.43470121631714753,0.30442860861661747 +NIFTY,3,2020-10-01,2020-10-12→2023-05-17,2571,643,dummy_mean,0.004862822462068116,0.0035774019272536064,-0.00814549058424796,0.6690907173205033,0.006404237277375008,0.0037340908007832104,0.0,0.9902417007827009 +NIFTY,3,2020-10-01,2020-10-12→2023-05-17,2571,643,persistence_log_vol5,0.005915960237358682,0.004346172806477419,-0.5638824465943599,1.6115580538572984,0.0058247139569291,0.0040886390504230475,-0.2202555112663349,1.0353180314271984 +NIFTY,3,2020-10-01,2020-10-12→2023-05-17,2571,643,"HAR_ols_log(vol5,22,60)",0.004439339291931083,0.0032502770902078527,0.15926250064561365,0.5237509800285552,0.005286539030758544,0.0032291597568822913,0.25738738195964594,0.5002868996456887 +NIFTY,3,2020-10-01,2020-10-12→2023-05-17,2571,643,rf_repo_params,0.004517631600406256,0.0033587962789497616,0.12133766186248152,0.5390536732793905,0.004459767161270829,0.0028018400901176537,0.4358552848057262,0.3602344291455727 +NIFTY,4,2023-05-10,2023-05-18→2025-12-22,3214,643,dummy_mean,0.00432745038539244,0.002999032831183902,-0.40286516205518863,0.5997926289872325,0.006142880328180243,0.0037047151696189013,0.0,0.9436185001104593 +NIFTY,4,2023-05-10,2023-05-18→2025-12-22,3214,643,persistence_log_vol5,0.005366980304558404,0.0031653651809922536,-0.6181814930489755,1.3101396956237112,0.005847553717410162,0.0041458501867741885,-0.2872586208130612,1.1562349045688662 +NIFTY,4,2023-05-10,2023-05-18→2025-12-22,3214,643,"HAR_ols_log(vol5,22,60)",0.0042563892467594715,0.0025500779525199323,-0.1586655996135211,0.6348135416999645,0.005167643287931977,0.003243285065494426,0.23790181494768947,0.5167905056969921 +NIFTY,4,2023-05-10,2023-05-18→2025-12-22,3214,643,rf_repo_params,0.004245605045001082,0.002508462845027732,-0.12073418070783659,0.6496578895276662,0.004449432838947077,0.0028676100614789617,0.39879798140929723,0.3885144865518723 diff --git a/analysis/outputs/numeric_dist_btc_prices.png b/analysis/outputs/numeric_dist_btc_prices.png new file mode 100644 index 0000000..56327a9 Binary files /dev/null and b/analysis/outputs/numeric_dist_btc_prices.png differ diff --git a/analysis/outputs/numeric_dist_nifty_prices.png b/analysis/outputs/numeric_dist_nifty_prices.png new file mode 100644 index 0000000..a6e70aa Binary files /dev/null and b/analysis/outputs/numeric_dist_nifty_prices.png differ diff --git a/analysis/outputs/numeric_profile_btc_google_trends.csv b/analysis/outputs/numeric_profile_btc_google_trends.csv new file mode 100644 index 0000000..37ddeb8 --- /dev/null +++ b/analysis/outputs/numeric_profile_btc_google_trends.csv @@ -0,0 +1,2 @@ +column,count,mean,median,mode,mode_count,std,var,min,max,range,q1,q2,q3,iqr,p01,p05,p95,p99,skew,kurtosis_excess,cv,zeros,negatives,outliers_iqr_1.5,outliers_abs_z_gt_3 +google_trend,132,22.71212121212121,21.0,2.0,13,16.91448193953647,286.0996992829054,2.0,100.0,98.0,11.75,21.0,33.0,21.25,2.0,2.0,52.0,67.44999999999999,1.141254046552913,2.4638534568998454,0.7447336944692509,0,0,2,1 diff --git a/analysis/outputs/numeric_profile_btc_prices.csv b/analysis/outputs/numeric_profile_btc_prices.csv new file mode 100644 index 0000000..bdf9a91 --- /dev/null +++ b/analysis/outputs/numeric_profile_btc_prices.csv @@ -0,0 +1,7 @@ +column,count,mean,median,mode,mode_count,std,var,min,max,range,q1,q2,q3,iqr,p01,p05,p95,p99,skew,kurtosis_excess,cv,zeros,negatives,outliers_iqr_1.5,outliers_abs_z_gt_3 +open,4016,27517.996194261952,11352.02001953125,233.4219970703125,2,31747.791174927683,1007922244.4868162,176.89700317382812,124752.140625,124575.24362182617,3671.5319213867188,11352.02001953125,42807.783203125,39136.25128173828,226.55219802856445,256.33824920654297,101768.755859375,116816.17265624998,1.3063722597900256,0.7259116532910261,1.153710137569818,0,0,204,4 +high,4016,28072.56553657881,11570.35009765625,244.25100708007807,2,32290.45450275255,1042673451.9943323,211.7310028076172,126198.0703125,125986.33930969238,3754.5494995117188,11570.35009765625,43575.4990234375,39820.94952392578,230.6254455566406,261.6527557373047,104025.064453125,117873.99843749998,1.2927044219194084,0.6768272195467553,1.150249501089517,0,0,209,3 +low,4016,26932.599106108526,11015.2724609375,429.0769958496094,2,31170.015764564163,971569882.7631783,171.50999450683594,123196.046875,123024.53688049316,3619.7574462890625,11015.2724609375,41906.5146484375,38286.75720214844,222.71329650878906,251.6842498779297,99766.5390625,115247.885546875,1.3211762519689938,0.7792164180208854,1.157334115499256,0,0,205,5 +close,4016,27538.886434083917,11358.3818359375,236.1529998779297,2,31758.717366148405,1008616128.7428963,178.10299682617188,124752.53125,124574.42825317383,3673.1780395507812,11358.3818359375,42840.408203125,39167.23016357422,226.70935440063477,256.3267517089844,101751.556640625,116820.01835937498,1.304910487738747,0.7205624543540377,1.1532317198868924,0,0,202,4 +volume,4016,22203364117.396164,17776841694.0,7860650.0,1,22913058758.449104,5.250082616681413e+20,7860650.0,350967941479.0,350960080829.0,2219544896.0,17776841694.0,33729773133.5,31510228237.5,15147890.0,26602475.0,65973765239.75,94482481617.89996,2.013178911543104,12.79031421946008,1.0319633834449844,0,0,80,53 +return,4016,0.002030439378639217,0.0012482708205154,-0.3716953856011707,1,0.03522205805326492,0.0012405933735075642,-0.3716953856011707,0.2524716942763181,0.6241670798774888,-0.012141849578898776,0.0012482708205154,0.01607209558084225,0.028213945159741027,-0.10060342549798289,-0.05283276070007978,0.05559358206097255,0.10419524511787893,-0.12036670727194186,7.979228225747921,17.347012879975978,1,1896,379,70 diff --git a/analysis/outputs/numeric_profile_nifty_google_trends.csv b/analysis/outputs/numeric_profile_nifty_google_trends.csv new file mode 100644 index 0000000..852ed4a --- /dev/null +++ b/analysis/outputs/numeric_profile_nifty_google_trends.csv @@ -0,0 +1,2 @@ +column,count,mean,median,mode,mode_count,std,var,min,max,range,q1,q2,q3,iqr,p01,p05,p95,p99,skew,kurtosis_excess,cv,zeros,negatives,outliers_iqr_1.5,outliers_abs_z_gt_3 +google_trend,194,36.654639175257735,26.0,13.0,15,25.775823192831197,664.3930612680947,8.0,100.0,92.0,13.25,26.0,59.0,45.75,8.93,10.0,82.0,98.0,0.6984440629895708,-0.7965702576655822,0.7032076640991776,0,0,0,0 diff --git a/analysis/outputs/numeric_profile_nifty_prices.csv b/analysis/outputs/numeric_profile_nifty_prices.csv new file mode 100644 index 0000000..cc616dc --- /dev/null +++ b/analysis/outputs/numeric_profile_nifty_prices.csv @@ -0,0 +1,7 @@ +column,count,mean,median,mode,mode_count,std,var,min,max,range,q1,q2,q3,iqr,p01,p05,p95,p99,skew,kurtosis_excess,cv,zeros,negatives,outliers_iqr_1.5,outliers_abs_z_gt_3 +open,3927,11843.598396691774,10101.0498046875,4878.60009765625,2,6228.657420586264,38796173.26302434,4623.14990234375,26325.80078125,21702.65087890625,6207.625,10101.0498046875,17005.30078125,10797.67578125,4841.48314453125,5148.530126953125,24641.9798828125,25866.306914062498,0.8237081531467739,-0.5325909524828774,0.5259092052906903,0,0,0,0 +high,3927,11900.230633624189,10155.650390625,5016.25,2,6250.8755484589765,39073445.122322306,4623.14990234375,26325.80078125,21702.65087890625,6258.10009765625,10155.650390625,17112.2001953125,10854.10009765625,4879.318876953125,5179.5251953125,24764.1154296875,25946.740390625,0.8240327441121101,-0.5333514419871839,0.5252734792212415,0,0,0,0 +low,3927,11770.442265560343,10049.099609375,4924.2998046875,2,6201.777037336387,38462038.4208329,4531.14990234375,26172.400390625,21641.25048828125,6179.85009765625,10049.099609375,16846.9755859375,10667.12548828125,4787.581123046875,5101.470166015625,24535.460546875,25786.5891015625,0.8264565370341094,-0.5258147806154869,0.526894138505096,0,0,0,0 +close,3927,11836.565133013433,10113.7001953125,5274.85009765625,3,6227.34997346843,38779887.69205725,4544.2001953125,26216.05078125,21671.8505859375,6216.14990234375,10113.7001953125,16983.375,10767.22509765625,4840.12009765625,5139.464990234375,24653.1546875,25866.389609374997,0.8248120787302304,-0.5310723842182727,0.5261112411826039,0,0,0,0 +volume,3927,240987.03845174433,213500.0,0.0,774,202284.23147436132,40918910303.173,0.0,1811000.0,1811000.0,131700.0,213500.0,312150.0,180450.0,0.0,0.0,642600.0,873089.9999999992,1.4771939741380964,4.283169583043723,0.8393988024167826,774,0,285,49 +return,3927,0.0004620664744621217,0.0005878594150563,0.0,4,0.010397451392650718,0.00010810699546253434,-0.1298046607047124,0.0876321046711503,0.2174367653758627,-0.0047439768587643,0.0005878594150563,0.00610318273436265,0.010847159593126949,-0.026319707962292733,-0.01555300232175202,0.016239241745816257,0.02614220032053754,-0.6875979258269879,11.802509919608555,22.50206835445937,4,1834,156,47 diff --git a/analysis/outputs/profile_summary.json b/analysis/outputs/profile_summary.json new file mode 100644 index 0000000..cf96b56 --- /dev/null +++ b/analysis/outputs/profile_summary.json @@ -0,0 +1,1160 @@ +{ + "files": [ + { + "file": "btc_google_trends.csv", + "bytes": 1439, + "lines": 133, + "encoding": "ascii (subset of utf-8)", + "delimiter": "','", + "header": "date,google_trend" + }, + { + "file": "btc_prices.csv", + "bytes": 423823, + "lines": 4017, + "encoding": "ascii (subset of utf-8)", + "delimiter": "','", + "header": "date,open,high,low,close,volume,return" + }, + { + "file": "manifest.json", + "bytes": 13789, + "lines": 618, + "encoding": "ascii (subset of utf-8)", + "delimiter": NaN, + "header": NaN + }, + { + "file": "nifty_google_trends.csv", + "bytes": 2146, + "lines": 195, + "encoding": "ascii (subset of utf-8)", + "delimiter": "','", + "header": "date,google_trend" + }, + { + "file": "nifty_prices.csv", + "bytes": 379817, + "lines": 3928, + "encoding": "ascii (subset of utf-8)", + "delimiter": "','", + "header": "date,open,high,low,close,volume,return" + }, + { + "file": "pipeline.log", + "bytes": 7828, + "lines": 80, + "encoding": "utf-8 (non-ASCII present)", + "delimiter": NaN, + "header": NaN + }, + { + "file": "text_data.csv", + "bytes": 241848, + "lines": 1501, + "encoding": "utf-8 (non-ASCII present)", + "delimiter": "','", + "header": "timestamp,text,source,asset,channel" + } + ], + "shapes": { + "btc_prices": { + "rows": 4016, + "cols": 7, + "memory_kib": 219.8 + }, + "nifty_prices": { + "rows": 3927, + "cols": 7, + "memory_kib": 214.9 + }, + "text_data": { + "rows": 1500, + "cols": 5, + "memory_kib": 550.8 + }, + "btc_google_trends": { + "rows": 132, + "cols": 2, + "memory_kib": 8.4 + }, + "nifty_google_trends": { + "rows": 194, + "cols": 2, + "memory_kib": 12.3 + } + }, + "numeric": { + "btc_prices": { + "count": { + "open": 4016, + "high": 4016, + "low": 4016, + "close": 4016, + "volume": 4016, + "return": 4016 + }, + "mean": { + "open": 27517.996194262, + "high": 28072.5655365788, + "low": 26932.5991061085, + "close": 27538.8864340839, + "volume": 22203364117.396164, + "return": 0.0020304394 + }, + "median": { + "open": 11352.0200195312, + "high": 11570.3500976562, + "low": 11015.2724609375, + "close": 11358.3818359375, + "volume": 17776841694.0, + "return": 0.0012482708 + }, + "mode": { + "open": 233.4219970703, + "high": 244.2510070801, + "low": 429.0769958496, + "close": 236.1529998779, + "volume": 7860650.0, + "return": -0.3716953856 + }, + "mode_count": { + "open": 2, + "high": 2, + "low": 2, + "close": 2, + "volume": 1, + "return": 1 + }, + "std": { + "open": 31747.7911749277, + "high": 32290.4545027525, + "low": 31170.0157645642, + "close": 31758.7173661484, + "volume": 22913058758.449104, + "return": 0.0352220581 + }, + "var": { + "open": 1007922244.4868162, + "high": 1042673451.9943323, + "low": 971569882.7631783, + "close": 1008616128.7428963, + "volume": 5.250082617e+20, + "return": 0.0012405934 + }, + "min": { + "open": 176.8970031738, + "high": 211.7310028076, + "low": 171.5099945068, + "close": 178.1029968262, + "volume": 7860650.0, + "return": -0.3716953856 + }, + "max": { + "open": 124752.140625, + "high": 126198.0703125, + "low": 123196.046875, + "close": 124752.53125, + "volume": 350967941479.0, + "return": 0.2524716943 + }, + "range": { + "open": 124575.2436218262, + "high": 125986.3393096924, + "low": 123024.5368804932, + "close": 124574.4282531738, + "volume": 350960080829.0, + "return": 0.6241670799 + }, + "q1": { + "open": 3671.5319213867, + "high": 3754.5494995117, + "low": 3619.7574462891, + "close": 3673.1780395508, + "volume": 2219544896.0, + "return": -0.0121418496 + }, + "q2": { + "open": 11352.0200195312, + "high": 11570.3500976562, + "low": 11015.2724609375, + "close": 11358.3818359375, + "volume": 17776841694.0, + "return": 0.0012482708 + }, + "q3": { + "open": 42807.783203125, + "high": 43575.4990234375, + "low": 41906.5146484375, + "close": 42840.408203125, + "volume": 33729773133.5, + "return": 0.0160720956 + }, + "iqr": { + "open": 39136.2512817383, + "high": 39820.9495239258, + "low": 38286.7572021484, + "close": 39167.2301635742, + "volume": 31510228237.5, + "return": 0.0282139452 + }, + "p01": { + "open": 226.5521980286, + "high": 230.6254455566, + "low": 222.7132965088, + "close": 226.7093544006, + "volume": 15147890.0, + "return": -0.1006034255 + }, + "p05": { + "open": 256.3382492065, + "high": 261.6527557373, + "low": 251.6842498779, + "close": 256.326751709, + "volume": 26602475.0, + "return": -0.0528327607 + }, + "p95": { + "open": 101768.755859375, + "high": 104025.064453125, + "low": 99766.5390625, + "close": 101751.556640625, + "volume": 65973765239.75, + "return": 0.0555935821 + }, + "p99": { + "open": 116816.17265625, + "high": 117873.9984375, + "low": 115247.885546875, + "close": 116820.018359375, + "volume": 94482481617.89996, + "return": 0.1041952451 + }, + "skew": { + "open": 1.3063722598, + "high": 1.2927044219, + "low": 1.321176252, + "close": 1.3049104877, + "volume": 2.0131789115, + "return": -0.1203667073 + }, + "kurtosis_excess": { + "open": 0.7259116533, + "high": 0.6768272195, + "low": 0.779216418, + "close": 0.7205624544, + "volume": 12.7903142195, + "return": 7.9792282257 + }, + "cv": { + "open": 1.1537101376, + "high": 1.1502495011, + "low": 1.1573341155, + "close": 1.1532317199, + "volume": 1.0319633834, + "return": 17.34701288 + }, + "zeros": { + "open": 0, + "high": 0, + "low": 0, + "close": 0, + "volume": 0, + "return": 1 + }, + "negatives": { + "open": 0, + "high": 0, + "low": 0, + "close": 0, + "volume": 0, + "return": 1896 + }, + "outliers_iqr_1.5": { + "open": 204, + "high": 209, + "low": 205, + "close": 202, + "volume": 80, + "return": 379 + }, + "outliers_abs_z_gt_3": { + "open": 4, + "high": 3, + "low": 5, + "close": 4, + "volume": 53, + "return": 70 + } + }, + "nifty_prices": { + "count": { + "open": 3927, + "high": 3927, + "low": 3927, + "close": 3927, + "volume": 3927, + "return": 3927 + }, + "mean": { + "open": 11843.5983966918, + "high": 11900.2306336242, + "low": 11770.4422655603, + "close": 11836.5651330134, + "volume": 240987.0384517443, + "return": 0.0004620665 + }, + "median": { + "open": 10101.0498046875, + "high": 10155.650390625, + "low": 10049.099609375, + "close": 10113.7001953125, + "volume": 213500.0, + "return": 0.0005878594 + }, + "mode": { + "open": 4878.6000976562, + "high": 5016.25, + "low": 4924.2998046875, + "close": 5274.8500976562, + "volume": 0.0, + "return": 0.0 + }, + "mode_count": { + "open": 2, + "high": 2, + "low": 2, + "close": 3, + "volume": 774, + "return": 4 + }, + "std": { + "open": 6228.6574205863, + "high": 6250.875548459, + "low": 6201.7770373364, + "close": 6227.3499734684, + "volume": 202284.2314743613, + "return": 0.0103974514 + }, + "var": { + "open": 38796173.26302434, + "high": 39073445.122322306, + "low": 38462038.4208329, + "close": 38779887.69205725, + "volume": 40918910303.173, + "return": 0.000108107 + }, + "min": { + "open": 4623.1499023438, + "high": 4623.1499023438, + "low": 4531.1499023438, + "close": 4544.2001953125, + "volume": 0.0, + "return": -0.1298046607 + }, + "max": { + "open": 26325.80078125, + "high": 26325.80078125, + "low": 26172.400390625, + "close": 26216.05078125, + "volume": 1811000.0, + "return": 0.0876321047 + }, + "range": { + "open": 21702.6508789062, + "high": 21702.6508789062, + "low": 21641.2504882812, + "close": 21671.8505859375, + "volume": 1811000.0, + "return": 0.2174367654 + }, + "q1": { + "open": 6207.625, + "high": 6258.1000976562, + "low": 6179.8500976562, + "close": 6216.1499023438, + "volume": 131700.0, + "return": -0.0047439769 + }, + "q2": { + "open": 10101.0498046875, + "high": 10155.650390625, + "low": 10049.099609375, + "close": 10113.7001953125, + "volume": 213500.0, + "return": 0.0005878594 + }, + "q3": { + "open": 17005.30078125, + "high": 17112.2001953125, + "low": 16846.9755859375, + "close": 16983.375, + "volume": 312150.0, + "return": 0.0061031827 + }, + "iqr": { + "open": 10797.67578125, + "high": 10854.1000976562, + "low": 10667.1254882812, + "close": 10767.2250976562, + "volume": 180450.0, + "return": 0.0108471596 + }, + "p01": { + "open": 4841.4831445313, + "high": 4879.3188769531, + "low": 4787.5811230469, + "close": 4840.1200976563, + "volume": 0.0, + "return": -0.026319708 + }, + "p05": { + "open": 5148.5301269531, + "high": 5179.5251953125, + "low": 5101.4701660156, + "close": 5139.4649902344, + "volume": 0.0, + "return": -0.0155530023 + }, + "p95": { + "open": 24641.9798828125, + "high": 24764.1154296875, + "low": 24535.460546875, + "close": 24653.1546875, + "volume": 642600.0, + "return": 0.0162392417 + }, + "p99": { + "open": 25866.3069140625, + "high": 25946.740390625, + "low": 25786.5891015625, + "close": 25866.389609375, + "volume": 873089.9999999992, + "return": 0.0261422003 + }, + "skew": { + "open": 0.8237081531, + "high": 0.8240327441, + "low": 0.826456537, + "close": 0.8248120787, + "volume": 1.4771939741, + "return": -0.6875979258 + }, + "kurtosis_excess": { + "open": -0.5325909525, + "high": -0.533351442, + "low": -0.5258147806, + "close": -0.5310723842, + "volume": 4.283169583, + "return": 11.8025099196 + }, + "cv": { + "open": 0.5259092053, + "high": 0.5252734792, + "low": 0.5268941385, + "close": 0.5261112412, + "volume": 0.8393988024, + "return": 22.5020683545 + }, + "zeros": { + "open": 0, + "high": 0, + "low": 0, + "close": 0, + "volume": 774, + "return": 4 + }, + "negatives": { + "open": 0, + "high": 0, + "low": 0, + "close": 0, + "volume": 0, + "return": 1834 + }, + "outliers_iqr_1.5": { + "open": 0, + "high": 0, + "low": 0, + "close": 0, + "volume": 285, + "return": 156 + }, + "outliers_abs_z_gt_3": { + "open": 0, + "high": 0, + "low": 0, + "close": 0, + "volume": 49, + "return": 47 + } + }, + "btc_google_trends": { + "count": { + "google_trend": 132 + }, + "mean": { + "google_trend": 22.7121212121 + }, + "median": { + "google_trend": 21.0 + }, + "mode": { + "google_trend": 2.0 + }, + "mode_count": { + "google_trend": 13 + }, + "std": { + "google_trend": 16.9144819395 + }, + "var": { + "google_trend": 286.0996992829 + }, + "min": { + "google_trend": 2.0 + }, + "max": { + "google_trend": 100.0 + }, + "range": { + "google_trend": 98.0 + }, + "q1": { + "google_trend": 11.75 + }, + "q2": { + "google_trend": 21.0 + }, + "q3": { + "google_trend": 33.0 + }, + "iqr": { + "google_trend": 21.25 + }, + "p01": { + "google_trend": 2.0 + }, + "p05": { + "google_trend": 2.0 + }, + "p95": { + "google_trend": 52.0 + }, + "p99": { + "google_trend": 67.45 + }, + "skew": { + "google_trend": 1.1412540466 + }, + "kurtosis_excess": { + "google_trend": 2.4638534569 + }, + "cv": { + "google_trend": 0.7447336945 + }, + "zeros": { + "google_trend": 0 + }, + "negatives": { + "google_trend": 0 + }, + "outliers_iqr_1.5": { + "google_trend": 2 + }, + "outliers_abs_z_gt_3": { + "google_trend": 1 + } + }, + "nifty_google_trends": { + "count": { + "google_trend": 194 + }, + "mean": { + "google_trend": 36.6546391753 + }, + "median": { + "google_trend": 26.0 + }, + "mode": { + "google_trend": 13.0 + }, + "mode_count": { + "google_trend": 15 + }, + "std": { + "google_trend": 25.7758231928 + }, + "var": { + "google_trend": 664.3930612681 + }, + "min": { + "google_trend": 8.0 + }, + "max": { + "google_trend": 100.0 + }, + "range": { + "google_trend": 92.0 + }, + "q1": { + "google_trend": 13.25 + }, + "q2": { + "google_trend": 26.0 + }, + "q3": { + "google_trend": 59.0 + }, + "iqr": { + "google_trend": 45.75 + }, + "p01": { + "google_trend": 8.93 + }, + "p05": { + "google_trend": 10.0 + }, + "p95": { + "google_trend": 82.0 + }, + "p99": { + "google_trend": 98.0 + }, + "skew": { + "google_trend": 0.698444063 + }, + "kurtosis_excess": { + "google_trend": -0.7965702577 + }, + "cv": { + "google_trend": 0.7032076641 + }, + "zeros": { + "google_trend": 0 + }, + "negatives": { + "google_trend": 0 + }, + "outliers_iqr_1.5": { + "google_trend": 0 + }, + "outliers_abs_z_gt_3": { + "google_trend": 0 + } + } + }, + "plausibility": { + "BTC": { + "date_min": "2015-01-02", + "date_max": "2025-12-30", + "future_dates_vs_2026-10-09": 0, + "duplicate_dates": 0, + "nonpositive_prices": 0, + "high_lt_low": 0, + "close_outside_low_high": 0, + "open_outside_low_high": 0, + "volume_zero_rows": 0, + "stored_return_vs_pct_change_maxabsdiff_excl_first": 3.0964814046186007e-16, + "stored_return_first_row": 0.0024917184690256, + "day_gap_histogram": { + "1": 4015 + }, + "calendar_days_missing": 0, + "btc_missing_dates_sample": [], + "largest_abs_log_returns": [ + { + "date": "2020-03-12", + "close": 4970.79, + "abs_log_ret": 0.4647 + }, + { + "date": "2015-01-14", + "close": 178.1, + "abs_log_ret": 0.2376 + }, + { + "date": "2017-12-07", + "close": 17899.7, + "abs_log_ret": 0.2251 + }, + { + "date": "2017-07-20", + "close": 2817.6, + "abs_log_ret": 0.2146 + }, + { + "date": "2017-09-14", + "close": 3154.95, + "abs_log_ret": 0.2075 + } + ], + "rows_per_year": { + "2015": 364, + "2016": 366, + "2017": 365, + "2018": 365, + "2019": 365, + "2020": 366, + "2021": 365, + "2022": 365, + "2023": 365, + "2024": 366, + "2025": 364 + } + }, + "NIFTY": { + "date_min": "2010-01-05", + "date_max": "2025-12-30", + "future_dates_vs_2026-10-09": 0, + "duplicate_dates": 0, + "nonpositive_prices": 0, + "high_lt_low": 0, + "close_outside_low_high": 0, + "open_outside_low_high": 0, + "volume_zero_rows": 774, + "volume_zero_first_last": [ + "2010-01-05", + "2024-07-03" + ], + "volume_zero_by_year": { + "2010": 249, + "2011": 242, + "2012": 242, + "2013": 13, + "2017": 1, + "2018": 13, + "2020": 2, + "2021": 4, + "2022": 1, + "2023": 2, + "2024": 5 + }, + "stored_return_vs_pct_change_maxabsdiff_excl_first": 9.996344030316351e-17, + "stored_return_first_row": 0.0087343192778044, + "day_gap_histogram": { + "1": 2967, + "2": 120, + "3": 735, + "4": 95, + "5": 8, + "6": 1 + }, + "calendar_days_missing": 1912, + "largest_abs_log_returns": [ + { + "date": "2020-03-23", + "close": 7610.25, + "abs_log_ret": 0.139 + }, + { + "date": "2020-03-12", + "close": 9590.15, + "abs_log_ret": 0.0867 + }, + { + "date": "2020-04-07", + "close": 8792.2, + "abs_log_ret": 0.084 + }, + { + "date": "2020-03-16", + "close": 9197.4, + "abs_log_ret": 0.0792 + }, + { + "date": "2020-03-25", + "close": 8317.85, + "abs_log_ret": 0.0641 + } + ], + "rows_per_year": { + "2010": 249, + "2011": 242, + "2012": 242, + "2013": 247, + "2014": 240, + "2015": 244, + "2016": 244, + "2017": 248, + "2018": 245, + "2019": 241, + "2020": 250, + "2021": 248, + "2022": 248, + "2023": 245, + "2024": 246, + "2025": 248 + } + } + }, + "categorical": { + "text_data": { + "source": { + "value_counts": { + "nan": 1500 + }, + "relative_freq": { + "nan": 1.0 + }, + "mode": null, + "entropy_bits": null, + "n_categories": 0, + "rare_lt_1pct": 0, + "case_or_whitespace_variants": {}, + "na_like_strings": 0, + "true_NaN": 1500 + }, + "asset": { + "value_counts": { + "NIFTY": 750, + "BTC": 750 + }, + "relative_freq": { + "NIFTY": 0.5, + "BTC": 0.5 + }, + "mode": "BTC", + "entropy_bits": 1.0, + "n_categories": 2, + "rare_lt_1pct": 0, + "case_or_whitespace_variants": {}, + "na_like_strings": 0, + "true_NaN": 0 + }, + "channel": { + "value_counts": { + "news_gdelt": 1500 + }, + "relative_freq": { + "news_gdelt": 1.0 + }, + "mode": "news_gdelt", + "entropy_bits": -0.0, + "n_categories": 1, + "rare_lt_1pct": 0, + "case_or_whitespace_variants": {}, + "na_like_strings": 0, + "true_NaN": 0 + } + } + }, + "text": { + "rows": 1500, + "ts_min": "2024-10-03 01:15:00+00:00", + "ts_max": "2025-01-01 16:30:00+00:00", + "distinct_utc_days": 91, + "dominant_script_counts": { + "LATIN": 1261, + "DEVANAGARI": 150, + "HANGUL": 52, + "GUJARATI": 14, + "CYRILLIC": 7, + "TAMIL": 5, + "CJK": 3, + "KANNADA": 2, + "MALAYALAM": 2, + "HEBREW": 2, + "TELUGU": 1, + "ARABIC": 1 + }, + "dominant_script_by_asset": { + "BTC": { + "LATIN": 687, + "HANGUL": 52, + "CYRILLIC": 6, + "CJK": 2, + "HEBREW": 2, + "ARABIC": 1 + }, + "NIFTY": { + "LATIN": 574, + "DEVANAGARI": 150, + "GUJARATI": 14, + "TAMIL": 5, + "KANNADA": 2, + "MALAYALAM": 2, + "CYRILLIC": 1, + "CJK": 1, + "TELUGU": 1 + } + }, + "headline_len_chars": { + "count": 1499.0, + "mean": 87.9, + "std": 37.25, + "min": 21.0, + "25%": 64.0, + "50%": 79.0, + "75%": 102.0, + "max": 253.0 + }, + "exact_duplicate_rows": 65, + "duplicate_text_any_time": 109, + "rows_after_clean_len_gt_10 (nb02 reports 1377)": 1377, + "rows_dropped_by_clean_filter": 123, + "dropped_rows_by_script": { + "HANGUL": 52, + "DEVANAGARI": 50, + "CYRILLIC": 7, + "TAMIL": 5, + "CJK": 3, + "HEBREW": 2, + "LATIN": 1, + "TELUGU": 1, + "MALAYALAM": 1, + "ARABIC": 1 + }, + "kept_non_latin_rows (garbled by ascii-only regex)": 117, + "near_duplicate_clean_text": 192, + "headlines_per_day_per_asset": { + "BTC": { + "count": 91.0, + "mean": 7.54, + "std": 6.39, + "min": 0.0, + "25%": 3.0, + "50%": 6.0, + "75%": 10.0, + "max": 32.0 + }, + "NIFTY": { + "count": 91.0, + "mean": 7.59, + "std": 5.28, + "min": 0.0, + "25%": 3.0, + "50%": 7.0, + "75%": 11.0, + "max": 23.0 + } + }, + "days_with_headlines": { + "BTC": 82, + "NIFTY": 87 + } + }, + "training_table": { + "vader_on_clean_text": { + "count": 1377.0, + "mean": 0.1567, + "std": 0.307, + "min": -0.9136, + "25%": 0.0, + "50%": 0.0, + "75%": 0.4019, + "max": 0.891 + }, + "aligned_rows (nb05 printed BTC shape (75, 15))": 77, + "aligned_date_range": [ + "2024-10-08", + "2025-01-01" + ], + "rows_after_build_features_dropna": 13, + "train_rows": 10, + "test_rows": 3, + "train_dates": [ + "2024-12-14", + "2024-12-24" + ], + "test_dates": [ + "2024-12-25", + "2024-12-27" + ], + "why_so_few": "rolling(60) in pipeline/feature_engineering.py:17 consumes 59 of the aligned rows; shift(-5) target consumes the last 5" + }, + "training_target_baseline": { + "dummy_mean_rmse_vol_space": 0.009553206183977425, + "dummy_mean_mae_vol_space": 0.009413657530969635, + "y_train_values": [ + -3.50526, + -3.6496, + -3.73453, + -4.39897, + -3.74895, + -3.74616, + -3.52131, + -3.5458, + -3.53004, + -3.95697 + ], + "y_test_values": [ + -4.08834, + -4.29544, + -4.33745 + ], + "vol_space_min_max": [ + 0.012288998918154423, + 0.030038062036667947 + ] + }, + "research_target": { + "BTC": { + "vol_target": { + "n": 3951, + "mean": 0.028584228156607404, + "median": 0.023812354742148035, + "std": 0.020171685657338855, + "skew": 2.361870023392201, + "excess_kurtosis": 12.32707549322614, + "jarque_bera_stat": 28689.28274913106, + "jarque_bera_p": 0.0 + }, + "log_vol_target": { + "n": 3951, + "mean": -3.7750886822110354, + "median": -3.737508732056034, + "std": 0.6839852034545987, + "skew": -0.29071237936707744, + "excess_kurtosis": 0.16645104832600532, + "jarque_bera_stat": 60.21335549396826, + "jarque_bera_p": 8.410774436424628e-14 + } + }, + "NIFTY": { + "vol_target": { + "n": 3862, + "mean": 0.008656964832020343, + "median": 0.007425432200806333, + "std": 0.005816842591982817, + "skew": 4.2537008783709105, + "excess_kurtosis": 36.345498989971304, + "jarque_bera_stat": 224216.64595325626, + "jarque_bera_p": 0.0 + }, + "log_vol_target": { + "n": 3862, + "mean": -4.904175255125982, + "median": -4.902709743840681, + "std": 0.5455543001865042, + "skew": 0.09987645478750903, + "excess_kurtosis": 0.769044162621666, + "jarque_bera_stat": 101.59154313458419, + "jarque_bera_p": 8.703154721251744e-23 + } + } + }, + "relationships": { + "BTC": { + "top_pairs": { + "abs_return~sq_return": 0.7712, + "vol_22~vol_60": 0.7691, + "vol_5~vol_22": 0.6928, + "abs_return~vol_5": 0.5402, + "vol_5~vol_60": 0.5174, + "sq_return~vol_5": 0.4065 + }, + "vif": { + "abs_return": 2.928, + "sq_return": 2.482, + "vol_5": 2.301, + "vol_22": 3.453, + "vol_60": 2.454 + }, + "ranking": { + "pearson_with_target": { + "vol_22": 0.45555, + "vol_60": 0.4108, + "vol_5": 0.42157, + "sq_return": 0.17348, + "abs_return": 0.27838 + }, + "spearman_with_target": { + "vol_22": 0.47028, + "vol_60": 0.4039, + "vol_5": 0.4294, + "sq_return": 0.26522, + "abs_return": 0.26522 + }, + "mutual_info": { + "vol_22": 0.29675, + "vol_60": 0.27481, + "vol_5": 0.15742, + "sq_return": 0.06524, + "abs_return": 0.05615 + } + } + }, + "NIFTY": { + "top_pairs": { + "vol_22~vol_60": 0.7942, + "abs_return~sq_return": 0.7616, + "vol_5~vol_22": 0.7256, + "abs_return~vol_5": 0.5754, + "vol_5~vol_60": 0.5318, + "sq_return~vol_5": 0.4943 + }, + "vif": { + "abs_return": 2.727, + "sq_return": 2.416, + "vol_5": 2.615, + "vol_22": 4.154, + "vol_60": 2.748 + }, + "ranking": { + "pearson_with_target": { + "vol_60": 0.37615, + "vol_22": 0.43675, + "vol_5": 0.38326, + "abs_return": 0.25301, + "sq_return": 0.19668 + }, + "spearman_with_target": { + "vol_60": 0.38969, + "vol_22": 0.45374, + "vol_5": 0.3425, + "abs_return": 0.17962, + "sq_return": 0.17962 + }, + "mutual_info": { + "vol_60": 0.23363, + "vol_22": 0.20699, + "vol_5": 0.12124, + "abs_return": 0.0333, + "sq_return": 0.02967 + } + } + } + }, + "missingness": { + "pct_missing": { + "btc_close": 0.05, + "nifty_close": 32.63, + "btc_headlines": 97.96, + "nifty_headlines": 97.83, + "btc_trend_monthly": 96.71, + "nifty_trend_monthly": 96.71 + }, + "nifty_missing_by_weekday": { + "0": 34, + "1": 29, + "2": 31, + "3": 29, + "4": 41, + "5": 573, + "6": 574 + } + }, + "duplicates": { + "btc_prices": { + "exact_duplicate_rows": 0, + "duplicate_dates": 0 + }, + "nifty_prices": { + "exact_duplicate_rows": 0, + "duplicate_dates": 0 + }, + "btc_trends": { + "exact_duplicate_rows": 0, + "duplicate_dates": 0 + }, + "nifty_trends": { + "exact_duplicate_rows": 2, + "duplicate_dates": 2 + }, + "text_data": { + "exact_duplicate_rows": 65, + "duplicate_text_values": 109 + } + } +} \ No newline at end of file diff --git a/analysis/outputs/target_distribution_btc.png b/analysis/outputs/target_distribution_btc.png new file mode 100644 index 0000000..ab57502 Binary files /dev/null and b/analysis/outputs/target_distribution_btc.png differ diff --git a/analysis/outputs/target_distribution_nifty.png b/analysis/outputs/target_distribution_nifty.png new file mode 100644 index 0000000..8ea283a Binary files /dev/null and b/analysis/outputs/target_distribution_nifty.png differ diff --git a/analysis/outputs/text_headlines_per_day.csv b/analysis/outputs/text_headlines_per_day.csv new file mode 100644 index 0000000..b65fdd8 --- /dev/null +++ b/analysis/outputs/text_headlines_per_day.csv @@ -0,0 +1,92 @@ +timestamp,BTC,NIFTY +2024-10-03,14,10 +2024-10-04,11,13 +2024-10-05,4,1 +2024-10-06,3,0 +2024-10-07,12,6 +2024-10-08,13,5 +2024-10-09,7,6 +2024-10-10,17,13 +2024-10-11,7,5 +2024-10-12,3,1 +2024-10-13,10,1 +2024-10-14,9,11 +2024-10-15,5,13 +2024-10-16,9,5 +2024-10-17,6,11 +2024-10-18,4,8 +2024-10-19,2,3 +2024-10-20,5,2 +2024-10-21,6,23 +2024-10-22,3,8 +2024-10-23,4,12 +2024-10-24,7,5 +2024-10-25,3,10 +2024-10-26,0,1 +2024-10-27,3,2 +2024-10-28,11,15 +2024-10-29,4,13 +2024-10-30,10,9 +2024-10-31,7,14 +2024-11-01,8,4 +2024-11-02,4,1 +2024-11-03,0,2 +2024-11-04,0,10 +2024-11-05,0,17 +2024-11-06,1,9 +2024-11-07,0,4 +2024-11-08,0,12 +2024-11-09,0,2 +2024-11-10,6,4 +2024-11-11,13,11 +2024-11-12,10,20 +2024-11-13,5,19 +2024-11-14,2,22 +2024-11-15,6,5 +2024-11-16,4,4 +2024-11-17,0,2 +2024-11-18,9,10 +2024-11-19,4,8 +2024-11-20,12,9 +2024-11-21,9,9 +2024-11-22,9,9 +2024-11-23,1,2 +2024-11-24,5,1 +2024-11-25,12,13 +2024-11-26,19,10 +2024-11-27,11,11 +2024-11-28,6,13 +2024-11-29,19,10 +2024-11-30,3,7 +2024-12-01,2,3 +2024-12-02,2,15 +2024-12-03,8,12 +2024-12-04,8,12 +2024-12-05,14,13 +2024-12-06,6,6 +2024-12-07,3,3 +2024-12-08,12,1 +2024-12-09,31,9 +2024-12-10,18,11 +2024-12-11,13,14 +2024-12-12,15,6 +2024-12-13,22,12 +2024-12-14,32,3 +2024-12-15,0,2 +2024-12-16,2,12 +2024-12-17,5,7 +2024-12-18,6,6 +2024-12-19,1,3 +2024-12-20,4,9 +2024-12-21,2,0 +2024-12-22,5,2 +2024-12-23,9,8 +2024-12-24,8,4 +2024-12-25,4,2 +2024-12-26,9,8 +2024-12-27,8,6 +2024-12-28,9,2 +2024-12-29,4,0 +2024-12-30,17,0 +2024-12-31,23,7 +2025-01-01,7,7 diff --git a/analysis/outputs/verify_dashboard_numbers.json b/analysis/outputs/verify_dashboard_numbers.json new file mode 100644 index 0000000..f7be875 --- /dev/null +++ b/analysis/outputs/verify_dashboard_numbers.json @@ -0,0 +1,186 @@ +{ + "dashboard": { + "COND_EXP_BTC": { + "7d": { + "Q1(Low)": 0.0325, + "Q2": 0.0299, + "Q3": 0.0278, + "Q4": 0.0281, + "Q5(High)": 0.0294 + }, + "14d": { + "Q1(Low)": 0.0338, + "Q2": 0.0307, + "Q3": 0.0296, + "Q4": 0.0292, + "Q5(High)": 0.0303 + } + }, + "COND_EXP_NIFTY": { + "7d": { + "Q1(Low)": 0.0105, + "Q2": 0.0078, + "Q3": 0.008, + "Q4": 0.0082, + "Q5(High)": 0.0076 + }, + "14d": { + "Q1(Low)": 0.0107, + "Q2": 0.0081, + "Q3": 0.0084, + "Q4": 0.0085, + "Q5(High)": 0.008 + } + }, + "REAL_CORR_BTC": -0.0837, + "REAL_CORR_NIFTY": -0.058, + "NIFTY_REGIME_STATS": { + "low": { + "mean_vol": 0.144, + "mean_mfi": 0.352, + "ac1": 0.148 + }, + "medium": { + "mean_vol": 0.151, + "mean_mfi": 0.35, + "ac1": 0.117 + }, + "high": { + "mean_vol": 0.162, + "mean_mfi": 0.349, + "ac1": 0.083 + } + }, + "SHOCK_DECAY": { + "horizons": [ + 1, + 3, + 7, + 14, + 21 + ], + "btc": [ + 0.0119, + 0.0138, + 0.0115, + 0.0119, + 0.0097 + ], + "nifty": [ + 0.01, + 0.01, + 0.0091, + 0.0088, + 0.0091 + ] + } + }, + "synthetic": { + "BTC": { + "date_range": [ + "2016-02-11", + "2023-08-31" + ], + "rows": 1971, + "shock_mean_fwd_abs_ret": [ + 0.0118, + 0.0138, + 0.0114, + 0.0118, + 0.0096 + ], + "regime_stats": { + "low": { + "mean_vol30d": 0.209, + "mean_MFI": 0.329, + "persistence_ac1": 0.205 + }, + "medium": { + "mean_vol30d": 0.207, + "mean_MFI": 0.339, + "persistence_ac1": 0.086 + }, + "high": { + "mean_vol30d": 0.208, + "mean_MFI": 0.328, + "persistence_ac1": 0.048 + } + }, + "mfi_max": 1.0, + "mfi_max_date": "2016-05-19", + "mfi_max_after_2017": 0.753, + "mfi_max_after_2017_date": "2020-05-01", + "corr_gmsi_vs_vol30d": 0.0157 + }, + "NIFTY": { + "date_range": [ + "2016-02-11", + "2023-08-31" + ], + "rows": 1971, + "shock_mean_fwd_abs_ret": [ + 0.01, + 0.0099, + 0.0091, + 0.0088, + 0.009 + ], + "regime_stats": { + "low": { + "mean_vol30d": 0.144, + "mean_MFI": 0.352, + "persistence_ac1": 0.148 + }, + "medium": { + "mean_vol30d": 0.151, + "mean_MFI": 0.35, + "persistence_ac1": 0.117 + }, + "high": { + "mean_vol30d": 0.162, + "mean_MFI": 0.349, + "persistence_ac1": 0.083 + } + }, + "mfi_max": 0.761, + "mfi_max_date": "2019-03-07", + "mfi_max_after_2017": 0.761, + "mfi_max_after_2017_date": "2019-03-07", + "corr_gmsi_vs_vol30d": 0.0658 + } + }, + "real": { + "BTC": { + "rows": 2800, + "shock_mean_fwd_abs_ret": [ + 0.0396, + 0.035, + 0.0341, + 0.0371, + 0.0358 + ], + "mfi_max": 0.986, + "mfi_max_date": "2017-01-06", + "mfi_2020_03": 0.654, + "vol_30d_ann_max": 1.645, + "vol_30d_ann_max_date": "2020-04-06", + "cum_log_return_end": 4.098 + }, + "NIFTY": { + "rows": 1889, + "shock_mean_fwd_abs_ret": [ + 0.0163, + 0.0156, + 0.014, + 0.0124, + 0.0098 + ], + "mfi_max": 1.0, + "mfi_max_date": "2016-02-16", + "mfi_2020_03": 0.911, + "vol_30d_ann_max": 0.766, + "vol_30d_ann_max_date": "2020-04-23", + "cum_log_return_end": 0.885 + } + } +} \ No newline at end of file diff --git a/analysis/outputs/verify_dashboard_numbers_stdout.txt b/analysis/outputs/verify_dashboard_numbers_stdout.txt new file mode 100644 index 0000000..19c70cd --- /dev/null +++ b/analysis/outputs/verify_dashboard_numbers_stdout.txt @@ -0,0 +1,25 @@ +REAL-PRICE counterparts (2016-01-01 … 2023-08-31): + BTC: {'rows': 2800, 'shock_mean_fwd_abs_ret': [0.0396, 0.035, 0.0341, 0.0371, 0.0358], 'mfi_max': 0.986, 'mfi_max_date': '2017-01-06', 'mfi_2020_03': 0.654, 'vol_30d_ann_max': 1.645, 'vol_30d_ann_max_date': '2020-04-06', 'cum_log_return_end': 4.098} + NIFTY: {'rows': 1889, 'shock_mean_fwd_abs_ret': [0.0163, 0.0156, 0.014, 0.0124, 0.0098], 'mfi_max': 1.0, 'mfi_max_date': '2016-02-16', 'mfi_2020_03': 0.911, 'vol_30d_ann_max': 0.766, 'vol_30d_ann_max_date': '2020-04-23', 'cum_log_return_end': 0.885} +SHOCK_DECAY.btc (dashboard): + [0.0119, 0.0138, 0.0115, 0.0119, 0.0097] +synthetic BTC mean fwd |r| at h=1,3,7,14,21: + [0.0118, 0.0138, 0.0114, 0.0118, 0.0096] +SHOCK_DECAY.nifty (dashboard): + [0.01, 0.01, 0.0091, 0.0088, 0.0091] +synthetic NIFTY mean fwd |r|: + [0.01, 0.0099, 0.0091, 0.0088, 0.009] +NIFTY_REGIME_STATS (dashboard): + {'low': {'mean_vol': 0.144, 'mean_mfi': 0.352, 'ac1': 0.148}, 'medium': {'mean_vol': 0.151, 'mean_mfi': 0.35, 'ac1': 0.117}, 'high': {'mean_vol': 0.162, 'mean_mfi': 0.349, 'ac1': 0.083}} +synthetic NIFTY regime stats: + {'low': {'mean_vol30d': 0.144, 'mean_MFI': 0.352, 'persistence_ac1': 0.148}, 'medium': {'mean_vol30d': 0.151, 'mean_MFI': 0.35, 'persistence_ac1': 0.117}, 'high': {'mean_vol30d': 0.162, 'mean_MFI': 0.349, 'persistence_ac1': 0.083}} +dashboard claim: + MFI peak 0.76 · COVID crash · Mar 2020 (app.py:636, 996-999) +synthetic BTC MFI max after 2017: + [0.753, '2020-05-01'] +synthetic BTC MFI global max: + [1.0, '2016-05-19'] +synthetic date ranges: + {'BTC': ['2016-02-11', '2023-08-31'], 'NIFTY': ['2016-02-11', '2023-08-31']} +synthetic corr(GMSI, vol_30d): + {'BTC': 0.0157, 'NIFTY': 0.0658} diff --git a/analysis/requirements.txt b/analysis/requirements.txt new file mode 100644 index 0000000..ec532a3 --- /dev/null +++ b/analysis/requirements.txt @@ -0,0 +1,11 @@ +# Exact versions the analysis/ scripts were run with (Python 3.12.3). +# scikit-learn is pinned to 1.8.0 because models/rf_btc.pkl was pickled with 1.8.0. +numpy==2.5.3 +pandas==3.0.6 +scipy==1.18.1 +scikit-learn==1.8.0 +joblib==1.6.0 +matplotlib==3.11.2 +seaborn==0.13.2 +statsmodels==0.15.0 +vaderSentiment==3.3.2 diff --git a/analysis/verify_dashboard_numbers.py b/analysis/verify_dashboard_numbers.py new file mode 100644 index 0000000..eeb9694 --- /dev/null +++ b/analysis/verify_dashboard_numbers.py @@ -0,0 +1,136 @@ +""" +analysis/verify_dashboard_numbers.py — traces every hard-coded number in +dashboard/app.py back to the code that produced it. + +Specifically: re-runs scripts/08_market_dynamics_analysis.py's *synthetic* +branch (np.random.seed(42) GARCH + AR(1) "GMSI") and compares its outputs to +dashboard/app.py's SHOCK_DECAY and NIFTY_REGIME_STATS constants and the +"MFI peak 0.76" claim. If they match, those dashboard "real data" numbers are +simulation outputs. + + python analysis/verify_dashboard_numbers.py +""" +from __future__ import annotations + +import ast +import importlib.util +import json +import os +import sys +import tempfile +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import numpy as np + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from common import OUT, legacy_bytes # noqa: E402 + + +def dashboard_constants(): + tree = ast.parse(legacy_bytes("dashboard/app.py").decode()) + want = {"SHOCK_DECAY", "NIFTY_REGIME_STATS", "COND_EXP_BTC", "COND_EXP_NIFTY", "REAL_CORR_BTC", "REAL_CORR_NIFTY"} + out = {} + for node in tree.body: + if isinstance(node, ast.Assign) and isinstance(node.targets[0], ast.Name) and node.targets[0].id in want: + out[node.targets[0].id] = ast.literal_eval(node.value) + return out + + +def _legacy_script08(tmp: str) -> Path: + """The ORIGINAL scripts/08 (it was rewritten after the audit) written to a temp file.""" + p = Path(tmp) / "s08_original.py" + p.write_bytes(legacy_bytes("scripts/08_market_dynamics_analysis.py")) + return p + + +def run_script08_synthetic(): + cwd = os.getcwd() + with tempfile.TemporaryDirectory() as tmp: # empty cwd → every data path in load_or_generate_data() misses + os.chdir(tmp) + try: + spec = importlib.util.spec_from_file_location("s08", _legacy_script08(tmp)) + s08 = importlib.util.module_from_spec(spec) + spec.loader.exec_module(s08) # module import runs np.random.seed(42) (line 39) + btc, nifty, gmsi = s08.generate_synthetic_data() # same single call as the __main__ "all missing" path + res = {} + for name, df in [("BTC", btc), ("NIFTY", nifty)]: + g = gmsi["gmsi"].reindex(df.index).ffill() + mfi = s08.compute_mfi(df, window=30) + reg = s08.define_regimes(g) + mask, _ = s08.identify_shocks(df, 0.95) + _, summ = s08.compute_shock_propagation(df, mask, (1, 3, 7, 14, 21)) + rs = s08.regime_stats(df, reg, mfi) + res[name] = {"date_range": [str(df.index[0].date()), str(df.index[-1].date())], "rows": len(df), + "shock_mean_fwd_abs_ret": summ["mean_fwd_vol"].round(4).tolist(), + "regime_stats": rs[["mean_vol30d", "mean_MFI", "persistence_ac1"]].round(3).to_dict(orient="index"), + "mfi_max": round(float(mfi["MFI"].max()), 3), + "mfi_max_date": str(mfi["MFI"].idxmax().date()), + "mfi_max_after_2017": round(float(mfi["MFI"].loc["2017":].max()), 3), + "mfi_max_after_2017_date": str(mfi["MFI"].loc["2017":].idxmax().date()), + "corr_gmsi_vs_vol30d": round(float(g.corr(df["vol_30d"])), 4)} + finally: + os.chdir(cwd) + return res + + +def run_script08_on_real_prices(): + """Same MFI / shock functions, fed the committed real prices (no GMSI exists → no regime stats).""" + import pandas as pd + from common import load_prices + cwd = os.getcwd() + with tempfile.TemporaryDirectory() as tmp: + spec = importlib.util.spec_from_file_location("s08r", _legacy_script08(tmp)) + os.chdir(tmp) + try: + s08 = importlib.util.module_from_spec(spec); spec.loader.exec_module(s08) + finally: + os.chdir(cwd) + out = {} + for a in ["BTC", "NIFTY"]: + p = load_prices(a).set_index("date") + df = pd.DataFrame({"log_return": np.log(p["close"] / p["close"].shift(1))}) + for w in (7, 14, 30): # same annualisation as the script (×√252), main-block lines 884-887 + df[f"vol_{w}d"] = df["log_return"].rolling(w).std() * np.sqrt(252) + df["abs_return"] = df["log_return"].abs() + df = df.loc["2016-01-01":"2023-08-31"].dropna() # same window the synthetic figures show + mfi = s08.compute_mfi(df, 30) + mask, _ = s08.identify_shocks(df, 0.95) + _, summ = s08.compute_shock_propagation(df, mask, (1, 3, 7, 14, 21)) + out[a] = {"rows": len(df), "shock_mean_fwd_abs_ret": summ["mean_fwd_vol"].round(4).tolist(), + "mfi_max": round(float(mfi["MFI"].max()), 3), "mfi_max_date": str(mfi["MFI"].idxmax().date()), + "mfi_2020_03": round(float(mfi["MFI"].loc["2020-03"].max()), 3), + "vol_30d_ann_max": round(float(df["vol_30d"].max()), 3), + "vol_30d_ann_max_date": str(df["vol_30d"].idxmax().date()), + "cum_log_return_end": round(float(df["log_return"].sum()), 3)} + return out + + +def main(): + dash = dashboard_constants() + syn = run_script08_synthetic() + real = run_script08_on_real_prices() + print("REAL-PRICE counterparts (2016-01-01 … 2023-08-31):") + for a, v in real.items(): + print(f" {a}: {v}") + cmp = { + "SHOCK_DECAY.btc (dashboard)": dash["SHOCK_DECAY"]["btc"], + "synthetic BTC mean fwd |r| at h=1,3,7,14,21": syn["BTC"]["shock_mean_fwd_abs_ret"], + "SHOCK_DECAY.nifty (dashboard)": dash["SHOCK_DECAY"]["nifty"], + "synthetic NIFTY mean fwd |r|": syn["NIFTY"]["shock_mean_fwd_abs_ret"], + "NIFTY_REGIME_STATS (dashboard)": dash["NIFTY_REGIME_STATS"], + "synthetic NIFTY regime stats": syn["NIFTY"]["regime_stats"], + "dashboard claim": "MFI peak 0.76 · COVID crash · Mar 2020 (app.py:636, 996-999)", + "synthetic BTC MFI max after 2017": [syn["BTC"]["mfi_max_after_2017"], syn["BTC"]["mfi_max_after_2017_date"]], + "synthetic BTC MFI global max": [syn["BTC"]["mfi_max"], syn["BTC"]["mfi_max_date"]], + "synthetic date ranges": {k: v["date_range"] for k, v in syn.items()}, + "synthetic corr(GMSI, vol_30d)": {k: v["corr_gmsi_vs_vol30d"] for k, v in syn.items()}, + } + for k, v in cmp.items(): + print(f"{k}:\n {v}") + (OUT / "verify_dashboard_numbers.json").write_text(json.dumps({"dashboard": dash, "synthetic": syn, "real": real}, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/dashboard/README.md b/dashboard/README.md index 5cf378a..6d5eb04 100644 --- a/dashboard/README.md +++ b/dashboard/README.md @@ -1,56 +1,18 @@ -# FinSentinel — Market Intelligence Dashboard - -Financial Sentiment & Market Dynamics Research Platform -DSN-278 · VIT Bhopal University · 2026 - ---- - -## Quick Start +# FinSentinel dashboard ```bash -# 1. Install dependencies -pip install streamlit plotly scipy pandas numpy - -# 2. Run the dashboard -streamlit run app.py +pip install -r dashboard/requirements.txt +streamlit run dashboard/app.py # run from the repo root ``` -Opens at: http://localhost:8501 - ---- - -## Pages - -| Page | What it shows | -|------|--------------| -| 🏠 Overview | Live metrics, asset prices, key findings summary | -| 📊 Sentiment & Correlation | FinBERT+VADER scores vs price, lag correlation, scatter | -| 🌡️ Market Fragility (MFI) | MFI components, VIX validation, fragility timeline | -| ⚡ Shock Propagation | Decay curves, half-life, regime-conditioned shock response | -| 🔬 Regime Analysis | GMSI regimes, Wasserstein distance, vol distributions | -| 📖 Methodology | Full pipeline diagram, NLP formulas, statistical methods | - ---- - -## Data Note - -Currently uses realistic synthetic data (GARCH-simulated returns, AR(1) GMSI). -To connect real data: replace the `generate_data()` function in `app.py` -with reads from your `data/processed/master_daily.csv`. - ---- - -## Deploy to Streamlit Cloud - -1. Push to GitHub -2. Go to share.streamlit.io -3. Select repo → `dashboard/app.py` -4. Deploy (free, public URL) - ---- - -## Stack -- Streamlit — UI framework -- Plotly — interactive charts -- SciPy — correlation statistics -- Pandas / NumPy — data processing +| Page | Shows | Source | +|---|---|---| +| Overview | headline results, BTC & NIFTY price history | `dashboard/data/*`, `data/raw/*_prices.csv` | +| Volatility forecast | **live model inference**: 5-day volatility forecast for any date in the data or pasted prices; walk-forward model comparison | `models/har_*.json`, `pipeline/volatility.py` | +| GMSI & volatility | conditional-expectation charts, corrected significance | `reports/figures/`, `dashboard/data/gmsi_calibration.json` | +| Market fragility (MFI) | MFI and its components on real prices | `dashboard/data/mfi_*.csv` | +| Shock propagation | volatility after top-5% moves vs normal | `dashboard/data/shocks_*.csv` | +| Methodology & limitations | definitions, validation, caveats, corrections log | — | + +All files under `dashboard/data/` and `models/` are produced by `python run_pipeline.py` (repo root) and committed, +so the app needs no network access and no heavy ML libraries. Deployment: `docs/DEPLOY.md`. diff --git a/dashboard/app.py b/dashboard/app.py index a1ea4d3..a1dddea 100644 --- a/dashboard/app.py +++ b/dashboard/app.py @@ -1,1322 +1,46 @@ """ -FinSentinel — Market Intelligence Dashboard v2 -Real research figures + synthetic price overlay -DSN-278 · VIT Bhopal · 2026 -""" +FinSentinel dashboard — entry point for `streamlit run dashboard/app.py`. +Every number shown is either read from files produced by `python run_pipeline.py` +(real BTC-USD / NIFTY 50 prices in data/raw) or computed live by the served +volatility model. Nothing is simulated. +""" import streamlit as st -import pandas as pd -import numpy as np -import plotly.graph_objects as go -import plotly.express as px -from plotly.subplots import make_subplots -from scipy.stats import pearsonr, spearmanr, wasserstein_distance -from PIL import Image -import os, warnings -warnings.filterwarnings("ignore") - -# ── Page config ─────────────────────────────────────────────────────────────── -st.set_page_config( - page_title="FinSentinel — Market Intelligence", - page_icon="📡", - layout="wide", - initial_sidebar_state="expanded" -) -# ── Asset loader ────────────────────────────────────────────────────────────── -ASSET_DIR = os.path.join(os.path.dirname(__file__), "assets") +st.set_page_config(page_title="FinSentinel", page_icon="📡", layout="wide", + initial_sidebar_state="expanded") -def load_img(name): - path = os.path.join(ASSET_DIR, name) - if os.path.exists(path): - return Image.open(path) - return None +from data import MissingArtifact # noqa: E402 +from views import fragility, forecast, gmsi, methodology, overview, shocks # noqa: E402 -# ── Global CSS ──────────────────────────────────────────────────────────────── st.markdown(""" """, unsafe_allow_html=True) + +PAGES = { + "Overview": overview, + "Volatility forecast": forecast, + "GMSI & volatility": gmsi, + "Market fragility (MFI)": fragility, + "Shock propagation": shocks, + "Methodology & limitations": methodology, } -/* ── Callout boxes ── */ -.cbox { - border-radius: 8px; - padding: 14px 16px; - margin: 10px 0; - font-size: 13px; - line-height: 1.8; -} -.cbox-blue { background: rgba(0,200,248,.05); border: 1px solid rgba(0,200,248,.18); } -.cbox-green { background: rgba(0,214,143,.05); border: 1px solid rgba(0,214,143,.2); } -.cbox-amber { background: rgba(255,184,48,.05); border: 1px solid rgba(255,184,48,.2); } -.cbox-red { background: rgba(255,77,109,.05); border: 1px solid rgba(255,77,109,.2); } -.cbox-purple { background: rgba(124,92,252,.05); border: 1px solid rgba(124,92,252,.2); } - -.tag { - display: inline-block; - padding: 2px 8px; - border-radius: 3px; - font-family: var(--mono); - font-size: 8.5px; - letter-spacing: 0.12em; - margin-bottom: 8px; - text-transform: uppercase; - font-weight: 600; -} -.tag-blue { background: rgba(0,200,248,.12); color: var(--accent); } -.tag-green { background: rgba(0,214,143,.12); color: var(--green); } -.tag-amber { background: rgba(255,184,48,.12); color: var(--amber); } -.tag-red { background: rgba(255,77,109,.12); color: var(--red); } - -/* ── Figure containers ── */ -.fig-container { - background: var(--surf); - border: 1px solid var(--bdr); - border-radius: 10px; - padding: 3px; - margin: 4px 0; -} -.fig-caption { - font-family: var(--mono); - font-size: 9.5px; - color: var(--muted); - text-align: center; - padding: 8px 12px 6px 12px; - letter-spacing: 0.04em; - line-height: 1.6; - font-style: italic; -} - -/* ── Page title block ── */ -.page-title { - font-size: 22px; - font-weight: 600; - color: var(--text); - letter-spacing: -0.02em; - margin-bottom: 4px; -} -.page-sub { - font-size: 13px; - color: var(--text2); - margin-bottom: 22px; - line-height: 1.5; -} - -/* ── Data table ── */ -div[data-testid="stDataFrame"] { - border: 1px solid var(--bdr) !important; - border-radius: 8px !important; - overflow: hidden !important; -} - -div[data-testid="stMetric"] { - background: var(--surf2) !important; - border: 1px solid var(--bdr) !important; - border-radius: 8px !important; - padding: 14px !important; -} - -/* ── Tabs ── */ -.stTabs [data-baseweb="tab-list"] { - gap: 2px; - background: var(--surf) !important; - border-radius: 8px; - padding: 3px; - border: 1px solid var(--bdr); -} -.stTabs [data-baseweb="tab"] { - border-radius: 6px !important; - font-family: var(--mono) !important; - font-size: 11px !important; - letter-spacing: 0.06em !important; - color: var(--text2) !important; - background: transparent !important; - padding: 6px 14px !important; -} -.stTabs [aria-selected="true"] { - background: var(--surf3) !important; - color: var(--text) !important; -} - -/* ── Selectbox / radio ── */ -.stSelectbox > div > div { - background: var(--surf2) !important; - border: 1px solid var(--bdr) !important; - border-radius: 6px !important; - font-family: var(--mono) !important; - font-size: 12px !important; -} - -""", unsafe_allow_html=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# REAL DATA VALUES (extracted from your actual figures) -# ══════════════════════════════════════════════════════════════════════════════ - -# From cond_exp_BTC.png — E[fwd vol | GMSI quintile] -COND_EXP_BTC = { - "7d": {"Q1(Low)":0.0325, "Q2":0.0299, "Q3":0.0278, "Q4":0.0281, "Q5(High)":0.0294}, - "14d": {"Q1(Low)":0.0338, "Q2":0.0307, "Q3":0.0296, "Q4":0.0292, "Q5(High)":0.0303}, -} -COND_EXP_NIFTY = { - "7d": {"Q1(Low)":0.0105, "Q2":0.0078, "Q3":0.0080, "Q4":0.0082, "Q5(High)":0.0076}, - "14d": {"Q1(Low)":0.0107, "Q2":0.0081, "Q3":0.0084, "Q4":0.0085, "Q5(High)":0.0080}, -} - -# From placebo tests — real correlations -REAL_CORR_BTC = -0.0837 # Spearman, 7d forward -REAL_CORR_NIFTY = -0.0580 - -# From fig4_regime_stats_nifty -NIFTY_REGIME_STATS = { - "low": {"mean_vol":0.144, "mean_mfi":0.352, "ac1":0.148}, - "medium": {"mean_vol":0.151, "mean_mfi":0.350, "ac1":0.117}, - "high": {"mean_vol":0.162, "mean_mfi":0.349, "ac1":0.083}, -} - -# From fig6_shock_decay — approximate values -SHOCK_DECAY = { - "horizons": [1, 3, 7, 14, 21], - "btc": [0.0119, 0.0138, 0.0115, 0.0119, 0.0097], - "nifty": [0.0100, 0.0100, 0.0091, 0.0088, 0.0091], -} - -# ══════════════════════════════════════════════════════════════════════════════ -# SYNTHETIC PRICE/VOL DATA (for charts not yet in real figures) -# ══════════════════════════════════════════════════════════════════════════════ -@st.cache_data -def gen_market_data(): - np.random.seed(42) - n = 2000 - dates = pd.bdate_range("2016-02-01", periods=n) - def garch(n, omega, alpha, beta, mu=0.0003, df=5): - ret, s2 = [], omega/(1-alpha-beta) - for t in range(n): - s2 = max(1e-7, omega + alpha*(ret[-1]**2 if ret else 0) + beta*s2) - z = np.random.standard_t(df)/np.sqrt(df/(df-2)) - ret.append(mu + np.sqrt(s2)*z) - return pd.Series(ret, index=dates) - - btc_ret = garch(n, 1e-5, 0.12, 0.85, df=4) - nif_ret = garch(n, 3e-6, 0.07, 0.90, df=6) - btc_vol = btc_ret.rolling(30).std()*np.sqrt(252) - nif_vol = nif_ret.rolling(30).std()*np.sqrt(252) - btc_price= 500*np.exp(btc_ret.cumsum()) - nif_price= 8000*np.exp(nif_ret.cumsum()) - - # GMSI — AR(1), exogenous - g = np.zeros(n); g[0]=0 - for t in range(1,n): - g[t] = 0.72*g[t-1] + np.random.normal(0,.25) - if np.random.rand()<.018: g[t] += np.random.choice([-1,1])*np.random.uniform(.4,.8) - gmsi = pd.Series(g, index=dates) - - # Regimes from GMSI - lq = gmsi.expanding().quantile(0.2) - hq = gmsi.expanding().quantile(0.8) - regime = pd.Series("medium", index=dates) - regime[gmsi<=lq] = "low"; regime[gmsi>=hq] = "high" - - df = pd.DataFrame({ - "date":dates, "btc_ret":btc_ret, "btc_vol":btc_vol, - "btc_price":btc_price, "nif_ret":nif_ret, "nif_vol":nif_vol, - "nif_price":nif_price, "gmsi":gmsi, "regime":regime - }).dropna() - return df - -mdf = gen_market_data() - -# ── Plot base layout ────────────────────────────────────────────────────────── -# BL never includes xaxis/yaxis/font — those are applied separately via t() to -# prevent "multiple values for keyword argument" errors when callers also pass them. -BL_BASE = dict( - paper_bgcolor="rgba(0,0,0,0)", plot_bgcolor="rgba(0,0,0,0)", - margin=dict(l=10,r=10,t=36,b=10), - legend=dict(bgcolor="rgba(0,0,0,0)", bordercolor="#1a2535") -) -_AX = dict(gridcolor="#1a2535", linecolor="#1a2535", zerolinecolor="#1a2535") -_FN = dict(family="JetBrains Mono", color="#94a3b8", size=11) - -C = dict(btc="#f7931a", nifty="#3b82f6", gmsi="#00d4ff", - green="#10b981", red="#ef4444", amber="#f59e0b", - purple="#7c3aed", muted="#475569") - -def t(fig, h=None, title=None, ts=12, xt=None, yt=None, barmode=None, showlegend=True, **extra): - """Apply dark theme to a figure. Never passes xaxis/yaxis via update_layout.""" - kw = {**BL_BASE, "font": _FN, "showlegend": showlegend} - if h: kw["height"] = h - if barmode: kw["barmode"] = barmode - if title: kw["title"] = dict(text=title, font=dict(size=ts)) - kw.update(extra) - fig.update_layout(**kw) - fig.update_xaxes(**_AX) - fig.update_yaxes(**_AX) - if xt: fig.update_xaxes(title_text=xt) - if yt: fig.update_yaxes(title_text=yt) - return fig - - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 1 — OVERVIEW & KEY RESULTS -# ══════════════════════════════════════════════════════════════════════════════ - - - -PAGES = [ - ("overview", "Overview & Key Results", "M3 12a9 9 0 1 0 18 0 9 9 0 0 0-18 0zm9-3.5v4l3 1.5"), - ("gmsi", "GMSI & Conditional Vol.", "M3 3h18v4H3zm0 7h18v4H3zm0 7h18v4H3"), - ("placebo", "Placebo & Robustness", "M9 12l2 2 4-4m6 2a9 9 0 1 1-18 0 9 9 0 0 1 18 0"), - ("mfi", "Market Fragility Index", "M13 10V3L4 14h7v7l9-11h-7"), - ("shock", "Shock Propagation", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0"), - ("regime", "Regime Analysis", "M9 19v-6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2zm0 0V9a2 2 0 0 0 2-2h2a2 2 0 0 0 2 2v10m-6 0a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2m0 0V5a2 2 0 0 0 2-2h2a2 2 0 0 0 2 2v14a2 2 0 0 0-2 2h-2a2 2 0 0 0-2-2"), - ("methodology", "Methodology & Pipeline", "M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 0 2-2h2a2 2 0 0 0 2 2"), -] - -# Session-state navigation — no page reloads, works on Streamlit Cloud -if "page" not in st.session_state: - st.session_state.page = "overview" -page = st.session_state.page - with st.sidebar: - # Logo block - st.markdown(""" - - - """, unsafe_allow_html=True) - - # Nav buttons — pure st.button with CSS override, session_state routing - st.markdown(""" - - """, unsafe_allow_html=True) - - for pid, label, icon_path in PAGES: - is_active = (st.session_state.page == pid) - # Highlight active button via inline style injection - if is_active: - st.markdown(f""" - - """, unsafe_allow_html=True) - # Simple clean button — clicking navigates - btn_label = f" {label}" if not is_active else f" {label}" - if st.button(btn_label, key=f"nav_{pid}", - type="primary" if is_active else "secondary", - use_container_width=True): - st.session_state.page = pid - st.rerun() - - # Footer info block - st.markdown(""" -
-
- - BTC-USD - - - NIFTY 50 - -
-
- 2016 → 2024 · ~2000 days
- GDELT · FRED · yfinance
- FinBERT · VADER · GMSI -
-
- DSN-278 · VIT Bhopal -
-
- """, unsafe_allow_html=True) - -# ── Page title renderer ─────────────────────────────────────────────────────── -PAGE_META = {p[0]: p[1] for p in PAGES} - -def page_header(subtitle): - title = PAGE_META.get(page, "") - st.markdown(f""" -
-
Financial Sentiment & Market Dynamics · DSN-278
-
{title}
-
{subtitle}
-
- """, unsafe_allow_html=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 1 — OVERVIEW & KEY RESULTS - - -if page == "overview": - page_header("Real-time analysis of GMSI stress, MFI fragility, and shock propagation across BTC and NIFTY 50.") - - # Key result cards - c1,c2,c3,c4,c5 = st.columns(5) - cards = [ - ("c","GMSI→Vol Direction","Negative","High stress ≠ high vol","g"), - ("c","BTC Real Corr (7d)","−0.084","Spearman · p<0.05 placebo","btc"), - ("c","NIFTY Real Corr (7d)","−0.058","Weaker but same direction","nifty"), - ("c","Placebo p-value BTC","< 2%","500 permutation test","a"), - ("c","MFI Peak (BTC)","0.76","COVID crash · Mar 2020","r"), - ] - for col,(_, lbl, val, sub, cls) in zip([c1,c2,c3,c4,c5], cards): - with col: - st.markdown(f"""
-
{lbl}
-
{val}
-
{sub}
-
""", unsafe_allow_html=True) - - st.markdown("
", unsafe_allow_html=True) - - # Three findings + core chart - col_l, col_r = st.columns([3,2]) - - with col_l: - st.markdown("
BTC Price & GMSI · 2016–2024
", unsafe_allow_html=True) - # Convert dates to strings to avoid timezone serialization issues on Cloud - dates_str = mdf.date.astype(str) - fig = make_subplots(rows=2, cols=1, shared_xaxes=True, - row_heights=[0.6,0.4], vertical_spacing=0.04) - fig.add_trace(go.Scatter(x=dates_str, y=mdf.btc_price, name="BTC Price", - line=dict(color=C["btc"],width=1.5), fill="tozeroy", - fillcolor="rgba(247,147,26,0.07)"), row=1,col=1) - fig.add_trace(go.Scatter(x=dates_str, y=mdf.gmsi, name="GMSI", - line=dict(color=C["gmsi"],width=1.5), fill="tozeroy", - fillcolor="rgba(0,200,248,0.08)"), row=2,col=1) - # Regime shading - regime_arr = mdf.regime.values - breaks = np.where(np.array(regime_arr[1:]) != np.array(regime_arr[:-1]))[0] + 1 - starts = np.concatenate([[0], breaks]) - ends = np.concatenate([breaks, [len(regime_arr)]]) - for s,e in zip(starts, ends): - r = regime_arr[s] - clr = {"low":"rgba(16,185,129,.07)","high":"rgba(239,68,68,.09)", - "medium":"rgba(0,0,0,0)"}[r] - if clr != "rgba(0,0,0,0)": - for row in [1,2]: - fig.add_vrect(x0=dates_str.iloc[s], x1=dates_str.iloc[min(e,len(dates_str)-1)], - fillcolor=clr, line_width=0, row=row, col=1) - t(fig, h=360) - fig.update_yaxes(title_text="Price (USD)", row=1, col=1) - fig.update_yaxes(title_text="GMSI", row=2, col=1) - st.plotly_chart(fig, use_container_width=True) - - # Real figures row below the chart - st.markdown("
Real Pipeline Figures
", unsafe_allow_html=True) - rc1, rc2 = st.columns(2) - with rc1: - img = load_img("cond_exp_BTC.png") - if img: - st.image(img, use_container_width=True) - st.markdown("
E[Vol | GMSI Quintile] — BTC · Core Paper 1 finding
", - unsafe_allow_html=True) - with rc2: - img = load_img("fig6_shock_decay_comparison.png") - if img: - st.image(img, use_container_width=True) - st.markdown("
Shock decay curves — BTC vs NIFTY · Paper 2
", - unsafe_allow_html=True) - - with col_r: - st.markdown("
Three Core Research Findings
", unsafe_allow_html=True) - st.markdown(""" -
- FINDING 1 — PAPER 1
- Complacency Effect Confirmed
- Q1 (Low GMSI) predicts the highest forward volatility in - both BTC and NIFTY. Markets are most dangerous when stress signals - appear calm. BTC 7d: Q1=0.0325 vs Q5=0.0294. -
-
- FINDING 2 — PAPER 1
- Result is Not by Chance
- Placebo permutation test (500 shuffles): real BTC correlation - −0.084 falls in the bottom 2% of the null - distribution. Statistically genuine — not a data artifact. -
-
- FINDING 3 — PAPER 2
- AC₁ Paradox — Shocks Decay Faster in High Stress
- NIFTY Vol Persistence: Low=0.148 → High=0.083. - Complacent markets absorb shocks worst. -
- """, unsafe_allow_html=True) - - st.markdown("
Results at a Glance
", unsafe_allow_html=True) - st.markdown(""" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MetricBTCNIFTY
Spearman r (7d fwd)−0.084−0.058
Placebo p-value<0.02<0.05
MFI peak (date)0.76 (Mar 2020)—
Shock peak horizont+3 (retail lag)t+1 (institutional)
AC₁ Low→High regime—0.148 → 0.083
Analysis period2016–2024 · ~2000 days
- """, unsafe_allow_html=True) - - st.markdown("
Research Status
", unsafe_allow_html=True) - st.markdown(""" -
-
✓ - GMSI constructed & validated
-
✓ - Placebo tests complete
-
✓ - MFI validated vs VIX (FRED)
-
✓ - Shock propagation analysed
-
✓ - Dashboard deployed
-
◎ - Paper 1 — writing in progress
-
◎ - Paper 2 — writing in progress
-
- """, unsafe_allow_html=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 2 — GMSI & CONDITIONAL VOLATILITY -# ══════════════════════════════════════════════════════════════════════════════ -elif page == "gmsi": - page_header("The core Paper 1 finding: E[forward vol | GMSI quintile] — from real pipeline data") - - # GMSI sanity checks — real figure - st.markdown("
GMSI Sanity Checks — Real Pipeline Output
", unsafe_allow_html=True) - img = load_img("gmsi_sanity_checks.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 1. GMSI distribution (top-left), time series 2015–2026 (top-right), - autocorrelation structure confirming AR(1) dynamics (bottom-left), - GMSI vs BTC volatility overlay confirming no mechanical coupling (bottom-right). -
""", unsafe_allow_html=True) - st.markdown(""" -
- SANITY CHECK PASSED
- The GMSI distribution is approximately normal with slight right skew — no pathological - clumping. The ACF decays slowly (AR persistence is expected for a stress index — stress - regimes are sticky). The GMSI vs BTC volatility time series shows the two signals are - clearly not mechanically coupled: they diverge frequently, confirming the GMSI - is genuinely exogenous. This panel is the leakage-proof validation chart. -
""", unsafe_allow_html=True) - - st.markdown("
E[Forward Volatility | GMSI Quintile] — Real Results
", unsafe_allow_html=True) - col1, col2 = st.columns(2) - - with col1: - img = load_img("cond_exp_BTC.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 2. BTC: Mean forward volatility at 7d (left) and 14d (right) horizons - by GMSI quintile. Q1(Low) consistently highest — the complacency effect. -
""", unsafe_allow_html=True) - - with col2: - img = load_img("cond_exp_NIFTY.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 3. NIFTY: Same pattern holds for equity markets. Q1(Low GMSI) - predicts highest forward vol (0.0105 vs 0.0076 at Q5). -
""", unsafe_allow_html=True) - - # Interactive reproduction with real values - st.markdown("
Interactive Reproduction — Real Data Values
", unsafe_allow_html=True) - asset_sel = st.radio("Asset", ["BTC", "NIFTY"], horizontal=True) - horizon = st.radio("Horizon", ["7d", "14d"], horizontal=True) - - data = COND_EXP_BTC[horizon] if asset_sel=="BTC" else COND_EXP_NIFTY[horizon] - quintiles = list(data.keys()); values = list(data.values()) - clr_seq = [C["red"] if q=="Q1(Low)" else - (C["amber"] if q in ["Q2","Q3"] else C["green"]) for q in quintiles] - - fig = go.Figure(go.Bar(x=quintiles, y=values, marker_color=clr_seq, opacity=0.85, - text=[f"{v:.4f}" for v in values], textposition="outside", - textfont=dict(family="JetBrains Mono",size=12))) - fig.add_annotation(x="Q1(Low)", y=max(values)*1.12, - text="← Highest vol when stress is LOW", showarrow=False, - font=dict(color=C["red"],size=11,family="JetBrains Mono")) - t(fig, h=300, title=f"{asset_sel}: E[{horizon} Forward Vol | GMSI Quintile] · Real Values", ts=13, yt="Mean Forward Volatility") - st.plotly_chart(fig, use_container_width=True) - - # Comparison table - st.markdown("
Conditional Expectation Table — Both Assets, Both Horizons
", unsafe_allow_html=True) - rows = [] - for q in ["Q1(Low)","Q2","Q3","Q4","Q5(High)"]: - rows.append({ - "Quintile": q, - "BTC 7d Vol": f"{COND_EXP_BTC['7d'][q]:.4f}", - "BTC 14d Vol": f"{COND_EXP_BTC['14d'][q]:.4f}", - "NIFTY 7d Vol": f"{COND_EXP_NIFTY['7d'][q]:.4f}", - "NIFTY 14d Vol": f"{COND_EXP_NIFTY['14d'][q]:.4f}", - }) - st.dataframe(pd.DataFrame(rows).set_index("Quintile"), use_container_width=True) - - st.markdown(""" -
- PAPER 1 CORE RESULT
- The monotonically decreasing relationship between GMSI quintile and forward volatility - holds for both BTC and NIFTY, at both 7-day and 14-day horizons. This is not a - sampling artifact — the placebo tests on the next page confirm statistical significance. - The mechanism: low measured stress → investor complacency → under-hedged positioning → - larger volatility response when any shock eventually arrives. -
""", unsafe_allow_html=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 3 — PLACEBO & ROBUSTNESS -# ══════════════════════════════════════════════════════════════════════════════ -elif page == "placebo": - page_header("500-permutation placebo test — is the GMSI–volatility relationship real or by chance?") - - col1, col2 = st.columns(2) - with col1: - img = load_img("placebo_test_BTC.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 4. BTC Placebo Test: 500 permutations of GMSI labels. - Real Spearman r = −0.0837 (red dashed) lies in bottom ~2% of null distribution. -
""", unsafe_allow_html=True) - - with col2: - img = load_img("placebo_test_NIFTY.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 5. NIFTY Placebo Test: Real Spearman r = −0.0580 (red dashed). - Also in extreme left tail — consistent negative effect confirmed. -
""", unsafe_allow_html=True) - - st.markdown("
", unsafe_allow_html=True) - col1, col2 = st.columns(2) - - with col1: - st.markdown("
Placebo Test — What It Means
", unsafe_allow_html=True) - st.markdown(""" -
- METHODOLOGY
- Procedure: Randomly shuffle GMSI values 500 times, - breaking any time-structure, then recompute the Spearman correlation - between shuffled GMSI and forward volatility each time.

- Under H₀ (no real relationship): the real correlation - should look like a typical draw from the null distribution — sitting near - the center of the histogram.

- What we observe: The real correlation sits far in the - left tail in both cases, with very few permutations producing a correlation - as negative as the real one. This is strong evidence the relationship is - not by chance. -
""", unsafe_allow_html=True) - - with col2: - st.markdown("
Placebo Test Results Summary
", unsafe_allow_html=True) - summary = pd.DataFrame({ - "Asset": ["BTC", "NIFTY"], - "Real Corr": [f"{REAL_CORR_BTC:.4f}", f"{REAL_CORR_NIFTY:.4f}"], - "Direction": ["Negative ✓", "Negative ✓"], - "Approx p": ["~0.01–0.02", "~0.03–0.05"], - "Verdict": ["Significant ✓", "Marginally Significant ✓"], - }) - st.dataframe(summary.set_index("Asset"), use_container_width=True) - - st.markdown(""" -
- KEY INSIGHT
- Both assets show the same direction of effect (negative correlation). - This cross-asset consistency is strong additional evidence the finding is real. - If it were noise, we would not expect both markets to show the same directional bias. -
""", unsafe_allow_html=True) - - # Interactive null distribution sim - st.markdown("
Interactive Null Distribution — Simulated (same method)
", unsafe_allow_html=True) - np.random.seed(99) - null_btc = np.random.normal(REAL_CORR_BTC*0.1, 0.022, 500) - fig = go.Figure() - fig.add_trace(go.Histogram(x=null_btc, nbinsx=40, - marker_color="rgba(71,85,105,0.7)", name="Null distribution (500 permutations)")) - fig.add_vline(x=REAL_CORR_BTC, line_color=C["red"], line_dash="dash", line_width=2, - annotation_text=f"Real r = {REAL_CORR_BTC:.4f}", - annotation_font=dict(color=C["red"],size=11,family="JetBrains Mono")) - t(fig, h=280, title="BTC Placebo: Null Distribution vs Real Correlation", ts=12, xt="Spearman Correlation", yt="Count") - st.plotly_chart(fig, use_container_width=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 4 — MFI -# ══════════════════════════════════════════════════════════════════════════════ -elif page == "mfi": - page_header("A composite, interpretable measure of structural market vulnerability — from real BTC data 2016–2024") - - st.markdown(""" -
- MATHEMATICAL DEFINITION
- MFI = (A_norm + B_norm + C_norm) / 3
-   A: AC₁(|rₜ|) rolling 30d — Volatility Persistence
-   B: CoV(σ₇ᵈ) rolling 30d — Vol-of-Vol
-   C: P(|rₜ|>2σ₃₀) rolling 30d — Tail Risk Frequency
- Each component normalised via expanding min-max (zero look-ahead). - MFI→1: shocks amplify. MFI→0: shocks decay. -
""", unsafe_allow_html=True) - - # Real MFI figure - st.markdown("
BTC — MFI Time Series 2016–2024 · Real Data
", unsafe_allow_html=True) - img = load_img("fig1_mfi_btc.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 6. BTC Market Fragility Index (2016–2024). Top: cumulative log return. - Middle: MFI with high-fragility (0.7) and low-fragility (0.3) thresholds. - Bottom: 30d volatility with GMSI regime shading (green=low, amber=medium, red=high stress). -
""", unsafe_allow_html=True) - - # Interpretation annotations - col1, col2, col3 = st.columns(3) - with col1: - st.markdown("""
- SPIKE: Early 2016
- MFI spikes to ~0.65 during BTC's initial price discovery - phase — high tail frequency and persistence as the market - established structure. -
""", unsafe_allow_html=True) - with col2: - st.markdown("""
- PEAK: Mar 2020 (COVID)
- MFI reaches 0.76 — highest in the sample. All three components - spike simultaneously: shocks self-reinforce, vol regime collapses, - tail moves cluster. Classic systemic fragility. -
""", unsafe_allow_html=True) - with col3: - st.markdown("""
- PATTERN: 2022 Bear
- Sustained elevated MFI through the 2022 crypto winter. - Vol persistence stays high — shocks are not decaying, - consistent with a structurally fragile bear market regime. -
""", unsafe_allow_html=True) - - # Component decomposition — real figure - st.markdown("
BTC — MFI Component Decomposition · Real Data
", unsafe_allow_html=True) - img2 = load_img("fig5_mfi_components_btc.png") - if img2: - st.markdown("
", unsafe_allow_html=True) - st.image(img2, use_container_width=True) - st.markdown("""
- Fig 7. MFI Component Decomposition for BTC (2016–2024). Top: Volatility Persistence (AC₁ of |r|). - Middle: Vol-of-Vol (CoV of 7d vol). Bottom: Tail Risk Frequency (P(|r|>2σ)). - Components are independent — confirming the composite captures distinct dimensions of fragility. -
""", unsafe_allow_html=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 5 — SHOCK PROPAGATION -# ══════════════════════════════════════════════════════════════════════════════ -elif page == "shock": - page_header("How volatility evolves after extreme return events — BTC vs NIFTY comparison · Real data") - - c1,c2,c3,c4 = st.columns(4) - cards2 = [ - ("BTC t+3 Peak","0.0138","Highest fwd vol — delayed reaction","btc"), - ("NIFTY t+1 Peak","0.0100","Immediate then decays smoothly","nifty"), - ("BTC t+21","0.0097","Residual elevation at 21 days","a"), - ("NIFTY t+21","0.0091","Lower base, faster recovery","g"), - ] - for col,(lbl,val,sub,cls) in zip([c1,c2,c3,c4],cards2): - with col: - st.markdown(f"""
-
{lbl}
-
{val}
-
{sub}
-
""", unsafe_allow_html=True) - - st.markdown("
", unsafe_allow_html=True) - - col1, col2 = st.columns([3,2]) - with col1: - st.markdown("
Forward Volatility Decay — Real Pipeline Output
", unsafe_allow_html=True) - img = load_img("fig6_shock_decay_comparison.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 8. Shock Propagation: Mean forward absolute return at horizons 1,3,7,14,21 days - after top-5% return events. BTC (orange) shows a peak at t+3, then slow decay. - NIFTY (blue) peaks at t+1, decays faster. Shaded areas = ±0.5 std. -
""", unsafe_allow_html=True) - - with col2: - st.markdown("
Decay Curve Reproduction
", unsafe_allow_html=True) - fig = go.Figure() - fig.add_trace(go.Scatter(x=SHOCK_DECAY["horizons"], y=SHOCK_DECAY["btc"], - name="BTC", line=dict(color=C["btc"],width=2), - mode="lines+markers", marker=dict(size=7))) - fig.add_trace(go.Scatter(x=SHOCK_DECAY["horizons"], y=SHOCK_DECAY["nifty"], - name="NIFTY", line=dict(color=C["nifty"],width=2,dash="dot"), - mode="lines+markers", marker=dict(size=7))) - t(fig, h=300, xt="Days After Shock", yt="Mean |Return|") - st.plotly_chart(fig, use_container_width=True) - - st.markdown(""" -
- BTC ANOMALY
- BTC shows a peak at t+3 rather than t+1. - This suggests BTC shocks trigger a secondary wave of reaction: - retail investors respond with a lag, amplifying the initial shock - before eventual decay. NIFTY shows no such secondary wave — - institutional response is immediate and mean-reverting. -
""", unsafe_allow_html=True) - - # Regime shock response — NIFTY real figure - st.markdown("
Shock Response by Regime — NIFTY · Real Data
", unsafe_allow_html=True) - img2 = load_img("fig3_regime_shock_nifty.png") - if img2: - st.markdown("
", unsafe_allow_html=True) - st.image(img2, use_container_width=True) - st.markdown("""
- Fig 9. NIFTY shock response at t+1, t+3, t+7, t+14 conditioned on GMSI regime. - Low-stress regime (green) consistently shows highest immediate shock response — - confirming the complacency mechanism. n values shown per bar. -
""", unsafe_allow_html=True) - - st.markdown(""" -
- CRITICAL FINDING
- In the low-stress regime, NIFTY shows the highest shock response at t+1 (0.015) - — nearly 2.5× the high-stress regime (0.006). This is the empirical signature of the - complacency mechanism: when stress signals are low, markets are under-hedged, and any - shock therefore has disproportionate impact. This finding directly parallels and extends - the conditional expectation results from Page 2, providing convergent evidence across two - distinct methodological approaches. -
""", unsafe_allow_html=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 6 — REGIME ANALYSIS -# ══════════════════════════════════════════════════════════════════════════════ -elif page == "regime": - page_header("GMSI-defined stress regimes and their structural effect on volatility, fragility, and shock persistence") - - col1, col2 = st.columns([3,2]) - - with col1: - st.markdown("
NIFTY Regime Statistics — Real Data
", unsafe_allow_html=True) - img = load_img("fig4_regime_stats_nifty.png") - if img: - st.markdown("
", unsafe_allow_html=True) - st.image(img, use_container_width=True) - st.markdown("""
- Fig 10. NIFTY regime statistics: Mean 30d Volatility, Mean MFI, and Vol Persistence (AC1) - across low/medium/high GMSI regimes. Volatility increases monotonically with stress. - Critically, AC1 decreases with stress — shocks decay faster in high-stress regimes. -
""", unsafe_allow_html=True) - - with col2: - st.markdown("
Regime Statistics — Exact Values
", unsafe_allow_html=True) - reg_df = pd.DataFrame({ - "Regime": ["Low","Medium","High"], - "Mean Vol (30d)": [0.144,0.151,0.162], - "Mean MFI": [0.352,0.350,0.349], - "Vol Persistence AC1": [0.148,0.117,0.083], - }).set_index("Regime") - st.dataframe(reg_df, use_container_width=True) - - st.markdown(""" -
- THE AC1 PARADOX
- Vol persistence decreases as stress increases - (Low: 0.148 → High: 0.083). This means shocks actually - decay faster when markets are in high-stress regimes. - Interpretation: in high-stress regimes, markets are alert and - mean-revert quickly. In low-stress regimes, markets are - complacent — shocks find no prepared hedges and persist longer. -
""", unsafe_allow_html=True) - - # Interactive regime viz - st.markdown("
Regime Statistics — Interactive Comparison
", unsafe_allow_html=True) - fig = make_subplots(rows=1, cols=3, - subplot_titles=["Mean Volatility (30d)","Mean MFI","Vol Persistence (AC1)"]) - regs = ["Low","Medium","High"] - rcolors = [C["green"],C["amber"],C["red"]] - metrics = [ - [NIFTY_REGIME_STATS[r.lower()]["mean_vol"] for r in regs], - [NIFTY_REGIME_STATS[r.lower()]["mean_mfi"] for r in regs], - [NIFTY_REGIME_STATS[r.lower()]["ac1"] for r in regs], - ] - for i,(vals,title) in enumerate(zip(metrics,["Mean Vol","MFI","AC1"]),1): - fig.add_trace(go.Bar(x=regs, y=vals, marker_color=rcolors, opacity=0.85, - text=[f"{v:.3f}" for v in vals], textposition="outside", - showlegend=False), row=1, col=i) - t(fig, h=320, title="NIFTY Regime Statistics · Real Values") - st.plotly_chart(fig, use_container_width=True) - - # GMSI regime timeline - st.markdown("
GMSI Regime Timeline · 2016–2024
", unsafe_allow_html=True) - fig2 = go.Figure() - fig2.add_trace(go.Scatter(x=mdf.date, y=mdf.gmsi, name="GMSI", - line=dict(color=C["gmsi"],width=1.4),fill="tozeroy", - fillcolor="rgba(0,212,255,0.07)")) - for _,grp in mdf.groupby((mdf.regime!=mdf.regime.shift()).cumsum()): - r=grp.regime.iloc[0] - clr={"low":"rgba(16,185,129,.1)","high":"rgba(239,68,68,.12)","medium":"rgba(0,0,0,0)"}[r] - if clr!="rgba(0,0,0,0)": - fig2.add_vrect(x0=grp.date.iloc[0],x1=grp.date.iloc[-1], - fillcolor=clr,line_width=0) - t(fig2, h=280, yt="GMSI") - st.plotly_chart(fig2, use_container_width=True) - -# ══════════════════════════════════════════════════════════════════════════════ -# PAGE 7 — METHODOLOGY -# ══════════════════════════════════════════════════════════════════════════════ -elif page == "methodology": - page_header("Complete research methodology, data sources, and analytical framework") - - tab1, tab2, tab3, tab4 = st.tabs(["📡 Data Pipeline","🧠 GMSI Construction","📐 Statistical Methods","📊 Results Summary"]) - - with tab1: - st.markdown("
End-to-End Research Pipeline
", unsafe_allow_html=True) - steps = [ - ("yfinance","Price Data","Daily OHLCV: BTC-USD (2016→), ^NSEI NIFTY50 (2012→). Derives log-returns ln(Pₜ/Pₜ₋₁), rolling σ (7d,14d,30d) annualised ×√252 (equity) or ×√365 (crypto)."), - ("FRED API","Macro Signals","VIX daily (VIXCLS), US HY Credit Spread (BAMLH0A0HYM2), 10Y-2Y yield spread (T10Y2Y), TED spread (TEDRATE). Used for MFI validation against institutional fear gauges."), - ("GDELT GKG","Global Events","BigQuery pull: daily aggregates of event_count, avg_tone, negative_share, conflict_theme_count, source_diversity. Primary input to GMSI construction."), - ("NewsAPI","Headlines","100 articles/day, 7 keyword queries. Per-article FinBERT + VADER scoring. Daily aggregation to sentiment_score and sentiment_surprise (deviation from 30d MA)."), - ("Google Trends","Attention","Weekly search volume for 14 financial terms, forward-filled to daily. Attention proxy component in GMSI."), - ] - for i,(src,title,desc) in enumerate(steps,1): - st.markdown(f""" -
-
- {i} -
-
{src} → {title}
-
{desc}
-
""", unsafe_allow_html=True) - - # Sankey flow - st.markdown("
Pipeline Flow Diagram
", unsafe_allow_html=True) - fig = go.Figure(go.Sankey( - node=dict(pad=18,thickness=20, - line=dict(color="#1a2535",width=0.5), - label=["yfinance","FRED","GDELT","NewsAPI","Google Trends", - "Log Returns","Macro Signals","Event Features","Sentiment Scores","Attention", - "Master Dataset","GMSI","MFI","Shock Engine","Dashboard"], - color=["#f7931a","#00d4ff","#7c3aed","#10b981","#f59e0b", - "#f7931a","#00d4ff","#7c3aed","#10b981","#f59e0b", - "#e2e8f0","#00d4ff","#ef4444","#3b82f6","#64748b"]), - link=dict( - source=[0,1,2,3,4, 5,6,7,8,9, 10,10,10,11,12,13], - target=[5,6,7,8,9, 10,10,10,10,10, 11,12,13,14,14,14], - value= [3,2,2,3,1, 3,2,2,3,1, 2,2,2,3,3,3], - color=["rgba(247,147,26,.25)","rgba(0,212,255,.25)","rgba(124,58,237,.25)", - "rgba(16,185,129,.25)","rgba(245,158,11,.25)", - "rgba(247,147,26,.18)","rgba(0,212,255,.18)","rgba(124,58,237,.18)", - "rgba(16,185,129,.18)","rgba(245,158,11,.18)", - "rgba(0,212,255,.18)","rgba(239,68,68,.18)","rgba(59,130,246,.18)", - "rgba(0,212,255,.25)","rgba(239,68,68,.25)","rgba(59,130,246,.25)"] - ) - )) - t(fig, h=380) - st.plotly_chart(fig, use_container_width=True) - - with tab2: - st.markdown("
GMSI Construction — Pure Exogenous Index
", unsafe_allow_html=True) - st.markdown(""" -
- CRITICAL DESIGN PRINCIPLE
- The GMSI uses zero price-derived inputs. - Previous version used volatility in construction → mechanical coupling → artificially high correlation (~0.9). - Corrected version uses only exogenous signals. The sanity check panel (Page 2) confirms - the corrected GMSI is not mechanically coupled to price volatility. -
""", unsafe_allow_html=True) - - st.markdown(""" -
- GMSI FORMULA
- raw_GMSI = w₁·EventIntensity + w₂·NegativeShare + w₃·GoldsteinInv - + w₄·FinBERT + w₅·VADER + w₆·SentimentSurprise + w₇·AttentionProxy

- Weights = PCA loading scores on first principal component across all signals.
- Final normalization: expanding min-max → GMSI ∈ [0,1] with no look-ahead.

- Sentiment Surprise = daily_score − 30d_rolling_mean. - Captures unexpected shifts in sentiment rather than absolute level — - more informative for market dynamics than raw sentiment. -
-
- FinBERT SCORING
- Score = P(positive)×(+1) + P(negative)×(−1)
- Consolidation: if max class prob ≥ 0.65 → FinBERT score; - else → 0.6×FinBERT + 0.4×VADER.
- Validated: 82.7% accuracy on 300-article held-out set vs 64.3% VADER baseline. -
""", unsafe_allow_html=True) - - with tab3: - st.markdown("
Statistical Methods — Definitions & Justifications
", unsafe_allow_html=True) - methods = [ - ("Conditional Expectation","E[Volₜ₊ₕ | GMSI_quintile]", - "Non-parametric. Divides GMSI into quintiles, computes mean forward volatility within each. Requires no distributional assumptions. Primary result method."), - ("Spearman Rank Correlation","ρ = 1 − 6Σdᵢ²/n(n²−1)", - "Rank-based correlation between GMSI and forward vol. Robust to outliers and non-normality — critical for financial returns with fat tails."), - ("Placebo Permutation Test","H₀: shuffle GMSI 500×, recompute ρ each time", - "Non-parametric significance test. No distributional assumptions. If real ρ is in extreme tail of null distribution → result is not by chance."), - ("MFI — Market Fragility Index","(AC₁(|r|) + CoV(σ₇ᵈ) + P(|r|>2σ)) / 3", - "Composite fragility measure. Each component expanding-normalised. Captures persistence, instability, and tail clustering independently."), - ("Shock Propagation","E[|rₜ₊ₕ|] for shocks: |rₜ|>Q₀.₉₅(expanding)", - "Measures forward absolute return elevation after top-5% events. Expanding quantile threshold prevents look-ahead bias."), - ("Wasserstein Distance","W(P,Q) = inf E[||X−Y||]", - "Measures structural difference between entire volatility distributions across regimes. More informative than comparing means — captures shape differences."), - ] - for name, formula, desc in methods: - st.markdown(f""" -
-
{name}
-
{formula}
-
{desc}
-
""", unsafe_allow_html=True) - - with tab4: - st.markdown("
Complete Results Summary — Real Data
", unsafe_allow_html=True) - results = pd.DataFrame({ - "Finding": [ - "GMSI Q1 (Low) → BTC 7d Vol", - "GMSI Q5 (High) → BTC 7d Vol", - "GMSI Q1 (Low) → NIFTY 7d Vol", - "GMSI Q5 (High) → NIFTY 7d Vol", - "BTC Spearman corr (7d forward)", - "NIFTY Spearman corr (7d forward)", - "Placebo p-value (BTC)", - "Placebo p-value (NIFTY)", - "BTC MFI peak", - "NIFTY Vol Persistence: Low regime", - "NIFTY Vol Persistence: High regime", - "BTC Shock peak (t+3)", - "NIFTY Shock peak (t+1)", - ], - "Value": [ - "0.0325","0.0294","0.0105","0.0076", - "−0.0837","−0.0580","~0.01–0.02","~0.03–0.05", - "0.76 (Mar 2020)","0.148","0.083","0.0138","0.0100", - ], - "Interpretation": [ - "Highest — complacency effect","Lower — stress already priced in", - "Highest — same pattern holds","Lower — same direction", - "Negative ✓ significant","Negative ✓ marginally significant", - "Bottom ~2% of null","Bottom ~4% of null", - "COVID crash peak","High persistence — shocks linger", - "Low persistence — shocks decay fast in stressed markets", - "Secondary retail reaction wave","Immediate institutional response", - ] - }).set_index("Finding") - st.dataframe(results, use_container_width=True)# ── Sidebar — professional panel nav ───────────────────────────────────────── \ No newline at end of file + st.markdown("### 📡 FinSentinel") + st.caption("Stress, fragility and volatility — BTC-USD & NIFTY 50, daily data 2015–2025") + choice = st.radio("Page", list(PAGES), label_visibility="collapsed") + st.divider() + st.caption("All results are reproducible with `python run_pipeline.py`. " + "Data: Yahoo Finance via yfinance (research use only).") + +try: + PAGES[choice].render() +except MissingArtifact as exc: + st.error(f"A required data file is missing. {exc}") diff --git a/dashboard/assets/boxplot_vol_by_regime.png b/dashboard/assets/boxplot_vol_by_regime.png deleted file mode 100644 index c4c0e50..0000000 Binary files a/dashboard/assets/boxplot_vol_by_regime.png and /dev/null differ diff --git a/dashboard/assets/cond_exp_BTC.png b/dashboard/assets/cond_exp_BTC.png deleted file mode 100644 index 69efce6..0000000 Binary files a/dashboard/assets/cond_exp_BTC.png and /dev/null differ diff --git a/dashboard/assets/cond_exp_NIFTY.png b/dashboard/assets/cond_exp_NIFTY.png deleted file mode 100644 index 9d67a0d..0000000 Binary files a/dashboard/assets/cond_exp_NIFTY.png and /dev/null differ diff --git a/dashboard/assets/fig1_mfi_btc.png b/dashboard/assets/fig1_mfi_btc.png deleted file mode 100644 index 34490be..0000000 Binary files a/dashboard/assets/fig1_mfi_btc.png and /dev/null differ diff --git a/dashboard/assets/fig3_regime_shock_nifty.png b/dashboard/assets/fig3_regime_shock_nifty.png deleted file mode 100644 index f203036..0000000 Binary files a/dashboard/assets/fig3_regime_shock_nifty.png and /dev/null differ diff --git a/dashboard/assets/fig4_regime_stats_nifty.png b/dashboard/assets/fig4_regime_stats_nifty.png deleted file mode 100644 index 98d4fdd..0000000 Binary files a/dashboard/assets/fig4_regime_stats_nifty.png and /dev/null differ diff --git a/dashboard/assets/fig5_mfi_components_btc.png b/dashboard/assets/fig5_mfi_components_btc.png deleted file mode 100644 index 4d6b487..0000000 Binary files a/dashboard/assets/fig5_mfi_components_btc.png and /dev/null differ diff --git a/dashboard/assets/fig6_shock_decay_comparison.png b/dashboard/assets/fig6_shock_decay_comparison.png deleted file mode 100644 index 4711a59..0000000 Binary files a/dashboard/assets/fig6_shock_decay_comparison.png and /dev/null differ diff --git a/dashboard/assets/gmsi_sanity_checks.png b/dashboard/assets/gmsi_sanity_checks.png deleted file mode 100644 index f9f8be0..0000000 Binary files a/dashboard/assets/gmsi_sanity_checks.png and /dev/null differ diff --git a/dashboard/assets/heatmap_regime_vs_vol.png b/dashboard/assets/heatmap_regime_vs_vol.png deleted file mode 100644 index 5f3756a..0000000 Binary files a/dashboard/assets/heatmap_regime_vs_vol.png and /dev/null differ diff --git a/dashboard/assets/placebo_test_BTC.png b/dashboard/assets/placebo_test_BTC.png deleted file mode 100644 index 266e049..0000000 Binary files a/dashboard/assets/placebo_test_BTC.png and /dev/null differ diff --git a/dashboard/assets/placebo_test_NIFTY.png b/dashboard/assets/placebo_test_NIFTY.png deleted file mode 100644 index 26579b0..0000000 Binary files a/dashboard/assets/placebo_test_NIFTY.png and /dev/null differ diff --git a/dashboard/assets/shock_response.png b/dashboard/assets/shock_response.png deleted file mode 100644 index 7e76029..0000000 Binary files a/dashboard/assets/shock_response.png and /dev/null differ diff --git a/dashboard/data.py b/dashboard/data.py new file mode 100644 index 0000000..97c4dc9 --- /dev/null +++ b/dashboard/data.py @@ -0,0 +1,66 @@ +""" +dashboard/data.py — every file the dashboard reads, behind Streamlit caches. + +Nothing here computes results: models and result tables are produced offline by +`python run_pipeline.py` and committed. The only live computation is the +forecast, which calls pipeline.volatility.forecast — the same feature code the +model was trained with. +""" +from __future__ import annotations + +import json +import sys +from pathlib import Path + +import pandas as pd +import streamlit as st + +ROOT = Path(__file__).resolve().parents[1] +if str(ROOT) not in sys.path: # Streamlit puts only dashboard/ on sys.path + sys.path.insert(0, str(ROOT)) + +from pipeline import volatility as vol # noqa: E402 +from pipeline.data import DASHBOARD_DATA, FIGURES, MODELS, load_close # noqa: E402 + +ASSETS = ("BTC", "NIFTY") +REBUILD_HINT = "Run `python run_pipeline.py` from the repo root to regenerate it." + + +class MissingArtifact(RuntimeError): + pass + + +def _require(path: Path) -> Path: + if not path.exists(): + raise MissingArtifact(f"`{path.relative_to(ROOT)}` is missing. {REBUILD_HINT}") + return path + + +@st.cache_data(show_spinner=False) +def prices(asset: str) -> pd.Series: + return load_close(asset) + + +@st.cache_resource(show_spinner=False) +def model(asset: str) -> vol.HARModel: + return vol.HARModel.from_json(_require(MODELS / f"har_{asset.lower()}.json")) + + +@st.cache_data(show_spinner=False) +def metrics() -> dict: + return json.loads(_require(DASHBOARD_DATA / "metrics.json").read_text()) + + +@st.cache_data(show_spinner=False) +def gmsi_calibration() -> dict: + return json.loads(_require(DASHBOARD_DATA / "gmsi_calibration.json").read_text()) + + +@st.cache_data(show_spinner=False) +def table(name: str, asset: str, parse_dates=("date",)) -> pd.DataFrame: + path = _require(DASHBOARD_DATA / f"{name}_{asset.lower()}.csv") + return pd.read_csv(path, parse_dates=list(parse_dates) or False) + + +def figure(name: str) -> Path: + return _require(FIGURES / name) diff --git a/dashboard/data/gmsi_calibration.json b/dashboard/data/gmsi_calibration.json new file mode 100644 index 0000000..ec98433 --- /dev/null +++ b/dashboard/data/gmsi_calibration.json @@ -0,0 +1,53 @@ +{ + "published_spearman": { + "BTC": -0.0837, + "NIFTY": -0.058 + }, + "assumed_gmsi_lag1_acf": 0.82, + "assets": { + "BTC": { + "n": 4009, + "statistic": -0.0837, + "phi": 0.82, + "n_sims": 2000, + "null_sd": 0.041356584957607, + "iid_null_sd": 0.015795600590164088, + "variance_inflation": 6.855151414377907, + "p_value": 0.046, + "p_value_if_iid": 1.1647446754438945e-07, + "fwd_vol_lag1_acf": 0.9280664037785994 + }, + "NIFTY": { + "n": 3920, + "statistic": -0.058, + "phi": 0.82, + "n_sims": 2000, + "null_sd": 0.04155299444642353, + "iid_null_sd": 0.015973951748802794, + "variance_inflation": 6.766746630713396, + "p_value": 0.163, + "p_value_if_iid": 0.0002824223730048351, + "fwd_vol_lag1_acf": 0.940093998802739 + } + }, + "false_positive_rate": [ + { + "phi": 0.0, + "n_sims": 200, + "iid_shuffle": 0.06, + "circular_shift": 0.065 + }, + { + "phi": 0.5, + "n_sims": 200, + "iid_shuffle": 0.24, + "circular_shift": 0.05 + }, + { + "phi": 0.9, + "n_sims": 200, + "iid_shuffle": 0.55, + "circular_shift": 0.085 + } + ] +} \ No newline at end of file diff --git a/dashboard/data/metrics.json b/dashboard/data/metrics.json new file mode 100644 index 0000000..24dc057 --- /dev/null +++ b/dashboard/data/metrics.json @@ -0,0 +1,758 @@ +{ + "BTC": { + "summary": { + "HAR (served)": { + "test_rmse_vol": 0.018781, + "test_mae_vol": 0.012697, + "test_r2_log": 0.047382, + "test_qlike": 1.149635, + "train_rmse_vol": 0.019603, + "train_mae_vol": 0.012614, + "train_r2_log": 0.282363, + "train_qlike": 1.266968 + }, + "Random Forest": { + "test_rmse_vol": 0.019117, + "test_mae_vol": 0.013162, + "test_r2_log": -0.026474, + "test_qlike": 1.220979, + "train_rmse_vol": 0.017256, + "train_mae_vol": 0.010616, + "train_r2_log": 0.508498, + "train_qlike": 0.765512 + }, + "Persistence (vol_5)": { + "test_rmse_vol": 0.021557, + "test_mae_vol": 0.01532, + "test_r2_log": -0.367417, + "test_qlike": 1.798933, + "train_rmse_vol": 0.022816, + "train_mae_vol": 0.015596, + "train_r2_log": -0.038307, + "train_qlike": 2.518042 + }, + "Mean (dummy)": { + "test_rmse_vol": 0.021241, + "test_mae_vol": 0.01501, + "test_r2_log": -0.384705, + "test_qlike": 1.965969, + "train_rmse_vol": 0.022502, + "train_mae_vol": 0.015134, + "train_r2_log": 0.0, + "train_qlike": 1.607123 + } + }, + "folds": [ + { + "fold": 0, + "model": "HAR (served)", + "test_start": "2016-12-23", + "test_end": "2018-10-11", + "n_train": 656, + "n_test": 658, + "test_rmse_vol": 0.026772, + "test_mae_vol": 0.01817, + "test_r2_log": -0.058741, + "test_qlike": 1.816455, + "train_rmse_vol": 0.016472, + "train_mae_vol": 0.010464, + "train_r2_log": 0.212511, + "train_qlike": 1.493493 + }, + { + "fold": 0, + "model": "Random Forest", + "test_start": "2016-12-23", + "test_end": "2018-10-11", + "n_train": 656, + "n_test": 658, + "test_rmse_vol": 0.027286, + "test_mae_vol": 0.018605, + "test_r2_log": -0.115154, + "test_qlike": 1.928336, + "train_rmse_vol": 0.014062, + "train_mae_vol": 0.008488, + "train_r2_log": 0.514304, + "train_qlike": 0.777944 + }, + { + "fold": 0, + "model": "Persistence (vol_5)", + "test_start": "2016-12-23", + "test_end": "2018-10-11", + "n_train": 656, + "n_test": 658, + "test_rmse_vol": 0.025808, + "test_mae_vol": 0.018828, + "test_r2_log": -0.038596, + "test_qlike": 1.308462, + "train_rmse_vol": 0.019077, + "train_mae_vol": 0.013045, + "train_r2_log": -0.166861, + "train_qlike": 3.181041 + }, + { + "fold": 0, + "model": "Mean (dummy)", + "test_start": "2016-12-23", + "test_end": "2018-10-11", + "n_train": 656, + "n_test": 658, + "test_rmse_vol": 0.033568, + "test_mae_vol": 0.024317, + "test_r2_log": -1.287617, + "test_qlike": 5.579801, + "train_rmse_vol": 0.018103, + "train_mae_vol": 0.011634, + "train_r2_log": 0.0, + "train_qlike": 1.833004 + }, + { + "fold": 1, + "model": "HAR (served)", + "test_start": "2018-10-12", + "test_end": "2020-07-30", + "n_train": 1314, + "n_test": 658, + "test_rmse_vol": 0.024832, + "test_mae_vol": 0.014422, + "test_r2_log": 0.163534, + "test_qlike": 1.783051, + "train_rmse_vol": 0.019848, + "train_mae_vol": 0.013116, + "train_r2_log": 0.359307, + "train_qlike": 1.200155 + }, + { + "fold": 1, + "model": "Random Forest", + "test_start": "2018-10-12", + "test_end": "2020-07-30", + "n_train": 1314, + "n_test": 658, + "test_rmse_vol": 0.0248, + "test_mae_vol": 0.015025, + "test_r2_log": 0.110227, + "test_qlike": 1.807041, + "train_rmse_vol": 0.016934, + "train_mae_vol": 0.01063, + "train_r2_log": 0.591097, + "train_qlike": 0.683957 + }, + { + "fold": 1, + "model": "Persistence (vol_5)", + "test_start": "2018-10-12", + "test_end": "2020-07-30", + "n_train": 1314, + "n_test": 658, + "test_rmse_vol": 0.029645, + "test_mae_vol": 0.018361, + "test_r2_log": -0.228908, + "test_qlike": 3.15378, + "train_rmse_vol": 0.022717, + "train_mae_vol": 0.015964, + "train_r2_log": 0.115397, + "train_qlike": 2.288375 + }, + { + "fold": 1, + "model": "Mean (dummy)", + "test_start": "2018-10-12", + "test_end": "2020-07-30", + "n_train": 1314, + "n_test": 658, + "test_rmse_vol": 0.026789, + "test_mae_vol": 0.016213, + "test_r2_log": -0.000589, + "test_qlike": 1.933827, + "train_rmse_vol": 0.02407, + "train_mae_vol": 0.016745, + "train_r2_log": 0.0, + "train_qlike": 1.680535 + }, + { + "fold": 2, + "model": "HAR (served)", + "test_start": "2020-07-31", + "test_end": "2022-05-19", + "n_train": 1972, + "n_test": 658, + "test_rmse_vol": 0.016843, + "test_mae_vol": 0.01238, + "test_r2_log": 0.038553, + "test_qlike": 0.718931, + "train_rmse_vol": 0.021762, + "train_mae_vol": 0.013579, + "train_r2_log": 0.295366, + "train_qlike": 1.378843 + }, + { + "fold": 2, + "model": "Random Forest", + "test_start": "2020-07-31", + "test_end": "2022-05-19", + "n_train": 1972, + "n_test": 658, + "test_rmse_vol": 0.017448, + "test_mae_vol": 0.013104, + "test_r2_log": -0.093983, + "test_qlike": 0.785657, + "train_rmse_vol": 0.019216, + "train_mae_vol": 0.01137, + "train_r2_log": 0.516377, + "train_qlike": 0.837572 + }, + { + "fold": 2, + "model": "Persistence (vol_5)", + "test_start": "2020-07-31", + "test_end": "2022-05-19", + "n_train": 1972, + "n_test": 658, + "test_rmse_vol": 0.020173, + "test_mae_vol": 0.01542, + "test_r2_log": -0.493785, + "test_qlike": 1.185558, + "train_rmse_vol": 0.025238, + "train_mae_vol": 0.016766, + "train_r2_log": -0.003201, + "train_qlike": 2.598004 + }, + { + "fold": 2, + "model": "Mean (dummy)", + "test_start": "2020-07-31", + "test_end": "2022-05-19", + "n_train": 1972, + "n_test": 658, + "test_rmse_vol": 0.019594, + "test_mae_vol": 0.014313, + "test_r2_log": -0.275221, + "test_qlike": 1.088664, + "train_rmse_vol": 0.024963, + "train_mae_vol": 0.016533, + "train_r2_log": 0.0, + "train_qlike": 1.744669 + }, + { + "fold": 3, + "model": "HAR (served)", + "test_start": "2022-05-20", + "test_end": "2024-03-07", + "n_train": 2630, + "n_test": 658, + "test_rmse_vol": 0.014275, + "test_mae_vol": 0.010326, + "test_r2_log": 0.007245, + "test_qlike": 0.895835, + "train_rmse_vol": 0.020437, + "train_mae_vol": 0.013243, + "train_r2_log": 0.283296, + "train_qlike": 1.138308 + }, + { + "fold": 3, + "model": "Random Forest", + "test_start": "2022-05-20", + "test_end": "2024-03-07", + "n_train": 2630, + "n_test": 658, + "test_rmse_vol": 0.014587, + "test_mae_vol": 0.010597, + "test_r2_log": -0.043777, + "test_qlike": 1.037902, + "train_rmse_vol": 0.018408, + "train_mae_vol": 0.011477, + "train_r2_log": 0.479748, + "train_qlike": 0.746292 + }, + { + "fold": 3, + "model": "Persistence (vol_5)", + "test_start": "2022-05-20", + "test_end": "2024-03-07", + "n_train": 2630, + "n_test": 658, + "test_rmse_vol": 0.017991, + "test_mae_vol": 0.013196, + "test_r2_log": -0.597322, + "test_qlike": 2.371133, + "train_rmse_vol": 0.024081, + "train_mae_vol": 0.016439, + "train_r2_log": -0.039758, + "train_qlike": 2.249838 + }, + { + "fold": 3, + "model": "Mean (dummy)", + "test_start": "2022-05-20", + "test_end": "2024-03-07", + "n_train": 2630, + "n_test": 658, + "test_rmse_vol": 0.014624, + "test_mae_vol": 0.011285, + "test_r2_log": -0.218605, + "test_qlike": 0.730476, + "train_rmse_vol": 0.023233, + "train_mae_vol": 0.015813, + "train_r2_log": 0.0, + "train_qlike": 1.379658 + }, + { + "fold": 4, + "model": "HAR (served)", + "test_start": "2024-03-08", + "test_end": "2025-12-25", + "n_train": 3288, + "n_test": 658, + "test_rmse_vol": 0.011184, + "test_mae_vol": 0.008188, + "test_r2_log": 0.086319, + "test_qlike": 0.533904, + "train_rmse_vol": 0.019497, + "train_mae_vol": 0.012668, + "train_r2_log": 0.261335, + "train_qlike": 1.124041 + }, + { + "fold": 4, + "model": "Random Forest", + "test_start": "2024-03-08", + "test_end": "2025-12-25", + "n_train": 3288, + "n_test": 658, + "test_rmse_vol": 0.011462, + "test_mae_vol": 0.00848, + "test_r2_log": 0.010316, + "test_qlike": 0.545957, + "train_rmse_vol": 0.017662, + "train_mae_vol": 0.011113, + "train_r2_log": 0.440963, + "train_qlike": 0.781793 + }, + { + "fold": 4, + "model": "Persistence (vol_5)", + "test_start": "2024-03-08", + "test_end": "2025-12-25", + "n_train": 3288, + "n_test": 658, + "test_rmse_vol": 0.01417, + "test_mae_vol": 0.010795, + "test_r2_log": -0.478473, + "test_qlike": 0.97573, + "train_rmse_vol": 0.022967, + "train_mae_vol": 0.015768, + "train_r2_log": -0.097114, + "train_qlike": 2.272952 + }, + { + "fold": 4, + "model": "Mean (dummy)", + "test_start": "2024-03-08", + "test_end": "2025-12-25", + "n_train": 3288, + "n_test": 658, + "test_rmse_vol": 0.01163, + "test_mae_vol": 0.00892, + "test_r2_log": -0.141491, + "test_qlike": 0.497076, + "train_rmse_vol": 0.022143, + "train_mae_vol": 0.014943, + "train_r2_log": 0.0, + "train_qlike": 1.397751 + } + ], + "n_rows": 3951, + "date_range": [ + "2015-03-03", + "2025-12-25" + ], + "market_dynamics": { + "n_shocks": 158, + "mfi_max": 0.9095757225834639, + "mfi_max_date": "2017-01-06", + "mfi_2020_03_max": 0.6356506566766447, + "mfi_mean_since_2016": 0.2971459969449981 + } + }, + "NIFTY": { + "summary": { + "HAR (served)": { + "test_rmse_vol": 0.00488, + "test_mae_vol": 0.003113, + "test_r2_log": 0.100069, + "test_qlike": 0.547901, + "train_rmse_vol": 0.004527, + "train_mae_vol": 0.00315, + "train_r2_log": 0.206813, + "train_qlike": 0.436282 + }, + "Random Forest": { + "test_rmse_vol": 0.00519, + "test_mae_vol": 0.003222, + "test_r2_log": 0.061983, + "test_qlike": 0.683852, + "train_rmse_vol": 0.003881, + "train_mae_vol": 0.002699, + "train_r2_log": 0.412811, + "train_qlike": 0.315016 + }, + "Mean (dummy)": { + "test_rmse_vol": 0.005578, + "test_mae_vol": 0.003628, + "test_r2_log": -0.18624, + "test_qlike": 0.890473, + "train_rmse_vol": 0.005238, + "train_mae_vol": 0.003554, + "train_r2_log": 0.0, + "train_qlike": 0.691882 + }, + "Persistence (vol_5)": { + "test_rmse_vol": 0.005737, + "test_mae_vol": 0.003955, + "test_r2_log": -0.438958, + "test_qlike": 1.269509, + "train_rmse_vol": 0.005416, + "train_mae_vol": 0.004041, + "train_r2_log": -0.342044, + "train_qlike": 1.013134 + } + }, + "folds": [ + { + "fold": 0, + "model": "HAR (served)", + "test_start": "2012-11-22", + "test_end": "2015-07-14", + "n_train": 642, + "n_test": 643, + "test_rmse_vol": 0.004093, + "test_mae_vol": 0.003163, + "test_r2_log": 0.023536, + "test_qlike": 0.427393, + "train_rmse_vol": 0.004073, + "train_mae_vol": 0.003169, + "train_r2_log": 0.161759, + "train_qlike": 0.323935 + }, + { + "fold": 0, + "model": "Random Forest", + "test_start": "2012-11-22", + "test_end": "2015-07-14", + "n_train": 642, + "n_test": 643, + "test_rmse_vol": 0.004064, + "test_mae_vol": 0.003115, + "test_r2_log": 0.045803, + "test_qlike": 0.415422, + "train_rmse_vol": 0.003534, + "train_mae_vol": 0.002679, + "train_r2_log": 0.392061, + "train_qlike": 0.234339 + }, + { + "fold": 0, + "model": "Persistence (vol_5)", + "test_start": "2012-11-22", + "test_end": "2015-07-14", + "n_train": 642, + "n_test": 643, + "test_rmse_vol": 0.005136, + "test_mae_vol": 0.004022, + "test_r2_log": -0.606571, + "test_qlike": 1.35829, + "train_rmse_vol": 0.005276, + "train_mae_vol": 0.004122, + "train_r2_log": -0.427733, + "train_qlike": 0.748789 + }, + { + "fold": 0, + "model": "Mean (dummy)", + "test_start": "2012-11-22", + "test_end": "2015-07-14", + "n_train": 642, + "n_test": 643, + "test_rmse_vol": 0.004496, + "test_mae_vol": 0.003496, + "test_r2_log": -0.193395, + "test_qlike": 0.477834, + "train_rmse_vol": 0.004483, + "train_mae_vol": 0.003498, + "train_r2_log": 0.0, + "train_qlike": 0.401593 + }, + { + "fold": 1, + "model": "HAR (served)", + "test_start": "2015-07-15", + "test_end": "2018-02-23", + "n_train": 1285, + "n_test": 643, + "test_rmse_vol": 0.003471, + "test_mae_vol": 0.002476, + "test_r2_log": 0.155028, + "test_qlike": 0.401658, + "train_rmse_vol": 0.004141, + "train_mae_vol": 0.003162, + "train_r2_log": 0.158519, + "train_qlike": 0.410785 + }, + { + "fold": 1, + "model": "Random Forest", + "test_start": "2015-07-15", + "test_end": "2018-02-23", + "n_train": 1285, + "n_test": 643, + "test_rmse_vol": 0.003537, + "test_mae_vol": 0.002528, + "test_r2_log": 0.110375, + "test_qlike": 0.407294, + "train_rmse_vol": 0.003517, + "train_mae_vol": 0.002646, + "train_r2_log": 0.402641, + "train_qlike": 0.287564 + }, + { + "fold": 1, + "model": "Persistence (vol_5)", + "test_start": "2015-07-15", + "test_end": "2018-02-23", + "n_train": 1285, + "n_test": 643, + "test_rmse_vol": 0.004327, + "test_mae_vol": 0.003216, + "test_r2_log": -0.406044, + "test_qlike": 1.110432, + "train_rmse_vol": 0.005201, + "train_mae_vol": 0.004061, + "train_r2_log": -0.441927, + "train_qlike": 1.052735 + }, + { + "fold": 1, + "model": "Mean (dummy)", + "test_start": "2015-07-15", + "test_end": "2018-02-23", + "n_train": 1285, + "n_test": 643, + "test_rmse_vol": 0.004075, + "test_mae_vol": 0.003198, + "test_r2_log": -0.325305, + "test_qlike": 0.492726, + "train_rmse_vol": 0.004608, + "train_mae_vol": 0.003468, + "train_r2_log": 0.0, + "train_qlike": 0.523425 + }, + { + "fold": 2, + "model": "HAR (served)", + "test_start": "2018-02-26", + "test_end": "2020-10-09", + "n_train": 1928, + "n_test": 643, + "test_rmse_vol": 0.008142, + "test_mae_vol": 0.004128, + "test_r2_log": 0.321182, + "test_qlike": 0.751889, + "train_rmse_vol": 0.003965, + "train_mae_vol": 0.002948, + "train_r2_log": 0.218495, + "train_qlike": 0.429612 + }, + { + "fold": 2, + "model": "Random Forest", + "test_start": "2018-02-26", + "test_end": "2020-10-09", + "n_train": 1928, + "n_test": 643, + "test_rmse_vol": 0.009586, + "test_mae_vol": 0.004601, + "test_r2_log": 0.153132, + "test_qlike": 1.407833, + "train_rmse_vol": 0.003444, + "train_mae_vol": 0.002499, + "train_r2_log": 0.434701, + "train_qlike": 0.304429 + }, + { + "fold": 2, + "model": "Persistence (vol_5)", + "test_start": "2018-02-26", + "test_end": "2020-10-09", + "n_train": 1928, + "n_test": 643, + "test_rmse_vol": 0.00794, + "test_mae_vol": 0.005027, + "test_r2_log": -0.000111, + "test_qlike": 0.957125, + "train_rmse_vol": 0.00493, + "train_mae_vol": 0.003786, + "train_r2_log": -0.333046, + "train_qlike": 1.072591 + }, + { + "fold": 2, + "model": "Mean (dummy)", + "test_start": "2018-02-26", + "test_end": "2020-10-09", + "n_train": 1928, + "n_test": 643, + "test_rmse_vol": 0.010127, + "test_mae_vol": 0.004867, + "test_r2_log": -0.00149, + "test_qlike": 2.212919, + "train_rmse_vol": 0.00455, + "train_mae_vol": 0.003365, + "train_r2_log": 0.0, + "train_qlike": 0.60053 + }, + { + "fold": 3, + "model": "HAR (served)", + "test_start": "2020-10-12", + "test_end": "2023-05-17", + "n_train": 2571, + "n_test": 643, + "test_rmse_vol": 0.004439, + "test_mae_vol": 0.00325, + "test_r2_log": 0.159263, + "test_qlike": 0.523751, + "train_rmse_vol": 0.005287, + "train_mae_vol": 0.003229, + "train_r2_log": 0.257387, + "train_qlike": 0.500287 + }, + { + "fold": 3, + "model": "Random Forest", + "test_start": "2020-10-12", + "test_end": "2023-05-17", + "n_train": 2571, + "n_test": 643, + "test_rmse_vol": 0.004518, + "test_mae_vol": 0.003359, + "test_r2_log": 0.121338, + "test_qlike": 0.539054, + "train_rmse_vol": 0.00446, + "train_mae_vol": 0.002802, + "train_r2_log": 0.435855, + "train_qlike": 0.360234 + }, + { + "fold": 3, + "model": "Persistence (vol_5)", + "test_start": "2020-10-12", + "test_end": "2023-05-17", + "n_train": 2571, + "n_test": 643, + "test_rmse_vol": 0.005916, + "test_mae_vol": 0.004346, + "test_r2_log": -0.563882, + "test_qlike": 1.611558, + "train_rmse_vol": 0.005825, + "train_mae_vol": 0.004089, + "train_r2_log": -0.220256, + "train_qlike": 1.035318 + }, + { + "fold": 3, + "model": "Mean (dummy)", + "test_start": "2020-10-12", + "test_end": "2023-05-17", + "n_train": 2571, + "n_test": 643, + "test_rmse_vol": 0.004863, + "test_mae_vol": 0.003577, + "test_r2_log": -0.008145, + "test_qlike": 0.669091, + "train_rmse_vol": 0.006404, + "train_mae_vol": 0.003734, + "train_r2_log": 0.0, + "train_qlike": 0.990242 + }, + { + "fold": 4, + "model": "HAR (served)", + "test_start": "2023-05-18", + "test_end": "2025-12-22", + "n_train": 3214, + "n_test": 643, + "test_rmse_vol": 0.004256, + "test_mae_vol": 0.00255, + "test_r2_log": -0.158666, + "test_qlike": 0.634814, + "train_rmse_vol": 0.005168, + "train_mae_vol": 0.003243, + "train_r2_log": 0.237902, + "train_qlike": 0.516791 + }, + { + "fold": 4, + "model": "Random Forest", + "test_start": "2023-05-18", + "test_end": "2025-12-22", + "n_train": 3214, + "n_test": 643, + "test_rmse_vol": 0.004246, + "test_mae_vol": 0.002508, + "test_r2_log": -0.120734, + "test_qlike": 0.649658, + "train_rmse_vol": 0.004449, + "train_mae_vol": 0.002868, + "train_r2_log": 0.398798, + "train_qlike": 0.388514 + }, + { + "fold": 4, + "model": "Persistence (vol_5)", + "test_start": "2023-05-18", + "test_end": "2025-12-22", + "n_train": 3214, + "n_test": 643, + "test_rmse_vol": 0.005367, + "test_mae_vol": 0.003165, + "test_r2_log": -0.618181, + "test_qlike": 1.31014, + "train_rmse_vol": 0.005848, + "train_mae_vol": 0.004146, + "train_r2_log": -0.287259, + "train_qlike": 1.156235 + }, + { + "fold": 4, + "model": "Mean (dummy)", + "test_start": "2023-05-18", + "test_end": "2025-12-22", + "n_train": 3214, + "n_test": 643, + "test_rmse_vol": 0.004327, + "test_mae_vol": 0.002999, + "test_r2_log": -0.402865, + "test_qlike": 0.599793, + "train_rmse_vol": 0.006143, + "train_mae_vol": 0.003705, + "train_r2_log": 0.0, + "train_qlike": 0.943619 + } + ], + "n_rows": 3862, + "date_range": [ + "2010-04-06", + "2025-12-22" + ], + "market_dynamics": { + "n_shocks": 141, + "mfi_max": 0.9184425261596894, + "mfi_max_date": "2020-03-23", + "mfi_2020_03_max": 0.9184425261596894, + "mfi_mean_since_2016": 0.3466659323838908 + } + } +} \ No newline at end of file diff --git a/dashboard/data/mfi_btc.csv b/dashboard/data/mfi_btc.csv new file mode 100644 index 0000000..f57601c --- /dev/null +++ b/dashboard/data/mfi_btc.csv @@ -0,0 +1,3942 @@ +date,MFI,persistence_norm,vol_of_vol_norm,tail_freq_norm +2015-03-18,0.46236,0.14651,0.24056,1 +2015-03-19,0.44645,0.15999,0.17934,1 +2015-03-20,0.42045,0.1715,0.089841,1 +2015-03-21,0.39759,0.19277,0,1 +2015-03-22,0.39094,0.17281,0,1 +2015-03-23,0.39679,0.18075,0.0096026,1 +2015-03-24,0.40285,0.13686,0.071701,1 +2015-03-25,0.37608,0.063249,0.064983,1 +2015-03-26,0.36391,0.054011,0.03771,1 +2015-03-27,0.34862,0.045853,0,1 +2015-03-28,0.36252,0.087546,0,1 +2015-03-29,0.38048,0.14144,0,1 +2015-03-30,0.37823,0.13469,0,1 +2015-03-31,0.38317,0.13098,0.018526,1 +2015-04-01,0.3913,0.13099,0.042894,1 +2015-04-02,0.39652,0.13021,0.059354,1 +2015-04-03,0.40536,0.13642,0.079666,1 +2015-04-04,0.42007,0.15573,0.10449,1 +2015-04-05,0.4347,0.14403,0.16008,1 +2015-04-06,0.443,0.1324,0.19658,1 +2015-04-07,0.46648,0.1635,0.23593,1 +2015-04-08,0.47772,0.18109,0.25208,1 +2015-04-09,0.47975,0.16149,0.27777,1 +2015-04-10,0.47491,0.14316,0.28158,1 +2015-04-11,0.47587,0.13979,0.28782,1 +2015-04-12,0.50461,0.1784,0.33542,1 +2015-04-13,0.49887,0.13985,0.35676,1 +2015-04-14,0.50935,0.14882,0.37923,1 +2015-04-15,0.50121,0.14608,0.35756,1 +2015-04-16,0.47837,0.10318,0.33193,1 +2015-04-17,0.28363,0.022333,0.32855,0.5 +2015-04-18,0.27358,0.0065668,0.31417,0.5 +2015-04-19,0.27076,0.018379,0.29391,0.5 +2015-04-20,0.28206,0.059677,0.28651,0.5 +2015-04-21,0.26722,0.054826,0.24682,0.5 +2015-04-22,0.25458,0.064476,0.19928,0.5 +2015-04-23,0.083919,0.20418,0.047581,0 +2015-04-24,0.062785,0.16523,0.023121,0 +2015-04-25,0.047552,0.14265,0,0 +2015-04-26,0.055362,0.16609,0,0 +2015-04-27,0.074133,0.2224,0,0 +2015-04-28,0.066394,0.19918,0,0 +2015-04-29,0.072937,0.21881,0,0 +2015-04-30,0.053055,0.12808,0.031087,0 +2015-05-01,0.063275,0.13614,0.053683,0 +2015-05-02,0.07097,0.14597,0.066943,0 +2015-05-03,0.051156,0.085741,0.067728,0 +2015-05-04,0.055367,0.098642,0.067457,0 +2015-05-05,0.05242,0.12094,0.036318,0 +2015-05-06,0.043804,0.11159,0.019823,0 +2015-05-07,0.052757,0.1581,0.00017534,0 +2015-05-08,0.070993,0.21298,0,0 +2015-05-09,0.076319,0.22896,0,0 +2015-05-10,0.10087,0.3026,0,0 +2015-05-11,0.088982,0.26695,0,0 +2015-05-12,0.14415,0.43245,0,0 +2015-05-13,0.12794,0.38204,0.0017692,0 +2015-05-14,0.13323,0.37,0.029707,0 +2015-05-15,0.17786,0.4194,0.11419,0 +2015-05-16,0.20991,0.44503,0.18471,0 +2015-05-17,0.25085,0.50615,0.24638,0 +2015-05-18,0.25637,0.46771,0.3014,0 +2015-05-19,0.26646,0.44739,0.35198,0 +2015-05-20,0.31375,0.53609,0.40517,0 +2015-05-21,0.3745,0.66633,0.45717,0 +2015-05-22,0.37345,0.63405,0.48629,0 +2015-05-23,0.38113,0.62929,0.51412,0 +2015-05-24,0.3903,0.63166,0.53924,0 +2015-05-25,0.38967,0.60559,0.56341,0 +2015-05-26,0.34711,0.45764,0.58369,0 +2015-05-27,0.35829,0.49317,0.5817,0 +2015-05-28,0.38374,0.55232,0.5989,0 +2015-05-29,0.4855,0.81977,0.63675,0 +2015-05-30,0.46364,0.76465,0.62626,0 +2015-05-31,0.45983,0.76842,0.61107,0 +2015-06-01,0.61057,0.76519,0.56653,0.5 +2015-06-02,0.6098,0.79139,0.538,0.5 +2015-06-03,0.60117,0.77864,0.52486,0.5 +2015-06-04,0.60395,0.80045,0.51141,0.5 +2015-06-05,0.54657,0.67475,0.46495,0.5 +2015-06-06,0.47185,0.47707,0.43847,0.5 +2015-06-07,0.45738,0.46909,0.40304,0.5 +2015-06-08,0.62,0.50572,0.35427,1 +2015-06-09,0.57819,0.42507,0.3095,1 +2015-06-10,0.56661,0.4516,0.24823,1 +2015-06-11,0.56172,0.50771,0.17744,1 +2015-06-12,0.56267,0.57537,0.11262,1 +2015-06-13,0.54828,0.54518,0.09967,1 +2015-06-14,0.54514,0.53305,0.10237,1 +2015-06-15,0.55364,0.51208,0.14883,1 +2015-06-16,0.60549,0.5934,0.22306,1 +2015-06-17,0.58505,0.47205,0.2831,1 +2015-06-18,0.60243,0.47916,0.32814,1 +2015-06-19,0.61194,0.45617,0.37964,1 +2015-06-20,0.62241,0.45395,0.41327,1 +2015-06-21,0.64371,0.47575,0.45537,1 +2015-06-22,0.65181,0.47098,0.48446,1 +2015-06-23,0.65703,0.47437,0.49674,1 +2015-06-24,0.66675,0.49643,0.50383,1 +2015-06-25,0.65754,0.46909,0.50353,1 +2015-06-26,0.65109,0.44355,0.50973,1 +2015-06-27,0.62389,0.37176,0.49991,1 +2015-06-28,0.60994,0.36518,0.46463,1 +2015-06-29,0.59539,0.34293,0.44324,1 +2015-06-30,0.60178,0.39454,0.41081,1 +2015-07-01,0.49191,0.4061,0.40296,0.66667 +2015-07-02,0.4946,0.41134,0.40579,0.66667 +2015-07-03,0.48901,0.39319,0.40718,0.66667 +2015-07-04,0.47865,0.36613,0.40314,0.66667 +2015-07-05,0.59531,0.3797,0.40622,1 +2015-07-06,0.58606,0.35182,0.40634,1 +2015-07-07,0.58737,0.35878,0.40334,1 +2015-07-08,0.48128,0.38832,0.38886,0.66667 +2015-07-09,0.4599,0.34389,0.36913,0.66667 +2015-07-10,0.53466,0.23646,0.36751,1 +2015-07-11,0.5599,0.32073,0.35897,1 +2015-07-12,0.5856,0.39452,0.36228,1 +2015-07-13,0.69399,0.62506,0.45691,1 +2015-07-14,0.68758,0.56344,0.49929,1 +2015-07-15,0.70512,0.62218,0.49319,1 +2015-07-16,0.68327,0.69805,0.55175,0.8 +2015-07-17,0.67227,0.64882,0.56798,0.8 +2015-07-18,0.67536,0.65301,0.57306,0.8 +2015-07-19,0.67761,0.6567,0.57613,0.8 +2015-07-20,0.67388,0.62397,0.59768,0.8 +2015-07-21,0.67697,0.61015,0.62076,0.8 +2015-07-22,0.68617,0.61719,0.64132,0.8 +2015-07-23,0.6903,0.64096,0.62995,0.8 +2015-07-24,0.65471,0.57062,0.59351,0.8 +2015-07-25,0.61416,0.47439,0.56808,0.8 +2015-07-26,0.61727,0.516,0.53581,0.8 +2015-07-27,0.62525,0.54719,0.52856,0.8 +2015-07-28,0.64422,0.60425,0.52841,0.8 +2015-07-29,0.6432,0.59998,0.52961,0.8 +2015-07-30,0.64367,0.60258,0.52842,0.8 +2015-07-31,0.65862,0.61146,0.56441,0.8 +2015-08-01,0.67063,0.6096,0.60229,0.8 +2015-08-02,0.69168,0.62278,0.65227,0.8 +2015-08-03,0.71839,0.65313,0.70206,0.8 +2015-08-04,0.67604,0.68655,0.74157,0.6 +2015-08-05,0.68937,0.68385,0.78426,0.6 +2015-08-06,0.70361,0.6875,0.82333,0.6 +2015-08-07,0.71852,0.6957,0.85987,0.6 +2015-08-08,0.76369,0.64178,0.84929,0.8 +2015-08-09,0.66957,0.55969,0.84903,0.6 +2015-08-10,0.65396,0.51295,0.84893,0.6 +2015-08-11,0.46698,0.15216,0.84877,0.4 +2015-08-12,0.36815,0.087087,0.81737,0.2 +2015-08-13,0.35541,0.088737,0.77748,0.2 +2015-08-14,0.34779,0.11531,0.72807,0.2 +2015-08-15,0.33077,0.13158,0.66074,0.2 +2015-08-16,0.31805,0.13602,0.61814,0.2 +2015-08-17,0.30628,0.1463,0.57253,0.2 +2015-08-18,0.50681,0.12042,1,0.4 +2015-08-19,0.65291,0.55874,1,0.4 +2015-08-20,0.6574,0.57221,1,0.4 +2015-08-21,0.65316,0.55948,1,0.4 +2015-08-22,0.65857,0.57571,1,0.4 +2015-08-23,0.66465,0.59394,1,0.4 +2015-08-24,0.65028,0.56184,0.98901,0.4 +2015-08-25,0.64767,0.59075,0.95225,0.4 +2015-08-26,0.63085,0.57298,0.91957,0.4 +2015-08-27,0.61941,0.57143,0.88681,0.4 +2015-08-28,0.60761,0.5648,0.85802,0.4 +2015-08-29,0.59517,0.55546,0.83006,0.4 +2015-08-30,0.5819,0.55953,0.78617,0.4 +2015-08-31,0.576,0.56184,0.76616,0.4 +2015-09-01,0.57093,0.55921,0.75356,0.4 +2015-09-02,0.56801,0.56204,0.74198,0.4 +2015-09-03,0.56722,0.56607,0.73559,0.4 +2015-09-04,0.56774,0.56615,0.73706,0.4 +2015-09-05,0.56507,0.56071,0.7345,0.4 +2015-09-06,0.57468,0.59411,0.72994,0.4 +2015-09-07,0.52197,0.6123,0.7536,0.2 +2015-09-08,0.53149,0.61254,0.78194,0.2 +2015-09-09,0.53769,0.61267,0.8004,0.2 +2015-09-10,0.54486,0.61206,0.82252,0.2 +2015-09-11,0.5544,0.61774,0.84547,0.2 +2015-09-12,0.55948,0.61238,0.86606,0.2 +2015-09-13,0.56618,0.60928,0.88927,0.2 +2015-09-14,0.56541,0.608,0.88824,0.2 +2015-09-15,0.56821,0.61413,0.89052,0.2 +2015-09-16,0.69881,1,0.89644,0.2 +2015-09-17,0.56783,0.76037,0.94312,0 +2015-09-18,0.55045,0.6778,0.97355,0 +2015-09-19,0.56406,0.69729,0.9949,0 +2015-09-20,0.56845,0.70535,1,0 +2015-09-21,0.55808,0.69219,0.98204,0 +2015-09-22,0.61965,0.95141,0.90754,0 +2015-09-23,0.37258,0.42361,0.69413,0 +2015-09-24,0.28537,0.21043,0.64569,0 +2015-09-25,0.27243,0.20325,0.61403,0 +2015-09-26,0.29089,0.29187,0.5808,0 +2015-09-27,0.27922,0.33205,0.50561,0 +2015-09-28,0.28952,0.29434,0.37423,0.2 +2015-09-29,0.19127,0.28288,0.090926,0.2 +2015-09-30,0.17257,0.27805,0.039655,0.2 +2015-10-01,0.17613,0.29052,0.037855,0.2 +2015-10-02,0.18224,0.30872,0.038013,0.2 +2015-10-03,0.18917,0.32968,0.037834,0.2 +2015-10-04,0.18172,0.32081,0.024355,0.2 +2015-10-05,0.16554,0.2428,0.053829,0.2 +2015-10-06,0.19033,0.30652,0.064459,0.2 +2015-10-07,0.21164,0.36845,0.066463,0.2 +2015-10-08,0.19025,0.30482,0.065927,0.2 +2015-10-09,0.21138,0.37852,0.05561,0.2 +2015-10-10,0.20841,0.37565,0.049593,0.2 +2015-10-11,0.21252,0.39362,0.04393,0.2 +2015-10-12,0.17129,0.28786,0.026016,0.2 +2015-10-13,0.19015,0.35284,0.01762,0.2 +2015-10-14,0.17909,0.31956,0.017708,0.2 +2015-10-15,0.17842,0.29953,0.035726,0.2 +2015-10-16,0.24395,0.29597,0.035867,0.4 +2015-10-17,0.40029,0.56093,0.039942,0.6 +2015-10-18,0.55358,0.72412,0.1366,0.8 +2015-10-19,0.53788,0.6281,0.18555,0.8 +2015-10-20,0.54638,0.63437,0.20478,0.8 +2015-10-21,0.55408,0.62191,0.24034,0.8 +2015-10-22,0.57018,0.63185,0.27869,0.8 +2015-10-23,0.57367,0.62668,0.29434,0.8 +2015-10-24,0.58324,0.64616,0.30357,0.8 +2015-10-25,0.56812,0.60237,0.30199,0.8 +2015-10-26,0.56582,0.59777,0.2997,0.8 +2015-10-27,0.55931,0.58115,0.2968,0.8 +2015-10-28,0.60229,0.709,0.29787,0.8 +2015-10-29,0.62587,0.77741,0.30021,0.8 +2015-10-30,0.70929,0.82841,0.29947,1 +2015-10-31,0.75138,0.91278,0.34135,1 +2015-11-01,0.76987,0.93689,0.37274,1 +2015-11-02,0.78911,0.89552,0.4718,1 +2015-11-03,0.86096,1,0.58289,1 +2015-11-04,0.81558,0.81805,0.62871,1 +2015-11-05,0.83577,0.79035,0.71696,1 +2015-11-06,0.84885,0.77278,0.77377,1 +2015-11-07,0.8467,0.75951,0.78058,1 +2015-11-08,0.84267,0.74534,0.78268,1 +2015-11-09,0.82658,0.72485,0.75489,1 +2015-11-10,0.76946,0.58708,0.72129,1 +2015-11-11,0.78262,0.6606,0.68725,1 +2015-11-12,0.78589,0.69339,0.66428,1 +2015-11-13,0.74352,0.59931,0.63126,1 +2015-11-14,0.73658,0.61979,0.58996,1 +2015-11-15,0.68683,0.61395,0.55764,0.88889 +2015-11-16,0.63923,0.6128,0.52712,0.77778 +2015-11-17,0.59547,0.61486,0.5049,0.66667 +2015-11-18,0.59256,0.6252,0.48581,0.66667 +2015-11-19,0.59132,0.62356,0.48371,0.66667 +2015-11-20,0.59209,0.62578,0.48382,0.66667 +2015-11-21,0.59504,0.63435,0.48411,0.66667 +2015-11-22,0.59794,0.63735,0.48979,0.66667 +2015-11-23,0.60538,0.64649,0.50298,0.66667 +2015-11-24,0.60576,0.64561,0.505,0.66667 +2015-11-25,0.60455,0.64918,0.4978,0.66667 +2015-11-26,0.58965,0.62838,0.4739,0.66667 +2015-11-27,0.53274,0.59492,0.44774,0.55556 +2015-11-28,0.52991,0.61346,0.42071,0.55556 +2015-11-29,0.48225,0.60472,0.39759,0.44444 +2015-11-30,0.44547,0.6023,0.40077,0.33333 +2015-12-01,0.45133,0.62453,0.39612,0.33333 +2015-12-02,0.36916,0.48412,0.40112,0.22222 +2015-12-03,0.36447,0.56081,0.42149,0.11111 +2015-12-04,0.38429,0.59974,0.44203,0.11111 +2015-12-05,0.36872,0.55216,0.44289,0.11111 +2015-12-06,0.3485,0.49511,0.43929,0.11111 +2015-12-07,0.35058,0.50205,0.43859,0.11111 +2015-12-08,0.34628,0.49422,0.43351,0.11111 +2015-12-09,0.37021,0.55949,0.44003,0.11111 +2015-12-10,0.26367,0.3457,0.4453,0 +2015-12-11,0.19809,0.040063,0.44309,0.11111 +2015-12-12,0.23527,0.18261,0.4121,0.11111 +2015-12-13,0.21036,0.14801,0.37198,0.11111 +2015-12-14,0.19995,0.15899,0.32975,0.11111 +2015-12-15,0.17857,0.15082,0.27377,0.11111 +2015-12-16,0.15365,0.15865,0.19118,0.11111 +2015-12-17,0.14036,0.14442,0.16555,0.11111 +2015-12-18,0.14338,0.15702,0.162,0.11111 +2015-12-19,0.148,0.16864,0.16426,0.11111 +2015-12-20,0.13667,0.14032,0.15858,0.11111 +2015-12-21,0.12717,0.11535,0.15506,0.11111 +2015-12-22,0.12663,0.11269,0.1561,0.11111 +2015-12-23,0.11944,0.1073,0.13991,0.11111 +2015-12-24,0.10809,0.10533,0.10783,0.11111 +2015-12-25,0.095461,0.080431,0.094841,0.11111 +2015-12-26,0.1172,0.029717,0.09966,0.22222 +2015-12-27,0.11174,0.012061,0.10094,0.22222 +2015-12-28,0.1225,0.043124,0.10216,0.22222 +2015-12-29,0.12493,0.048051,0.10452,0.22222 +2015-12-30,0.12591,0.051984,0.10353,0.22222 +2015-12-31,0.13206,0.069283,0.10468,0.22222 +2016-01-01,0.13128,0.065843,0.10579,0.22222 +2016-01-02,0.14223,0.065706,0.13875,0.22222 +2016-01-03,0.16837,0.11553,0.16735,0.22222 +2016-01-04,0.19991,0.17544,0.20207,0.22222 +2016-01-05,0.21898,0.18696,0.24776,0.22222 +2016-01-06,0.24172,0.20596,0.29698,0.22222 +2016-01-07,0.27778,0.20049,0.29953,0.33333 +2016-01-08,0.26554,0.16375,0.29952,0.33333 +2016-01-09,0.28408,0.21901,0.29989,0.33333 +2016-01-10,0.21092,0.1086,0.30194,0.22222 +2016-01-11,0.22551,0.15386,0.30045,0.22222 +2016-01-12,0.22183,0.14707,0.2962,0.22222 +2016-01-13,0.20995,0.11673,0.29091,0.22222 +2016-01-14,0.21438,0.10057,0.32035,0.22222 +2016-01-15,0.27083,0.10491,0.37425,0.33333 +2016-01-16,0.37966,0.35225,0.45339,0.33333 +2016-01-17,0.39293,0.33805,0.50741,0.33333 +2016-01-18,0.4079,0.35285,0.53752,0.33333 +2016-01-19,0.4195,0.36197,0.56319,0.33333 +2016-01-20,0.46427,0.34312,0.60525,0.44444 +2016-01-21,0.46411,0.33068,0.61722,0.44444 +2016-01-22,0.45529,0.32867,0.59276,0.44444 +2016-01-23,0.44354,0.31411,0.57206,0.44444 +2016-01-24,0.44812,0.35061,0.5493,0.44444 +2016-01-25,0.41783,0.37517,0.54498,0.33333 +2016-01-26,0.41274,0.36541,0.53948,0.33333 +2016-01-27,0.41728,0.37682,0.54168,0.33333 +2016-01-28,0.41586,0.37032,0.54394,0.33333 +2016-01-29,0.4162,0.35756,0.5577,0.33333 +2016-01-30,0.42267,0.36368,0.57099,0.33333 +2016-01-31,0.42779,0.35368,0.59637,0.33333 +2016-02-01,0.42091,0.34263,0.58677,0.33333 +2016-02-02,0.41764,0.34211,0.57747,0.33333 +2016-02-03,0.41397,0.3387,0.56987,0.33333 +2016-02-04,0.39732,0.31581,0.54281,0.33333 +2016-02-05,0.38978,0.32488,0.51113,0.33333 +2016-02-06,0.35812,0.34271,0.50943,0.22222 +2016-02-07,0.35699,0.33658,0.51216,0.22222 +2016-02-08,0.35923,0.33958,0.5159,0.22222 +2016-02-09,0.35757,0.3316,0.5189,0.22222 +2016-02-10,0.36139,0.3397,0.52225,0.22222 +2016-02-11,0.3728,0.34761,0.54856,0.22222 +2016-02-12,0.37997,0.34493,0.57275,0.22222 +2016-02-13,0.43435,0.50884,0.572,0.22222 +2016-02-14,0.32409,0.25768,0.60349,0.11111 +2016-02-15,0.33547,0.27312,0.62219,0.11111 +2016-02-16,0.33918,0.26926,0.63717,0.11111 +2016-02-17,0.34116,0.26722,0.64514,0.11111 +2016-02-18,0.34841,0.28494,0.64918,0.11111 +2016-02-19,0.27764,0.23637,0.59656,0 +2016-02-20,0.20833,0.135,0.48998,0 +2016-02-21,0.18598,0.093586,0.46434,0 +2016-02-22,0.19561,0.13826,0.44856,0 +2016-02-23,0.14045,0.024591,0.39676,0 +2016-02-24,0.11653,0.039001,0.3106,0 +2016-02-25,0.068454,0.030742,0.17462,0 +2016-02-26,0.064836,0.051757,0.14275,0 +2016-02-27,0.061385,0.091037,0.093119,0 +2016-02-28,0.062292,0.097749,0.089128,0 +2016-02-29,0.072988,0.13375,0.085209,0 +2016-03-01,0.090514,0.1477,0.12384,0 +2016-03-02,0.086021,0.12425,0.13381,0 +2016-03-03,0.080867,0.099368,0.14323,0 +2016-03-04,0.074325,0.071687,0.15129,0 +2016-03-05,0.095739,0.13332,0.1539,0 +2016-03-06,0.10333,0.16104,0.14895,0 +2016-03-07,0.11182,0.20148,0.13399,0 +2016-03-08,0.098979,0.17162,0.12531,0 +2016-03-09,0.10762,0.20712,0.11573,0 +2016-03-10,0.11357,0.23715,0.10356,0 +2016-03-11,0.11329,0.24579,0.094097,0 +2016-03-12,0.10779,0.2327,0.090683,0 +2016-03-13,0.10365,0.2163,0.094646,0 +2016-03-14,0.094812,0.19474,0.089693,0 +2016-03-15,0.095035,0.18242,0.10269,0 +2016-03-16,0.11077,0.2158,0.11651,0 +2016-03-17,0.1127,0.20981,0.1283,0 +2016-03-18,0.10746,0.19177,0.13063,0 +2016-03-19,0.10138,0.16346,0.14067,0 +2016-03-20,0.12336,0.22077,0.1493,0 +2016-03-21,0.14569,0.28264,0.15444,0 +2016-03-22,0.1405,0.26198,0.15952,0 +2016-03-23,0.16999,0.34626,0.16372,0 +2016-03-24,0.17338,0.37294,0.1472,0 +2016-03-25,0.18689,0.39202,0.16866,0 +2016-03-26,0.21126,0.44726,0.1865,0 +2016-03-27,0.20333,0.44014,0.16984,0 +2016-03-28,0.19008,0.39546,0.17478,0 +2016-03-29,0.18363,0.38102,0.16988,0 +2016-03-30,0.17301,0.35843,0.1606,0 +2016-03-31,0.18283,0.4032,0.14529,0 +2016-04-01,0.19885,0.44953,0.14701,0 +2016-04-02,0.21453,0.49541,0.14819,0 +2016-04-03,0.17739,0.37041,0.16176,0 +2016-04-04,0.15716,0.29719,0.1743,0 +2016-04-05,0.14951,0.23932,0.20922,0 +2016-04-06,0.1714,0.27592,0.23829,0 +2016-04-07,0.1774,0.27602,0.25618,0 +2016-04-08,0.18201,0.27574,0.2703,0 +2016-04-09,0.18871,0.28204,0.2841,0 +2016-04-10,0.1776,0.22573,0.30707,0 +2016-04-11,0.18182,0.21676,0.32871,0 +2016-04-12,0.18898,0.21488,0.35207,0 +2016-04-13,0.19617,0.21328,0.37523,0 +2016-04-14,0.19908,0.19955,0.39769,0 +2016-04-15,0.1997,0.18747,0.41161,0 +2016-04-16,0.16749,0.075464,0.42701,0 +2016-04-17,0.16866,0.090672,0.41531,0 +2016-04-18,0.17037,0.094117,0.41699,0 +2016-04-19,0.20365,0.089554,0.41027,0.11111 +2016-04-20,0.24852,0.2311,0.40335,0.11111 +2016-04-21,0.32839,0.37418,0.38878,0.22222 +2016-04-22,0.32586,0.37887,0.37649,0.22222 +2016-04-23,0.32166,0.3754,0.36735,0.22222 +2016-04-24,0.35991,0.38804,0.35836,0.33333 +2016-04-25,0.37953,0.45725,0.348,0.33333 +2016-04-26,0.3887,0.4847,0.34808,0.33333 +2016-04-27,0.48122,0.50181,0.49741,0.44444 +2016-04-28,0.49631,0.46522,0.57926,0.44444 +2016-04-29,0.51573,0.46312,0.63962,0.44444 +2016-04-30,0.53377,0.46791,0.68895,0.44444 +2016-05-01,0.54093,0.46101,0.71735,0.44444 +2016-05-02,0.5456,0.45285,0.7395,0.44444 +2016-05-03,0.54136,0.4336,0.74603,0.44444 +2016-05-04,0.53273,0.42044,0.73329,0.44444 +2016-05-05,0.51798,0.41351,0.696,0.44444 +2016-05-06,0.47665,0.3335,0.652,0.44444 +2016-05-07,0.43943,0.26273,0.61111,0.44444 +2016-05-08,0.43437,0.28149,0.57716,0.44444 +2016-05-09,0.4256,0.28994,0.5424,0.44444 +2016-05-10,0.39924,0.247,0.50627,0.44444 +2016-05-11,0.37311,0.20433,0.47055,0.44444 +2016-05-12,0.36256,0.20849,0.43474,0.44444 +2016-05-13,0.35266,0.20228,0.41125,0.44444 +2016-05-14,0.35992,0.24817,0.38714,0.44444 +2016-05-15,0.36472,0.28121,0.3685,0.44444 +2016-05-16,0.35631,0.2783,0.3462,0.44444 +2016-05-17,0.36172,0.28051,0.3602,0.44444 +2016-05-18,0.38257,0.32783,0.37544,0.44444 +2016-05-19,0.35081,0.24796,0.36003,0.44444 +2016-05-20,0.34023,0.23216,0.34409,0.44444 +2016-05-21,0.30227,0.24224,0.33124,0.33333 +2016-05-22,0.30145,0.24704,0.32397,0.33333 +2016-05-23,0.29865,0.2468,0.31582,0.33333 +2016-05-24,0.25989,0.25426,0.30318,0.22222 +2016-05-25,0.2562,0.2578,0.28858,0.22222 +2016-05-26,0.25644,0.24731,0.29978,0.22222 +2016-05-27,0.24481,0.22562,0.28658,0.22222 +2016-05-28,0.51927,0.79242,0.43206,0.33333 +2016-05-29,0.44763,0.48438,0.52518,0.33333 +2016-05-30,0.46925,0.48448,0.58994,0.33333 +2016-05-31,0.48659,0.48457,0.64188,0.33333 +2016-06-01,0.49932,0.48553,0.67909,0.33333 +2016-06-02,0.50929,0.48658,0.70796,0.33333 +2016-06-03,0.53322,0.44013,0.71509,0.44444 +2016-06-04,0.52008,0.418,0.6978,0.44444 +2016-06-05,0.52172,0.43177,0.68895,0.44444 +2016-06-06,0.51352,0.41995,0.67617,0.44444 +2016-06-07,0.50577,0.41208,0.66078,0.44444 +2016-06-08,0.49977,0.41663,0.63825,0.44444 +2016-06-09,0.49645,0.42242,0.62248,0.44444 +2016-06-10,0.49646,0.41751,0.62741,0.44444 +2016-06-11,0.48041,0.38395,0.61282,0.44444 +2016-06-12,0.54993,0.50164,0.5926,0.55556 +2016-06-13,0.55633,0.54339,0.57005,0.55556 +2016-06-14,0.54738,0.53841,0.54817,0.55556 +2016-06-15,0.53491,0.52646,0.52272,0.55556 +2016-06-16,0.53685,0.46037,0.48352,0.66667 +2016-06-17,0.52006,0.44547,0.44805,0.66667 +2016-06-18,0.48217,0.45297,0.43799,0.55556 +2016-06-19,0.47278,0.44865,0.41414,0.55556 +2016-06-20,0.45873,0.43017,0.39045,0.55556 +2016-06-21,0.49413,0.43184,0.38389,0.66667 +2016-06-22,0.57827,0.5595,0.39753,0.77778 +2016-06-23,0.56748,0.54594,0.3787,0.77778 +2016-06-24,0.56235,0.53801,0.37127,0.77778 +2016-06-25,0.5416,0.5131,0.33391,0.77778 +2016-06-26,0.49096,0.49145,0.31476,0.66667 +2016-06-27,0.4878,0.5776,0.33023,0.55556 +2016-06-28,0.48264,0.56013,0.33222,0.55556 +2016-06-29,0.48205,0.55864,0.33195,0.55556 +2016-06-30,0.47175,0.52795,0.33176,0.55556 +2016-07-01,0.46021,0.48869,0.33639,0.55556 +2016-07-02,0.46771,0.5085,0.33908,0.55556 +2016-07-03,0.4395,0.53376,0.34029,0.44444 +2016-07-04,0.42251,0.50525,0.31782,0.44444 +2016-07-05,0.40807,0.48752,0.29226,0.44444 +2016-07-06,0.40009,0.48933,0.26649,0.44444 +2016-07-07,0.37974,0.45212,0.24265,0.44444 +2016-07-08,0.36255,0.42705,0.21615,0.44444 +2016-07-09,0.34474,0.39645,0.19333,0.44444 +2016-07-10,0.34052,0.42976,0.14737,0.44444 +2016-07-11,0.34593,0.46217,0.13118,0.44444 +2016-07-12,0.31257,0.46174,0.14263,0.33333 +2016-07-13,0.31973,0.47144,0.1544,0.33333 +2016-07-14,0.33357,0.48407,0.18329,0.33333 +2016-07-15,0.38028,0.58383,0.22367,0.33333 +2016-07-16,0.38224,0.65423,0.27027,0.22222 +2016-07-17,0.39283,0.64879,0.30748,0.22222 +2016-07-18,0.39965,0.63566,0.34106,0.22222 +2016-07-19,0.42028,0.66073,0.3779,0.22222 +2016-07-20,0.44895,0.70842,0.4162,0.22222 +2016-07-21,0.35943,0.51742,0.44977,0.11111 +2016-07-22,0.2975,0.4303,0.46221,0 +2016-07-23,0.28347,0.36433,0.48609,0 +2016-07-24,0.32467,0.47041,0.5036,0 +2016-07-25,0.36114,0.5692,0.51422,0 +2016-07-26,0.34698,0.52593,0.515,0 +2016-07-27,0.34911,0.56358,0.48375,0 +2016-07-28,0.34827,0.57903,0.46579,0 +2016-07-29,0.38234,0.6437,0.5033,0 +2016-07-30,0.42328,0.73093,0.5389,0 +2016-07-31,0.41762,0.70378,0.54907,0 +2016-08-01,0.4062,0.66639,0.55222,0 +2016-08-02,0.4236,0.61068,0.54901,0.11111 +2016-08-03,0.42473,0.60717,0.5559,0.11111 +2016-08-04,0.42886,0.6089,0.56657,0.11111 +2016-08-05,0.4451,0.64783,0.57635,0.11111 +2016-08-06,0.43236,0.59694,0.58903,0.11111 +2016-08-07,0.42912,0.58493,0.5913,0.11111 +2016-08-08,0.43663,0.60137,0.59741,0.11111 +2016-08-09,0.44137,0.59901,0.61398,0.11111 +2016-08-10,0.4567,0.61842,0.64058,0.11111 +2016-08-11,0.46851,0.62361,0.67081,0.11111 +2016-08-12,0.48141,0.63129,0.70183,0.11111 +2016-08-13,0.49639,0.63515,0.7429,0.11111 +2016-08-14,0.49589,0.61763,0.75894,0.11111 +2016-08-15,0.50013,0.62216,0.76713,0.11111 +2016-08-16,0.50354,0.62668,0.77282,0.11111 +2016-08-17,0.50477,0.62104,0.78215,0.11111 +2016-08-18,0.50672,0.62421,0.78485,0.11111 +2016-08-19,0.509,0.63107,0.78483,0.11111 +2016-08-20,0.51266,0.64456,0.78232,0.11111 +2016-08-21,0.52116,0.65142,0.80095,0.11111 +2016-08-22,0.5285,0.65166,0.82274,0.11111 +2016-08-23,0.5335,0.65268,0.8367,0.11111 +2016-08-24,0.53969,0.65541,0.85256,0.11111 +2016-08-25,0.54403,0.65426,0.86673,0.11111 +2016-08-26,0.54837,0.65312,0.88088,0.11111 +2016-08-27,0.54764,0.6415,0.89031,0.11111 +2016-08-28,0.54177,0.632,0.8822,0.11111 +2016-08-29,0.55986,0.69142,0.87705,0.11111 +2016-08-30,0.5613,0.66829,0.9045,0.11111 +2016-08-31,0.63068,0.84456,0.93637,0.11111 +2016-09-01,0.46182,0.41423,0.97123,0 +2016-09-02,0.38605,0.16915,0.98899,0 +2016-09-03,0.41723,0.17691,0.96366,0.11111 +2016-09-04,0.46106,0.35727,0.91481,0.11111 +2016-09-05,0.41639,0.33553,0.80253,0.11111 +2016-09-06,0.35572,0.34031,0.61574,0.11111 +2016-09-07,0.21876,0.33501,0.21016,0.11111 +2016-09-08,0.21253,0.32503,0.20144,0.11111 +2016-09-09,0.20941,0.30687,0.21024,0.11111 +2016-09-10,0.21036,0.30776,0.21222,0.11111 +2016-09-11,0.22266,0.23089,0.21487,0.22222 +2016-09-12,0.21308,0.22191,0.19511,0.22222 +2016-09-13,0.22592,0.2604,0.19515,0.22222 +2016-09-14,0.23553,0.29061,0.19377,0.22222 +2016-09-15,0.23823,0.29817,0.19429,0.22222 +2016-09-16,0.2404,0.30382,0.19517,0.22222 +2016-09-17,0.24271,0.31002,0.19589,0.22222 +2016-09-18,0.25945,0.32065,0.23548,0.22222 +2016-09-19,0.27539,0.33358,0.27037,0.22222 +2016-09-20,0.29382,0.35708,0.30217,0.22222 +2016-09-21,0.28478,0.32719,0.30492,0.22222 +2016-09-22,0.27258,0.29465,0.30086,0.22222 +2016-09-23,0.26457,0.28288,0.28861,0.22222 +2016-09-24,0.25557,0.26609,0.27838,0.22222 +2016-09-25,0.26356,0.29832,0.27014,0.22222 +2016-09-26,0.2592,0.29115,0.26423,0.22222 +2016-09-27,0.25486,0.28118,0.26118,0.22222 +2016-09-28,0.25839,0.28599,0.26696,0.22222 +2016-09-29,0.2648,0.29603,0.27613,0.22222 +2016-09-30,0.26893,0.29473,0.28985,0.22222 +2016-10-01,0.27261,0.29349,0.30213,0.22222 +2016-10-02,0.2878,0.32824,0.31294,0.22222 +2016-10-03,0.16806,0.058896,0.33417,0.11111 +2016-10-04,0.18032,0.07946,0.35038,0.11111 +2016-10-05,0.18615,0.085321,0.362,0.11111 +2016-10-06,0.19141,0.094384,0.36873,0.11111 +2016-10-07,0.18143,0.057624,0.37556,0.11111 +2016-10-08,0.17599,0.02659,0.39027,0.11111 +2016-10-09,0.17704,0.029295,0.39072,0.11111 +2016-10-10,0.18849,0.039265,0.41508,0.11111 +2016-10-11,0.20657,0.10546,0.40313,0.11111 +2016-10-12,0.24517,0.22458,0.39981,0.11111 +2016-10-13,0.23946,0.20887,0.39839,0.11111 +2016-10-14,0.23992,0.20943,0.39921,0.11111 +2016-10-15,0.24676,0.20974,0.41943,0.11111 +2016-10-16,0.24674,0.19556,0.43355,0.11111 +2016-10-17,0.25304,0.19864,0.44938,0.11111 +2016-10-18,0.253,0.20592,0.44197,0.11111 +2016-10-19,0.23804,0.17623,0.42676,0.11111 +2016-10-20,0.23738,0.18954,0.4115,0.11111 +2016-10-21,0.25585,0.23403,0.42239,0.11111 +2016-10-22,0.29443,0.21666,0.44441,0.22222 +2016-10-23,0.28355,0.16401,0.46443,0.22222 +2016-10-24,0.28694,0.15831,0.48029,0.22222 +2016-10-25,0.29265,0.16585,0.48988,0.22222 +2016-10-26,0.34004,0.18234,0.50444,0.33333 +2016-10-27,0.36575,0.2507,0.51321,0.33333 +2016-10-28,0.35561,0.22598,0.50751,0.33333 +2016-10-29,0.37434,0.1823,0.49628,0.44444 +2016-10-30,0.3989,0.26182,0.49042,0.44444 +2016-10-31,0.38863,0.24188,0.47955,0.44444 +2016-11-01,0.40656,0.18399,0.48013,0.55556 +2016-11-02,0.40984,0.21378,0.46018,0.55556 +2016-11-03,0.4989,0.26908,0.56096,0.66667 +2016-11-04,0.53195,0.3173,0.61188,0.66667 +2016-11-05,0.52597,0.29516,0.61608,0.66667 +2016-11-06,0.52052,0.29005,0.60485,0.66667 +2016-11-07,0.50945,0.27814,0.58353,0.66667 +2016-11-08,0.49252,0.26642,0.54446,0.66667 +2016-11-09,0.48715,0.29063,0.50416,0.66667 +2016-11-10,0.45458,0.30535,0.50282,0.55556 +2016-11-11,0.45513,0.30013,0.50971,0.55556 +2016-11-12,0.44983,0.28303,0.5109,0.55556 +2016-11-13,0.44598,0.26797,0.5144,0.55556 +2016-11-14,0.44754,0.26649,0.52057,0.55556 +2016-11-15,0.447,0.25977,0.52568,0.55556 +2016-11-16,0.46924,0.22512,0.51593,0.66667 +2016-11-17,0.44077,0.18181,0.47383,0.66667 +2016-11-18,0.42619,0.17591,0.436,0.66667 +2016-11-19,0.40722,0.15408,0.4009,0.66667 +2016-11-20,0.39574,0.1634,0.35716,0.66667 +2016-11-21,0.36659,0.19565,0.34855,0.55556 +2016-11-22,0.35544,0.17101,0.33977,0.55556 +2016-11-23,0.35006,0.15391,0.34071,0.55556 +2016-11-24,0.36013,0.18368,0.34115,0.55556 +2016-11-25,0.33167,0.20399,0.34656,0.44444 +2016-11-26,0.33671,0.21525,0.35045,0.44444 +2016-11-27,0.35771,0.2602,0.36849,0.44444 +2016-11-28,0.32773,0.2617,0.38816,0.33333 +2016-11-29,0.34905,0.28533,0.42848,0.33333 +2016-11-30,0.37542,0.33453,0.45841,0.33333 +2016-12-01,0.34575,0.32836,0.48667,0.22222 +2016-12-02,0.34961,0.32538,0.50121,0.22222 +2016-12-03,0.24024,0.11779,0.49182,0.11111 +2016-12-04,0.24676,0.15816,0.471,0.11111 +2016-12-05,0.22925,0.13596,0.44069,0.11111 +2016-12-06,0.21218,0.12602,0.3994,0.11111 +2016-12-07,0.19465,0.13636,0.33649,0.11111 +2016-12-08,0.18329,0.15694,0.28183,0.11111 +2016-12-09,0.16502,0.17681,0.20713,0.11111 +2016-12-10,0.17712,0.20036,0.21989,0.11111 +2016-12-11,0.18903,0.22882,0.22716,0.11111 +2016-12-12,0.20159,0.23617,0.25749,0.11111 +2016-12-13,0.20333,0.21316,0.28571,0.11111 +2016-12-14,0.22192,0.2427,0.31196,0.11111 +2016-12-15,0.23432,0.2574,0.33444,0.11111 +2016-12-16,0.22855,0.33774,0.34792,0 +2016-12-17,0.23758,0.3535,0.35923,0 +2016-12-18,0.25396,0.3896,0.37228,0 +2016-12-19,0.31915,0.55661,0.40085,0 +2016-12-20,0.30666,0.52276,0.39723,0 +2016-12-21,0.32275,0.49627,0.36087,0.11111 +2016-12-22,0.43424,0.76177,0.31871,0.22222 +2016-12-23,0.54609,0.92119,0.38376,0.33333 +2016-12-24,0.55791,0.84708,0.49332,0.33333 +2016-12-25,0.5724,0.81352,0.57035,0.33333 +2016-12-26,0.58694,0.8077,0.61977,0.33333 +2016-12-27,0.59044,0.7952,0.64278,0.33333 +2016-12-28,0.6372,0.81433,0.65282,0.44444 +2016-12-29,0.60344,0.72622,0.63967,0.44444 +2016-12-30,0.59451,0.72408,0.615,0.44444 +2016-12-31,0.58789,0.72708,0.59213,0.44444 +2017-01-01,0.57298,0.693,0.5815,0.44444 +2017-01-02,0.57163,0.69982,0.57064,0.44444 +2017-01-03,0.57228,0.71534,0.55705,0.44444 +2017-01-04,0.59719,0.64959,0.58644,0.55556 +2017-01-05,0.79475,0.93348,0.78411,0.66667 +2017-01-06,0.90958,1,0.95095,0.77778 +2017-01-07,0.876,0.85023,1,0.77778 +2017-01-08,0.87553,0.8488,1,0.77778 +2017-01-09,0.86874,0.84775,0.98069,0.77778 +2017-01-10,0.85882,0.84916,0.94953,0.77778 +2017-01-11,0.82379,0.68449,0.89798,0.88889 +2017-01-12,0.78098,0.60946,0.8446,0.88889 +2017-01-13,0.758,0.59738,0.78773,0.88889 +2017-01-14,0.73742,0.5905,0.73288,0.88889 +2017-01-15,0.72043,0.59234,0.68007,0.88889 +2017-01-16,0.70224,0.58941,0.62843,0.88889 +2017-01-17,0.67004,0.54265,0.57857,0.88889 +2017-01-18,0.64354,0.5096,0.53214,0.88889 +2017-01-19,0.63135,0.51759,0.48758,0.88889 +2017-01-20,0.58842,0.52744,0.46005,0.77778 +2017-01-21,0.54398,0.53001,0.43526,0.66667 +2017-01-22,0.50512,0.53739,0.42242,0.55556 +2017-01-23,0.50641,0.54745,0.41623,0.55556 +2017-01-24,0.50757,0.53811,0.42904,0.55556 +2017-01-25,0.51209,0.53662,0.44409,0.55556 +2017-01-26,0.51892,0.54298,0.45822,0.55556 +2017-01-27,0.49186,0.55794,0.4732,0.44444 +2017-01-28,0.50055,0.56248,0.49473,0.44444 +2017-01-29,0.5065,0.56695,0.5081,0.44444 +2017-01-30,0.51441,0.58306,0.51573,0.44444 +2017-01-31,0.51026,0.56778,0.51855,0.44444 +2017-02-01,0.50862,0.56007,0.52135,0.44444 +2017-02-02,0.51908,0.58966,0.52312,0.44444 +2017-02-03,0.45401,0.48353,0.54517,0.33333 +2017-02-04,0.35251,0.25973,0.57557,0.22222 +2017-02-05,0.33492,0.30442,0.58924,0.11111 +2017-02-06,0.33581,0.29775,0.59858,0.11111 +2017-02-07,0.33887,0.28949,0.61599,0.11111 +2017-02-08,0.34022,0.28198,0.62758,0.11111 +2017-02-09,0.35568,0.35122,0.60471,0.11111 +2017-02-10,0.25129,0.16912,0.58474,0 +2017-02-11,0.24001,0.16385,0.55619,0 +2017-02-12,0.23548,0.17116,0.53527,0 +2017-02-13,0.2249,0.16795,0.50674,0 +2017-02-14,0.20987,0.16335,0.46628,0 +2017-02-15,0.19431,0.17961,0.4033,0 +2017-02-16,0.095865,0.045471,0.24212,0 +2017-02-17,0.10121,0.04807,0.25555,0 +2017-02-18,0.10351,0.042081,0.26846,0 +2017-02-19,0.11532,0.07115,0.27482,0 +2017-02-20,0.11724,0.076543,0.27519,0 +2017-02-21,0.11963,0.096322,0.26257,0 +2017-02-22,0.10925,0.091021,0.23672,0 +2017-02-23,0.13662,0.060066,0.23867,0.11111 +2017-02-24,0.12901,0.036907,0.239,0.11111 +2017-02-25,0.12598,0.026671,0.24016,0.11111 +2017-02-26,0.11693,0,0.23968,0.11111 +2017-02-27,0.11467,0,0.2329,0.11111 +2017-02-28,0.11229,0,0.22576,0.11111 +2017-03-01,0.1144,0.013937,0.21815,0.11111 +2017-03-02,0.10967,0,0.21791,0.11111 +2017-03-03,0.10964,0.00015003,0.21766,0.11111 +2017-03-04,0.11097,0,0.22179,0.11111 +2017-03-05,0.11326,0.0031869,0.22547,0.11111 +2017-03-06,0.11993,0.021044,0.22764,0.11111 +2017-03-07,0.1135,0,0.22939,0.11111 +2017-03-08,0.21227,0.17128,0.24331,0.22222 +2017-03-09,0.24227,0.25921,0.24537,0.22222 +2017-03-10,0.33214,0.40962,0.25347,0.33333 +2017-03-11,0.41944,0.62273,0.30226,0.33333 +2017-03-12,0.44539,0.64788,0.35495,0.33333 +2017-03-13,0.44751,0.61314,0.39607,0.33333 +2017-03-14,0.45563,0.61201,0.42153,0.33333 +2017-03-15,0.45978,0.62034,0.42568,0.33333 +2017-03-16,0.44223,0.55751,0.43584,0.33333 +2017-03-17,0.51125,0.63903,0.45026,0.44444 +2017-03-18,0.60825,0.80838,0.46081,0.55556 +2017-03-19,0.61201,0.80775,0.47272,0.55556 +2017-03-20,0.59716,0.76347,0.47244,0.55556 +2017-03-21,0.59135,0.74013,0.47836,0.55556 +2017-03-22,0.59756,0.75992,0.47719,0.55556 +2017-03-23,0.58275,0.72289,0.46981,0.55556 +2017-03-24,0.59127,0.64518,0.46198,0.66667 +2017-03-25,0.54299,0.63239,0.44103,0.55556 +2017-03-26,0.53083,0.62154,0.41541,0.55556 +2017-03-27,0.50747,0.56381,0.40304,0.55556 +2017-03-28,0.47765,0.49393,0.38347,0.55556 +2017-03-29,0.4714,0.49872,0.35994,0.55556 +2017-03-30,0.46931,0.51918,0.33319,0.55556 +2017-03-31,0.46226,0.51271,0.31852,0.55556 +2017-04-01,0.45083,0.49833,0.29861,0.55556 +2017-04-02,0.44549,0.50085,0.28006,0.55556 +2017-04-03,0.43708,0.48475,0.27092,0.55556 +2017-04-04,0.42418,0.45778,0.25922,0.55556 +2017-04-05,0.4297,0.48589,0.24766,0.55556 +2017-04-06,0.42584,0.47225,0.2497,0.55556 +2017-04-07,0.38953,0.46208,0.26206,0.44444 +2017-04-08,0.40504,0.49536,0.27532,0.44444 +2017-04-09,0.37637,0.50385,0.29192,0.33333 +2017-04-10,0.39037,0.5194,0.31836,0.33333 +2017-04-11,0.40528,0.53612,0.34639,0.33333 +2017-04-12,0.41366,0.5332,0.37444,0.33333 +2017-04-13,0.42264,0.52163,0.41295,0.33333 +2017-04-14,0.43978,0.54006,0.44595,0.33333 +2017-04-15,0.45165,0.54016,0.48145,0.33333 +2017-04-16,0.39471,0.44353,0.51838,0.22222 +2017-04-17,0.32739,0.31714,0.55391,0.11111 +2017-04-18,0.34307,0.332,0.58611,0.11111 +2017-04-19,0.35922,0.35017,0.61638,0.11111 +2017-04-20,0.3419,0.26375,0.65085,0.11111 +2017-04-21,0.35667,0.28371,0.67519,0.11111 +2017-04-22,0.37693,0.32658,0.69311,0.11111 +2017-04-23,0.26944,0.13395,0.67436,0 +2017-04-24,0.27396,0.16158,0.66029,0 +2017-04-25,0.27433,0.17252,0.65047,0 +2017-04-26,0.28204,0.25546,0.59067,0 +2017-04-27,0.25108,0.23432,0.51891,0 +2017-04-28,0.21344,0.20246,0.43786,0 +2017-04-29,0.17367,0.22536,0.29564,0 +2017-04-30,0.16872,0.2334,0.27275,0 +2017-05-01,0.21431,0.29903,0.2328,0.11111 +2017-05-02,0.20938,0.32866,0.18836,0.11111 +2017-05-03,0.21908,0.36054,0.18558,0.11111 +2017-05-04,0.22463,0.38337,0.1794,0.11111 +2017-05-05,0.23668,0.42576,0.17318,0.11111 +2017-05-06,0.25977,0.505,0.16322,0.11111 +2017-05-07,0.24866,0.48307,0.15179,0.11111 +2017-05-08,0.25745,0.40337,0.14675,0.22222 +2017-05-09,0.2498,0.38366,0.14352,0.22222 +2017-05-10,0.25122,0.37925,0.1522,0.22222 +2017-05-11,0.25333,0.37518,0.16259,0.22222 +2017-05-12,0.37136,0.45949,0.32127,0.33333 +2017-05-13,0.43698,0.56142,0.41619,0.33333 +2017-05-14,0.43152,0.48776,0.47345,0.33333 +2017-05-15,0.4211,0.43765,0.49232,0.33333 +2017-05-16,0.40782,0.39145,0.49869,0.33333 +2017-05-17,0.42771,0.32341,0.51529,0.44444 +2017-05-18,0.42623,0.31462,0.51964,0.44444 +2017-05-19,0.41565,0.30095,0.50156,0.44444 +2017-05-20,0.41101,0.3255,0.46308,0.44444 +2017-05-21,0.38563,0.28322,0.42923,0.44444 +2017-05-22,0.40045,0.25574,0.39006,0.55556 +2017-05-23,0.45921,0.34605,0.36492,0.66667 +2017-05-24,0.47172,0.39765,0.35083,0.66667 +2017-05-25,0.47465,0.40565,0.35164,0.66667 +2017-05-26,0.48073,0.41636,0.35915,0.66667 +2017-05-27,0.4928,0.4325,0.37924,0.66667 +2017-05-28,0.49,0.40893,0.39441,0.66667 +2017-05-29,0.48005,0.37768,0.39582,0.66667 +2017-05-30,0.4781,0.39495,0.37267,0.66667 +2017-05-31,0.44096,0.41005,0.35728,0.55556 +2017-06-01,0.43175,0.40144,0.33826,0.55556 +2017-06-02,0.41851,0.38653,0.31345,0.55556 +2017-06-03,0.41034,0.38394,0.29154,0.55556 +2017-06-04,0.41002,0.40982,0.26469,0.55556 +2017-06-05,0.36026,0.29596,0.22927,0.55556 +2017-06-06,0.38647,0.39795,0.20592,0.55556 +2017-06-07,0.36427,0.46342,0.18496,0.44444 +2017-06-08,0.34306,0.42061,0.16412,0.44444 +2017-06-09,0.3435,0.44332,0.14275,0.44444 +2017-06-10,0.33968,0.45472,0.11986,0.44444 +2017-06-11,0.29806,0.43946,0.1214,0.33333 +2017-06-12,0.29115,0.30146,0.12754,0.44444 +2017-06-13,0.26637,0.22603,0.12863,0.44444 +2017-06-14,0.25151,0.17831,0.13179,0.44444 +2017-06-15,0.24428,0.15661,0.13178,0.44444 +2017-06-16,0.22384,0.20379,0.13441,0.33333 +2017-06-17,0.22394,0.2007,0.1378,0.33333 +2017-06-18,0.22161,0.19826,0.13324,0.33333 +2017-06-19,0.22203,0.20681,0.12594,0.33333 +2017-06-20,0.22442,0.21925,0.12069,0.33333 +2017-06-21,0.17529,0.18682,0.11682,0.22222 +2017-06-22,0.15089,0.22904,0.11253,0.11111 +2017-06-23,0.15988,0.26096,0.10756,0.11111 +2017-06-24,0.15628,0.24084,0.11688,0.11111 +2017-06-25,0.14985,0.20786,0.13058,0.11111 +2017-06-26,0.13247,0.1537,0.1326,0.11111 +2017-06-27,0.12855,0.13946,0.1351,0.11111 +2017-06-28,0.13207,0.14881,0.13627,0.11111 +2017-06-29,0.14239,0.17471,0.14136,0.11111 +2017-06-30,0.14165,0.16687,0.14697,0.11111 +2017-07-01,0.14673,0.17011,0.15898,0.11111 +2017-07-02,0.1496,0.17176,0.16592,0.11111 +2017-07-03,0.14213,0.13515,0.18014,0.11111 +2017-07-04,0.16602,0.18935,0.1976,0.11111 +2017-07-05,0.15806,0.14562,0.21744,0.11111 +2017-07-06,0.16373,0.15113,0.22893,0.11111 +2017-07-07,0.16671,0.14317,0.24584,0.11111 +2017-07-08,0.17083,0.1374,0.26398,0.11111 +2017-07-09,0.18221,0.15409,0.28143,0.11111 +2017-07-10,0.1879,0.16448,0.2881,0.11111 +2017-07-11,0.21115,0.22513,0.29722,0.11111 +2017-07-12,0.1705,0.22575,0.28576,0 +2017-07-13,0.17014,0.22948,0.28095,0 +2017-07-14,0.16619,0.23791,0.26066,0 +2017-07-15,0.27482,0.46959,0.24375,0.11111 +2017-07-16,0.2704,0.47973,0.22036,0.11111 +2017-07-17,0.33007,0.46655,0.30142,0.22222 +2017-07-18,0.3538,0.46818,0.371,0.22222 +2017-07-19,0.37683,0.47509,0.43316,0.22222 +2017-07-20,0.43754,0.39501,0.58427,0.33333 +2017-07-21,0.47024,0.40933,0.66806,0.33333 +2017-07-22,0.47353,0.40034,0.68692,0.33333 +2017-07-23,0.4766,0.40257,0.6939,0.33333 +2017-07-24,0.47828,0.41324,0.68828,0.33333 +2017-07-25,0.47173,0.40211,0.67975,0.33333 +2017-07-26,0.46584,0.39333,0.67085,0.33333 +2017-07-27,0.45717,0.38358,0.65459,0.33333 +2017-07-28,0.44813,0.37141,0.63965,0.33333 +2017-07-29,0.44025,0.36123,0.62619,0.33333 +2017-07-30,0.43515,0.36033,0.61179,0.33333 +2017-07-31,0.42631,0.35565,0.58995,0.33333 +2017-08-01,0.41973,0.35064,0.5752,0.33333 +2017-08-02,0.4074,0.33309,0.55579,0.33333 +2017-08-03,0.39625,0.31924,0.53619,0.33333 +2017-08-04,0.38065,0.2898,0.51883,0.33333 +2017-08-05,0.36305,0.26714,0.48867,0.33333 +2017-08-06,0.3406,0.22708,0.46138,0.33333 +2017-08-07,0.32654,0.21431,0.43197,0.33333 +2017-08-08,0.32064,0.219,0.40958,0.33333 +2017-08-09,0.32201,0.23913,0.39357,0.33333 +2017-08-10,0.31658,0.2421,0.3743,0.33333 +2017-08-11,0.30251,0.2171,0.3571,0.33333 +2017-08-12,0.3017,0.22327,0.34849,0.33333 +2017-08-13,0.29848,0.2157,0.34641,0.33333 +2017-08-14,0.26664,0.2243,0.35339,0.22222 +2017-08-15,0.26944,0.23347,0.35264,0.22222 +2017-08-16,0.23764,0.23406,0.36777,0.11111 +2017-08-17,0.24048,0.23197,0.37835,0.11111 +2017-08-18,0.26549,0.30035,0.38501,0.11111 +2017-08-19,0.16709,0.14465,0.35663,0 +2017-08-20,0.15558,0.15405,0.3127,0 +2017-08-21,0.15466,0.16889,0.29508,0 +2017-08-22,0.14315,0.1653,0.26416,0 +2017-08-23,0.15525,0.21803,0.24773,0 +2017-08-24,0.13767,0.23375,0.17926,0 +2017-08-25,0.10142,0.24091,0.063347,0 +2017-08-26,0.1162,0.26683,0.081761,0 +2017-08-27,0.13848,0.30722,0.10824,0 +2017-08-28,0.16269,0.34328,0.1448,0 +2017-08-29,0.16825,0.33543,0.16932,0 +2017-08-30,0.16555,0.30889,0.18776,0 +2017-08-31,0.18442,0.34124,0.21203,0 +2017-09-01,0.19149,0.34493,0.22955,0 +2017-09-02,0.19573,0.35757,0.22963,0 +2017-09-03,0.17833,0.30555,0.22943,0 +2017-09-04,0.21376,0.30412,0.22605,0.11111 +2017-09-05,0.22027,0.33204,0.21767,0.11111 +2017-09-06,0.22687,0.35547,0.21404,0.11111 +2017-09-07,0.21605,0.31519,0.22186,0.11111 +2017-09-08,0.22788,0.22827,0.23316,0.22222 +2017-09-09,0.21922,0.19731,0.23814,0.22222 +2017-09-10,0.19417,0.12102,0.23926,0.22222 +2017-09-11,0.18293,0.086708,0.23987,0.22222 +2017-09-12,0.17609,0.067402,0.23865,0.22222 +2017-09-13,0.1607,0.021143,0.23874,0.22222 +2017-09-14,0.32587,0.34907,0.29521,0.33333 +2017-09-15,0.50851,0.66279,0.41831,0.44444 +2017-09-16,0.50567,0.57821,0.49436,0.44444 +2017-09-17,0.52677,0.58959,0.54627,0.44444 +2017-09-18,0.56658,0.54141,0.60279,0.55556 +2017-09-19,0.57148,0.52192,0.63696,0.55556 +2017-09-20,0.57287,0.51949,0.64358,0.55556 +2017-09-21,0.5584,0.49801,0.62164,0.55556 +2017-09-22,0.54258,0.48015,0.59205,0.55556 +2017-09-23,0.53474,0.47897,0.5697,0.55556 +2017-09-24,0.52052,0.46572,0.54028,0.55556 +2017-09-25,0.50732,0.44719,0.51923,0.55556 +2017-09-26,0.48929,0.41813,0.49417,0.55556 +2017-09-27,0.47213,0.40294,0.45788,0.55556 +2017-09-28,0.45886,0.38617,0.43486,0.55556 +2017-09-29,0.45577,0.39865,0.41311,0.55556 +2017-09-30,0.44725,0.3987,0.3875,0.55556 +2017-10-01,0.44246,0.40122,0.37062,0.55556 +2017-10-02,0.45346,0.42802,0.37679,0.55556 +2017-10-03,0.46521,0.45915,0.38092,0.55556 +2017-10-04,0.44049,0.46873,0.40828,0.44444 +2017-10-05,0.45018,0.47344,0.43265,0.44444 +2017-10-06,0.463,0.48484,0.45972,0.44444 +2017-10-07,0.48572,0.52002,0.49271,0.44444 +2017-10-08,0.46658,0.54545,0.52095,0.33333 +2017-10-09,0.47289,0.54067,0.54467,0.33333 +2017-10-10,0.48108,0.53679,0.57313,0.33333 +2017-10-11,0.49227,0.53831,0.60518,0.33333 +2017-10-12,0.48196,0.50818,0.60436,0.33333 +2017-10-13,0.47352,0.48688,0.60036,0.33333 +2017-10-14,0.31894,0.11932,0.61528,0.22222 +2017-10-15,0.29543,0.16495,0.61022,0.11111 +2017-10-16,0.28686,0.14998,0.59949,0.11111 +2017-10-17,0.29298,0.18743,0.58041,0.11111 +2017-10-18,0.2215,0.13943,0.52507,0 +2017-10-19,0.20392,0.15352,0.45825,0 +2017-10-20,0.17312,0.18173,0.33763,0 +2017-10-21,0.16599,0.20428,0.29369,0 +2017-10-22,0.18006,0.24899,0.2912,0 +2017-10-23,0.17828,0.25922,0.27562,0 +2017-10-24,0.15556,0.22978,0.23691,0 +2017-10-25,0.1728,0.28669,0.23171,0 +2017-10-26,0.18405,0.32375,0.22839,0 +2017-10-27,0.19293,0.36981,0.20898,0 +2017-10-28,0.18664,0.35271,0.20722,0 +2017-10-29,0.17981,0.32786,0.21158,0 +2017-10-30,0.16972,0.2938,0.21535,0 +2017-10-31,0.15661,0.25406,0.21577,0 +2017-11-01,0.16074,0.26747,0.21474,0 +2017-11-02,0.16411,0.27795,0.21439,0 +2017-11-03,0.15761,0.2682,0.20463,0 +2017-11-04,0.15592,0.26523,0.20253,0 +2017-11-05,0.1536,0.25726,0.20353,0 +2017-11-06,0.14,0.24029,0.17972,0 +2017-11-07,0.13114,0.22671,0.1667,0 +2017-11-08,0.12717,0.22425,0.15725,0 +2017-11-09,0.11336,0.2015,0.13858,0 +2017-11-10,0.13741,0.30857,0.10364,0 +2017-11-11,0.13401,0.2972,0.10482,0 +2017-11-12,0.1427,0.32051,0.10759,0 +2017-11-13,0.23535,0.44438,0.15057,0.11111 +2017-11-14,0.21643,0.35729,0.18089,0.11111 +2017-11-15,0.24475,0.28048,0.23157,0.22222 +2017-11-16,0.28331,0.35186,0.27585,0.22222 +2017-11-17,0.27276,0.30134,0.29472,0.22222 +2017-11-18,0.28044,0.33095,0.28815,0.22222 +2017-11-19,0.28495,0.35665,0.27599,0.22222 +2017-11-20,0.26577,0.31271,0.26238,0.22222 +2017-11-21,0.25189,0.2918,0.24164,0.22222 +2017-11-22,0.26559,0.34296,0.23159,0.22222 +2017-11-23,0.27281,0.34764,0.24857,0.22222 +2017-11-24,0.2818,0.35392,0.26924,0.22222 +2017-11-25,0.27822,0.33428,0.27815,0.22222 +2017-11-26,0.27755,0.33065,0.27977,0.22222 +2017-11-27,0.2948,0.38251,0.27968,0.22222 +2017-11-28,0.31139,0.42312,0.28882,0.22222 +2017-11-29,0.32724,0.46666,0.29284,0.22222 +2017-11-30,0.32956,0.4671,0.29935,0.22222 +2017-12-01,0.32692,0.45553,0.30301,0.22222 +2017-12-02,0.31463,0.41444,0.30722,0.22222 +2017-12-03,0.31724,0.42183,0.30766,0.22222 +2017-12-04,0.31108,0.40651,0.30451,0.22222 +2017-12-05,0.32023,0.4405,0.29797,0.22222 +2017-12-06,0.32428,0.33928,0.30023,0.33333 +2017-12-07,0.51464,0.76074,0.33874,0.44444 +2017-12-08,0.51689,0.70506,0.40117,0.44444 +2017-12-09,0.54252,0.71545,0.46766,0.44444 +2017-12-10,0.55295,0.69969,0.5147,0.44444 +2017-12-11,0.55625,0.67955,0.54475,0.44444 +2017-12-12,0.55623,0.66107,0.56318,0.44444 +2017-12-13,0.53255,0.68823,0.5761,0.33333 +2017-12-14,0.54047,0.71252,0.57556,0.33333 +2017-12-15,0.49689,0.69104,0.57741,0.22222 +2017-12-16,0.50431,0.7077,0.58301,0.22222 +2017-12-17,0.49327,0.67163,0.58597,0.22222 +2017-12-18,0.49701,0.67838,0.59044,0.22222 +2017-12-19,0.48642,0.65418,0.58286,0.22222 +2017-12-20,0.47975,0.647,0.57004,0.22222 +2017-12-21,0.47242,0.63593,0.5591,0.22222 +2017-12-22,0.4567,0.61196,0.53592,0.22222 +2017-12-23,0.44066,0.59366,0.5061,0.22222 +2017-12-24,0.43123,0.59665,0.47482,0.22222 +2017-12-25,0.42327,0.59563,0.45194,0.22222 +2017-12-26,0.39655,0.53625,0.43116,0.22222 +2017-12-27,0.37334,0.48729,0.4105,0.22222 +2017-12-28,0.35599,0.46132,0.38443,0.22222 +2017-12-29,0.33999,0.43496,0.36277,0.22222 +2017-12-30,0.31643,0.39654,0.33053,0.22222 +2017-12-31,0.31262,0.41497,0.30065,0.22222 +2018-01-01,0.29153,0.38271,0.26966,0.22222 +2018-01-02,0.27098,0.35678,0.23395,0.22222 +2018-01-03,0.24627,0.32317,0.19341,0.22222 +2018-01-04,0.2607,0.4089,0.15098,0.22222 +2018-01-05,0.12284,0.11543,0.14198,0.11111 +2018-01-06,0.051685,0,0.15506,0 +2018-01-07,0.052107,0,0.15632,0 +2018-01-08,0.052495,0.016422,0.14106,0 +2018-01-09,0.049616,0.025278,0.12357,0 +2018-01-10,0.049563,0.051106,0.097583,0 +2018-01-11,0.030936,0.032977,0.059832,0 +2018-01-12,0.018045,0.021451,0.032682,0 +2018-01-13,0.022969,0.033545,0.035363,0 +2018-01-14,0.02462,0.035606,0.038253,0 +2018-01-15,0.038283,0.075856,0.038992,0 +2018-01-16,0.049391,0,0.03706,0.11111 +2018-01-17,0.045944,0,0.026722,0.11111 +2018-01-18,0.051816,0.021351,0.022985,0.11111 +2018-01-19,0.060838,0.051889,0.019515,0.11111 +2018-01-20,0.05316,0.026801,0.021567,0.11111 +2018-01-21,0.063795,0.050889,0.029385,0.11111 +2018-01-22,0.066536,0.057865,0.03063,0.11111 +2018-01-23,0.064176,0.054724,0.026693,0.11111 +2018-01-24,0.07841,0.10153,0.022587,0.11111 +2018-01-25,0.090594,0.13988,0.020793,0.11111 +2018-01-26,0.10628,0.18773,0.020008,0.11111 +2018-01-27,0.1219,0.22421,0.030395,0.11111 +2018-01-28,0.15175,0.27602,0.068106,0.11111 +2018-01-29,0.14867,0.22747,0.10742,0.11111 +2018-01-30,0.15108,0.23253,0.1096,0.11111 +2018-01-31,0.14496,0.21109,0.11269,0.11111 +2018-02-01,0.14253,0.20336,0.11313,0.11111 +2018-02-02,0.13531,0.18179,0.11303,0.11111 +2018-02-03,0.14154,0.19972,0.11379,0.11111 +2018-02-04,0.1495,0.22674,0.11065,0.11111 +2018-02-05,0.22079,0.33286,0.10729,0.22222 +2018-02-06,0.25162,0.40976,0.12288,0.22222 +2018-02-07,0.24942,0.39102,0.13503,0.22222 +2018-02-08,0.24811,0.37361,0.14851,0.22222 +2018-02-09,0.2588,0.39255,0.16163,0.22222 +2018-02-10,0.26576,0.40252,0.17254,0.22222 +2018-02-11,0.26358,0.39626,0.17226,0.22222 +2018-02-12,0.26142,0.39188,0.17015,0.22222 +2018-02-13,0.25457,0.37238,0.16912,0.22222 +2018-02-14,0.2795,0.454,0.16228,0.22222 +2018-02-15,0.26858,0.53045,0.16418,0.11111 +2018-02-16,0.26108,0.50548,0.16665,0.11111 +2018-02-17,0.24771,0.46337,0.16867,0.11111 +2018-02-18,0.26025,0.49854,0.17111,0.11111 +2018-02-19,0.24972,0.46548,0.17256,0.11111 +2018-02-20,0.2484,0.4602,0.17389,0.11111 +2018-02-21,0.24639,0.45814,0.16993,0.11111 +2018-02-22,0.24423,0.44974,0.17183,0.11111 +2018-02-23,0.23981,0.43476,0.17355,0.11111 +2018-02-24,0.22901,0.39572,0.18019,0.11111 +2018-02-25,0.22304,0.36989,0.18811,0.11111 +2018-02-26,0.21298,0.34065,0.18717,0.11111 +2018-02-27,0.20127,0.32458,0.1681,0.11111 +2018-02-28,0.20417,0.35702,0.14438,0.11111 +2018-03-01,0.22423,0.40998,0.1516,0.11111 +2018-03-02,0.24517,0.46844,0.15598,0.11111 +2018-03-03,0.26523,0.5084,0.17617,0.11111 +2018-03-04,0.27657,0.52023,0.19836,0.11111 +2018-03-05,0.30809,0.58445,0.2287,0.11111 +2018-03-06,0.26899,0.45469,0.24116,0.11111 +2018-03-07,0.16334,0.24303,0.24699,0 +2018-03-08,0.18434,0.31251,0.24051,0 +2018-03-09,0.18862,0.33294,0.23291,0 +2018-03-10,0.17761,0.31208,0.22076,0 +2018-03-11,0.17018,0.33061,0.17993,0 +2018-03-12,0.15425,0.33554,0.12723,0 +2018-03-13,0.13219,0.32764,0.068935,0 +2018-03-14,0.10519,0.25081,0.064747,0 +2018-03-15,0.084202,0.18952,0.063083,0 +2018-03-16,0.082293,0.19011,0.056771,0 +2018-03-17,0.086002,0.20649,0.05152,0 +2018-03-18,0.097178,0.24492,0.046615,0 +2018-03-19,0.086703,0.22197,0.038134,0 +2018-03-20,0.0802,0.20907,0.031533,0 +2018-03-21,0.094764,0.24088,0.043411,0 +2018-03-22,0.11356,0.28658,0.05409,0 +2018-03-23,0.10933,0.26756,0.060413,0 +2018-03-24,0.11901,0.28292,0.074112,0 +2018-03-25,0.12564,0.29348,0.08345,0 +2018-03-26,0.13697,0.30324,0.10767,0 +2018-03-27,0.15476,0.32723,0.13705,0 +2018-03-28,0.15849,0.31789,0.15759,0 +2018-03-29,0.18153,0.27816,0.15533,0.11111 +2018-03-30,0.18863,0.29648,0.15829,0.11111 +2018-03-31,0.19207,0.30589,0.15922,0.11111 +2018-04-01,0.19694,0.31964,0.16006,0.11111 +2018-04-02,0.19568,0.31926,0.15667,0.11111 +2018-04-03,0.18056,0.27796,0.15262,0.11111 +2018-04-04,0.19669,0.33519,0.14378,0.11111 +2018-04-05,0.16528,0.24234,0.1424,0.11111 +2018-04-06,0.15654,0.21643,0.14209,0.11111 +2018-04-07,0.16254,0.2344,0.14212,0.11111 +2018-04-08,0.16626,0.24578,0.14189,0.11111 +2018-04-09,0.15345,0.21253,0.1367,0.11111 +2018-04-10,0.1467,0.19426,0.13474,0.11111 +2018-04-11,0.15784,0.21367,0.14874,0.11111 +2018-04-12,0.21099,0.26164,0.14912,0.22222 +2018-04-13,0.2025,0.2422,0.14307,0.22222 +2018-04-14,0.19884,0.23675,0.13756,0.22222 +2018-04-15,0.20015,0.24694,0.13129,0.22222 +2018-04-16,0.1965,0.24313,0.12415,0.22222 +2018-04-17,0.19649,0.24083,0.12642,0.22222 +2018-04-18,0.1961,0.24086,0.12522,0.22222 +2018-04-19,0.19799,0.23832,0.13342,0.22222 +2018-04-20,0.18758,0.20782,0.13271,0.22222 +2018-04-21,0.17732,0.17571,0.13403,0.22222 +2018-04-22,0.18534,0.19724,0.13656,0.22222 +2018-04-23,0.19024,0.2103,0.13819,0.22222 +2018-04-24,0.18141,0.18936,0.13266,0.22222 +2018-04-25,0.20988,0.28636,0.12107,0.22222 +2018-04-26,0.21274,0.31458,0.10143,0.22222 +2018-04-27,0.21852,0.35136,0.08197,0.22222 +2018-04-28,0.17908,0.33904,0.087085,0.11111 +2018-04-29,0.17848,0.33844,0.085885,0.11111 +2018-04-30,0.18002,0.34066,0.088289,0.11111 +2018-05-01,0.18285,0.35207,0.085365,0.11111 +2018-05-02,0.1932,0.36722,0.10127,0.11111 +2018-05-03,0.18182,0.32137,0.11299,0.11111 +2018-05-04,0.19393,0.34496,0.12571,0.11111 +2018-05-05,0.20491,0.35514,0.14848,0.11111 +2018-05-06,0.21317,0.36283,0.16556,0.11111 +2018-05-07,0.21939,0.36816,0.17888,0.11111 +2018-05-08,0.22476,0.37199,0.1912,0.11111 +2018-05-09,0.23401,0.38792,0.20299,0.11111 +2018-05-10,0.24066,0.3796,0.23125,0.11111 +2018-05-11,0.25475,0.42366,0.22947,0.11111 +2018-05-12,0.25503,0.52623,0.23885,0 +2018-05-13,0.24979,0.50674,0.24263,0 +2018-05-14,0.2567,0.52392,0.24617,0 +2018-05-15,0.25744,0.52429,0.24802,0 +2018-05-16,0.25979,0.52858,0.25078,0 +2018-05-17,0.2589,0.52718,0.24952,0 +2018-05-18,0.26179,0.52782,0.25754,0 +2018-05-19,0.27761,0.56751,0.26531,0 +2018-05-20,0.29508,0.60839,0.27684,0 +2018-05-21,0.29211,0.58832,0.28802,0 +2018-05-22,0.28429,0.55993,0.29296,0 +2018-05-23,0.31203,0.64814,0.28796,0 +2018-05-24,0.22856,0.39809,0.28759,0 +2018-05-25,0.18225,0.27379,0.27296,0 +2018-05-26,0.16788,0.25414,0.24951,0 +2018-05-27,0.16023,0.25054,0.23015,0 +2018-05-28,0.14959,0.25419,0.19459,0 +2018-05-29,0.13804,0.27512,0.13901,0 +2018-05-30,0.099566,0.24719,0.051509,0 +2018-05-31,0.084375,0.25312,0,0 +2018-06-01,0.098042,0.29223,0.0018964,0 +2018-06-02,0.11781,0.34983,0.0036122,0 +2018-06-03,0.11886,0.34962,0.0069552,0 +2018-06-04,0.11788,0.34351,0.010141,0 +2018-06-05,0.12614,0.34098,0.037445,0 +2018-06-06,0.14036,0.35578,0.065313,0 +2018-06-07,0.15696,0.37953,0.091363,0 +2018-06-08,0.17457,0.41031,0.11339,0 +2018-06-09,0.16398,0.36675,0.1252,0 +2018-06-10,0.21137,0.37497,0.14803,0.11111 +2018-06-11,0.21629,0.36527,0.17249,0.11111 +2018-06-12,0.22281,0.3661,0.19121,0.11111 +2018-06-13,0.23497,0.38886,0.20494,0.11111 +2018-06-14,0.25371,0.40944,0.24057,0.11111 +2018-06-15,0.26859,0.42613,0.26854,0.11111 +2018-06-16,0.27687,0.42357,0.29594,0.11111 +2018-06-17,0.27522,0.42623,0.28831,0.11111 +2018-06-18,0.27263,0.42624,0.28052,0.11111 +2018-06-19,0.26789,0.41935,0.27322,0.11111 +2018-06-20,0.27923,0.45809,0.26848,0.11111 +2018-06-21,0.27158,0.42711,0.27653,0.11111 +2018-06-22,0.30209,0.40167,0.28236,0.22222 +2018-06-23,0.28827,0.35526,0.28733,0.22222 +2018-06-24,0.29204,0.36282,0.29108,0.22222 +2018-06-25,0.29349,0.3669,0.29135,0.22222 +2018-06-26,0.29356,0.37371,0.28476,0.22222 +2018-06-27,0.28802,0.36416,0.27768,0.22222 +2018-06-28,0.2895,0.36759,0.27869,0.22222 +2018-06-29,0.29289,0.38363,0.27283,0.22222 +2018-06-30,0.28933,0.3792,0.26657,0.22222 +2018-07-01,0.28251,0.36589,0.25942,0.22222 +2018-07-02,0.27375,0.34949,0.24954,0.22222 +2018-07-03,0.26925,0.34524,0.24031,0.22222 +2018-07-04,0.26827,0.35396,0.22862,0.22222 +2018-07-05,0.26383,0.35673,0.21254,0.22222 +2018-07-06,0.26008,0.35164,0.20638,0.22222 +2018-07-07,0.25171,0.33263,0.20026,0.22222 +2018-07-08,0.24471,0.32034,0.19157,0.22222 +2018-07-09,0.26413,0.37743,0.19275,0.22222 +2018-07-10,0.22224,0.35838,0.19725,0.11111 +2018-07-11,0.2164,0.3378,0.20028,0.11111 +2018-07-12,0.20971,0.31595,0.20208,0.11111 +2018-07-13,0.2015,0.28915,0.20423,0.11111 +2018-07-14,0.19779,0.28408,0.19818,0.11111 +2018-07-15,0.19724,0.29426,0.18634,0.11111 +2018-07-16,0.18443,0.27968,0.16251,0.11111 +2018-07-17,0.26542,0.41081,0.16322,0.22222 +2018-07-18,0.25332,0.37514,0.16261,0.22222 +2018-07-19,0.2499,0.36461,0.16285,0.22222 +2018-07-20,0.24445,0.35106,0.16005,0.22222 +2018-07-21,0.2645,0.42415,0.14714,0.22222 +2018-07-22,0.24757,0.49258,0.13903,0.11111 +2018-07-23,0.23271,0.45717,0.12986,0.11111 +2018-07-24,0.28083,0.50124,0.11903,0.22222 +2018-07-25,0.28012,0.50116,0.11698,0.22222 +2018-07-26,0.2821,0.50317,0.12089,0.22222 +2018-07-27,0.28724,0.51787,0.12164,0.22222 +2018-07-28,0.27898,0.49404,0.12069,0.22222 +2018-07-29,0.2846,0.50457,0.127,0.22222 +2018-07-30,0.2938,0.52769,0.13148,0.22222 +2018-07-31,0.29055,0.51325,0.13618,0.22222 +2018-08-01,0.29267,0.51392,0.14188,0.22222 +2018-08-02,0.29377,0.50979,0.1493,0.22222 +2018-08-03,0.29764,0.50408,0.16662,0.22222 +2018-08-04,0.2894,0.47893,0.16705,0.22222 +2018-08-05,0.27501,0.44909,0.15371,0.22222 +2018-08-06,0.27331,0.45704,0.14068,0.22222 +2018-08-07,0.26856,0.4449,0.13855,0.22222 +2018-08-08,0.27388,0.48992,0.10949,0.22222 +2018-08-09,0.29293,0.54736,0.10922,0.22222 +2018-08-10,0.29939,0.56473,0.11121,0.22222 +2018-08-11,0.294,0.54616,0.11362,0.22222 +2018-08-12,0.28995,0.53281,0.11482,0.22222 +2018-08-13,0.29173,0.5422,0.11077,0.22222 +2018-08-14,0.30276,0.57817,0.10788,0.22222 +2018-08-15,0.28182,0.51518,0.10806,0.22222 +2018-08-16,0.27302,0.59501,0.11294,0.11111 +2018-08-17,0.27169,0.56685,0.13711,0.11111 +2018-08-18,0.27419,0.56,0.15147,0.11111 +2018-08-19,0.27621,0.55264,0.16487,0.11111 +2018-08-20,0.27019,0.52845,0.17102,0.11111 +2018-08-21,0.27993,0.55318,0.17551,0.11111 +2018-08-22,0.27252,0.52754,0.17892,0.11111 +2018-08-23,0.23441,0.52248,0.18075,0 +2018-08-24,0.23374,0.52051,0.18071,0 +2018-08-25,0.22939,0.51028,0.17789,0 +2018-08-26,0.23678,0.5366,0.17374,0 +2018-08-27,0.2258,0.50244,0.17497,0 +2018-08-28,0.21494,0.47252,0.17231,0 +2018-08-29,0.23027,0.51686,0.17395,0 +2018-08-30,0.24409,0.54767,0.1846,0 +2018-08-31,0.25321,0.5607,0.19893,0 +2018-09-01,0.25474,0.55489,0.20933,0 +2018-09-02,0.26731,0.58573,0.21621,0 +2018-09-03,0.3049,0.68326,0.23145,0 +2018-09-04,0.31471,0.6878,0.25634,0 +2018-09-05,0.32221,0.59856,0.25696,0.11111 +2018-09-06,0.33402,0.63634,0.25461,0.11111 +2018-09-07,0.31056,0.56208,0.25848,0.11111 +2018-09-08,0.28176,0.47861,0.25557,0.11111 +2018-09-09,0.27953,0.4798,0.24769,0.11111 +2018-09-10,0.27961,0.48925,0.23848,0.11111 +2018-09-11,0.27671,0.49259,0.22644,0.11111 +2018-09-12,0.27951,0.51313,0.21429,0.11111 +2018-09-13,0.27065,0.50052,0.2003,0.11111 +2018-09-14,0.26549,0.48361,0.20175,0.11111 +2018-09-15,0.29692,0.54345,0.23619,0.11111 +2018-09-16,0.30724,0.55218,0.25843,0.11111 +2018-09-17,0.29868,0.52343,0.26151,0.11111 +2018-09-18,0.2986,0.52113,0.26355,0.11111 +2018-09-19,0.29752,0.51343,0.26803,0.11111 +2018-09-20,0.29866,0.51037,0.2745,0.11111 +2018-09-21,0.29935,0.51125,0.2757,0.11111 +2018-09-22,0.28855,0.47871,0.27581,0.11111 +2018-09-23,0.29917,0.50966,0.27674,0.11111 +2018-09-24,0.29891,0.50016,0.28545,0.11111 +2018-09-25,0.30304,0.50907,0.28894,0.11111 +2018-09-26,0.29714,0.49185,0.28846,0.11111 +2018-09-27,0.29772,0.49534,0.28672,0.11111 +2018-09-28,0.29134,0.47556,0.28737,0.11111 +2018-09-29,0.29417,0.48097,0.29042,0.11111 +2018-09-30,0.29906,0.49638,0.28968,0.11111 +2018-10-01,0.30472,0.50951,0.29353,0.11111 +2018-10-02,0.30905,0.51356,0.30249,0.11111 +2018-10-03,0.31286,0.51895,0.30852,0.11111 +2018-10-04,0.34365,0.59382,0.32601,0.11111 +2018-10-05,0.22437,0.32706,0.34603,0 +2018-10-06,0.23246,0.34423,0.35314,0 +2018-10-07,0.24205,0.37062,0.35554,0 +2018-10-08,0.24078,0.36398,0.35836,0 +2018-10-09,0.24225,0.37417,0.35258,0 +2018-10-10,0.23048,0.36365,0.3278,0 +2018-10-11,0.2416,0.33868,0.27502,0.11111 +2018-10-12,0.22754,0.29831,0.27319,0.11111 +2018-10-13,0.24209,0.34147,0.2737,0.11111 +2018-10-14,0.24436,0.34735,0.2746,0.11111 +2018-10-15,0.26373,0.28088,0.2881,0.22222 +2018-10-16,0.25697,0.25332,0.29538,0.22222 +2018-10-17,0.2594,0.24168,0.31429,0.22222 +2018-10-18,0.26047,0.24491,0.31429,0.22222 +2018-10-19,0.26375,0.25474,0.3143,0.22222 +2018-10-20,0.2554,0.23003,0.31396,0.22222 +2018-10-21,0.26645,0.26435,0.31279,0.22222 +2018-10-22,0.28043,0.26749,0.35157,0.22222 +2018-10-23,0.30089,0.29135,0.38911,0.22222 +2018-10-24,0.30896,0.27755,0.42711,0.22222 +2018-10-25,0.32799,0.28405,0.4777,0.22222 +2018-10-26,0.34737,0.29177,0.52811,0.22222 +2018-10-27,0.37002,0.3078,0.58003,0.22222 +2018-10-28,0.39028,0.31606,0.63256,0.22222 +2018-10-29,0.38957,0.29821,0.64829,0.22222 +2018-10-30,0.38767,0.27714,0.66364,0.22222 +2018-10-31,0.39507,0.28362,0.67936,0.22222 +2018-11-01,0.39651,0.28242,0.68488,0.22222 +2018-11-02,0.39778,0.28018,0.69093,0.22222 +2018-11-03,0.39458,0.28367,0.67786,0.22222 +2018-11-04,0.39198,0.28639,0.66734,0.22222 +2018-11-05,0.39583,0.28491,0.68036,0.22222 +2018-11-06,0.39968,0.28492,0.69189,0.22222 +2018-11-07,0.40345,0.28448,0.70364,0.22222 +2018-11-08,0.40403,0.28814,0.70173,0.22222 +2018-11-09,0.3884,0.24805,0.69492,0.22222 +2018-11-10,0.35596,0.2459,0.71088,0.11111 +2018-11-11,0.36124,0.24634,0.72627,0.11111 +2018-11-12,0.36323,0.23823,0.74034,0.11111 +2018-11-13,0.37276,0.25148,0.75567,0.11111 +2018-11-14,0.40978,0.29303,0.82518,0.11111 +2018-11-15,0.46988,0.41712,0.88139,0.11111 +2018-11-16,0.48615,0.41965,0.92769,0.11111 +2018-11-17,0.50031,0.41897,0.97086,0.11111 +2018-11-18,0.50861,0.41471,1,0.11111 +2018-11-19,0.54835,0.42284,1,0.22222 +2018-11-20,0.66721,0.6683,1,0.33333 +2018-11-21,0.66346,0.66718,0.98988,0.33333 +2018-11-22,0.65502,0.67019,0.96154,0.33333 +2018-11-23,0.63509,0.64749,0.92445,0.33333 +2018-11-24,0.63641,0.58239,0.8824,0.44444 +2018-11-25,0.61794,0.56873,0.84066,0.44444 +2018-11-26,0.59695,0.56272,0.7837,0.44444 +2018-11-27,0.57382,0.54962,0.72738,0.44444 +2018-11-28,0.58979,0.51486,0.69895,0.55556 +2018-11-29,0.56032,0.45937,0.66603,0.55556 +2018-11-30,0.54138,0.43513,0.63346,0.55556 +2018-12-01,0.52787,0.43187,0.59617,0.55556 +2018-12-02,0.50904,0.4123,0.55926,0.55556 +2018-12-03,0.48873,0.38821,0.52241,0.55556 +2018-12-04,0.46765,0.36168,0.48572,0.55556 +2018-12-05,0.44591,0.33941,0.44275,0.55556 +2018-12-06,0.42822,0.33001,0.39909,0.55556 +2018-12-07,0.40713,0.30961,0.35623,0.55556 +2018-12-08,0.39185,0.29793,0.32206,0.55556 +2018-12-09,0.37171,0.27592,0.28366,0.55556 +2018-12-10,0.34749,0.24129,0.24562,0.55556 +2018-12-11,0.32425,0.20975,0.20743,0.55556 +2018-12-12,0.30214,0.18401,0.16685,0.55556 +2018-12-13,0.30053,0.222,0.12403,0.55556 +2018-12-14,0.27348,0.24643,0.12958,0.44444 +2018-12-15,0.27668,0.24877,0.13682,0.44444 +2018-12-16,0.28569,0.25882,0.15379,0.44444 +2018-12-17,0.26352,0.19727,0.14885,0.44444 +2018-12-18,0.2787,0.24702,0.14463,0.44444 +2018-12-19,0.1789,0.056337,0.14703,0.33333 +2018-12-20,0.13269,0.027644,0.14821,0.22222 +2018-12-21,0.15125,0.085097,0.14643,0.22222 +2018-12-22,0.15083,0.085789,0.14447,0.22222 +2018-12-23,0.1735,0.15633,0.14195,0.22222 +2018-12-24,0.14108,0.17533,0.13681,0.11111 +2018-12-25,0.134,0.16392,0.12697,0.11111 +2018-12-26,0.13206,0.15872,0.12634,0.11111 +2018-12-27,0.14285,0.18831,0.12912,0.11111 +2018-12-28,0.13471,0.28947,0.11468,0 +2018-12-29,0.13613,0.30785,0.10053,0 +2018-12-30,0.12765,0.30699,0.075946,0 +2018-12-31,0.12977,0.32053,0.068783,0 +2019-01-01,0.13413,0.34129,0.061114,0 +2019-01-02,0.13926,0.36697,0.050819,0 +2019-01-03,0.14204,0.38603,0.040082,0 +2019-01-04,0.14298,0.37112,0.05783,0 +2019-01-05,0.16387,0.41342,0.078177,0 +2019-01-06,0.15365,0.37669,0.084259,0 +2019-01-07,0.1496,0.35849,0.090305,0 +2019-01-08,0.16208,0.38525,0.10099,0 +2019-01-09,0.17795,0.42168,0.11216,0 +2019-01-10,0.18983,0.34791,0.11047,0.11111 +2019-01-11,0.17278,0.29897,0.10824,0.11111 +2019-01-12,0.18156,0.33017,0.10339,0.11111 +2019-01-13,0.17815,0.32158,0.10175,0.11111 +2019-01-14,0.16559,0.29124,0.094404,0.11111 +2019-01-15,0.17369,0.3346,0.075374,0.11111 +2019-01-16,0.16854,0.31882,0.075678,0.11111 +2019-01-17,0.18478,0.34773,0.095494,0.11111 +2019-01-18,0.21299,0.41423,0.11362,0.11111 +2019-01-19,0.18232,0.30728,0.12857,0.11111 +2019-01-20,0.17972,0.29328,0.13477,0.11111 +2019-01-21,0.18435,0.28918,0.15276,0.11111 +2019-01-22,0.19319,0.29968,0.16878,0.11111 +2019-01-23,0.20819,0.32469,0.18879,0.11111 +2019-01-24,0.2253,0.36842,0.19637,0.11111 +2019-01-25,0.24061,0.41128,0.19944,0.11111 +2019-01-26,0.22245,0.33321,0.22304,0.11111 +2019-01-27,0.22819,0.31267,0.26077,0.11111 +2019-01-28,0.23087,0.30459,0.27689,0.11111 +2019-01-29,0.23428,0.29979,0.29194,0.11111 +2019-01-30,0.23522,0.29406,0.30049,0.11111 +2019-01-31,0.23874,0.29094,0.31418,0.11111 +2019-02-01,0.23999,0.287,0.32186,0.11111 +2019-02-02,0.2468,0.29748,0.33182,0.11111 +2019-02-03,0.24726,0.28758,0.34309,0.11111 +2019-02-04,0.26513,0.3198,0.36447,0.11111 +2019-02-05,0.27707,0.33224,0.38785,0.11111 +2019-02-06,0.28366,0.32964,0.41024,0.11111 +2019-02-07,0.28601,0.31415,0.43277,0.11111 +2019-02-08,0.33272,0.34279,0.43315,0.22222 +2019-02-09,0.29222,0.35021,0.41533,0.11111 +2019-02-10,0.28617,0.35378,0.39363,0.11111 +2019-02-11,0.28217,0.36727,0.36811,0.11111 +2019-02-12,0.26093,0.30736,0.36432,0.11111 +2019-02-13,0.24233,0.27397,0.34192,0.11111 +2019-02-14,0.23713,0.28359,0.31669,0.11111 +2019-02-15,0.23779,0.29048,0.31178,0.11111 +2019-02-16,0.25105,0.29871,0.34333,0.11111 +2019-02-17,0.26046,0.30244,0.36782,0.11111 +2019-02-18,0.29664,0.29985,0.36786,0.22222 +2019-02-19,0.29792,0.30464,0.36689,0.22222 +2019-02-20,0.29674,0.30248,0.36552,0.22222 +2019-02-21,0.29525,0.30006,0.36347,0.22222 +2019-02-22,0.29259,0.29497,0.36057,0.22222 +2019-02-23,0.28955,0.28916,0.35728,0.22222 +2019-02-24,0.38012,0.40419,0.40285,0.33333 +2019-02-25,0.38112,0.40132,0.40872,0.33333 +2019-02-26,0.37706,0.41131,0.38655,0.33333 +2019-02-27,0.3809,0.4286,0.38077,0.33333 +2019-02-28,0.38053,0.43865,0.3696,0.33333 +2019-03-01,0.38023,0.44822,0.35913,0.33333 +2019-03-02,0.37756,0.45625,0.34309,0.33333 +2019-03-03,0.38418,0.46197,0.35725,0.33333 +2019-03-04,0.3877,0.45739,0.37237,0.33333 +2019-03-05,0.39035,0.46726,0.37047,0.33333 +2019-03-06,0.37655,0.4393,0.35701,0.33333 +2019-03-07,0.37523,0.44971,0.34266,0.33333 +2019-03-08,0.37382,0.45899,0.32913,0.33333 +2019-03-09,0.38763,0.51596,0.31358,0.33333 +2019-03-10,0.37989,0.59517,0.32229,0.22222 +2019-03-11,0.38209,0.58968,0.33436,0.22222 +2019-03-12,0.39152,0.58916,0.36317,0.22222 +2019-03-13,0.40369,0.59778,0.39106,0.22222 +2019-03-14,0.41305,0.59915,0.41778,0.22222 +2019-03-15,0.42079,0.59715,0.44298,0.22222 +2019-03-16,0.42421,0.58725,0.46316,0.22222 +2019-03-17,0.41407,0.57183,0.44816,0.22222 +2019-03-18,0.41273,0.57731,0.43867,0.22222 +2019-03-19,0.42481,0.61781,0.43441,0.22222 +2019-03-20,0.41558,0.67599,0.45962,0.11111 +2019-03-21,0.42043,0.6736,0.47658,0.11111 +2019-03-22,0.42444,0.66897,0.49322,0.11111 +2019-03-23,0.43542,0.67469,0.52046,0.11111 +2019-03-24,0.4481,0.68498,0.54823,0.11111 +2019-03-25,0.43381,0.61914,0.57117,0.11111 +2019-03-26,0.35218,0.50055,0.55598,0 +2019-03-27,0.37775,0.48291,0.53924,0.11111 +2019-03-28,0.35907,0.45249,0.51362,0.11111 +2019-03-29,0.34023,0.43595,0.47363,0.11111 +2019-03-30,0.31285,0.41977,0.40766,0.11111 +2019-03-31,0.27745,0.41992,0.30133,0.11111 +2019-04-01,0.22542,0.39607,0.16907,0.11111 +2019-04-02,0.42518,0.46694,0.58637,0.22222 +2019-04-03,0.4596,0.43058,0.72599,0.22222 +2019-04-04,0.48945,0.43885,0.80728,0.22222 +2019-04-05,0.50067,0.43387,0.84593,0.22222 +2019-04-06,0.50348,0.42661,0.86161,0.22222 +2019-04-07,0.50212,0.42308,0.86107,0.22222 +2019-04-08,0.50034,0.42506,0.85375,0.22222 +2019-04-09,0.50068,0.42415,0.85567,0.22222 +2019-04-10,0.49922,0.42321,0.85224,0.22222 +2019-04-11,0.48744,0.42359,0.81649,0.22222 +2019-04-12,0.46917,0.40239,0.78289,0.22222 +2019-04-13,0.45939,0.40544,0.75051,0.22222 +2019-04-14,0.45075,0.40825,0.72178,0.22222 +2019-04-15,0.44341,0.40991,0.69808,0.22222 +2019-04-16,0.43321,0.40541,0.67199,0.22222 +2019-04-17,0.41969,0.39337,0.64347,0.22222 +2019-04-18,0.41539,0.39397,0.62999,0.22222 +2019-04-19,0.41171,0.39745,0.61545,0.22222 +2019-04-20,0.41064,0.40182,0.60788,0.22222 +2019-04-21,0.40696,0.39882,0.59985,0.22222 +2019-04-22,0.40167,0.39258,0.59023,0.22222 +2019-04-23,0.39757,0.38965,0.58083,0.22222 +2019-04-24,0.3926,0.38797,0.56759,0.22222 +2019-04-25,0.38422,0.39059,0.53987,0.22222 +2019-04-26,0.34005,0.38676,0.52228,0.11111 +2019-04-27,0.3326,0.38419,0.50249,0.11111 +2019-04-28,0.32685,0.38651,0.48292,0.11111 +2019-04-29,0.31912,0.38189,0.46436,0.11111 +2019-04-30,0.31217,0.37712,0.44827,0.11111 +2019-05-01,0.33074,0.45367,0.42745,0.11111 +2019-05-02,0.29999,0.45926,0.44071,0 +2019-05-03,0.33854,0.47139,0.43311,0.11111 +2019-05-04,0.32371,0.44328,0.41674,0.11111 +2019-05-05,0.32032,0.46349,0.38636,0.11111 +2019-05-06,0.3144,0.49574,0.33633,0.11111 +2019-05-07,0.28959,0.49589,0.26177,0.11111 +2019-05-08,0.24278,0.49249,0.12474,0.11111 +2019-05-09,0.24788,0.51142,0.12112,0.11111 +2019-05-10,0.25275,0.52539,0.12174,0.11111 +2019-05-11,0.35871,0.67131,0.18258,0.22222 +2019-05-12,0.35722,0.60048,0.24896,0.22222 +2019-05-13,0.4195,0.60062,0.32453,0.33333 +2019-05-14,0.4193,0.55149,0.37306,0.33333 +2019-05-15,0.43096,0.55308,0.40646,0.33333 +2019-05-16,0.44954,0.56133,0.45396,0.33333 +2019-05-17,0.47107,0.56539,0.51448,0.33333 +2019-05-18,0.45438,0.51866,0.51113,0.33333 +2019-05-19,0.46753,0.4376,0.52056,0.44444 +2019-05-20,0.45131,0.40253,0.50696,0.44444 +2019-05-21,0.44308,0.39469,0.4901,0.44444 +2019-05-22,0.43363,0.39123,0.4652,0.44444 +2019-05-23,0.42419,0.39032,0.43781,0.44444 +2019-05-24,0.4187,0.39867,0.41298,0.44444 +2019-05-25,0.42046,0.41688,0.40005,0.44444 +2019-05-26,0.40474,0.37832,0.39146,0.44444 +2019-05-27,0.38831,0.33551,0.38497,0.44444 +2019-05-28,0.38264,0.32556,0.37793,0.44444 +2019-05-29,0.38392,0.33263,0.37469,0.44444 +2019-05-30,0.37563,0.31974,0.3627,0.44444 +2019-05-31,0.36736,0.308,0.34963,0.44444 +2019-06-01,0.35998,0.3179,0.31759,0.44444 +2019-06-02,0.32662,0.3364,0.31012,0.33333 +2019-06-03,0.31163,0.31019,0.29137,0.33333 +2019-06-04,0.30375,0.30754,0.27038,0.33333 +2019-06-05,0.28567,0.27543,0.24823,0.33333 +2019-06-06,0.28365,0.29172,0.22588,0.33333 +2019-06-07,0.27918,0.30015,0.20405,0.33333 +2019-06-08,0.27418,0.30595,0.18327,0.33333 +2019-06-09,0.26558,0.306,0.15741,0.33333 +2019-06-10,0.22702,0.29668,0.16216,0.22222 +2019-06-11,0.22736,0.28028,0.17958,0.22222 +2019-06-12,0.19858,0.29099,0.19363,0.11111 +2019-06-13,0.20361,0.29275,0.20698,0.11111 +2019-06-14,0.20082,0.2774,0.21395,0.11111 +2019-06-15,0.19046,0.24492,0.21535,0.11111 +2019-06-16,0.19821,0.27595,0.20757,0.11111 +2019-06-17,0.21886,0.32799,0.21747,0.11111 +2019-06-18,0.16344,0.29639,0.19394,0 +2019-06-19,0.16042,0.29708,0.18419,0 +2019-06-20,0.16094,0.31362,0.16919,0 +2019-06-21,0.15465,0.32103,0.14293,0 +2019-06-22,0.16469,0.39136,0.1027,0 +2019-06-23,0.14122,0.34592,0.077757,0 +2019-06-24,0.15829,0.42872,0.046144,0 +2019-06-25,0.1979,0.43176,0.050819,0.11111 +2019-06-26,0.28458,0.58094,0.050571,0.22222 +2019-06-27,0.44962,0.79857,0.21696,0.33333 +2019-06-28,0.54506,0.87556,0.31518,0.44444 +2019-06-29,0.55584,0.83963,0.38344,0.44444 +2019-06-30,0.56994,0.81599,0.44938,0.44444 +2019-07-01,0.56371,0.75584,0.49086,0.44444 +2019-07-02,0.57348,0.77683,0.49916,0.44444 +2019-07-03,0.55815,0.7217,0.50829,0.44444 +2019-07-04,0.56586,0.74903,0.50411,0.44444 +2019-07-05,0.55374,0.72016,0.49661,0.44444 +2019-07-06,0.55116,0.7212,0.48785,0.44444 +2019-07-07,0.54922,0.7225,0.4807,0.44444 +2019-07-08,0.53954,0.70161,0.47257,0.44444 +2019-07-09,0.53036,0.68364,0.46299,0.44444 +2019-07-10,0.52985,0.6879,0.4572,0.44444 +2019-07-11,0.51885,0.67073,0.44139,0.44444 +2019-07-12,0.50859,0.65481,0.42651,0.44444 +2019-07-13,0.50741,0.66764,0.41016,0.44444 +2019-07-14,0.49627,0.64943,0.39493,0.44444 +2019-07-15,0.48477,0.63154,0.37831,0.44444 +2019-07-16,0.5077,0.61614,0.35141,0.55556 +2019-07-17,0.47017,0.53134,0.32362,0.55556 +2019-07-18,0.4483,0.48577,0.30356,0.55556 +2019-07-19,0.42227,0.43062,0.28062,0.55556 +2019-07-20,0.42444,0.46157,0.25619,0.55556 +2019-07-21,0.42353,0.48439,0.23064,0.55556 +2019-07-22,0.42183,0.50342,0.20651,0.55556 +2019-07-23,0.40972,0.48248,0.19112,0.55556 +2019-07-24,0.41103,0.50195,0.17558,0.55556 +2019-07-25,0.38234,0.5246,0.17797,0.44444 +2019-07-26,0.33648,0.48645,0.18966,0.33333 +2019-07-27,0.27316,0.37262,0.22465,0.22222 +2019-07-28,0.24999,0.38589,0.25297,0.11111 +2019-07-29,0.27242,0.42776,0.27838,0.11111 +2019-07-30,0.29756,0.4816,0.29996,0.11111 +2019-07-31,0.29501,0.46662,0.3073,0.11111 +2019-08-01,0.30822,0.50142,0.31212,0.11111 +2019-08-02,0.29726,0.46888,0.31179,0.11111 +2019-08-03,0.31045,0.48584,0.33441,0.11111 +2019-08-04,0.31918,0.48419,0.36226,0.11111 +2019-08-05,0.31536,0.45369,0.38127,0.11111 +2019-08-06,0.32052,0.4586,0.39185,0.11111 +2019-08-07,0.32868,0.4716,0.40334,0.11111 +2019-08-08,0.33052,0.46665,0.4138,0.11111 +2019-08-09,0.34117,0.49189,0.4205,0.11111 +2019-08-10,0.33843,0.48106,0.42313,0.11111 +2019-08-11,0.33742,0.47521,0.42593,0.11111 +2019-08-12,0.34604,0.48777,0.43924,0.11111 +2019-08-13,0.32684,0.42031,0.44909,0.11111 +2019-08-14,0.2969,0.32322,0.45636,0.11111 +2019-08-15,0.26097,0.33,0.45292,0 +2019-08-16,0.26194,0.34424,0.44158,0 +2019-08-17,0.27187,0.41065,0.40496,0 +2019-08-18,0.25888,0.41878,0.35787,0 +2019-08-19,0.2253,0.39004,0.28584,0 +2019-08-20,0.19748,0.36805,0.2244,0 +2019-08-21,0.16464,0.34538,0.14856,0 +2019-08-22,0.15015,0.31389,0.13656,0 +2019-08-23,0.14027,0.29682,0.12398,0 +2019-08-24,0.12981,0.27274,0.11671,0 +2019-08-25,0.13466,0.29555,0.10844,0 +2019-08-26,0.13709,0.31616,0.095103,0 +2019-08-27,0.1253,0.29007,0.085848,0 +2019-08-28,0.11127,0.25341,0.08041,0 +2019-08-29,0.11263,0.27376,0.064135,0 +2019-08-30,0.11301,0.26923,0.069797,0 +2019-08-31,0.12623,0.30123,0.077467,0 +2019-09-01,0.13523,0.32333,0.082375,0 +2019-09-02,0.12165,0.30315,0.061784,0 +2019-09-03,0.12497,0.33746,0.037463,0 +2019-09-04,0.11843,0.32252,0.032772,0 +2019-09-05,0.13323,0.35339,0.046291,0 +2019-09-06,0.14357,0.3794,0.051317,0 +2019-09-07,0.13819,0.35787,0.056708,0 +2019-09-08,0.14981,0.38878,0.060653,0 +2019-09-09,0.16495,0.41432,0.080523,0 +2019-09-10,0.17225,0.4097,0.10705,0 +2019-09-11,0.18646,0.42763,0.13175,0 +2019-09-12,0.15572,0.32013,0.14702,0 +2019-09-13,0.14306,0.26341,0.16576,0 +2019-09-14,0.16224,0.30228,0.18444,0 +2019-09-15,0.17721,0.3314,0.20024,0 +2019-09-16,0.18845,0.34878,0.21657,0 +2019-09-17,0.20999,0.38973,0.24023,0 +2019-09-18,0.22049,0.41706,0.24442,0 +2019-09-19,0.23876,0.44728,0.26901,0 +2019-09-20,0.28729,0.56123,0.30064,0 +2019-09-21,0.30594,0.59262,0.3252,0 +2019-09-22,0.30443,0.57238,0.34092,0 +2019-09-23,0.29774,0.55917,0.33405,0 +2019-09-24,0.38373,0.67754,0.36255,0.11111 +2019-09-25,0.34841,0.53951,0.39462,0.11111 +2019-09-26,0.35402,0.53603,0.41492,0.11111 +2019-09-27,0.35854,0.52437,0.44014,0.11111 +2019-09-28,0.3671,0.52802,0.46216,0.11111 +2019-09-29,0.36878,0.52236,0.47288,0.11111 +2019-09-30,0.37262,0.5198,0.48694,0.11111 +2019-10-01,0.37765,0.53419,0.48765,0.11111 +2019-10-02,0.37571,0.52418,0.49184,0.11111 +2019-10-03,0.38329,0.53257,0.5062,0.11111 +2019-10-04,0.38523,0.52343,0.52115,0.11111 +2019-10-05,0.39207,0.53297,0.53212,0.11111 +2019-10-06,0.39559,0.53022,0.54543,0.11111 +2019-10-07,0.39951,0.53323,0.5542,0.11111 +2019-10-08,0.39701,0.51605,0.56388,0.11111 +2019-10-09,0.38593,0.49297,0.55372,0.11111 +2019-10-10,0.37319,0.47025,0.5382,0.11111 +2019-10-11,0.36463,0.46071,0.52206,0.11111 +2019-10-12,0.35869,0.45229,0.51267,0.11111 +2019-10-13,0.35522,0.45354,0.501,0.11111 +2019-10-14,0.34938,0.44832,0.48871,0.11111 +2019-10-15,0.34125,0.43813,0.47452,0.11111 +2019-10-16,0.3382,0.43057,0.47291,0.11111 +2019-10-17,0.33072,0.4191,0.46194,0.11111 +2019-10-18,0.3266,0.41167,0.45703,0.11111 +2019-10-19,0.31828,0.40711,0.43663,0.11111 +2019-10-20,0.30486,0.39649,0.40698,0.11111 +2019-10-21,0.29339,0.38576,0.38329,0.11111 +2019-10-22,0.28966,0.39605,0.36183,0.11111 +2019-10-23,0.28369,0.28376,0.34508,0.22222 +2019-10-24,0.20554,0.17279,0.33271,0.11111 +2019-10-25,0.25882,0.1594,0.39483,0.22222 +2019-10-26,0.37646,0.45468,0.45248,0.22222 +2019-10-27,0.39385,0.46461,0.49473,0.22222 +2019-10-28,0.40669,0.46418,0.53365,0.22222 +2019-10-29,0.41551,0.46279,0.56152,0.22222 +2019-10-30,0.41877,0.4632,0.57089,0.22222 +2019-10-31,0.41396,0.45289,0.56676,0.22222 +2019-11-01,0.41323,0.4605,0.55697,0.22222 +2019-11-02,0.41121,0.46503,0.54636,0.22222 +2019-11-03,0.40869,0.46347,0.54039,0.22222 +2019-11-04,0.40826,0.46385,0.5387,0.22222 +2019-11-05,0.40971,0.46651,0.54038,0.22222 +2019-11-06,0.41944,0.48226,0.55385,0.22222 +2019-11-07,0.43077,0.50522,0.56487,0.22222 +2019-11-08,0.43294,0.50886,0.56775,0.22222 +2019-11-09,0.42827,0.49289,0.5697,0.22222 +2019-11-10,0.42971,0.49553,0.57138,0.22222 +2019-11-11,0.42643,0.48452,0.57254,0.22222 +2019-11-12,0.42012,0.46728,0.57085,0.22222 +2019-11-13,0.4219,0.47742,0.56606,0.22222 +2019-11-14,0.42327,0.48431,0.56327,0.22222 +2019-11-15,0.41935,0.482,0.55382,0.22222 +2019-11-16,0.41507,0.47735,0.54564,0.22222 +2019-11-17,0.41464,0.48277,0.53893,0.22222 +2019-11-18,0.41208,0.48108,0.53294,0.22222 +2019-11-19,0.4144,0.48231,0.53868,0.22222 +2019-11-20,0.41589,0.48123,0.54421,0.22222 +2019-11-21,0.41758,0.48897,0.54155,0.22222 +2019-11-22,0.40364,0.54876,0.55105,0.11111 +2019-11-23,0.48907,0.79792,0.55818,0.11111 +2019-11-24,0.35605,0.51344,0.55471,0 +2019-11-25,0.3232,0.43533,0.53427,0 +2019-11-26,0.30672,0.41979,0.50037,0 +2019-11-27,0.27876,0.39558,0.44071,0 +2019-11-28,0.24363,0.37012,0.36078,0 +2019-11-29,0.21645,0.36018,0.28916,0 +2019-11-30,0.17582,0.34501,0.18246,0 +2019-12-01,0.166,0.32332,0.17467,0 +2019-12-02,0.16036,0.30578,0.17529,0 +2019-12-03,0.16391,0.32122,0.1705,0 +2019-12-04,0.16868,0.34468,0.16136,0 +2019-12-05,0.15212,0.3098,0.14654,0 +2019-12-06,0.13375,0.27854,0.12271,0 +2019-12-07,0.14653,0.33283,0.10676,0 +2019-12-08,0.18976,0.44655,0.12273,0 +2019-12-09,0.1973,0.45909,0.13281,0 +2019-12-10,0.1954,0.4454,0.14081,0 +2019-12-11,0.20708,0.47277,0.14849,0 +2019-12-12,0.21074,0.46569,0.16652,0 +2019-12-13,0.22239,0.47823,0.18894,0 +2019-12-14,0.2292,0.48024,0.20735,0 +2019-12-15,0.23652,0.48674,0.22282,0 +2019-12-16,0.22425,0.43996,0.23278,0 +2019-12-17,0.24321,0.50073,0.2289,0 +2019-12-18,0.33583,0.63509,0.26128,0.11111 +2019-12-19,0.3015,0.51378,0.27961,0.11111 +2019-12-20,0.31061,0.53168,0.28905,0.11111 +2019-12-21,0.305,0.50441,0.29947,0.11111 +2019-12-22,0.30403,0.48686,0.31414,0.11111 +2019-12-23,0.3126,0.50322,0.32346,0.11111 +2019-12-24,0.31678,0.5162,0.32304,0.11111 +2019-12-25,0.32174,0.52456,0.32955,0.11111 +2019-12-26,0.33451,0.55531,0.33711,0.11111 +2019-12-27,0.34579,0.58454,0.34172,0.11111 +2019-12-28,0.35726,0.61259,0.34807,0.11111 +2019-12-29,0.36118,0.60196,0.37047,0.11111 +2019-12-30,0.36827,0.59978,0.39392,0.11111 +2019-12-31,0.37526,0.6001,0.41456,0.11111 +2020-01-01,0.38232,0.6004,0.43545,0.11111 +2020-01-02,0.37723,0.5735,0.44708,0.11111 +2020-01-03,0.38666,0.60546,0.44342,0.11111 +2020-01-04,0.37694,0.57744,0.44228,0.11111 +2020-01-05,0.37624,0.58222,0.4354,0.11111 +2020-01-06,0.3526,0.5231,0.42358,0.11111 +2020-01-07,0.36538,0.57799,0.40704,0.11111 +2020-01-08,0.35265,0.55312,0.39373,0.11111 +2020-01-09,0.3472,0.54815,0.38234,0.11111 +2020-01-10,0.34151,0.54274,0.37069,0.11111 +2020-01-11,0.32705,0.52051,0.34954,0.11111 +2020-01-12,0.31873,0.52147,0.32361,0.11111 +2020-01-13,0.31123,0.52274,0.29985,0.11111 +2020-01-14,0.32101,0.4639,0.27692,0.22222 +2020-01-15,0.28802,0.38443,0.25739,0.22222 +2020-01-16,0.2575,0.3044,0.24587,0.22222 +2020-01-17,0.22729,0.33176,0.239,0.11111 +2020-01-18,0.21876,0.31433,0.23083,0.11111 +2020-01-19,0.20534,0.28296,0.22194,0.11111 +2020-01-20,0.20901,0.30264,0.21327,0.11111 +2020-01-21,0.20952,0.30577,0.21166,0.11111 +2020-01-22,0.21144,0.31597,0.20725,0.11111 +2020-01-23,0.2015,0.28996,0.20343,0.11111 +2020-01-24,0.194,0.25981,0.21108,0.11111 +2020-01-25,0.19592,0.25731,0.21935,0.11111 +2020-01-26,0.18886,0.23338,0.22209,0.11111 +2020-01-27,0.18807,0.23401,0.21908,0.11111 +2020-01-28,0.19291,0.27222,0.1954,0.11111 +2020-01-29,0.1725,0.23893,0.16747,0.11111 +2020-01-30,0.16104,0.22652,0.14547,0.11111 +2020-01-31,0.15546,0.23693,0.11835,0.11111 +2020-02-01,0.14541,0.2205,0.10461,0.11111 +2020-02-02,0.16053,0.26424,0.10625,0.11111 +2020-02-03,0.16145,0.26324,0.11001,0.11111 +2020-02-04,0.1872,0.31495,0.13553,0.11111 +2020-02-05,0.15591,0.21742,0.13921,0.11111 +2020-02-06,0.15874,0.22231,0.14279,0.11111 +2020-02-07,0.16482,0.23587,0.14748,0.11111 +2020-02-08,0.16671,0.23668,0.15234,0.11111 +2020-02-09,0.16644,0.23065,0.15756,0.11111 +2020-02-10,0.16823,0.23751,0.15608,0.11111 +2020-02-11,0.17271,0.25256,0.15447,0.11111 +2020-02-12,0.18767,0.29261,0.15928,0.11111 +2020-02-13,0.18707,0.41428,0.14694,0 +2020-02-14,0.17882,0.40419,0.13227,0 +2020-02-15,0.16734,0.38141,0.1206,0 +2020-02-16,0.15208,0.34764,0.10859,0 +2020-02-17,0.15173,0.35519,0.10001,0 +2020-02-18,0.16118,0.40195,0.08158,0 +2020-02-19,0.22693,0.49485,0.07482,0.11111 +2020-02-20,0.19961,0.40529,0.082416,0.11111 +2020-02-21,0.21494,0.44785,0.085859,0.11111 +2020-02-22,0.22989,0.49181,0.086739,0.11111 +2020-02-23,0.21785,0.46002,0.082405,0.11111 +2020-02-24,0.2205,0.47533,0.075047,0.11111 +2020-02-25,0.21777,0.47467,0.067518,0.11111 +2020-02-26,0.25405,0.47282,0.067097,0.22222 +2020-02-27,0.24756,0.4537,0.066747,0.22222 +2020-02-28,0.2516,0.46663,0.065953,0.22222 +2020-02-29,0.25331,0.47456,0.063146,0.22222 +2020-03-01,0.25954,0.48746,0.068946,0.22222 +2020-03-02,0.24325,0.43887,0.068656,0.22222 +2020-03-03,0.22889,0.39637,0.068092,0.22222 +2020-03-04,0.23482,0.40315,0.079093,0.22222 +2020-03-05,0.22494,0.39767,0.054914,0.22222 +2020-03-06,0.22463,0.39378,0.057897,0.22222 +2020-03-07,0.21825,0.37645,0.056094,0.22222 +2020-03-08,0.26782,0.38218,0.087933,0.33333 +2020-03-09,0.27072,0.38248,0.096351,0.33333 +2020-03-10,0.27263,0.38278,0.10179,0.33333 +2020-03-11,0.28437,0.40927,0.11051,0.33333 +2020-03-12,0.4671,0.24579,0.71106,0.44444 +2020-03-13,0.60821,0.4753,0.90488,0.44444 +2020-03-14,0.63035,0.47838,0.96821,0.44444 +2020-03-15,0.63565,0.47775,0.98475,0.44444 +2020-03-16,0.63383,0.4771,0.97993,0.44444 +2020-03-17,0.62597,0.47385,0.95961,0.44444 +2020-03-18,0.61619,0.47425,0.92989,0.44444 +2020-03-19,0.59667,0.45164,0.89391,0.44444 +2020-03-20,0.54294,0.4298,0.86569,0.33333 +2020-03-21,0.53524,0.43092,0.84148,0.33333 +2020-03-22,0.52369,0.42269,0.81506,0.33333 +2020-03-23,0.51406,0.42046,0.7884,0.33333 +2020-03-24,0.5049,0.41767,0.76371,0.33333 +2020-03-25,0.4964,0.41647,0.73939,0.33333 +2020-03-26,0.49399,0.42392,0.72472,0.33333 +2020-03-27,0.4529,0.42717,0.70931,0.22222 +2020-03-28,0.44553,0.42171,0.69265,0.22222 +2020-03-29,0.43787,0.41574,0.67564,0.22222 +2020-03-30,0.4302,0.40781,0.66058,0.22222 +2020-03-31,0.42131,0.39853,0.64319,0.22222 +2020-04-01,0.41824,0.40092,0.63157,0.22222 +2020-04-02,0.41188,0.39523,0.61818,0.22222 +2020-04-03,0.40565,0.39632,0.59842,0.22222 +2020-04-04,0.40201,0.39886,0.58494,0.22222 +2020-04-05,0.3991,0.39874,0.57632,0.22222 +2020-04-06,0.39873,0.40122,0.57276,0.22222 +2020-04-07,0.36569,0.40376,0.58221,0.11111 +2020-04-08,0.36769,0.40268,0.58929,0.11111 +2020-04-09,0.36858,0.39817,0.59647,0.11111 +2020-04-10,0.43597,0.60001,0.59679,0.11111 +2020-04-11,0.29665,0.27611,0.61383,0 +2020-04-12,0.28572,0.23821,0.61894,0 +2020-04-13,0.2895,0.24415,0.62435,0 +2020-04-14,0.28883,0.25484,0.61165,0 +2020-04-15,0.27501,0.24826,0.57676,0 +2020-04-16,0.24308,0.25273,0.47649,0 +2020-04-17,0.18521,0.29561,0.26004,0 +2020-04-18,0.22055,0.41637,0.24528,0 +2020-04-19,0.20856,0.392,0.23369,0 +2020-04-20,0.2126,0.41375,0.22406,0 +2020-04-21,0.16769,0.30374,0.19932,0 +2020-04-22,0.12364,0.1965,0.17442,0 +2020-04-23,0.12243,0.22348,0.1438,0 +2020-04-24,0.094249,0.1905,0.092247,0 +2020-04-25,0.10393,0.21787,0.093906,0 +2020-04-26,0.10599,0.22796,0.090024,0 +2020-04-27,0.10517,0.21309,0.10243,0 +2020-04-28,0.066809,0.087618,0.11281,0 +2020-04-29,0.10297,0.094916,0.10288,0.11111 +2020-04-30,0.11717,0.13761,0.10278,0.11111 +2020-05-01,0.11656,0.13816,0.10041,0.11111 +2020-05-02,0.11531,0.13984,0.094964,0.11111 +2020-05-03,0.11689,0.14331,0.096251,0.11111 +2020-05-04,0.12337,0.15668,0.10232,0.11111 +2020-05-05,0.13429,0.18359,0.10815,0.11111 +2020-05-06,0.14177,0.18735,0.12686,0.11111 +2020-05-07,0.18789,0.21125,0.1302,0.22222 +2020-05-08,0.1824,0.19408,0.1309,0.22222 +2020-05-09,0.18904,0.21579,0.1291,0.22222 +2020-05-10,0.24578,0.26438,0.13963,0.33333 +2020-05-11,0.24316,0.24654,0.14961,0.33333 +2020-05-12,0.24575,0.2443,0.15961,0.33333 +2020-05-13,0.24436,0.23315,0.1666,0.33333 +2020-05-14,0.25039,0.25221,0.16562,0.33333 +2020-05-15,0.25121,0.2577,0.16261,0.33333 +2020-05-16,0.26012,0.27927,0.16775,0.33333 +2020-05-17,0.25682,0.2713,0.16581,0.33333 +2020-05-18,0.25488,0.2654,0.16592,0.33333 +2020-05-19,0.26676,0.30101,0.16594,0.33333 +2020-05-20,0.27526,0.32246,0.16997,0.33333 +2020-05-21,0.2777,0.3239,0.17586,0.33333 +2020-05-22,0.27578,0.309,0.18501,0.33333 +2020-05-23,0.28442,0.32996,0.18996,0.33333 +2020-05-24,0.27747,0.30415,0.19494,0.33333 +2020-05-25,0.27085,0.28122,0.19798,0.33333 +2020-05-26,0.27343,0.28607,0.20089,0.33333 +2020-05-27,0.25896,0.2653,0.17826,0.33333 +2020-05-28,0.28054,0.3519,0.15637,0.33333 +2020-05-29,0.25692,0.38698,0.16155,0.22222 +2020-05-30,0.25692,0.38419,0.16434,0.22222 +2020-05-31,0.25909,0.38236,0.17269,0.22222 +2020-06-01,0.25413,0.36756,0.1726,0.22222 +2020-06-02,0.27387,0.4265,0.17289,0.22222 +2020-06-03,0.25266,0.36395,0.17181,0.22222 +2020-06-04,0.2564,0.37679,0.17018,0.22222 +2020-06-05,0.25414,0.39275,0.14746,0.22222 +2020-06-06,0.23564,0.4566,0.1392,0.11111 +2020-06-07,0.24065,0.4778,0.13304,0.11111 +2020-06-08,0.25796,0.52553,0.13723,0.11111 +2020-06-09,0.26115,0.61072,0.17273,0 +2020-06-10,0.27784,0.62779,0.20573,0 +2020-06-11,0.26418,0.58589,0.20664,0 +2020-06-12,0.24092,0.52492,0.19785,0 +2020-06-13,0.23072,0.49956,0.19261,0 +2020-06-14,0.24012,0.54038,0.17999,0 +2020-06-15,0.24174,0.56314,0.16207,0 +2020-06-16,0.24988,0.58435,0.16529,0 +2020-06-17,0.24888,0.57736,0.16927,0 +2020-06-18,0.26489,0.59259,0.20207,0 +2020-06-19,0.2796,0.60175,0.23705,0 +2020-06-20,0.29968,0.63055,0.26848,0 +2020-06-21,0.31162,0.63626,0.29859,0 +2020-06-22,0.32122,0.65437,0.30928,0 +2020-06-23,0.32189,0.64563,0.32004,0 +2020-06-24,0.31451,0.619,0.32451,0 +2020-06-25,0.31666,0.62127,0.32871,0 +2020-06-26,0.31254,0.60311,0.33451,0 +2020-06-27,0.32042,0.62135,0.33991,0 +2020-06-28,0.3252,0.63128,0.34433,0 +2020-06-29,0.32957,0.62912,0.35959,0 +2020-06-30,0.33765,0.63945,0.3735,0 +2020-07-01,0.24058,0.32505,0.39669,0 +2020-07-02,0.22821,0.28864,0.39598,0 +2020-07-03,0.22692,0.28778,0.39298,0 +2020-07-04,0.22815,0.29484,0.3896,0 +2020-07-05,0.22691,0.30514,0.37558,0 +2020-07-06,0.20752,0.29013,0.33244,0 +2020-07-07,0.19021,0.29847,0.27215,0 +2020-07-08,0.17932,0.27925,0.25873,0 +2020-07-09,0.17279,0.27282,0.24555,0 +2020-07-10,0.1712,0.28378,0.22981,0 +2020-07-11,0.13625,0.1827,0.22604,0 +2020-07-12,0.14489,0.21607,0.21861,0 +2020-07-13,0.14846,0.2276,0.21777,0 +2020-07-14,0.15775,0.25415,0.21911,0 +2020-07-15,0.16781,0.27138,0.23204,0 +2020-07-16,0.17623,0.27571,0.25298,0 +2020-07-17,0.18373,0.28193,0.26926,0 +2020-07-18,0.20111,0.30887,0.29448,0 +2020-07-19,0.21615,0.33268,0.31576,0 +2020-07-20,0.22555,0.33792,0.33874,0 +2020-07-21,0.23073,0.35811,0.33408,0 +2020-07-22,0.2681,0.46426,0.34005,0 +2020-07-23,0.29901,0.54769,0.34935,0 +2020-07-24,0.32327,0.62329,0.34652,0 +2020-07-25,0.31768,0.61273,0.3403,0 +2020-07-26,0.32153,0.63575,0.32885,0 +2020-07-27,0.4282,0.73772,0.43577,0.11111 +2020-07-28,0.37625,0.49362,0.52402,0.11111 +2020-07-29,0.39433,0.48847,0.58341,0.11111 +2020-07-30,0.40511,0.48254,0.62168,0.11111 +2020-07-31,0.40521,0.47589,0.62864,0.11111 +2020-08-01,0.40824,0.48486,0.62875,0.11111 +2020-08-02,0.476,0.54587,0.6599,0.22222 +2020-08-03,0.46256,0.53143,0.63404,0.22222 +2020-08-04,0.45641,0.54166,0.60536,0.22222 +2020-08-05,0.44515,0.51688,0.59635,0.22222 +2020-08-06,0.43256,0.48807,0.58739,0.22222 +2020-08-07,0.42976,0.48768,0.57937,0.22222 +2020-08-08,0.42707,0.48903,0.56995,0.22222 +2020-08-09,0.42288,0.48071,0.56571,0.22222 +2020-08-10,0.41874,0.47227,0.56174,0.22222 +2020-08-11,0.41224,0.46285,0.55164,0.22222 +2020-08-12,0.40086,0.44447,0.5359,0.22222 +2020-08-13,0.39009,0.43176,0.51629,0.22222 +2020-08-14,0.3778,0.42399,0.48718,0.22222 +2020-08-15,0.36527,0.42296,0.45064,0.22222 +2020-08-16,0.35107,0.4158,0.41519,0.22222 +2020-08-17,0.32901,0.38772,0.37708,0.22222 +2020-08-18,0.31297,0.37094,0.34574,0.22222 +2020-08-19,0.30173,0.37323,0.30972,0.22222 +2020-08-20,0.29642,0.37438,0.29266,0.22222 +2020-08-21,0.2878,0.36797,0.27322,0.22222 +2020-08-22,0.27385,0.34967,0.24966,0.22222 +2020-08-23,0.26998,0.35959,0.22811,0.22222 +2020-08-24,0.27022,0.3739,0.21455,0.22222 +2020-08-25,0.25023,0.32995,0.19852,0.22222 +2020-08-26,0.24069,0.4055,0.20546,0.11111 +2020-08-27,0.24282,0.40762,0.20972,0.11111 +2020-08-28,0.24288,0.40619,0.21134,0.11111 +2020-08-29,0.24259,0.406,0.21064,0.11111 +2020-08-30,0.24084,0.40328,0.20814,0.11111 +2020-08-31,0.18725,0.24682,0.20381,0.11111 +2020-09-01,0.10672,0.17057,0.14959,0 +2020-09-02,0.16853,0.25297,0.1415,0.11111 +2020-09-03,0.35793,0.65229,0.19928,0.22222 +2020-09-04,0.36341,0.62701,0.24099,0.22222 +2020-09-05,0.37553,0.62831,0.27606,0.22222 +2020-09-06,0.38011,0.61582,0.3023,0.22222 +2020-09-07,0.38931,0.61674,0.32898,0.22222 +2020-09-08,0.39089,0.61209,0.33836,0.22222 +2020-09-09,0.39471,0.61786,0.34406,0.22222 +2020-09-10,0.40096,0.63141,0.34926,0.22222 +2020-09-11,0.40346,0.63607,0.35209,0.22222 +2020-09-12,0.4126,0.64778,0.36781,0.22222 +2020-09-13,0.41569,0.64414,0.38072,0.22222 +2020-09-14,0.41051,0.62534,0.38395,0.22222 +2020-09-15,0.4156,0.62969,0.39489,0.22222 +2020-09-16,0.41998,0.63016,0.40757,0.22222 +2020-09-17,0.42124,0.63065,0.41085,0.22222 +2020-09-18,0.42839,0.64579,0.41716,0.22222 +2020-09-19,0.43219,0.65216,0.42219,0.22222 +2020-09-20,0.43686,0.65888,0.42947,0.22222 +2020-09-21,0.42934,0.63738,0.42843,0.22222 +2020-09-22,0.41699,0.60105,0.42769,0.22222 +2020-09-23,0.41612,0.60581,0.42034,0.22222 +2020-09-24,0.41976,0.62623,0.41084,0.22222 +2020-09-25,0.40418,0.58879,0.40153,0.22222 +2020-09-26,0.40391,0.5983,0.3912,0.22222 +2020-09-27,0.40489,0.61101,0.38143,0.22222 +2020-09-28,0.40628,0.62152,0.37509,0.22222 +2020-09-29,0.4062,0.62574,0.37064,0.22222 +2020-09-30,0.40998,0.63744,0.37026,0.22222 +2020-10-01,0.41386,0.63784,0.38152,0.22222 +2020-10-02,0.35463,0.54515,0.40763,0.11111 +2020-10-03,0.30445,0.48941,0.42396,0 +2020-10-04,0.29517,0.45558,0.42993,0 +2020-10-05,0.2978,0.46783,0.42559,0 +2020-10-06,0.29189,0.46464,0.41103,0 +2020-10-07,0.28146,0.46813,0.37626,0 +2020-10-08,0.26363,0.45823,0.33266,0 +2020-10-09,0.23786,0.45755,0.25603,0 +2020-10-10,0.23916,0.45569,0.2618,0 +2020-10-11,0.23199,0.42836,0.26762,0 +2020-10-12,0.22918,0.42244,0.2651,0 +2020-10-13,0.23468,0.43516,0.26887,0 +2020-10-14,0.24361,0.45353,0.27732,0 +2020-10-15,0.25227,0.47249,0.28431,0 +2020-10-16,0.25451,0.47776,0.28577,0 +2020-10-17,0.24663,0.44571,0.29417,0 +2020-10-18,0.25135,0.45227,0.30176,0 +2020-10-19,0.25088,0.44723,0.3054,0 +2020-10-20,0.25491,0.45312,0.31162,0 +2020-10-21,0.31076,0.49875,0.32241,0.11111 +2020-10-22,0.29657,0.44716,0.33142,0.11111 +2020-10-23,0.27778,0.38667,0.33556,0.11111 +2020-10-24,0.28485,0.4213,0.32214,0.11111 +2020-10-25,0.27826,0.41292,0.31075,0.11111 +2020-10-26,0.27463,0.41098,0.30181,0.11111 +2020-10-27,0.29216,0.35516,0.29909,0.22222 +2020-10-28,0.3118,0.41586,0.29733,0.22222 +2020-10-29,0.30893,0.40935,0.29523,0.22222 +2020-10-30,0.31035,0.41237,0.29647,0.22222 +2020-10-31,0.30521,0.41152,0.2819,0.22222 +2020-11-01,0.29242,0.38937,0.26567,0.22222 +2020-11-02,0.28507,0.38519,0.24779,0.22222 +2020-11-03,0.27838,0.38085,0.23208,0.22222 +2020-11-04,0.27468,0.37739,0.22444,0.22222 +2020-11-05,0.31502,0.36317,0.24856,0.33333 +2020-11-06,0.29382,0.2826,0.26552,0.33333 +2020-11-07,0.29861,0.25635,0.30614,0.33333 +2020-11-08,0.32348,0.30417,0.33293,0.33333 +2020-11-09,0.32426,0.29274,0.34671,0.33333 +2020-11-10,0.32875,0.3002,0.35272,0.33333 +2020-11-11,0.32622,0.29208,0.35324,0.33333 +2020-11-12,0.31725,0.28764,0.33079,0.33333 +2020-11-13,0.29844,0.25296,0.30903,0.33333 +2020-11-14,0.29155,0.25429,0.28702,0.33333 +2020-11-15,0.28695,0.2522,0.27533,0.33333 +2020-11-16,0.26945,0.22291,0.2521,0.33333 +2020-11-17,0.27735,0.27207,0.22665,0.33333 +2020-11-18,0.26341,0.25228,0.20462,0.33333 +2020-11-19,0.266,0.28488,0.17979,0.33333 +2020-11-20,0.22766,0.28144,0.17933,0.22222 +2020-11-21,0.21546,0.24377,0.18039,0.22222 +2020-11-22,0.21479,0.24334,0.17882,0.22222 +2020-11-23,0.21521,0.24557,0.17785,0.22222 +2020-11-24,0.20393,0.20725,0.1823,0.22222 +2020-11-25,0.21011,0.22443,0.18368,0.22222 +2020-11-26,0.21429,0.22749,0.19315,0.22222 +2020-11-27,0.19944,0.1879,0.1882,0.22222 +2020-11-28,0.19269,0.17006,0.18578,0.22222 +2020-11-29,0.18949,0.16328,0.18298,0.22222 +2020-11-30,0.23105,0.16785,0.19196,0.33333 +2020-12-01,0.2422,0.19528,0.198,0.33333 +2020-12-02,0.24212,0.19136,0.20168,0.33333 +2020-12-03,0.23861,0.19689,0.18559,0.33333 +2020-12-04,0.23371,0.2108,0.15699,0.33333 +2020-12-05,0.21901,0.27788,0.15692,0.22222 +2020-12-06,0.22928,0.30879,0.15684,0.22222 +2020-12-07,0.2288,0.30325,0.16092,0.22222 +2020-12-08,0.22779,0.29863,0.16252,0.22222 +2020-12-09,0.21596,0.26122,0.16444,0.22222 +2020-12-10,0.21893,0.26863,0.16595,0.22222 +2020-12-11,0.22321,0.27752,0.16988,0.22222 +2020-12-12,0.22462,0.27864,0.17301,0.22222 +2020-12-13,0.21761,0.25526,0.17535,0.22222 +2020-12-14,0.21523,0.2534,0.17008,0.22222 +2020-12-15,0.23016,0.297,0.17126,0.22222 +2020-12-16,0.2378,0.21699,0.16307,0.33333 +2020-12-17,0.29218,0.38463,0.15857,0.33333 +2020-12-18,0.275,0.33721,0.15446,0.33333 +2020-12-19,0.27891,0.35381,0.14959,0.33333 +2020-12-20,0.28346,0.37113,0.14593,0.33333 +2020-12-21,0.27551,0.35213,0.14106,0.33333 +2020-12-22,0.26685,0.33022,0.13698,0.33333 +2020-12-23,0.26652,0.33774,0.12848,0.33333 +2020-12-24,0.26623,0.34585,0.1195,0.33333 +2020-12-25,0.27225,0.37068,0.11274,0.33333 +2020-12-26,0.27326,0.48666,0.11092,0.22222 +2020-12-27,0.25573,0.43394,0.11104,0.22222 +2020-12-28,0.25621,0.43364,0.11277,0.22222 +2020-12-29,0.26179,0.44965,0.1135,0.22222 +2020-12-30,0.19857,0.37928,0.10531,0.11111 +2020-12-31,0.18322,0.35197,0.086578,0.11111 +2021-01-01,0.1789,0.3664,0.059173,0.11111 +2021-01-02,0.20295,0.32806,0.058581,0.22222 +2021-01-03,0.19525,0.31054,0.053006,0.22222 +2021-01-04,0.19241,0.30679,0.048205,0.22222 +2021-01-05,0.18223,0.27876,0.045715,0.22222 +2021-01-06,0.25003,0.3655,0.051244,0.33333 +2021-01-07,0.2777,0.44495,0.054819,0.33333 +2021-01-08,0.27187,0.42839,0.053893,0.33333 +2021-01-09,0.2646,0.40898,0.051497,0.33333 +2021-01-10,0.26484,0.40212,0.059061,0.33333 +2021-01-11,0.28417,0.42512,0.094053,0.33333 +2021-01-12,0.28842,0.41376,0.11818,0.33333 +2021-01-13,0.32557,0.39086,0.14141,0.44444 +2021-01-14,0.35156,0.47312,0.1371,0.44444 +2021-01-15,0.30428,0.42624,0.15327,0.33333 +2021-01-16,0.3117,0.43611,0.16565,0.33333 +2021-01-17,0.31916,0.45384,0.17032,0.33333 +2021-01-18,0.32191,0.46481,0.16758,0.33333 +2021-01-19,0.32346,0.47106,0.16597,0.33333 +2021-01-20,0.33271,0.49445,0.17035,0.33333 +2021-01-21,0.33623,0.39284,0.17141,0.44444 +2021-01-22,0.35613,0.44813,0.17582,0.44444 +2021-01-23,0.3496,0.43416,0.17018,0.44444 +2021-01-24,0.35417,0.45217,0.1659,0.44444 +2021-01-25,0.37404,0.51238,0.16528,0.44444 +2021-01-26,0.38072,0.53484,0.16288,0.44444 +2021-01-27,0.36714,0.50161,0.15538,0.44444 +2021-01-28,0.37416,0.53691,0.14112,0.44444 +2021-01-29,0.36073,0.51811,0.11965,0.44444 +2021-01-30,0.35116,0.50907,0.099953,0.44444 +2021-01-31,0.35981,0.55683,0.07816,0.44444 +2021-02-01,0.33023,0.59357,0.063801,0.33333 +2021-02-02,0.31603,0.57228,0.042462,0.33333 +2021-02-03,0.31807,0.58481,0.036051,0.33333 +2021-02-04,0.31311,0.56353,0.042459,0.33333 +2021-02-05,0.27375,0.54734,0.051684,0.22222 +2021-02-06,0.27889,0.55385,0.0606,0.22222 +2021-02-07,0.28558,0.55857,0.075952,0.22222 +2021-02-08,0.28324,0.44638,0.070011,0.33333 +2021-02-09,0.25187,0.3517,0.070587,0.33333 +2021-02-10,0.25335,0.35268,0.074027,0.33333 +2021-02-11,0.25101,0.34325,0.076447,0.33333 +2021-02-12,0.20724,0.32051,0.078991,0.22222 +2021-02-13,0.21271,0.33252,0.083377,0.22222 +2021-02-14,0.2168,0.34219,0.086001,0.22222 +2021-02-15,0.21907,0.33433,0.10067,0.22222 +2021-02-16,0.2225,0.33187,0.11341,0.22222 +2021-02-17,0.22386,0.32209,0.12726,0.22222 +2021-02-18,0.22336,0.30229,0.14557,0.22222 +2021-02-19,0.22833,0.31861,0.14417,0.22222 +2021-02-20,0.15803,0.20842,0.15455,0.11111 +2021-02-21,0.16404,0.21831,0.16271,0.11111 +2021-02-22,0.16112,0.20993,0.16232,0.11111 +2021-02-23,0.16765,0.22993,0.16192,0.11111 +2021-02-24,0.15111,0.18171,0.1605,0.11111 +2021-02-25,0.15407,0.19145,0.15966,0.11111 +2021-02-26,0.13617,0.14181,0.15559,0.11111 +2021-02-27,0.1445,0.16603,0.15634,0.11111 +2021-02-28,0.14587,0.16683,0.15968,0.11111 +2021-03-01,0.14214,0.15413,0.16118,0.11111 +2021-03-02,0.13916,0.14463,0.16174,0.11111 +2021-03-03,0.14121,0.15073,0.16179,0.11111 +2021-03-04,0.13896,0.14348,0.16231,0.11111 +2021-03-05,0.14074,0.15057,0.16053,0.11111 +2021-03-06,0.1466,0.17657,0.15211,0.11111 +2021-03-07,0.1427,0.17289,0.14409,0.11111 +2021-03-08,0.14021,0.16377,0.14574,0.11111 +2021-03-09,0.14506,0.18289,0.14118,0.11111 +2021-03-10,0.13228,0.24409,0.15276,0 +2021-03-11,0.14091,0.24337,0.17937,0 +2021-03-12,0.14617,0.24459,0.19394,0 +2021-03-13,0.1487,0.2432,0.20289,0 +2021-03-14,0.1367,0.21426,0.19585,0 +2021-03-15,0.12877,0.20978,0.17654,0 +2021-03-16,0.11616,0.19261,0.15586,0 +2021-03-17,0.11197,0.18452,0.15138,0 +2021-03-18,0.1133,0.19235,0.14756,0 +2021-03-19,0.1253,0.23332,0.14258,0 +2021-03-20,0.1499,0.3109,0.13879,0 +2021-03-21,0.17702,0.38668,0.14437,0 +2021-03-22,0.17084,0.36182,0.15071,0 +2021-03-23,0.16813,0.34634,0.15806,0 +2021-03-24,0.13612,0.23287,0.17548,0 +2021-03-25,0.14202,0.25024,0.17583,0 +2021-03-26,0.13869,0.25142,0.16464,0 +2021-03-27,0.13004,0.24471,0.14542,0 +2021-03-28,0.13083,0.24941,0.14308,0 +2021-03-29,0.1267,0.23736,0.14274,0 +2021-03-30,0.12688,0.23627,0.14437,0 +2021-03-31,0.11978,0.23613,0.12322,0 +2021-04-01,0.13832,0.28632,0.12864,0 +2021-04-02,0.15007,0.29839,0.15183,0 +2021-04-03,0.15523,0.30751,0.15819,0 +2021-04-04,0.14482,0.27279,0.16168,0 +2021-04-05,0.16149,0.31607,0.16839,0 +2021-04-06,0.1694,0.33455,0.17365,0 +2021-04-07,0.17091,0.33075,0.18197,0 +2021-04-08,0.1785,0.35228,0.18324,0 +2021-04-09,0.17072,0.32782,0.18434,0 +2021-04-10,0.16871,0.33232,0.1738,0 +2021-04-11,0.18164,0.37587,0.16906,0 +2021-04-12,0.17347,0.35288,0.16751,0 +2021-04-13,0.18029,0.26234,0.16741,0.11111 +2021-04-14,0.16651,0.23125,0.15716,0.11111 +2021-04-15,0.17364,0.25826,0.15156,0.11111 +2021-04-16,0.16581,0.24897,0.13736,0.11111 +2021-04-17,0.15868,0.24348,0.12145,0.11111 +2021-04-18,0.18686,0.22216,0.1162,0.22222 +2021-04-19,0.17711,0.18154,0.12755,0.22222 +2021-04-20,0.18315,0.19976,0.12746,0.22222 +2021-04-21,0.19015,0.2205,0.12773,0.22222 +2021-04-22,0.20787,0.27394,0.12745,0.22222 +2021-04-23,0.2035,0.26495,0.12332,0.22222 +2021-04-24,0.20041,0.25999,0.11902,0.22222 +2021-04-25,0.20348,0.26781,0.12042,0.22222 +2021-04-26,0.25533,0.28514,0.14752,0.33333 +2021-04-27,0.26582,0.29236,0.17176,0.33333 +2021-04-28,0.27367,0.3001,0.18757,0.33333 +2021-04-29,0.27532,0.29549,0.19714,0.33333 +2021-04-30,0.311,0.27349,0.21506,0.44444 +2021-05-01,0.28804,0.19881,0.22085,0.44444 +2021-05-02,0.28584,0.21023,0.20284,0.44444 +2021-05-03,0.28339,0.21628,0.18945,0.44444 +2021-05-04,0.2708,0.18761,0.18035,0.44444 +2021-05-05,0.29727,0.27266,0.17472,0.44444 +2021-05-06,0.28989,0.26226,0.16297,0.44444 +2021-05-07,0.28602,0.26422,0.1494,0.44444 +2021-05-08,0.2884,0.27599,0.14476,0.44444 +2021-05-09,0.28608,0.27503,0.13876,0.44444 +2021-05-10,0.27989,0.26317,0.13206,0.44444 +2021-05-11,0.26564,0.23066,0.12182,0.44444 +2021-05-12,0.30298,0.22923,0.12415,0.55556 +2021-05-13,0.26478,0.21747,0.13244,0.44444 +2021-05-14,0.26168,0.21264,0.12797,0.44444 +2021-05-15,0.24913,0.18685,0.1161,0.44444 +2021-05-16,0.23989,0.16632,0.10889,0.44444 +2021-05-17,0.2364,0.1642,0.10055,0.44444 +2021-05-18,0.20232,0.17243,0.10118,0.33333 +2021-05-19,0.22994,0.14323,0.10214,0.44444 +2021-05-20,0.28857,0.30691,0.11436,0.44444 +2021-05-21,0.30922,0.3588,0.1244,0.44444 +2021-05-22,0.30114,0.33093,0.12803,0.44444 +2021-05-23,0.29141,0.30133,0.12847,0.44444 +2021-05-24,0.30694,0.3291,0.14727,0.44444 +2021-05-25,0.30029,0.3139,0.14251,0.44444 +2021-05-26,0.27432,0.34555,0.14408,0.33333 +2021-05-27,0.27025,0.3362,0.14122,0.33333 +2021-05-28,0.26022,0.31165,0.13569,0.33333 +2021-05-29,0.25891,0.31521,0.12817,0.33333 +2021-05-30,0.22872,0.33872,0.12522,0.22222 +2021-05-31,0.22377,0.31929,0.12979,0.22222 +2021-06-01,0.21983,0.30321,0.13407,0.22222 +2021-06-02,0.22551,0.32873,0.12558,0.22222 +2021-06-03,0.22126,0.31663,0.12492,0.22222 +2021-06-04,0.22784,0.32887,0.13242,0.22222 +2021-06-05,0.22427,0.31183,0.13876,0.22222 +2021-06-06,0.2235,0.30698,0.14129,0.22222 +2021-06-07,0.21525,0.28016,0.14338,0.22222 +2021-06-08,0.20979,0.26242,0.14473,0.22222 +2021-06-09,0.19395,0.21967,0.13996,0.22222 +2021-06-10,0.1937,0.23208,0.1268,0.22222 +2021-06-11,0.17849,0.29683,0.12752,0.11111 +2021-06-12,0.1676,0.26365,0.12804,0.11111 +2021-06-13,0.17342,0.28132,0.12783,0.11111 +2021-06-14,0.172,0.27737,0.12753,0.11111 +2021-06-15,0.18257,0.30918,0.12742,0.11111 +2021-06-16,0.18591,0.31654,0.13007,0.11111 +2021-06-17,0.2072,0.37842,0.13206,0.11111 +2021-06-18,0.11271,0.20579,0.13233,0 +2021-06-19,0.076307,0.097556,0.13137,0 +2021-06-20,0.10742,0.17798,0.14429,0 +2021-06-21,0.13426,0.14945,0.14221,0.11111 +2021-06-22,0.10129,0.056855,0.13589,0.11111 +2021-06-23,0.09945,0.08618,0.10106,0.11111 +2021-06-24,0.076667,0.067108,0.051783,0.11111 +2021-06-25,0.067405,0.055062,0.036041,0.11111 +2021-06-26,0.064779,0.04907,0.034156,0.11111 +2021-06-27,0.064467,0.038706,0.043583,0.11111 +2021-06-28,0.056455,0.017905,0.040348,0.11111 +2021-06-29,0.058421,0.024455,0.039697,0.11111 +2021-06-30,0.057051,0.025774,0.034266,0.11111 +2021-07-01,0.050755,0.012407,0.028746,0.11111 +2021-07-02,0.052591,0.015288,0.031374,0.11111 +2021-07-03,0.059174,0.030307,0.036105,0.11111 +2021-07-04,0.068,0.039814,0.053074,0.11111 +2021-07-05,0.068875,0.033604,0.06191,0.11111 +2021-07-06,0.07737,0.045333,0.075668,0.11111 +2021-07-07,0.095071,0.08307,0.091034,0.11111 +2021-07-08,0.11657,0.12877,0.10982,0.11111 +2021-07-09,0.1264,0.14369,0.12439,0.11111 +2021-07-10,0.13097,0.14048,0.14131,0.11111 +2021-07-11,0.14333,0.16143,0.15744,0.11111 +2021-07-12,0.13137,0.10719,0.17581,0.11111 +2021-07-13,0.12927,0.090714,0.18599,0.11111 +2021-07-14,0.14024,0.10818,0.20142,0.11111 +2021-07-15,0.15045,0.12548,0.21476,0.11111 +2021-07-16,0.16246,0.13943,0.23683,0.11111 +2021-07-17,0.18391,0.18395,0.25668,0.11111 +2021-07-18,0.20692,0.2322,0.27746,0.11111 +2021-07-19,0.20376,0.20133,0.29883,0.11111 +2021-07-20,0.23248,0.27246,0.31388,0.11111 +2021-07-21,0.23336,0.27438,0.3146,0.11111 +2021-07-22,0.21719,0.2255,0.31496,0.11111 +2021-07-23,0.21203,0.21375,0.31122,0.11111 +2021-07-24,0.19618,0.17365,0.30376,0.11111 +2021-07-25,0.19008,0.17203,0.28709,0.11111 +2021-07-26,0.19289,0.20342,0.26414,0.11111 +2021-07-27,0.23258,0.37122,0.21542,0.11111 +2021-07-28,0.23138,0.36895,0.21407,0.11111 +2021-07-29,0.23726,0.3977,0.20297,0.11111 +2021-07-30,0.2086,0.33483,0.17985,0.11111 +2021-07-31,0.19228,0.33323,0.13251,0.11111 +2021-08-01,0.18589,0.31575,0.13081,0.11111 +2021-08-02,0.18116,0.30627,0.12611,0.11111 +2021-08-03,0.18499,0.31734,0.12652,0.11111 +2021-08-04,0.19233,0.3378,0.12808,0.11111 +2021-08-05,0.18936,0.32389,0.1331,0.11111 +2021-08-06,0.19219,0.3299,0.13557,0.11111 +2021-08-07,0.2004,0.35218,0.1379,0.11111 +2021-08-08,0.1965,0.34062,0.13777,0.11111 +2021-08-09,0.1837,0.30349,0.13649,0.11111 +2021-08-10,0.1759,0.28141,0.13519,0.11111 +2021-08-11,0.18588,0.31536,0.13118,0.11111 +2021-08-12,0.17674,0.29252,0.12659,0.11111 +2021-08-13,0.21389,0.29322,0.12624,0.22222 +2021-08-14,0.20129,0.25669,0.12495,0.22222 +2021-08-15,0.1962,0.2534,0.11298,0.22222 +2021-08-16,0.18269,0.22684,0.099022,0.22222 +2021-08-17,0.17498,0.22566,0.077049,0.22222 +2021-08-18,0.16963,0.23469,0.051992,0.22222 +2021-08-19,0.14827,0.19181,0.030764,0.22222 +2021-08-20,0.14108,0.28212,0.029998,0.11111 +2021-08-21,0.13369,0.25951,0.030449,0.11111 +2021-08-22,0.14726,0.30082,0.029848,0.11111 +2021-08-23,0.1607,0.34021,0.030767,0.11111 +2021-08-24,0.15315,0.31933,0.029024,0.11111 +2021-08-25,0.13335,0.25968,0.029251,0.11111 +2021-08-26,0.13642,0.28004,0.018109,0.11111 +2021-08-27,0.12709,0.27015,0,0.11111 +2021-08-28,0.13498,0.29384,0,0.11111 +2021-08-29,0.16109,0.37215,0,0.11111 +2021-08-30,0.15876,0.36518,0,0.11111 +2021-08-31,0.15496,0.35376,0,0.11111 +2021-09-01,0.15015,0.33935,0,0.11111 +2021-09-02,0.14884,0.32798,0.0074395,0.11111 +2021-09-03,0.15887,0.33795,0.027557,0.11111 +2021-09-04,0.16845,0.3513,0.04293,0.11111 +2021-09-05,0.15471,0.30271,0.050311,0.11111 +2021-09-06,0.16609,0.30384,0.083318,0.11111 +2021-09-07,0.2142,0.30101,0.11936,0.22222 +2021-09-08,0.21853,0.29323,0.14014,0.22222 +2021-09-09,0.22292,0.29157,0.15496,0.22222 +2021-09-10,0.22444,0.28526,0.16584,0.22222 +2021-09-11,0.22361,0.27193,0.17668,0.22222 +2021-09-12,0.19442,0.28952,0.18263,0.11111 +2021-09-13,0.19158,0.27774,0.18589,0.11111 +2021-09-14,0.19251,0.27548,0.19095,0.11111 +2021-09-15,0.19388,0.27514,0.19539,0.11111 +2021-09-16,0.19707,0.28064,0.19947,0.11111 +2021-09-17,0.21,0.31114,0.20774,0.11111 +2021-09-18,0.20246,0.28124,0.21502,0.11111 +2021-09-19,0.21057,0.30169,0.2189,0.11111 +2021-09-20,0.24699,0.296,0.22273,0.22222 +2021-09-21,0.27053,0.36673,0.22263,0.22222 +2021-09-22,0.28848,0.41411,0.22912,0.22222 +2021-09-23,0.29193,0.41542,0.23814,0.22222 +2021-09-24,0.29554,0.41737,0.24703,0.22222 +2021-09-25,0.28927,0.39251,0.25309,0.22222 +2021-09-26,0.30053,0.42268,0.25668,0.22222 +2021-09-27,0.29209,0.40165,0.25239,0.22222 +2021-09-28,0.29369,0.41064,0.24819,0.22222 +2021-09-29,0.2985,0.41951,0.25379,0.22222 +2021-09-30,0.29523,0.41108,0.25238,0.22222 +2021-10-01,0.34908,0.46529,0.24861,0.33333 +2021-10-02,0.32294,0.39618,0.23931,0.33333 +2021-10-03,0.31711,0.39514,0.22287,0.33333 +2021-10-04,0.31595,0.40861,0.20592,0.33333 +2021-10-05,0.31081,0.40341,0.1957,0.33333 +2021-10-06,0.32598,0.47947,0.16514,0.33333 +2021-10-07,0.31083,0.54804,0.16222,0.22222 +2021-10-08,0.30697,0.53438,0.1643,0.22222 +2021-10-09,0.31351,0.55104,0.16726,0.22222 +2021-10-10,0.31921,0.56666,0.16874,0.22222 +2021-10-11,0.30751,0.53249,0.16782,0.22222 +2021-10-12,0.30401,0.52296,0.16686,0.22222 +2021-10-13,0.30909,0.53077,0.17428,0.22222 +2021-10-14,0.31492,0.54313,0.17943,0.22222 +2021-10-15,0.29222,0.48043,0.174,0.22222 +2021-10-16,0.27143,0.42418,0.16788,0.22222 +2021-10-17,0.27033,0.43221,0.15656,0.22222 +2021-10-18,0.27244,0.44701,0.14808,0.22222 +2021-10-19,0.28306,0.48049,0.14645,0.22222 +2021-10-20,0.22901,0.4225,0.15342,0.11111 +2021-10-21,0.21359,0.37638,0.15329,0.11111 +2021-10-22,0.20933,0.3678,0.14907,0.11111 +2021-10-23,0.20658,0.36998,0.13866,0.11111 +2021-10-24,0.21402,0.41039,0.12055,0.11111 +2021-10-25,0.19799,0.38342,0.099428,0.11111 +2021-10-26,0.18722,0.38302,0.067521,0.11111 +2021-10-27,0.18657,0.38493,0.063656,0.11111 +2021-10-28,0.18669,0.3856,0.063361,0.11111 +2021-10-29,0.1913,0.40471,0.058094,0.11111 +2021-10-30,0.16228,0.31707,0.058663,0.11111 +2021-10-31,0.15725,0.41937,0.052376,0 +2021-11-01,0.15705,0.42442,0.046738,0 +2021-11-02,0.14767,0.40102,0.041981,0 +2021-11-03,0.15045,0.39764,0.05371,0 +2021-11-04,0.12688,0.31209,0.068543,0 +2021-11-05,0.12242,0.27943,0.087819,0 +2021-11-06,0.13531,0.31525,0.090665,0 +2021-11-07,0.13294,0.29838,0.10044,0 +2021-11-08,0.17624,0.31724,0.10037,0.11111 +2021-11-09,0.17331,0.30887,0.099944,0.11111 +2021-11-10,0.16873,0.29663,0.098455,0.11111 +2021-11-11,0.16423,0.28775,0.093833,0.11111 +2021-11-12,0.171,0.30902,0.092872,0.11111 +2021-11-13,0.20381,0.41293,0.087398,0.11111 +2021-11-14,0.22476,0.47632,0.086855,0.11111 +2021-11-15,0.22561,0.46138,0.10434,0.11111 +2021-11-16,0.22822,0.46744,0.1061,0.11111 +2021-11-17,0.21397,0.42159,0.1092,0.11111 +2021-11-18,0.19188,0.35576,0.10878,0.11111 +2021-11-19,0.18592,0.33721,0.10944,0.11111 +2021-11-20,0.17891,0.32459,0.10102,0.11111 +2021-11-21,0.17927,0.32431,0.10239,0.11111 +2021-11-22,0.17148,0.29836,0.10496,0.11111 +2021-11-23,0.17628,0.31184,0.1059,0.11111 +2021-11-24,0.16834,0.28899,0.10491,0.11111 +2021-11-25,0.16032,0.26757,0.1023,0.11111 +2021-11-26,0.19196,0.24824,0.10542,0.22222 +2021-11-27,0.19581,0.25737,0.10784,0.22222 +2021-11-28,0.201,0.26213,0.11866,0.22222 +2021-11-29,0.18738,0.2174,0.12251,0.22222 +2021-11-30,0.18387,0.20392,0.12547,0.22222 +2021-12-01,0.1961,0.23948,0.12659,0.22222 +2021-12-02,0.20763,0.27514,0.12552,0.22222 +2021-12-03,0.19751,0.25477,0.11555,0.22222 +2021-12-04,0.27825,0.38652,0.11488,0.33333 +2021-12-05,0.2358,0.27665,0.09743,0.33333 +2021-12-06,0.23221,0.28335,0.079951,0.33333 +2021-12-07,0.22724,0.28091,0.067472,0.33333 +2021-12-08,0.21285,0.3483,0.06803,0.22222 +2021-12-09,0.20211,0.31364,0.070471,0.22222 +2021-12-10,0.19489,0.29019,0.072253,0.22222 +2021-12-11,0.18157,0.25078,0.071699,0.22222 +2021-12-12,0.1703,0.21737,0.071306,0.22222 +2021-12-13,0.15747,0.17753,0.072663,0.22222 +2021-12-14,0.14359,0.13619,0.072342,0.22222 +2021-12-15,0.12779,0.11189,0.049257,0.22222 +2021-12-16,0.1317,0.13576,0.037123,0.22222 +2021-12-17,0.13696,0.16464,0.024014,0.22222 +2021-12-18,0.13663,0.16992,0.01775,0.22222 +2021-12-19,0.14424,0.1947,0.015816,0.22222 +2021-12-20,0.16113,0.23183,0.029328,0.22222 +2021-12-21,0.1593,0.22282,0.032858,0.22222 +2021-12-22,0.16011,0.21094,0.047163,0.22222 +2021-12-23,0.15789,0.19623,0.055208,0.22222 +2021-12-24,0.15833,0.17746,0.075317,0.22222 +2021-12-25,0.17372,0.2147,0.084236,0.22222 +2021-12-26,0.1457,0.22607,0.09991,0.11111 +2021-12-27,0.15661,0.24573,0.11299,0.11111 +2021-12-28,0.14995,0.22625,0.11249,0.11111 +2021-12-29,0.14988,0.22546,0.11305,0.11111 +2021-12-30,0.14752,0.21244,0.119,0.11111 +2021-12-31,0.14561,0.20055,0.12517,0.11111 +2022-01-01,0.14949,0.21089,0.12647,0.11111 +2022-01-02,0.10252,0.069331,0.12713,0.11111 +2022-01-03,0.075535,0.10281,0.1238,0 +2022-01-04,0.080983,0.10503,0.13792,0 +2022-01-05,0.078424,0.094771,0.1405,0 +2022-01-06,0.062042,0.041545,0.14458,0 +2022-01-07,0.067935,0.057722,0.14608,0 +2022-01-08,0.071313,0.060975,0.15296,0 +2022-01-09,0.088835,0.10914,0.15736,0 +2022-01-10,0.10391,0.14735,0.16437,0 +2022-01-11,0.10324,0.14342,0.1663,0 +2022-01-12,0.11857,0.19015,0.16555,0 +2022-01-13,0.13248,0.23793,0.15952,0 +2022-01-14,0.11533,0.20439,0.1416,0 +2022-01-15,0.11435,0.21134,0.13172,0 +2022-01-16,0.11951,0.24933,0.10921,0 +2022-01-17,0.11026,0.23966,0.091131,0 +2022-01-18,0.095089,0.2115,0.073771,0 +2022-01-19,0.11275,0.24878,0.089471,0 +2022-01-20,0.12472,0.27215,0.10202,0 +2022-01-21,0.21081,0.3869,0.13441,0.11111 +2022-01-22,0.25795,0.50831,0.15444,0.11111 +2022-01-23,0.26834,0.50621,0.18771,0.11111 +2022-01-24,0.27171,0.4859,0.21812,0.11111 +2022-01-25,0.27718,0.48034,0.24009,0.11111 +2022-01-26,0.30534,0.54803,0.25688,0.11111 +2022-01-27,0.31538,0.56012,0.27492,0.11111 +2022-01-28,0.31769,0.56261,0.27934,0.11111 +2022-01-29,0.32518,0.56348,0.30096,0.11111 +2022-01-30,0.33799,0.5719,0.33096,0.11111 +2022-01-31,0.3515,0.58303,0.36038,0.11111 +2022-02-01,0.36202,0.58597,0.38897,0.11111 +2022-02-02,0.35449,0.55939,0.39298,0.11111 +2022-02-03,0.35125,0.55197,0.39068,0.11111 +2022-02-04,0.36801,0.47777,0.40402,0.22222 +2022-02-05,0.34375,0.39654,0.41249,0.22222 +2022-02-06,0.34879,0.40556,0.4186,0.22222 +2022-02-07,0.34447,0.3952,0.41598,0.22222 +2022-02-08,0.33654,0.37435,0.41304,0.22222 +2022-02-09,0.33717,0.38467,0.4046,0.22222 +2022-02-10,0.33686,0.38764,0.40071,0.22222 +2022-02-11,0.33601,0.38446,0.40135,0.22222 +2022-02-12,0.33732,0.38444,0.4053,0.22222 +2022-02-13,0.33948,0.39081,0.40542,0.22222 +2022-02-14,0.34084,0.38544,0.41488,0.22222 +2022-02-15,0.33526,0.37324,0.41032,0.22222 +2022-02-16,0.33142,0.36431,0.40774,0.22222 +2022-02-17,0.35694,0.34185,0.39563,0.33333 +2022-02-18,0.34396,0.32224,0.37629,0.33333 +2022-02-19,0.33474,0.31689,0.354,0.33333 +2022-02-20,0.26124,0.20744,0.35407,0.22222 +2022-02-21,0.26251,0.2112,0.3541,0.22222 +2022-02-22,0.26697,0.22576,0.35292,0.22222 +2022-02-23,0.26417,0.21996,0.35034,0.22222 +2022-02-24,0.2588,0.20517,0.34901,0.22222 +2022-02-25,0.2514,0.1867,0.34528,0.22222 +2022-02-26,0.24848,0.18359,0.33964,0.22222 +2022-02-27,0.24171,0.16911,0.33379,0.22222 +2022-02-28,0.30536,0.25736,0.32537,0.33333 +2022-03-01,0.30258,0.27067,0.30373,0.33333 +2022-03-02,0.29089,0.26239,0.27696,0.33333 +2022-03-03,0.2851,0.27034,0.25161,0.33333 +2022-03-04,0.29677,0.2936,0.26337,0.33333 +2022-03-05,0.30412,0.31091,0.2681,0.33333 +2022-03-06,0.29399,0.37697,0.28277,0.22222 +2022-03-07,0.29423,0.3741,0.28638,0.22222 +2022-03-08,0.29832,0.38172,0.29103,0.22222 +2022-03-09,0.2941,0.36858,0.29151,0.22222 +2022-03-10,0.30571,0.40159,0.29331,0.22222 +2022-03-11,0.29639,0.37474,0.29222,0.22222 +2022-03-12,0.30021,0.38648,0.29192,0.22222 +2022-03-13,0.2943,0.38614,0.27453,0.22222 +2022-03-14,0.27856,0.35694,0.25653,0.22222 +2022-03-15,0.25915,0.3208,0.23444,0.22222 +2022-03-16,0.24847,0.3211,0.20209,0.22222 +2022-03-17,0.24505,0.31884,0.19408,0.22222 +2022-03-18,0.2563,0.3583,0.18839,0.22222 +2022-03-19,0.2352,0.39646,0.19804,0.11111 +2022-03-20,0.23474,0.38467,0.20843,0.11111 +2022-03-21,0.24689,0.40491,0.22465,0.11111 +2022-03-22,0.25097,0.40197,0.23983,0.11111 +2022-03-23,0.2582,0.40119,0.26229,0.11111 +2022-03-24,0.26558,0.40421,0.28143,0.11111 +2022-03-25,0.27305,0.40718,0.30085,0.11111 +2022-03-26,0.28319,0.42313,0.31531,0.11111 +2022-03-27,0.2804,0.40014,0.32994,0.11111 +2022-03-28,0.28266,0.38995,0.34691,0.11111 +2022-03-29,0.28383,0.37742,0.36295,0.11111 +2022-03-30,0.25137,0.37644,0.37765,0 +2022-03-31,0.25146,0.37061,0.38379,0 +2022-04-01,0.25468,0.37471,0.38934,0 +2022-04-02,0.2435,0.34164,0.38885,0 +2022-04-03,0.2639,0.41179,0.37991,0 +2022-04-04,0.26269,0.42811,0.35997,0 +2022-04-05,0.25087,0.4286,0.32401,0 +2022-04-06,0.2517,0.42789,0.32722,0 +2022-04-07,0.24966,0.41788,0.33109,0 +2022-04-08,0.14942,0.1293,0.31895,0 +2022-04-09,0.13047,0.10165,0.28977,0 +2022-04-10,0.12527,0.09756,0.27824,0 +2022-04-11,0.1631,0.1176,0.2606,0.11111 +2022-04-12,0.15019,0.099325,0.24013,0.11111 +2022-04-13,0.14249,0.11424,0.20211,0.11111 +2022-04-14,0.13515,0.14174,0.1526,0.11111 +2022-04-15,0.13776,0.16801,0.13414,0.11111 +2022-04-16,0.14278,0.1789,0.13832,0.11111 +2022-04-17,0.14689,0.18575,0.1438,0.11111 +2022-04-18,0.14735,0.1872,0.14373,0.11111 +2022-04-19,0.14742,0.18708,0.14406,0.11111 +2022-04-20,0.15667,0.21324,0.14564,0.11111 +2022-04-21,0.16082,0.22051,0.15084,0.11111 +2022-04-22,0.16144,0.22394,0.14929,0.11111 +2022-04-23,0.16331,0.23027,0.14854,0.11111 +2022-04-24,0.16686,0.24084,0.14862,0.11111 +2022-04-25,0.18019,0.27918,0.15028,0.11111 +2022-04-26,0.24333,0.36207,0.1457,0.22222 +2022-04-27,0.24937,0.38516,0.14072,0.22222 +2022-04-28,0.2389,0.36024,0.13425,0.22222 +2022-04-29,0.24151,0.36931,0.13298,0.22222 +2022-04-30,0.24604,0.3782,0.13771,0.22222 +2022-05-01,0.24583,0.37118,0.1441,0.22222 +2022-05-02,0.2439,0.36266,0.14683,0.22222 +2022-05-03,0.23566,0.34763,0.13714,0.22222 +2022-05-04,0.23183,0.34829,0.12499,0.22222 +2022-05-05,0.32365,0.50125,0.13638,0.33333 +2022-05-06,0.32311,0.48498,0.15101,0.33333 +2022-05-07,0.33075,0.4981,0.16082,0.33333 +2022-05-08,0.32969,0.48981,0.16592,0.33333 +2022-05-09,0.39775,0.54749,0.20131,0.44444 +2022-05-10,0.39956,0.5196,0.23464,0.44444 +2022-05-11,0.37,0.53363,0.24304,0.33333 +2022-05-12,0.35484,0.48014,0.25103,0.33333 +2022-05-13,0.36355,0.4974,0.25992,0.33333 +2022-05-14,0.36805,0.49787,0.27294,0.33333 +2022-05-15,0.37001,0.48781,0.28888,0.33333 +2022-05-16,0.36862,0.48542,0.2871,0.33333 +2022-05-17,0.3647,0.47559,0.28518,0.33333 +2022-05-18,0.35602,0.46073,0.27399,0.33333 +2022-05-19,0.35533,0.4701,0.26255,0.33333 +2022-05-20,0.34772,0.46135,0.24848,0.33333 +2022-05-21,0.33729,0.4494,0.22914,0.33333 +2022-05-22,0.32706,0.43859,0.20925,0.33333 +2022-05-23,0.30764,0.40151,0.18807,0.33333 +2022-05-24,0.29283,0.38211,0.16305,0.33333 +2022-05-25,0.29487,0.41449,0.13677,0.33333 +2022-05-26,0.26801,0.44673,0.13509,0.22222 +2022-05-27,0.27294,0.4533,0.14331,0.22222 +2022-05-28,0.27855,0.46165,0.15176,0.22222 +2022-05-29,0.28535,0.46991,0.16391,0.22222 +2022-05-30,0.27765,0.44602,0.16473,0.22222 +2022-05-31,0.25553,0.37771,0.16666,0.22222 +2022-06-01,0.23647,0.32531,0.16187,0.22222 +2022-06-02,0.22936,0.32042,0.14544,0.22222 +2022-06-03,0.21586,0.28916,0.13619,0.22222 +2022-06-04,0.19165,0.32773,0.1361,0.11111 +2022-06-05,0.19898,0.34992,0.13591,0.11111 +2022-06-06,0.19587,0.33825,0.13824,0.11111 +2022-06-07,0.17224,0.26525,0.14037,0.11111 +2022-06-08,0.13313,0.25356,0.14581,0 +2022-06-09,0.1328,0.25305,0.14537,0 +2022-06-10,0.14892,0.29488,0.15188,0 +2022-06-11,0.13917,0.26143,0.15608,0 +2022-06-12,0.13768,0.26066,0.15239,0 +2022-06-13,0.253,0.48802,0.15986,0.11111 +2022-06-14,0.21508,0.37492,0.15921,0.11111 +2022-06-15,0.22732,0.38708,0.18377,0.11111 +2022-06-16,0.26572,0.36993,0.205,0.22222 +2022-06-17,0.25525,0.31683,0.2267,0.22222 +2022-06-18,0.25263,0.29165,0.24401,0.22222 +2022-06-19,0.28095,0.33501,0.28562,0.22222 +2022-06-20,0.27232,0.306,0.28874,0.22222 +2022-06-21,0.27975,0.32594,0.2911,0.22222 +2022-06-22,0.28052,0.32713,0.29219,0.22222 +2022-06-23,0.27729,0.31889,0.29075,0.22222 +2022-06-24,0.26669,0.29272,0.28511,0.22222 +2022-06-25,0.26591,0.29922,0.27628,0.22222 +2022-06-26,0.26375,0.29727,0.27177,0.22222 +2022-06-27,0.26104,0.29459,0.26631,0.22222 +2022-06-28,0.26289,0.30907,0.25739,0.22222 +2022-06-29,0.27446,0.33895,0.26222,0.22222 +2022-06-30,0.29176,0.36739,0.28566,0.22222 +2022-07-01,0.30465,0.37555,0.31617,0.22222 +2022-07-02,0.31779,0.3778,0.35336,0.22222 +2022-07-03,0.33345,0.39183,0.38629,0.22222 +2022-07-04,0.32938,0.36685,0.39905,0.22222 +2022-07-05,0.33409,0.36704,0.41302,0.22222 +2022-07-06,0.34285,0.38331,0.42303,0.22222 +2022-07-07,0.34272,0.37724,0.42868,0.22222 +2022-07-08,0.3402,0.36539,0.43298,0.22222 +2022-07-09,0.34622,0.3815,0.43494,0.22222 +2022-07-10,0.34484,0.3803,0.432,0.22222 +2022-07-11,0.34516,0.38438,0.42887,0.22222 +2022-07-12,0.30685,0.26979,0.42852,0.22222 +2022-07-13,0.28327,0.30957,0.42912,0.11111 +2022-07-14,0.27986,0.2955,0.43295,0.11111 +2022-07-15,0.29014,0.32727,0.43205,0.11111 +2022-07-16,0.28148,0.41704,0.42738,0 +2022-07-17,0.3036,0.49438,0.41642,0 +2022-07-18,0.26076,0.27243,0.39874,0.11111 +2022-07-19,0.29185,0.43441,0.33004,0.11111 +2022-07-20,0.26696,0.38128,0.30849,0.11111 +2022-07-21,0.27235,0.4273,0.27863,0.11111 +2022-07-22,0.25184,0.40307,0.24134,0.11111 +2022-07-23,0.25956,0.44694,0.22063,0.11111 +2022-07-24,0.25158,0.44937,0.19426,0.11111 +2022-07-25,0.23485,0.40236,0.19108,0.11111 +2022-07-26,0.22209,0.35712,0.19806,0.11111 +2022-07-27,0.24231,0.29961,0.20511,0.22222 +2022-07-28,0.26295,0.35124,0.2154,0.22222 +2022-07-29,0.25557,0.3235,0.221,0.22222 +2022-07-30,0.25922,0.35095,0.20449,0.22222 +2022-07-31,0.25711,0.36461,0.18449,0.22222 +2022-08-01,0.23822,0.35019,0.14226,0.22222 +2022-08-02,0.23837,0.39265,0.10022,0.22222 +2022-08-03,0.25622,0.43288,0.11357,0.22222 +2022-08-04,0.27576,0.44016,0.16491,0.22222 +2022-08-05,0.28387,0.44714,0.18226,0.22222 +2022-08-06,0.3013,0.48018,0.2015,0.22222 +2022-08-07,0.30207,0.46934,0.21466,0.22222 +2022-08-08,0.3077,0.47888,0.22201,0.22222 +2022-08-09,0.30626,0.46624,0.23031,0.22222 +2022-08-10,0.30454,0.4562,0.2352,0.22222 +2022-08-11,0.2957,0.42405,0.24082,0.22222 +2022-08-12,0.30018,0.43277,0.24554,0.22222 +2022-08-13,0.30334,0.4336,0.25419,0.22222 +2022-08-14,0.31171,0.45129,0.2616,0.22222 +2022-08-15,0.31848,0.46273,0.27048,0.22222 +2022-08-16,0.33059,0.48439,0.28515,0.22222 +2022-08-17,0.26318,0.37579,0.30264,0.11111 +2022-08-18,0.2744,0.38975,0.32234,0.11111 +2022-08-19,0.28578,0.30967,0.32546,0.22222 +2022-08-20,0.28451,0.30177,0.32954,0.22222 +2022-08-21,0.28638,0.30237,0.33455,0.22222 +2022-08-22,0.28629,0.29789,0.33875,0.22222 +2022-08-23,0.29936,0.33114,0.34472,0.22222 +2022-08-24,0.31195,0.3638,0.34983,0.22222 +2022-08-25,0.3278,0.41372,0.34746,0.22222 +2022-08-26,0.29022,0.30216,0.34626,0.22222 +2022-08-27,0.29157,0.31044,0.34206,0.22222 +2022-08-28,0.28608,0.29695,0.33908,0.22222 +2022-08-29,0.28431,0.29804,0.33267,0.22222 +2022-08-30,0.28171,0.29883,0.32408,0.22222 +2022-08-31,0.27862,0.28991,0.32374,0.22222 +2022-09-01,0.27921,0.29255,0.32285,0.22222 +2022-09-02,0.27913,0.29562,0.31955,0.22222 +2022-09-03,0.27291,0.31042,0.28608,0.22222 +2022-09-04,0.27423,0.3212,0.27928,0.22222 +2022-09-05,0.27753,0.32537,0.28499,0.22222 +2022-09-06,0.27086,0.31386,0.2765,0.22222 +2022-09-07,0.27152,0.321,0.27133,0.22222 +2022-09-08,0.26692,0.30892,0.26962,0.22222 +2022-09-09,0.29589,0.27174,0.28258,0.33333 +2022-09-10,0.29622,0.26533,0.29001,0.33333 +2022-09-11,0.29815,0.26784,0.29327,0.33333 +2022-09-12,0.29094,0.24857,0.29091,0.33333 +2022-09-13,0.34002,0.26788,0.30773,0.44444 +2022-09-14,0.32682,0.22123,0.31479,0.44444 +2022-09-15,0.32568,0.21985,0.31275,0.44444 +2022-09-16,0.31605,0.21755,0.28616,0.44444 +2022-09-17,0.31894,0.2544,0.25799,0.44444 +2022-09-18,0.28377,0.26,0.25797,0.33333 +2022-09-19,0.28039,0.24986,0.25797,0.33333 +2022-09-20,0.28093,0.23875,0.2707,0.33333 +2022-09-21,0.27949,0.22223,0.28291,0.33333 +2022-09-22,0.27417,0.20317,0.286,0.33333 +2022-09-23,0.26566,0.17486,0.2888,0.33333 +2022-09-24,0.27446,0.19828,0.29176,0.33333 +2022-09-25,0.24463,0.21773,0.29393,0.22222 +2022-09-26,0.24457,0.21801,0.29347,0.22222 +2022-09-27,0.24575,0.22048,0.29456,0.22222 +2022-09-28,0.2495,0.22416,0.30212,0.22222 +2022-09-29,0.25788,0.22981,0.32161,0.22222 +2022-09-30,0.2651,0.23192,0.34115,0.22222 +2022-10-01,0.27236,0.23059,0.36427,0.22222 +2022-10-02,0.27461,0.22612,0.37549,0.22222 +2022-10-03,0.27212,0.21153,0.38262,0.22222 +2022-10-04,0.2696,0.20488,0.3817,0.22222 +2022-10-05,0.26805,0.21219,0.36974,0.22222 +2022-10-06,0.26938,0.21603,0.36989,0.22222 +2022-10-07,0.26997,0.21718,0.37051,0.22222 +2022-10-08,0.28835,0.27187,0.37097,0.22222 +2022-10-09,0.261,0.29496,0.37691,0.11111 +2022-10-10,0.26345,0.29366,0.38557,0.11111 +2022-10-11,0.27745,0.30679,0.41443,0.11111 +2022-10-12,0.24731,0.19314,0.43767,0.11111 +2022-10-13,0.23972,0.29115,0.42802,0 +2022-10-14,0.24447,0.32425,0.40917,0 +2022-10-15,0.24112,0.36256,0.36081,0 +2022-10-16,0.24558,0.37855,0.3582,0 +2022-10-17,0.23712,0.36347,0.34789,0 +2022-10-18,0.24162,0.40429,0.32056,0 +2022-10-19,0.24688,0.45227,0.28838,0 +2022-10-20,0.24554,0.4352,0.30142,0 +2022-10-21,0.23947,0.40409,0.31433,0 +2022-10-22,0.27819,0.52217,0.3124,0 +2022-10-23,0.26957,0.50743,0.30127,0 +2022-10-24,0.27081,0.52281,0.28961,0 +2022-10-25,0.3028,0.52169,0.27559,0.11111 +2022-10-26,0.38807,0.6903,0.25169,0.22222 +2022-10-27,0.40096,0.73261,0.24805,0.22222 +2022-10-28,0.40335,0.73917,0.24865,0.22222 +2022-10-29,0.40284,0.73075,0.25554,0.22222 +2022-10-30,0.40342,0.72471,0.26331,0.22222 +2022-10-31,0.40713,0.73459,0.26458,0.22222 +2022-11-01,0.41613,0.7645,0.26166,0.22222 +2022-11-02,0.38403,0.66617,0.26371,0.22222 +2022-11-03,0.40076,0.70871,0.27136,0.22222 +2022-11-04,0.38445,0.54837,0.27165,0.33333 +2022-11-05,0.35843,0.47116,0.27079,0.33333 +2022-11-06,0.35951,0.47682,0.26838,0.33333 +2022-11-07,0.35512,0.46466,0.26736,0.33333 +2022-11-08,0.43223,0.46202,0.39022,0.44444 +2022-11-09,0.70844,0.95614,0.61361,0.55556 +2022-11-10,0.80202,0.96873,0.77067,0.66667 +2022-11-11,0.80286,0.92574,0.81619,0.66667 +2022-11-12,0.80545,0.921,0.82867,0.66667 +2022-11-13,0.80091,0.91751,0.81854,0.66667 +2022-11-14,0.79387,0.91406,0.80089,0.66667 +2022-11-15,0.78434,0.91353,0.77282,0.66667 +2022-11-16,0.77171,0.91323,0.73524,0.66667 +2022-11-17,0.76751,0.913,0.72285,0.66667 +2022-11-18,0.76618,0.91558,0.71628,0.66667 +2022-11-19,0.76428,0.9173,0.70889,0.66667 +2022-11-20,0.75928,0.90937,0.70181,0.66667 +2022-11-21,0.75581,0.90932,0.69143,0.66667 +2022-11-22,0.75179,0.90821,0.68049,0.66667 +2022-11-23,0.74891,0.91502,0.66504,0.66667 +2022-11-24,0.70846,0.91046,0.65937,0.55556 +2022-11-25,0.67163,0.91529,0.65516,0.44444 +2022-11-26,0.67308,0.91912,0.65566,0.44444 +2022-11-27,0.67529,0.92206,0.65936,0.44444 +2022-11-28,0.67802,0.92111,0.6685,0.44444 +2022-11-29,0.68211,0.91985,0.68204,0.44444 +2022-11-30,0.6802,0.90924,0.68692,0.44444 +2022-12-01,0.6763,0.89919,0.68526,0.44444 +2022-12-02,0.67413,0.90063,0.67732,0.44444 +2022-12-03,0.67635,0.92053,0.66408,0.44444 +2022-12-04,0.64446,0.93608,0.66398,0.33333 +2022-12-05,0.645,0.93711,0.66456,0.33333 +2022-12-06,0.64625,0.93869,0.66675,0.33333 +2022-12-07,0.67174,1,0.68189,0.33333 +2022-12-08,0.64464,1,0.71169,0.22222 +2022-12-09,0.5137,0.69275,0.73725,0.11111 +2022-12-10,0.45093,0.61383,0.73895,0 +2022-12-11,0.46109,0.64637,0.73691,0 +2022-12-12,0.46042,0.66178,0.71948,0 +2022-12-13,0.42339,0.6087,0.66149,0 +2022-12-14,0.35695,0.54296,0.52788,0 +2022-12-15,0.25406,0.50768,0.25449,0 +2022-12-16,0.26506,0.56797,0.11609,0.11111 +2022-12-17,0.24609,0.50116,0.12601,0.11111 +2022-12-18,0.2424,0.48312,0.13298,0.11111 +2022-12-19,0.25007,0.50128,0.13781,0.11111 +2022-12-20,0.24314,0.48087,0.13745,0.11111 +2022-12-21,0.22405,0.42237,0.13867,0.11111 +2022-12-22,0.22123,0.41286,0.13972,0.11111 +2022-12-23,0.24074,0.46692,0.14419,0.11111 +2022-12-24,0.2428,0.46861,0.14868,0.11111 +2022-12-25,0.24661,0.47633,0.1524,0.11111 +2022-12-26,0.25002,0.4752,0.16374,0.11111 +2022-12-27,0.26343,0.47987,0.19931,0.11111 +2022-12-28,0.2724,0.47941,0.22667,0.11111 +2022-12-29,0.2811,0.48552,0.24665,0.11111 +2022-12-30,0.29517,0.50372,0.27067,0.11111 +2022-12-31,0.30741,0.51678,0.29433,0.11111 +2023-01-01,0.31701,0.52505,0.31488,0.11111 +2023-01-02,0.32568,0.53161,0.33433,0.11111 +2023-01-03,0.33758,0.54265,0.35897,0.11111 +2023-01-04,0.34452,0.53744,0.38502,0.11111 +2023-01-05,0.35284,0.53735,0.41007,0.11111 +2023-01-06,0.35688,0.52945,0.43007,0.11111 +2023-01-07,0.37116,0.5457,0.45668,0.11111 +2023-01-08,0.37818,0.54159,0.48185,0.11111 +2023-01-09,0.3822,0.52986,0.50562,0.11111 +2023-01-10,0.3857,0.52132,0.52466,0.11111 +2023-01-11,0.40345,0.57064,0.5286,0.11111 +2023-01-12,0.49686,0.73962,0.52874,0.22222 +2023-01-13,0.58839,0.9,0.53184,0.33333 +2023-01-14,0.64518,0.95589,0.5352,0.44444 +2023-01-15,0.58965,0.90008,0.53555,0.33333 +2023-01-16,0.58762,0.89709,0.53244,0.33333 +2023-01-17,0.59052,0.90352,0.5347,0.33333 +2023-01-18,0.59008,0.87783,0.55906,0.33333 +2023-01-19,0.60328,0.90455,0.57194,0.33333 +2023-01-20,0.62823,0.84013,0.60011,0.44444 +2023-01-21,0.58521,0.69716,0.61403,0.44444 +2023-01-22,0.58704,0.69607,0.62062,0.44444 +2023-01-23,0.58611,0.69087,0.62302,0.44444 +2023-01-24,0.58445,0.68448,0.62441,0.44444 +2023-01-25,0.57967,0.68228,0.61228,0.44444 +2023-01-26,0.56736,0.67359,0.58403,0.44444 +2023-01-27,0.5648,0.67863,0.57132,0.44444 +2023-01-28,0.56192,0.68101,0.56031,0.44444 +2023-01-29,0.54521,0.65086,0.54033,0.44444 +2023-01-30,0.53977,0.66166,0.5132,0.44444 +2023-01-31,0.52352,0.63848,0.48764,0.44444 +2023-02-01,0.50983,0.62357,0.46148,0.44444 +2023-02-02,0.49562,0.6125,0.42991,0.44444 +2023-02-03,0.48458,0.6129,0.3964,0.44444 +2023-02-04,0.47396,0.61507,0.36237,0.44444 +2023-02-05,0.45916,0.60451,0.32852,0.44444 +2023-02-06,0.44627,0.5946,0.29976,0.44444 +2023-02-07,0.43182,0.58301,0.26801,0.44444 +2023-02-08,0.42157,0.57829,0.24198,0.44444 +2023-02-09,0.40274,0.56024,0.20352,0.44444 +2023-02-10,0.37913,0.51383,0.17913,0.44444 +2023-02-11,0.31611,0.44162,0.17338,0.33333 +2023-02-12,0.24346,0.33529,0.17288,0.22222 +2023-02-13,0.22548,0.39322,0.17211,0.11111 +2023-02-14,0.22338,0.38612,0.17292,0.11111 +2023-02-15,0.27539,0.39979,0.20416,0.22222 +2023-02-16,0.29385,0.44199,0.21735,0.22222 +2023-02-17,0.30058,0.45268,0.22685,0.22222 +2023-02-18,0.30037,0.44126,0.23763,0.22222 +2023-02-19,0.28892,0.50943,0.24621,0.11111 +2023-02-20,0.28731,0.49571,0.2551,0.11111 +2023-02-21,0.28803,0.48645,0.26653,0.11111 +2023-02-22,0.288,0.48446,0.26844,0.11111 +2023-02-23,0.29126,0.49027,0.27242,0.11111 +2023-02-24,0.29309,0.48513,0.28303,0.11111 +2023-02-25,0.28391,0.44672,0.29389,0.11111 +2023-02-26,0.27272,0.42845,0.27861,0.11111 +2023-02-27,0.27687,0.45018,0.2693,0.11111 +2023-02-28,0.27056,0.43009,0.27048,0.11111 +2023-03-01,0.27549,0.4396,0.27576,0.11111 +2023-03-02,0.27706,0.43908,0.28099,0.11111 +2023-03-03,0.26917,0.41513,0.28129,0.11111 +2023-03-04,0.25143,0.36131,0.28186,0.11111 +2023-03-05,0.25285,0.36375,0.28369,0.11111 +2023-03-06,0.25943,0.38169,0.28549,0.11111 +2023-03-07,0.26252,0.39135,0.2851,0.11111 +2023-03-08,0.26024,0.39104,0.27857,0.11111 +2023-03-09,0.29902,0.4064,0.26845,0.22222 +2023-03-10,0.2861,0.384,0.25208,0.22222 +2023-03-11,0.29184,0.40435,0.24895,0.22222 +2023-03-12,0.3328,0.40615,0.25891,0.33333 +2023-03-13,0.43193,0.55629,0.29504,0.44444 +2023-03-14,0.42559,0.5145,0.31782,0.44444 +2023-03-15,0.42915,0.51139,0.33161,0.44444 +2023-03-16,0.4398,0.54937,0.32557,0.44444 +2023-03-17,0.43791,0.54514,0.32414,0.44444 +2023-03-18,0.42415,0.49814,0.32986,0.44444 +2023-03-19,0.42886,0.50923,0.3329,0.44444 +2023-03-20,0.42203,0.48868,0.33298,0.44444 +2023-03-21,0.42324,0.49255,0.33272,0.44444 +2023-03-22,0.42208,0.48788,0.33392,0.44444 +2023-03-23,0.4216,0.48585,0.33452,0.44444 +2023-03-24,0.41732,0.47798,0.32953,0.44444 +2023-03-25,0.41416,0.47644,0.3216,0.44444 +2023-03-26,0.41512,0.49148,0.30944,0.44444 +2023-03-27,0.40661,0.48105,0.29435,0.44444 +2023-03-28,0.39806,0.46594,0.2838,0.44444 +2023-03-29,0.38404,0.44198,0.26569,0.44444 +2023-03-30,0.37476,0.42993,0.24989,0.44444 +2023-03-31,0.37375,0.43303,0.24378,0.44444 +2023-04-01,0.38256,0.46603,0.2372,0.44444 +2023-04-02,0.39863,0.51284,0.23861,0.44444 +2023-04-03,0.39615,0.49881,0.24519,0.44444 +2023-04-04,0.39149,0.48102,0.249,0.44444 +2023-04-05,0.39598,0.47611,0.2674,0.44444 +2023-04-06,0.40942,0.49736,0.28645,0.44444 +2023-04-07,0.42618,0.52784,0.30625,0.44444 +2023-04-08,0.41771,0.58465,0.33514,0.33333 +2023-04-09,0.42743,0.59174,0.3572,0.33333 +2023-04-10,0.43298,0.59765,0.36796,0.33333 +2023-04-11,0.34807,0.44265,0.37933,0.22222 +2023-04-12,0.30953,0.44387,0.37362,0.11111 +2023-04-13,0.31091,0.45711,0.36452,0.11111 +2023-04-14,0.31126,0.47169,0.35098,0.11111 +2023-04-15,0.31031,0.46351,0.3563,0.11111 +2023-04-16,0.28764,0.50624,0.3567,0 +2023-04-17,0.27126,0.46778,0.34601,0 +2023-04-18,0.28553,0.52757,0.32904,0 +2023-04-19,0.33933,0.59199,0.31489,0.11111 +2023-04-20,0.33311,0.59024,0.29799,0.11111 +2023-04-21,0.31506,0.56532,0.26876,0.11111 +2023-04-22,0.29538,0.54062,0.23441,0.11111 +2023-04-23,0.30608,0.57199,0.23515,0.11111 +2023-04-24,0.31271,0.59066,0.23635,0.11111 +2023-04-25,0.30441,0.56218,0.23994,0.11111 +2023-04-26,0.30475,0.56638,0.23675,0.11111 +2023-04-27,0.30514,0.56979,0.23452,0.11111 +2023-04-28,0.29875,0.55277,0.23236,0.11111 +2023-04-29,0.30346,0.56593,0.23335,0.11111 +2023-04-30,0.31112,0.58541,0.23682,0.11111 +2023-05-01,0.28954,0.51919,0.23832,0.11111 +2023-05-02,0.29205,0.52605,0.23899,0.11111 +2023-05-03,0.29071,0.52266,0.23835,0.11111 +2023-05-04,0.29153,0.52529,0.23819,0.11111 +2023-05-05,0.27745,0.49743,0.22382,0.11111 +2023-05-06,0.26787,0.48585,0.20664,0.11111 +2023-05-07,0.25092,0.46203,0.17963,0.11111 +2023-05-08,0.23815,0.45234,0.15101,0.11111 +2023-05-09,0.23067,0.45196,0.12893,0.11111 +2023-05-10,0.23904,0.47534,0.13067,0.11111 +2023-05-11,0.2365,0.4672,0.1312,0.11111 +2023-05-12,0.23612,0.44533,0.15193,0.11111 +2023-05-13,0.24314,0.44988,0.16842,0.11111 +2023-05-14,0.24746,0.45265,0.17861,0.11111 +2023-05-15,0.24887,0.43968,0.19581,0.11111 +2023-05-16,0.26851,0.48161,0.2128,0.11111 +2023-05-17,0.26325,0.45934,0.21931,0.11111 +2023-05-18,0.23702,0.36782,0.23212,0.11111 +2023-05-19,0.18331,0.30592,0.24401,0 +2023-05-20,0.17995,0.28604,0.25382,0 +2023-05-21,0.16789,0.24572,0.25793,0 +2023-05-22,0.16805,0.25041,0.25374,0 +2023-05-23,0.16024,0.23705,0.24366,0 +2023-05-24,0.16794,0.2782,0.22561,0 +2023-05-25,0.16083,0.27576,0.20671,0 +2023-05-26,0.17624,0.32427,0.20444,0 +2023-05-27,0.18966,0.37282,0.19616,0 +2023-05-28,0.20684,0.30827,0.20114,0.11111 +2023-05-29,0.19887,0.27767,0.20784,0.11111 +2023-05-30,0.22589,0.35415,0.21241,0.11111 +2023-05-31,0.1986,0.28069,0.20402,0.11111 +2023-06-01,0.19859,0.2856,0.19907,0.11111 +2023-06-02,0.1964,0.28413,0.19395,0.11111 +2023-06-03,0.2021,0.29813,0.19706,0.11111 +2023-06-04,0.2008,0.28819,0.20309,0.11111 +2023-06-05,0.21025,0.20976,0.19875,0.22222 +2023-06-06,0.35659,0.49885,0.23757,0.33333 +2023-06-07,0.40536,0.60266,0.28008,0.33333 +2023-06-08,0.40047,0.55693,0.31114,0.33333 +2023-06-09,0.41651,0.586,0.33019,0.33333 +2023-06-10,0.41843,0.57477,0.34718,0.33333 +2023-06-11,0.40941,0.54852,0.34637,0.33333 +2023-06-12,0.40571,0.55082,0.33299,0.33333 +2023-06-13,0.40837,0.56466,0.32712,0.33333 +2023-06-14,0.39263,0.52693,0.31762,0.33333 +2023-06-15,0.38805,0.52636,0.30445,0.33333 +2023-06-16,0.38461,0.52932,0.29119,0.33333 +2023-06-17,0.37829,0.52313,0.27842,0.33333 +2023-06-18,0.37324,0.5223,0.26409,0.33333 +2023-06-19,0.36644,0.51643,0.24954,0.33333 +2023-06-20,0.39842,0.51448,0.23635,0.44444 +2023-06-21,0.46408,0.61652,0.22018,0.55556 +2023-06-22,0.43775,0.55152,0.20617,0.55556 +2023-06-23,0.43832,0.55977,0.19963,0.55556 +2023-06-24,0.42902,0.54038,0.19111,0.55556 +2023-06-25,0.42852,0.54732,0.18269,0.55556 +2023-06-26,0.44229,0.59743,0.1739,0.55556 +2023-06-27,0.41283,0.62092,0.17314,0.44444 +2023-06-28,0.41555,0.6162,0.18599,0.44444 +2023-06-29,0.41963,0.61732,0.19714,0.44444 +2023-06-30,0.42724,0.62234,0.21494,0.44444 +2023-07-01,0.43778,0.63555,0.23335,0.44444 +2023-07-02,0.44807,0.64817,0.25161,0.44444 +2023-07-03,0.4489,0.63538,0.26689,0.44444 +2023-07-04,0.47187,0.70769,0.26349,0.44444 +2023-07-05,0.41354,0.62445,0.28282,0.33333 +2023-07-06,0.35833,0.56067,0.29208,0.22222 +2023-07-07,0.36706,0.58698,0.29198,0.22222 +2023-07-08,0.36163,0.57395,0.28873,0.22222 +2023-07-09,0.37145,0.60868,0.28344,0.22222 +2023-07-10,0.37613,0.63159,0.27457,0.22222 +2023-07-11,0.36796,0.62366,0.25801,0.22222 +2023-07-12,0.36386,0.61227,0.25707,0.22222 +2023-07-13,0.36823,0.62418,0.25828,0.22222 +2023-07-14,0.38034,0.66389,0.25489,0.22222 +2023-07-15,0.36229,0.61062,0.25401,0.22222 +2023-07-16,0.37305,0.64281,0.25412,0.22222 +2023-07-17,0.37517,0.64913,0.25417,0.22222 +2023-07-18,0.37835,0.65858,0.25424,0.22222 +2023-07-19,0.38416,0.67584,0.25442,0.22222 +2023-07-20,0.26763,0.43862,0.25317,0.11111 +2023-07-21,0.28218,0.55985,0.28671,0 +2023-07-22,0.30724,0.60911,0.31261,0 +2023-07-23,0.32335,0.64374,0.32632,0 +2023-07-24,0.34892,0.62233,0.31332,0.11111 +2023-07-25,0.31802,0.54523,0.29772,0.11111 +2023-07-26,0.31168,0.5597,0.26423,0.11111 +2023-07-27,0.30586,0.55909,0.24737,0.11111 +2023-07-28,0.30678,0.56093,0.24829,0.11111 +2023-07-29,0.31286,0.57835,0.24913,0.11111 +2023-07-30,0.31285,0.57973,0.24771,0.11111 +2023-07-31,0.3242,0.58076,0.28074,0.11111 +2023-08-01,0.33173,0.58825,0.29583,0.11111 +2023-08-02,0.33548,0.59449,0.30084,0.11111 +2023-08-03,0.32942,0.57033,0.30682,0.11111 +2023-08-04,0.33484,0.58466,0.30875,0.11111 +2023-08-05,0.33459,0.57848,0.31419,0.11111 +2023-08-06,0.34528,0.60359,0.32112,0.11111 +2023-08-07,0.34708,0.60297,0.32717,0.11111 +2023-08-08,0.343,0.58768,0.33021,0.11111 +2023-08-09,0.34221,0.57809,0.33744,0.11111 +2023-08-10,0.34439,0.57876,0.34329,0.11111 +2023-08-11,0.36091,0.62222,0.34941,0.11111 +2023-08-12,0.28461,0.38465,0.35808,0.11111 +2023-08-13,0.31184,0.47404,0.35036,0.11111 +2023-08-14,0.30449,0.46482,0.33754,0.11111 +2023-08-15,0.3018,0.45652,0.33778,0.11111 +2023-08-16,0.30041,0.47076,0.31937,0.11111 +2023-08-17,0.3998,0.60506,0.37211,0.22222 +2023-08-18,0.41359,0.60737,0.41117,0.22222 +2023-08-19,0.42198,0.58518,0.45853,0.22222 +2023-08-20,0.42663,0.58686,0.4708,0.22222 +2023-08-21,0.42751,0.59182,0.4685,0.22222 +2023-08-22,0.4308,0.60107,0.46911,0.22222 +2023-08-23,0.40876,0.62619,0.48898,0.11111 +2023-08-24,0.40865,0.62377,0.49107,0.11111 +2023-08-25,0.41178,0.62067,0.50357,0.11111 +2023-08-26,0.41634,0.62173,0.51616,0.11111 +2023-08-27,0.42069,0.62211,0.52885,0.11111 +2023-08-28,0.425,0.62214,0.54176,0.11111 +2023-08-29,0.42946,0.52531,0.54084,0.22222 +2023-08-30,0.42032,0.52665,0.5121,0.22222 +2023-08-31,0.45812,0.52824,0.51277,0.33333 +2023-09-01,0.44932,0.49861,0.51602,0.33333 +2023-09-02,0.4478,0.49665,0.51341,0.33333 +2023-09-03,0.44509,0.49559,0.50635,0.33333 +2023-09-04,0.43966,0.48969,0.49596,0.33333 +2023-09-05,0.4335,0.48798,0.47919,0.33333 +2023-09-06,0.4328,0.50215,0.46291,0.33333 +2023-09-07,0.43404,0.49862,0.47017,0.33333 +2023-09-08,0.43221,0.4961,0.46719,0.33333 +2023-09-09,0.42905,0.48859,0.46524,0.33333 +2023-09-10,0.42802,0.4876,0.46311,0.33333 +2023-09-11,0.41777,0.46824,0.45173,0.33333 +2023-09-12,0.41448,0.47526,0.43485,0.33333 +2023-09-13,0.40736,0.47187,0.41688,0.33333 +2023-09-14,0.39698,0.47286,0.38475,0.33333 +2023-09-15,0.39436,0.48834,0.3614,0.33333 +2023-09-16,0.34107,0.43515,0.36584,0.22222 +2023-09-17,0.35136,0.46177,0.3701,0.22222 +2023-09-18,0.35525,0.45667,0.38687,0.22222 +2023-09-19,0.35937,0.447,0.4089,0.22222 +2023-09-20,0.36144,0.43162,0.43047,0.22222 +2023-09-21,0.36214,0.42438,0.4398,0.22222 +2023-09-22,0.35886,0.41047,0.44387,0.22222 +2023-09-23,0.36383,0.4245,0.44477,0.22222 +2023-09-24,0.3568,0.41475,0.43343,0.22222 +2023-09-25,0.34962,0.40332,0.42331,0.22222 +2023-09-26,0.349,0.40238,0.42241,0.22222 +2023-09-27,0.3835,0.50953,0.41875,0.22222 +2023-09-28,0.33532,0.46582,0.42901,0.11111 +2023-09-29,0.3174,0.40471,0.43637,0.11111 +2023-09-30,0.30071,0.47965,0.42247,0 +2023-10-01,0.30155,0.40058,0.39296,0.11111 +2023-10-02,0.3006,0.43957,0.35113,0.11111 +2023-10-03,0.27559,0.42204,0.2936,0.11111 +2023-10-04,0.24249,0.4077,0.20865,0.11111 +2023-10-05,0.23549,0.38913,0.20622,0.11111 +2023-10-06,0.24556,0.42003,0.20554,0.11111 +2023-10-07,0.23353,0.39019,0.19929,0.11111 +2023-10-08,0.24134,0.42076,0.19214,0.11111 +2023-10-09,0.23012,0.39358,0.18566,0.11111 +2023-10-10,0.24007,0.43084,0.17825,0.11111 +2023-10-11,0.20992,0.33931,0.17934,0.11111 +2023-10-12,0.19312,0.28935,0.17889,0.11111 +2023-10-13,0.19747,0.29337,0.18794,0.11111 +2023-10-14,0.20814,0.31563,0.19767,0.11111 +2023-10-15,0.20171,0.2934,0.20063,0.11111 +2023-10-16,0.25079,0.31236,0.21778,0.22222 +2023-10-17,0.23895,0.26297,0.23165,0.22222 +2023-10-18,0.24373,0.27814,0.23084,0.22222 +2023-10-19,0.24108,0.28274,0.21829,0.22222 +2023-10-20,0.28575,0.31641,0.2075,0.33333 +2023-10-21,0.28855,0.32558,0.20674,0.33333 +2023-10-22,0.28194,0.30657,0.20591,0.33333 +2023-10-23,0.32403,0.24426,0.28339,0.44444 +2023-10-24,0.37317,0.35264,0.32243,0.44444 +2023-10-25,0.37523,0.3426,0.33864,0.44444 +2023-10-26,0.37462,0.3322,0.34721,0.44444 +2023-10-27,0.38083,0.34254,0.35552,0.44444 +2023-10-28,0.38755,0.35596,0.36224,0.44444 +2023-10-29,0.38454,0.34676,0.36241,0.44444 +2023-10-30,0.39136,0.37026,0.35939,0.44444 +2023-10-31,0.36029,0.3764,0.37115,0.33333 +2023-11-01,0.36324,0.37274,0.38364,0.33333 +2023-11-02,0.36629,0.37155,0.39399,0.33333 +2023-11-03,0.36998,0.37176,0.40484,0.33333 +2023-11-04,0.37424,0.37461,0.41478,0.33333 +2023-11-05,0.38121,0.38357,0.42674,0.33333 +2023-11-06,0.38544,0.38426,0.43873,0.33333 +2023-11-07,0.38649,0.38548,0.44065,0.33333 +2023-11-08,0.38934,0.38624,0.44843,0.33333 +2023-11-09,0.38813,0.38009,0.45095,0.33333 +2023-11-10,0.39199,0.38623,0.45641,0.33333 +2023-11-11,0.38901,0.37661,0.45709,0.33333 +2023-11-12,0.38484,0.37414,0.44704,0.33333 +2023-11-13,0.37819,0.36983,0.43139,0.33333 +2023-11-14,0.37654,0.38008,0.41619,0.33333 +2023-11-15,0.40174,0.45295,0.41895,0.33333 +2023-11-16,0.42861,0.52568,0.42683,0.33333 +2023-11-17,0.4236,0.50748,0.43,0.33333 +2023-11-18,0.42695,0.51705,0.43048,0.33333 +2023-11-19,0.39185,0.52091,0.43243,0.22222 +2023-11-20,0.38735,0.50865,0.43117,0.22222 +2023-11-21,0.42689,0.6258,0.43264,0.22222 +2023-11-22,0.41934,0.71618,0.43073,0.11111 +2023-11-23,0.3991,0.65753,0.42867,0.11111 +2023-11-24,0.39997,0.66115,0.42763,0.11111 +2023-11-25,0.39847,0.66022,0.42409,0.11111 +2023-11-26,0.3964,0.66017,0.4179,0.11111 +2023-11-27,0.39514,0.66399,0.41033,0.11111 +2023-11-28,0.39375,0.6632,0.40693,0.11111 +2023-11-29,0.39218,0.64892,0.41652,0.11111 +2023-11-30,0.40045,0.67056,0.41966,0.11111 +2023-12-01,0.39446,0.65524,0.41704,0.11111 +2023-12-02,0.39444,0.65862,0.41359,0.11111 +2023-12-03,0.39236,0.65316,0.41281,0.11111 +2023-12-04,0.41564,0.62105,0.40365,0.22222 +2023-12-05,0.42511,0.6639,0.38921,0.22222 +2023-12-06,0.40204,0.61043,0.37347,0.22222 +2023-12-07,0.39701,0.61075,0.35805,0.22222 +2023-12-08,0.39359,0.62373,0.33481,0.22222 +2023-12-09,0.38787,0.62498,0.3164,0.22222 +2023-12-10,0.38331,0.63325,0.29445,0.22222 +2023-12-11,0.38343,0.53887,0.27809,0.33333 +2023-12-12,0.35528,0.47339,0.25912,0.33333 +2023-12-13,0.34575,0.45857,0.24536,0.33333 +2023-12-14,0.3322,0.42482,0.23844,0.33333 +2023-12-15,0.25506,0.3049,0.23807,0.22222 +2023-12-16,0.25518,0.30929,0.23403,0.22222 +2023-12-17,0.2496,0.29633,0.23025,0.22222 +2023-12-18,0.25145,0.30476,0.22736,0.22222 +2023-12-19,0.24717,0.29828,0.22101,0.22222 +2023-12-20,0.25384,0.3248,0.21449,0.22222 +2023-12-21,0.21469,0.22373,0.19813,0.22222 +2023-12-22,0.23105,0.27726,0.19368,0.22222 +2023-12-23,0.23502,0.2873,0.19554,0.22222 +2023-12-24,0.23272,0.27791,0.19803,0.22222 +2023-12-25,0.22912,0.2609,0.20424,0.22222 +2023-12-26,0.22424,0.24468,0.20581,0.22222 +2023-12-27,0.22538,0.24336,0.21058,0.22222 +2023-12-28,0.2228,0.23458,0.21158,0.22222 +2023-12-29,0.20216,0.19503,0.18922,0.22222 +2023-12-30,0.20341,0.22291,0.16509,0.22222 +2023-12-31,0.21144,0.25877,0.15334,0.22222 +2024-01-01,0.19468,0.22231,0.13952,0.22222 +2024-01-02,0.19317,0.23705,0.12023,0.22222 +2024-01-03,0.1117,0.10657,0.11741,0.11111 +2024-01-04,0.14215,0.19433,0.121,0.11111 +2024-01-05,0.13206,0.16139,0.12367,0.11111 +2024-01-06,0.14577,0.19953,0.12668,0.11111 +2024-01-07,0.15754,0.23218,0.12932,0.11111 +2024-01-08,0.17493,0.16074,0.14184,0.22222 +2024-01-09,0.20202,0.22905,0.15478,0.22222 +2024-01-10,0.17716,0.2708,0.14958,0.11111 +2024-01-11,0.18788,0.30278,0.14974,0.11111 +2024-01-12,0.2238,0.27117,0.17801,0.22222 +2024-01-13,0.21199,0.21281,0.20095,0.22222 +2024-01-14,0.21868,0.21233,0.22148,0.22222 +2024-01-15,0.21878,0.21176,0.22236,0.22222 +2024-01-16,0.21907,0.2107,0.22429,0.22222 +2024-01-17,0.22189,0.22109,0.22236,0.22222 +2024-01-18,0.22129,0.22067,0.22098,0.22222 +2024-01-19,0.2228,0.22179,0.22437,0.22222 +2024-01-20,0.22284,0.21863,0.22768,0.22222 +2024-01-21,0.22577,0.22541,0.22968,0.22222 +2024-01-22,0.2139,0.19455,0.22494,0.22222 +2024-01-23,0.20649,0.17753,0.21973,0.22222 +2024-01-24,0.20777,0.1926,0.20849,0.22222 +2024-01-25,0.21231,0.20856,0.20615,0.22222 +2024-01-26,0.20121,0.18885,0.19256,0.22222 +2024-01-27,0.19245,0.1746,0.18052,0.22222 +2024-01-28,0.19014,0.18046,0.16775,0.22222 +2024-01-29,0.1796,0.14953,0.16706,0.22222 +2024-01-30,0.18237,0.16291,0.16197,0.22222 +2024-01-31,0.18607,0.16994,0.16606,0.22222 +2024-02-01,0.18692,0.17064,0.16791,0.22222 +2024-02-02,0.18547,0.14319,0.19099,0.22222 +2024-02-03,0.20105,0.16927,0.21166,0.22222 +2024-02-04,0.2035,0.1589,0.22939,0.22222 +2024-02-05,0.21234,0.15111,0.26369,0.22222 +2024-02-06,0.23587,0.19146,0.29393,0.22222 +2024-02-07,0.19036,0.15056,0.30942,0.11111 +2024-02-08,0.19707,0.16107,0.31904,0.11111 +2024-02-09,0.20359,0.17418,0.32548,0.11111 +2024-02-10,0.21023,0.18553,0.33405,0.11111 +2024-02-11,0.19506,0.25821,0.32698,0 +2024-02-12,0.19402,0.26804,0.314,0 +2024-02-13,0.17334,0.24092,0.27909,0 +2024-02-14,0.16148,0.21292,0.27152,0 +2024-02-15,0.14458,0.18027,0.25348,0 +2024-02-16,0.14905,0.21153,0.23561,0 +2024-02-17,0.14511,0.2297,0.20562,0 +2024-02-18,0.14226,0.22117,0.20561,0 +2024-02-19,0.13665,0.20333,0.20661,0 +2024-02-20,0.15266,0.25036,0.20763,0 +2024-02-21,0.16498,0.26897,0.22598,0 +2024-02-22,0.16852,0.26449,0.24108,0 +2024-02-23,0.16754,0.25036,0.25225,0 +2024-02-24,0.18526,0.29632,0.25945,0 +2024-02-25,0.18915,0.32134,0.2461,0 +2024-02-26,0.19374,0.24556,0.22456,0.11111 +2024-02-27,0.30558,0.47706,0.21747,0.22222 +2024-02-28,0.43898,0.6825,0.30109,0.33333 +2024-02-29,0.43457,0.60403,0.36635,0.33333 +2024-03-01,0.44456,0.60091,0.39945,0.33333 +2024-03-02,0.4529,0.59305,0.43233,0.33333 +2024-03-03,0.45252,0.57994,0.4443,0.33333 +2024-03-04,0.48209,0.54197,0.45987,0.44444 +2024-03-05,0.56911,0.64186,0.50991,0.55556 +2024-03-06,0.56477,0.63792,0.50083,0.55556 +2024-03-07,0.55801,0.63327,0.48522,0.55556 +2024-03-08,0.55519,0.63492,0.47509,0.55556 +2024-03-09,0.55308,0.63951,0.46418,0.55556 +2024-03-10,0.55817,0.66056,0.45838,0.55556 +2024-03-11,0.54524,0.63547,0.4447,0.55556 +2024-03-12,0.53837,0.62417,0.4354,0.55556 +2024-03-13,0.5396,0.6367,0.42653,0.55556 +2024-03-14,0.5438,0.6591,0.41673,0.55556 +2024-03-15,0.54915,0.68531,0.40659,0.55556 +2024-03-16,0.53935,0.66747,0.39503,0.55556 +2024-03-17,0.53748,0.67541,0.38147,0.55556 +2024-03-18,0.52391,0.64625,0.36991,0.55556 +2024-03-19,0.53188,0.56752,0.36146,0.66667 +2024-03-20,0.60033,0.65589,0.36733,0.77778 +2024-03-21,0.58987,0.62477,0.36707,0.77778 +2024-03-22,0.57752,0.60876,0.34602,0.77778 +2024-03-23,0.5648,0.59773,0.3189,0.77778 +2024-03-24,0.54452,0.5661,0.28969,0.77778 +2024-03-25,0.53091,0.55094,0.26401,0.77778 +2024-03-26,0.52416,0.56729,0.22742,0.77778 +2024-03-27,0.49027,0.58728,0.21686,0.66667 +2024-03-28,0.45426,0.58971,0.21751,0.55556 +2024-03-29,0.43898,0.64121,0.23127,0.44444 +2024-03-30,0.44685,0.65165,0.24447,0.44444 +2024-03-31,0.4518,0.64803,0.26293,0.44444 +2024-04-01,0.45747,0.64213,0.28583,0.44444 +2024-04-02,0.46809,0.6679,0.29193,0.44444 +2024-04-03,0.40032,0.56936,0.29826,0.33333 +2024-04-04,0.35752,0.55271,0.29764,0.22222 +2024-04-05,0.3574,0.54936,0.30061,0.22222 +2024-04-06,0.35961,0.55353,0.30309,0.22222 +2024-04-07,0.362,0.55747,0.30631,0.22222 +2024-04-08,0.35413,0.53157,0.30859,0.22222 +2024-04-09,0.36381,0.55146,0.31776,0.22222 +2024-04-10,0.37156,0.5669,0.32556,0.22222 +2024-04-11,0.37017,0.56847,0.31984,0.22222 +2024-04-12,0.35912,0.54977,0.30538,0.22222 +2024-04-13,0.35903,0.55952,0.29534,0.22222 +2024-04-14,0.35818,0.56467,0.28765,0.22222 +2024-04-15,0.35213,0.545,0.28916,0.22222 +2024-04-16,0.35518,0.55118,0.29215,0.22222 +2024-04-17,0.37621,0.6114,0.29502,0.22222 +2024-04-18,0.2689,0.40065,0.29494,0.11111 +2024-04-19,0.19613,0.30917,0.27921,0 +2024-04-20,0.19252,0.31778,0.25979,0 +2024-04-21,0.19022,0.33615,0.2345,0 +2024-04-22,0.19369,0.36973,0.21135,0 +2024-04-23,0.16294,0.31388,0.17494,0 +2024-04-24,0.14859,0.33544,0.11033,0 +2024-04-25,0.12446,0.27742,0.095955,0 +2024-04-26,0.13357,0.2957,0.10501,0 +2024-04-27,0.1431,0.31257,0.11674,0 +2024-04-28,0.14979,0.324,0.12537,0 +2024-04-29,0.16435,0.34671,0.14633,0 +2024-04-30,0.15342,0.31826,0.14201,0 +2024-05-01,0.1651,0.365,0.13031,0 +2024-05-02,0.18148,0.41256,0.13188,0 +2024-05-03,0.21755,0.40216,0.13939,0.11111 +2024-05-04,0.21615,0.39181,0.14554,0.11111 +2024-05-05,0.21954,0.39637,0.15113,0.11111 +2024-05-06,0.22322,0.40255,0.156,0.11111 +2024-05-07,0.23074,0.42524,0.15589,0.11111 +2024-05-08,0.22755,0.41671,0.15482,0.11111 +2024-05-09,0.22657,0.41578,0.15283,0.11111 +2024-05-10,0.2306,0.42481,0.15587,0.11111 +2024-05-11,0.23083,0.4228,0.15859,0.11111 +2024-05-12,0.22129,0.38875,0.16399,0.11111 +2024-05-13,0.21084,0.35575,0.16566,0.11111 +2024-05-14,0.20461,0.33968,0.16303,0.11111 +2024-05-15,0.25493,0.37538,0.1672,0.22222 +2024-05-16,0.25567,0.37339,0.1714,0.22222 +2024-05-17,0.24688,0.34629,0.17213,0.22222 +2024-05-18,0.24827,0.35492,0.16768,0.22222 +2024-05-19,0.25217,0.36825,0.16605,0.22222 +2024-05-20,0.27886,0.32388,0.17937,0.33333 +2024-05-21,0.28194,0.32321,0.18929,0.33333 +2024-05-22,0.28448,0.33171,0.18838,0.33333 +2024-05-23,0.28861,0.34487,0.18761,0.33333 +2024-05-24,0.29307,0.36228,0.18361,0.33333 +2024-05-25,0.28845,0.35857,0.17344,0.33333 +2024-05-26,0.28386,0.35473,0.16352,0.33333 +2024-05-27,0.2826,0.34115,0.17331,0.33333 +2024-05-28,0.28279,0.3312,0.18382,0.33333 +2024-05-29,0.29274,0.36011,0.18477,0.33333 +2024-05-30,0.28743,0.32558,0.20339,0.33333 +2024-05-31,0.2981,0.33921,0.22177,0.33333 +2024-06-01,0.3148,0.3675,0.24355,0.33333 +2024-06-02,0.29668,0.40228,0.26554,0.22222 +2024-06-03,0.30303,0.40307,0.28381,0.22222 +2024-06-04,0.30456,0.39455,0.29691,0.22222 +2024-06-05,0.30636,0.38503,0.31183,0.22222 +2024-06-06,0.31674,0.39893,0.32906,0.22222 +2024-06-07,0.32024,0.39601,0.34248,0.22222 +2024-06-08,0.31665,0.37248,0.35525,0.22222 +2024-06-09,0.33572,0.41926,0.36569,0.22222 +2024-06-10,0.34139,0.42583,0.37613,0.22222 +2024-06-11,0.33903,0.40846,0.3864,0.22222 +2024-06-12,0.33969,0.40083,0.39602,0.22222 +2024-06-13,0.33327,0.3735,0.4041,0.22222 +2024-06-14,0.29325,0.36142,0.40722,0.11111 +2024-06-15,0.2943,0.36462,0.40717,0.11111 +2024-06-16,0.30693,0.39907,0.41059,0.11111 +2024-06-17,0.30916,0.40399,0.41237,0.11111 +2024-06-18,0.3305,0.46576,0.41463,0.11111 +2024-06-19,0.23377,0.30721,0.3941,0 +2024-06-20,0.23242,0.33159,0.36567,0 +2024-06-21,0.22366,0.31809,0.35288,0 +2024-06-22,0.21587,0.32066,0.32696,0 +2024-06-23,0.19755,0.30054,0.2921,0 +2024-06-24,0.2407,0.39238,0.2186,0.11111 +2024-06-25,0.24213,0.50083,0.11445,0.11111 +2024-06-26,0.25309,0.50916,0.13901,0.11111 +2024-06-27,0.26278,0.51134,0.16589,0.11111 +2024-06-28,0.27015,0.51101,0.18833,0.11111 +2024-06-29,0.27365,0.50303,0.20682,0.11111 +2024-06-30,0.27802,0.48904,0.23392,0.11111 +2024-07-01,0.25409,0.42194,0.22922,0.11111 +2024-07-02,0.25404,0.42859,0.22243,0.11111 +2024-07-03,0.25049,0.42143,0.21892,0.11111 +2024-07-04,0.33525,0.54931,0.23423,0.22222 +2024-07-05,0.30457,0.45125,0.24023,0.22222 +2024-07-06,0.30468,0.43904,0.25279,0.22222 +2024-07-07,0.36268,0.49554,0.25915,0.33333 +2024-07-08,0.35309,0.45893,0.267,0.33333 +2024-07-09,0.3488,0.43349,0.27958,0.33333 +2024-07-10,0.35792,0.45783,0.28261,0.33333 +2024-07-11,0.36367,0.48335,0.27433,0.33333 +2024-07-12,0.36535,0.49496,0.26775,0.33333 +2024-07-13,0.36286,0.49265,0.26259,0.33333 +2024-07-14,0.36368,0.49045,0.26727,0.33333 +2024-07-15,0.40285,0.5029,0.26121,0.44444 +2024-07-16,0.36088,0.38291,0.2553,0.44444 +2024-07-17,0.3621,0.39223,0.24962,0.44444 +2024-07-18,0.36137,0.4019,0.23778,0.44444 +2024-07-19,0.33152,0.33076,0.21936,0.44444 +2024-07-20,0.30657,0.28262,0.19264,0.44444 +2024-07-21,0.29336,0.27246,0.16317,0.44444 +2024-07-22,0.28382,0.27162,0.13538,0.44444 +2024-07-23,0.27182,0.27371,0.097304,0.44444 +2024-07-24,0.22319,0.24804,0.088182,0.33333 +2024-07-25,0.2304,0.26884,0.089028,0.33333 +2024-07-26,0.22632,0.25065,0.09497,0.33333 +2024-07-27,0.22226,0.23143,0.10201,0.33333 +2024-07-28,0.23467,0.26016,0.11052,0.33333 +2024-07-29,0.23863,0.26702,0.11554,0.33333 +2024-07-30,0.24563,0.27994,0.12363,0.33333 +2024-07-31,0.24005,0.26335,0.12348,0.33333 +2024-08-01,0.24009,0.26591,0.12102,0.33333 +2024-08-02,0.25205,0.19291,0.1188,0.44444 +2024-08-03,0.22248,0.21643,0.11767,0.33333 +2024-08-04,0.22183,0.21544,0.11672,0.33333 +2024-08-05,0.29635,0.32736,0.11724,0.44444 +2024-08-06,0.2948,0.40593,0.14513,0.33333 +2024-08-07,0.30069,0.40228,0.16645,0.33333 +2024-08-08,0.37148,0.37968,0.29031,0.44444 +2024-08-09,0.37126,0.31863,0.35069,0.44444 +2024-08-10,0.38406,0.31869,0.38904,0.44444 +2024-08-11,0.38777,0.30586,0.41301,0.44444 +2024-08-12,0.38595,0.29945,0.41395,0.44444 +2024-08-13,0.37979,0.29757,0.39737,0.44444 +2024-08-14,0.35291,0.32976,0.39563,0.33333 +2024-08-15,0.35045,0.31895,0.39907,0.33333 +2024-08-16,0.3475,0.30849,0.40068,0.33333 +2024-08-17,0.3539,0.32716,0.40121,0.33333 +2024-08-18,0.36225,0.34645,0.40697,0.33333 +2024-08-19,0.36201,0.34046,0.41225,0.33333 +2024-08-20,0.36383,0.33859,0.41956,0.33333 +2024-08-21,0.35973,0.32986,0.41601,0.33333 +2024-08-22,0.35841,0.32336,0.41854,0.33333 +2024-08-23,0.34484,0.28942,0.41176,0.33333 +2024-08-24,0.33239,0.25922,0.40461,0.33333 +2024-08-25,0.34078,0.2935,0.39551,0.33333 +2024-08-26,0.33043,0.27427,0.38367,0.33333 +2024-08-27,0.32206,0.26563,0.36723,0.33333 +2024-08-28,0.3087,0.23915,0.35363,0.33333 +2024-08-29,0.30865,0.25648,0.33613,0.33333 +2024-08-30,0.31436,0.27678,0.33297,0.33333 +2024-08-31,0.32881,0.32221,0.33089,0.33333 +2024-09-01,0.29887,0.33854,0.33584,0.22222 +2024-09-02,0.30157,0.34933,0.33315,0.22222 +2024-09-03,0.28844,0.30567,0.33742,0.22222 +2024-09-04,0.23948,0.26064,0.34669,0.11111 +2024-09-05,0.24165,0.25779,0.35605,0.11111 +2024-09-06,0.24032,0.24772,0.36213,0.11111 +2024-09-07,0.18752,0.22483,0.33772,0 +2024-09-08,0.17869,0.22339,0.31269,0 +2024-09-09,0.17272,0.24218,0.27597,0 +2024-09-10,0.1558,0.24123,0.22618,0 +2024-09-11,0.15184,0.26029,0.19522,0 +2024-09-12,0.14272,0.27063,0.15753,0 +2024-09-13,0.11926,0.25807,0.099715,0 +2024-09-14,0.11387,0.23849,0.10311,0 +2024-09-15,0.11778,0.24851,0.10484,0 +2024-09-16,0.11857,0.2468,0.1089,0 +2024-09-17,0.11674,0.24319,0.10704,0 +2024-09-18,0.11606,0.2423,0.10588,0 +2024-09-19,0.12053,0.25939,0.1022,0 +2024-09-20,0.12474,0.27071,0.1035,0 +2024-09-21,0.14322,0.32506,0.1046,0 +2024-09-22,0.18426,0.4381,0.11468,0 +2024-09-23,0.18642,0.42847,0.13079,0 +2024-09-24,0.20127,0.44396,0.15985,0 +2024-09-25,0.20092,0.42705,0.1757,0 +2024-09-26,0.21946,0.49654,0.16183,0 +2024-09-27,0.20303,0.45648,0.1526,0 +2024-09-28,0.1969,0.45336,0.13733,0 +2024-09-29,0.2002,0.45719,0.14341,0 +2024-09-30,0.19461,0.44061,0.14323,0 +2024-10-01,0.20792,0.47913,0.14462,0 +2024-10-02,0.18229,0.4046,0.14226,0 +2024-10-03,0.19734,0.44909,0.14293,0 +2024-10-04,0.19981,0.4567,0.14274,0 +2024-10-05,0.17872,0.3936,0.14257,0 +2024-10-06,0.19741,0.45217,0.14007,0 +2024-10-07,0.19633,0.45163,0.13735,0 +2024-10-08,0.2117,0.48047,0.15464,0 +2024-10-09,0.20797,0.4735,0.15042,0 +2024-10-10,0.19853,0.44797,0.14763,0 +2024-10-11,0.18233,0.40909,0.13789,0 +2024-10-12,0.18018,0.4063,0.13425,0 +2024-10-13,0.19047,0.43835,0.13307,0 +2024-10-14,0.20994,0.37813,0.14056,0.11111 +2024-10-15,0.21057,0.37503,0.14558,0.11111 +2024-10-16,0.20931,0.37125,0.14557,0.11111 +2024-10-17,0.20361,0.35707,0.14266,0.11111 +2024-10-18,0.19922,0.34645,0.14009,0.11111 +2024-10-19,0.20046,0.35441,0.13586,0.11111 +2024-10-20,0.19841,0.34741,0.13671,0.11111 +2024-10-21,0.19296,0.32384,0.14392,0.11111 +2024-10-22,0.18383,0.28787,0.15251,0.11111 +2024-10-23,0.18578,0.29103,0.15521,0.11111 +2024-10-24,0.18003,0.29072,0.13826,0.11111 +2024-10-25,0.17785,0.29375,0.12869,0.11111 +2024-10-26,0.17703,0.29443,0.12555,0.11111 +2024-10-27,0.17268,0.28477,0.12216,0.11111 +2024-10-28,0.16319,0.25985,0.1186,0.11111 +2024-10-29,0.1927,0.34961,0.11739,0.11111 +2024-10-30,0.15167,0.22717,0.11675,0.11111 +2024-10-31,0.15744,0.2445,0.11672,0.11111 +2024-11-01,0.14354,0.20569,0.11383,0.11111 +2024-11-02,0.15259,0.22925,0.11742,0.11111 +2024-11-03,0.16337,0.25895,0.12005,0.11111 +2024-11-04,0.16018,0.24979,0.11964,0.11111 +2024-11-05,0.15902,0.24435,0.12161,0.11111 +2024-11-06,0.24664,0.33325,0.18446,0.22222 +2024-11-07,0.22781,0.26733,0.19388,0.22222 +2024-11-08,0.238,0.2873,0.20448,0.22222 +2024-11-09,0.2498,0.31775,0.20943,0.22222 +2024-11-10,0.24442,0.29291,0.21812,0.22222 +2024-11-11,0.34124,0.45195,0.23844,0.33333 +2024-11-12,0.33523,0.41035,0.26201,0.33333 +2024-11-13,0.30169,0.41286,0.27,0.22222 +2024-11-14,0.30968,0.41762,0.28919,0.22222 +2024-11-15,0.31541,0.4235,0.3005,0.22222 +2024-11-16,0.30963,0.39806,0.30862,0.22222 +2024-11-17,0.31159,0.40234,0.31022,0.22222 +2024-11-18,0.3078,0.39894,0.30225,0.22222 +2024-11-19,0.30535,0.40199,0.29185,0.22222 +2024-11-20,0.3005,0.40452,0.27475,0.22222 +2024-11-21,0.2914,0.39201,0.25997,0.22222 +2024-11-22,0.28225,0.37377,0.25077,0.22222 +2024-11-23,0.28445,0.38396,0.24717,0.22222 +2024-11-24,0.28806,0.39437,0.24757,0.22222 +2024-11-25,0.27189,0.35744,0.236,0.22222 +2024-11-26,0.26388,0.34438,0.22504,0.22222 +2024-11-27,0.25554,0.33053,0.21387,0.22222 +2024-11-28,0.25262,0.32648,0.20915,0.22222 +2024-11-29,0.25353,0.33659,0.20176,0.22222 +2024-11-30,0.25489,0.34323,0.19921,0.22222 +2024-12-01,0.25212,0.33959,0.19456,0.22222 +2024-12-02,0.25046,0.33015,0.19902,0.22222 +2024-12-03,0.25337,0.33246,0.20541,0.22222 +2024-12-04,0.25514,0.32738,0.21583,0.22222 +2024-12-05,0.25195,0.32332,0.21032,0.22222 +2024-12-06,0.23874,0.3891,0.21601,0.11111 +2024-12-07,0.23055,0.3566,0.22394,0.11111 +2024-12-08,0.23177,0.3528,0.23139,0.11111 +2024-12-09,0.23916,0.3733,0.23307,0.11111 +2024-12-10,0.17641,0.18391,0.23421,0.11111 +2024-12-11,0.13814,0.18549,0.22891,0 +2024-12-12,0.13201,0.17928,0.21677,0 +2024-12-13,0.1245,0.15938,0.21412,0 +2024-12-14,0.10072,0.10421,0.19795,0 +2024-12-15,0.095653,0.11149,0.17547,0 +2024-12-16,0.07909,0.089798,0.14747,0 +2024-12-17,0.062752,0.081658,0.1066,0 +2024-12-18,0.086491,0.040452,0.10791,0.11111 +2024-12-19,0.10785,0.10187,0.11058,0.11111 +2024-12-20,0.10198,0.082459,0.11238,0.11111 +2024-12-21,0.11763,0.13127,0.11052,0.11111 +2024-12-22,0.10995,0.11752,0.10122,0.11111 +2024-12-23,0.1027,0.10043,0.096558,0.11111 +2024-12-24,0.10372,0.11132,0.088715,0.11111 +2024-12-25,0.098521,0.095338,0.089116,0.11111 +2024-12-26,0.094502,0.084832,0.087564,0.11111 +2024-12-27,0.10164,0.11475,0.079052,0.11111 +2024-12-28,0.10086,0.11329,0.078172,0.11111 +2024-12-29,0.10055,0.11458,0.075969,0.11111 +2024-12-30,0.096502,0.10479,0.073607,0.11111 +2024-12-31,0.10156,0.1123,0.081271,0.11111 +2025-01-01,0.10303,0.11122,0.086766,0.11111 +2025-01-02,0.10806,0.11934,0.093728,0.11111 +2025-01-03,0.1056,0.10874,0.096943,0.11111 +2025-01-04,0.11039,0.11265,0.10741,0.11111 +2025-01-05,0.14098,0.17889,0.13294,0.11111 +2025-01-06,0.1317,0.13595,0.14805,0.11111 +2025-01-07,0.20325,0.23942,0.14811,0.22222 +2025-01-08,0.21504,0.27183,0.15108,0.22222 +2025-01-09,0.22502,0.29978,0.15305,0.22222 +2025-01-10,0.23356,0.32436,0.15408,0.22222 +2025-01-11,0.22993,0.31125,0.15632,0.22222 +2025-01-12,0.23966,0.33718,0.15959,0.22222 +2025-01-13,0.25796,0.39199,0.15966,0.22222 +2025-01-14,0.25704,0.38518,0.16371,0.22222 +2025-01-15,0.25914,0.39302,0.16218,0.22222 +2025-01-16,0.27983,0.45247,0.16478,0.22222 +2025-01-17,0.21628,0.37346,0.16427,0.11111 +2025-01-18,0.20085,0.32964,0.1618,0.11111 +2025-01-19,0.1835,0.27884,0.16053,0.11111 +2025-01-20,0.18005,0.26998,0.15905,0.11111 +2025-01-21,0.17665,0.25652,0.16232,0.11111 +2025-01-22,0.19316,0.3038,0.16457,0.11111 +2025-01-23,0.19988,0.32575,0.16277,0.11111 +2025-01-24,0.21461,0.37065,0.16207,0.11111 +2025-01-25,0.22115,0.39013,0.16221,0.11111 +2025-01-26,0.22001,0.38494,0.16397,0.11111 +2025-01-27,0.21948,0.38172,0.1656,0.11111 +2025-01-28,0.2305,0.39427,0.18612,0.11111 +2025-01-29,0.23045,0.38017,0.20006,0.11111 +2025-01-30,0.22861,0.36806,0.20665,0.11111 +2025-01-31,0.23038,0.37027,0.20974,0.11111 +2025-02-01,0.2318,0.37506,0.20922,0.11111 +2025-02-02,0.22626,0.36566,0.20202,0.11111 +2025-02-03,0.21933,0.3562,0.19067,0.11111 +2025-02-04,0.23773,0.43153,0.17054,0.11111 +2025-02-05,0.20353,0.34531,0.15416,0.11111 +2025-02-06,0.1676,0.35025,0.15255,0 +2025-02-07,0.1791,0.3881,0.1492,0 +2025-02-08,0.18593,0.41149,0.14629,0 +2025-02-09,0.1993,0.45653,0.14138,0 +2025-02-10,0.19619,0.44195,0.14661,0 +2025-02-11,0.19285,0.41062,0.16794,0 +2025-02-12,0.20223,0.42235,0.18434,0 +2025-02-13,0.20042,0.40663,0.19464,0 +2025-02-14,0.21615,0.44312,0.20534,0 +2025-02-15,0.24064,0.50925,0.21266,0 +2025-02-16,0.27538,0.60629,0.21984,0 +2025-02-17,0.29897,0.6689,0.22802,0 +2025-02-18,0.31558,0.71249,0.23426,0 +2025-02-19,0.34013,0.77337,0.24701,0 +2025-02-20,0.33198,0.74593,0.25002,0 +2025-02-21,0.34436,0.79188,0.2412,0 +2025-02-22,0.32843,0.7564,0.2289,0 +2025-02-23,0.33121,0.76252,0.2311,0 +2025-02-24,0.32594,0.63553,0.23119,0.11111 +2025-02-25,0.34774,0.69454,0.23756,0.11111 +2025-02-26,0.39844,0.72523,0.24787,0.22222 +2025-02-27,0.36749,0.6387,0.24155,0.22222 +2025-02-28,0.37314,0.65766,0.23953,0.22222 +2025-03-01,0.37319,0.65512,0.24222,0.22222 +2025-03-02,0.42428,0.60446,0.33504,0.33333 +2025-03-03,0.56099,0.81327,0.42525,0.44444 +2025-03-04,0.54518,0.71286,0.47823,0.44444 +2025-03-05,0.54996,0.69533,0.51011,0.44444 +2025-03-06,0.55562,0.68751,0.53491,0.44444 +2025-03-07,0.55735,0.67227,0.55532,0.44444 +2025-03-08,0.55236,0.64567,0.56696,0.44444 +2025-03-09,0.56839,0.58739,0.56223,0.55556 +2025-03-10,0.55846,0.56428,0.55553,0.55556 +2025-03-11,0.55103,0.55193,0.54561,0.55556 +2025-03-12,0.53497,0.52421,0.52514,0.55556 +2025-03-13,0.52253,0.51782,0.49421,0.55556 +2025-03-14,0.51445,0.51909,0.46871,0.55556 +2025-03-15,0.50041,0.50053,0.44514,0.55556 +2025-03-16,0.48924,0.48811,0.42407,0.55556 +2025-03-17,0.47944,0.47847,0.4043,0.55556 +2025-03-18,0.47305,0.47158,0.39201,0.55556 +2025-03-19,0.45488,0.43626,0.37281,0.55556 +2025-03-20,0.44145,0.41821,0.35057,0.55556 +2025-03-21,0.42849,0.40516,0.32477,0.55556 +2025-03-22,0.42967,0.4332,0.30027,0.55556 +2025-03-23,0.42213,0.42965,0.28119,0.55556 +2025-03-24,0.40728,0.40421,0.26209,0.55556 +2025-03-25,0.41539,0.44893,0.24168,0.55556 +2025-03-26,0.38857,0.47144,0.24984,0.44444 +2025-03-27,0.40175,0.48909,0.27171,0.44444 +2025-03-28,0.37439,0.50748,0.28237,0.33333 +2025-03-29,0.36905,0.48645,0.28736,0.33333 +2025-03-30,0.37272,0.48492,0.29991,0.33333 +2025-03-31,0.40131,0.5509,0.3197,0.33333 +2025-04-01,0.27441,0.27057,0.33044,0.22222 +2025-04-02,0.24833,0.30667,0.32722,0.11111 +2025-04-03,0.24554,0.30579,0.31971,0.11111 +2025-04-04,0.25607,0.34209,0.31502,0.11111 +2025-04-05,0.26619,0.38061,0.30686,0.11111 +2025-04-06,0.27788,0.33725,0.27417,0.22222 +2025-04-07,0.27168,0.36156,0.23126,0.22222 +2025-04-08,0.21556,0.32128,0.21428,0.11111 +2025-04-09,0.284,0.39914,0.23065,0.22222 +2025-04-10,0.31629,0.48557,0.24109,0.22222 +2025-04-11,0.33397,0.51564,0.26404,0.22222 +2025-04-12,0.33716,0.50469,0.28457,0.22222 +2025-04-13,0.34456,0.52394,0.28751,0.22222 +2025-04-14,0.34627,0.52637,0.29022,0.22222 +2025-04-15,0.34981,0.53427,0.29294,0.22222 +2025-04-16,0.35347,0.54406,0.29413,0.22222 +2025-04-17,0.36345,0.57121,0.29692,0.22222 +2025-04-18,0.3673,0.56424,0.31544,0.22222 +2025-04-19,0.38494,0.59336,0.33923,0.22222 +2025-04-20,0.39343,0.58861,0.36945,0.22222 +2025-04-21,0.39921,0.58611,0.38931,0.22222 +2025-04-22,0.43926,0.59306,0.39139,0.33333 +2025-04-23,0.41522,0.51903,0.39329,0.33333 +2025-04-24,0.41611,0.52112,0.39387,0.33333 +2025-04-25,0.41366,0.51985,0.38781,0.33333 +2025-04-26,0.41727,0.54885,0.36962,0.33333 +2025-04-27,0.41805,0.55842,0.36239,0.33333 +2025-04-28,0.41872,0.56487,0.35797,0.33333 +2025-04-29,0.42125,0.55501,0.37541,0.33333 +2025-04-30,0.4344,0.58199,0.38788,0.33333 +2025-05-01,0.43391,0.56655,0.40184,0.33333 +2025-05-02,0.44136,0.57178,0.41896,0.33333 +2025-05-03,0.44642,0.5718,0.43412,0.33333 +2025-05-04,0.44773,0.56573,0.44412,0.33333 +2025-05-05,0.47453,0.63685,0.45341,0.33333 +2025-05-06,0.45459,0.67309,0.46846,0.22222 +2025-05-07,0.46164,0.67929,0.48342,0.22222 +2025-05-08,0.4546,0.54556,0.48492,0.33333 +2025-05-09,0.3605,0.38376,0.47551,0.22222 +2025-05-10,0.33064,0.30979,0.45991,0.22222 +2025-05-11,0.3068,0.27012,0.42805,0.22222 +2025-05-12,0.28824,0.26374,0.37875,0.22222 +2025-05-13,0.2776,0.26519,0.3454,0.22222 +2025-05-14,0.26272,0.2645,0.30145,0.22222 +2025-05-15,0.25649,0.27096,0.27627,0.22222 +2025-05-16,0.26294,0.28176,0.28483,0.22222 +2025-05-17,0.27334,0.29125,0.30654,0.22222 +2025-05-18,0.26613,0.2704,0.30576,0.22222 +2025-05-19,0.25903,0.25457,0.3003,0.22222 +2025-05-20,0.25935,0.27132,0.28451,0.22222 +2025-05-21,0.21192,0.13523,0.2783,0.22222 +2025-05-22,0.18764,0.17208,0.27974,0.11111 +2025-05-23,0.23358,0.19841,0.28012,0.22222 +2025-05-24,0.2231,0.16745,0.27963,0.22222 +2025-05-25,0.21964,0.15811,0.27858,0.22222 +2025-05-26,0.21676,0.15164,0.27642,0.22222 +2025-05-27,0.22092,0.16844,0.27209,0.22222 +2025-05-28,0.22082,0.17219,0.26805,0.22222 +2025-05-29,0.20837,0.15607,0.24683,0.22222 +2025-05-30,0.21037,0.17411,0.23476,0.22222 +2025-05-31,0.21375,0.18424,0.23481,0.22222 +2025-06-01,0.21391,0.184,0.23549,0.22222 +2025-06-02,0.21874,0.19469,0.23931,0.22222 +2025-06-03,0.2281,0.21642,0.24565,0.22222 +2025-06-04,0.23636,0.23585,0.25101,0.22222 +2025-06-05,0.23693,0.23562,0.25294,0.22222 +2025-06-06,0.27432,0.35072,0.25001,0.22222 +2025-06-07,0.27475,0.47029,0.24285,0.11111 +2025-06-08,0.27609,0.48384,0.23333,0.11111 +2025-06-09,0.28562,0.40421,0.23042,0.22222 +2025-06-10,0.2588,0.32338,0.2308,0.22222 +2025-06-11,0.25728,0.32082,0.22878,0.22222 +2025-06-12,0.25758,0.32522,0.22529,0.22222 +2025-06-13,0.2398,0.28025,0.21693,0.22222 +2025-06-14,0.23359,0.2726,0.20594,0.22222 +2025-06-15,0.2282,0.26852,0.19385,0.22222 +2025-06-16,0.23642,0.3081,0.17895,0.22222 +2025-06-17,0.24218,0.32295,0.18136,0.22222 +2025-06-18,0.23642,0.30491,0.18213,0.22222 +2025-06-19,0.24994,0.33496,0.19264,0.22222 +2025-06-20,0.24685,0.31509,0.20323,0.22222 +2025-06-21,0.23424,0.26766,0.21285,0.22222 +2025-06-22,0.2102,0.30314,0.21635,0.11111 +2025-06-23,0.25172,0.32168,0.21126,0.22222 +2025-06-24,0.23558,0.27566,0.20887,0.22222 +2025-06-25,0.22993,0.2599,0.20766,0.22222 +2025-06-26,0.22877,0.25764,0.20644,0.22222 +2025-06-27,0.23686,0.28181,0.20656,0.22222 +2025-06-28,0.24203,0.29732,0.20656,0.22222 +2025-06-29,0.24204,0.30502,0.19888,0.22222 +2025-06-30,0.24562,0.30273,0.21191,0.22222 +2025-07-01,0.24578,0.29818,0.21694,0.22222 +2025-07-02,0.24062,0.28953,0.21012,0.22222 +2025-07-03,0.2298,0.26382,0.20336,0.22222 +2025-07-04,0.23156,0.27887,0.19359,0.22222 +2025-07-05,0.208,0.21118,0.1906,0.22222 +2025-07-06,0.20875,0.21245,0.19159,0.22222 +2025-07-07,0.20923,0.2125,0.19296,0.22222 +2025-07-08,0.22764,0.26449,0.19621,0.22222 +2025-07-09,0.21056,0.32469,0.19587,0.11111 +2025-07-10,0.27603,0.41814,0.18773,0.22222 +2025-07-11,0.27013,0.4131,0.17507,0.22222 +2025-07-12,0.27649,0.4433,0.16393,0.22222 +2025-07-13,0.2677,0.42338,0.1575,0.22222 +2025-07-14,0.26003,0.40528,0.15258,0.22222 +2025-07-15,0.25523,0.39706,0.1464,0.22222 +2025-07-16,0.25266,0.39317,0.14258,0.22222 +2025-07-17,0.26379,0.41982,0.14933,0.22222 +2025-07-18,0.25894,0.39988,0.15473,0.22222 +2025-07-19,0.25974,0.40627,0.15072,0.22222 +2025-07-20,0.2668,0.42308,0.15511,0.22222 +2025-07-21,0.27408,0.43746,0.16256,0.22222 +2025-07-22,0.26515,0.40853,0.16468,0.22222 +2025-07-23,0.25197,0.48435,0.16045,0.11111 +2025-07-24,0.25306,0.4882,0.15987,0.11111 +2025-07-25,0.25674,0.50171,0.15739,0.11111 +2025-07-26,0.25197,0.49348,0.15133,0.11111 +2025-07-27,0.24021,0.46394,0.14557,0.11111 +2025-07-28,0.23795,0.46352,0.13923,0.11111 +2025-07-29,0.23809,0.45439,0.14876,0.11111 +2025-07-30,0.24806,0.48331,0.14975,0.11111 +2025-07-31,0.23407,0.44216,0.14893,0.11111 +2025-08-01,0.25228,0.49623,0.14949,0.11111 +2025-08-02,0.2492,0.48578,0.15071,0.11111 +2025-08-03,0.25193,0.49634,0.14835,0.11111 +2025-08-04,0.24848,0.48924,0.14509,0.11111 +2025-08-05,0.24772,0.49053,0.14151,0.11111 +2025-08-06,0.24665,0.49016,0.13867,0.11111 +2025-08-07,0.2496,0.49807,0.13961,0.11111 +2025-08-08,0.20251,0.35653,0.1399,0.11111 +2025-08-09,0.1352,0.28135,0.12426,0 +2025-08-10,0.15805,0.24428,0.11877,0.11111 +2025-08-11,0.15308,0.23636,0.11175,0.11111 +2025-08-12,0.15072,0.23774,0.10331,0.11111 +2025-08-13,0.20355,0.28399,0.10443,0.22222 +2025-08-14,0.33089,0.51251,0.14681,0.33333 +2025-08-15,0.32324,0.45303,0.18335,0.33333 +2025-08-16,0.33646,0.46051,0.21554,0.33333 +2025-08-17,0.35037,0.48974,0.22805,0.33333 +2025-08-18,0.34889,0.47559,0.23775,0.33333 +2025-08-19,0.34347,0.45381,0.24326,0.33333 +2025-08-20,0.35132,0.48537,0.23525,0.33333 +2025-08-21,0.35141,0.49175,0.22916,0.33333 +2025-08-22,0.39604,0.50956,0.23411,0.44444 +2025-08-23,0.38792,0.48199,0.23731,0.44444 +2025-08-24,0.3831,0.46694,0.23791,0.44444 +2025-08-25,0.38664,0.47416,0.24131,0.44444 +2025-08-26,0.38612,0.47309,0.24082,0.44444 +2025-08-27,0.3843,0.46844,0.24001,0.44444 +2025-08-28,0.36713,0.43136,0.22559,0.44444 +2025-08-29,0.35659,0.42245,0.20287,0.44444 +2025-08-30,0.33099,0.36081,0.18771,0.44444 +2025-08-31,0.33889,0.39404,0.1782,0.44444 +2025-09-01,0.33877,0.40491,0.16695,0.44444 +2025-09-02,0.33444,0.402,0.15688,0.44444 +2025-09-03,0.32601,0.38549,0.14809,0.44444 +2025-09-04,0.32383,0.38784,0.13921,0.44444 +2025-09-05,0.33808,0.41389,0.15592,0.44444 +2025-09-06,0.35589,0.45057,0.17265,0.44444 +2025-09-07,0.3572,0.4448,0.18236,0.44444 +2025-09-08,0.37098,0.47838,0.19013,0.44444 +2025-09-09,0.35091,0.50805,0.21135,0.33333 +2025-09-10,0.34744,0.48989,0.21909,0.33333 +2025-09-11,0.35193,0.49552,0.22692,0.33333 +2025-09-12,0.29867,0.4337,0.24007,0.22222 +2025-09-13,0.28682,0.49248,0.25688,0.11111 +2025-09-14,0.29362,0.50099,0.26876,0.11111 +2025-09-15,0.29354,0.49046,0.27906,0.11111 +2025-09-16,0.2962,0.48507,0.29241,0.11111 +2025-09-17,0.30803,0.50115,0.31183,0.11111 +2025-09-18,0.31957,0.51331,0.3343,0.11111 +2025-09-19,0.32393,0.50936,0.3513,0.11111 +2025-09-20,0.31892,0.48012,0.36552,0.11111 +2025-09-21,0.28747,0.4848,0.37762,0 +2025-09-22,0.27384,0.44494,0.37657,0 +2025-09-23,0.25238,0.38009,0.37705,0 +2025-09-24,0.2276,0.32168,0.36113,0 +2025-09-25,0.27372,0.36927,0.34079,0.11111 +2025-09-26,0.25759,0.33965,0.32201,0.11111 +2025-09-27,0.24581,0.32579,0.30054,0.11111 +2025-09-28,0.24876,0.33074,0.30442,0.11111 +2025-09-29,0.26505,0.37856,0.30549,0.11111 +2025-09-30,0.25705,0.35308,0.30697,0.11111 +2025-10-01,0.28487,0.29804,0.33434,0.22222 +2025-10-02,0.30811,0.37178,0.33034,0.22222 +2025-10-03,0.30721,0.37359,0.32581,0.22222 +2025-10-04,0.30245,0.36346,0.32168,0.22222 +2025-10-05,0.29551,0.34999,0.31433,0.22222 +2025-10-06,0.29196,0.34593,0.30772,0.22222 +2025-10-07,0.29048,0.34133,0.30788,0.22222 +2025-10-08,0.29088,0.35143,0.29899,0.22222 +2025-10-09,0.29117,0.36939,0.2819,0.22222 +2025-10-10,0.3503,0.38589,0.33167,0.33333 +2025-10-11,0.3759,0.43527,0.35911,0.33333 +2025-10-12,0.39052,0.44028,0.39794,0.33333 +2025-10-13,0.37731,0.38322,0.41537,0.33333 +2025-10-14,0.37227,0.35959,0.42388,0.33333 +2025-10-15,0.36946,0.35372,0.42132,0.33333 +2025-10-16,0.36594,0.35084,0.41365,0.33333 +2025-10-17,0.35099,0.33117,0.38848,0.33333 +2025-10-18,0.33914,0.32594,0.35815,0.33333 +2025-10-19,0.33132,0.32005,0.34056,0.33333 +2025-10-20,0.31323,0.28773,0.31863,0.33333 +2025-10-21,0.3077,0.29398,0.29578,0.33333 +2025-10-22,0.30562,0.29848,0.28505,0.33333 +2025-10-23,0.29487,0.28358,0.26771,0.33333 +2025-10-24,0.29594,0.29423,0.26027,0.33333 +2025-10-25,0.27468,0.33827,0.26355,0.22222 +2025-10-26,0.26201,0.29834,0.26547,0.22222 +2025-10-27,0.26104,0.29312,0.26779,0.22222 +2025-10-28,0.26907,0.30772,0.27728,0.22222 +2025-10-29,0.26876,0.30433,0.27972,0.22222 +2025-10-30,0.28332,0.34457,0.28317,0.22222 +2025-10-31,0.24771,0.3453,0.28672,0.11111 +2025-11-01,0.24992,0.35591,0.28275,0.11111 +2025-11-02,0.25474,0.36816,0.28494,0.11111 +2025-11-03,0.23493,0.31509,0.27861,0.11111 +2025-11-04,0.29313,0.38826,0.26891,0.22222 +2025-11-05,0.29618,0.40728,0.25904,0.22222 +2025-11-06,0.29793,0.4133,0.25828,0.22222 +2025-11-07,0.29494,0.41119,0.25141,0.22222 +2025-11-08,0.31484,0.47804,0.24426,0.22222 +2025-11-09,0.27004,0.45553,0.24349,0.11111 +2025-11-10,0.26177,0.43333,0.24086,0.11111 +2025-11-11,0.28416,0.5154,0.22598,0.11111 +2025-11-12,0.2771,0.51022,0.20997,0.11111 +2025-11-13,0.2696,0.50615,0.19155,0.11111 +2025-11-14,0.29852,0.49668,0.17665,0.22222 +2025-11-15,0.27331,0.43585,0.16185,0.22222 +2025-11-16,0.27348,0.43604,0.16217,0.22222 +2025-11-17,0.26936,0.42326,0.16259,0.22222 +2025-11-18,0.26422,0.41522,0.15523,0.22222 +2025-11-19,0.26461,0.41911,0.15249,0.22222 +2025-11-20,0.29605,0.40169,0.15313,0.33333 +2025-11-21,0.29086,0.3913,0.14795,0.33333 +2025-11-22,0.29194,0.39854,0.14396,0.33333 +2025-11-23,0.27723,0.36398,0.13439,0.33333 +2025-11-24,0.27665,0.37145,0.12517,0.33333 +2025-11-25,0.28014,0.38916,0.11793,0.33333 +2025-11-26,0.26261,0.33874,0.11575,0.33333 +2025-11-27,0.25153,0.31939,0.10186,0.33333 +2025-11-28,0.26379,0.3547,0.10334,0.33333 +2025-11-29,0.27728,0.39437,0.10415,0.33333 +2025-11-30,0.28517,0.41486,0.10732,0.33333 +2025-12-01,0.25548,0.33325,0.099855,0.33333 +2025-12-02,0.33519,0.4702,0.090924,0.44444 +2025-12-03,0.3208,0.42812,0.089833,0.44444 +2025-12-04,0.28486,0.42517,0.096093,0.33333 +2025-12-05,0.28578,0.41727,0.10674,0.33333 +2025-12-06,0.28142,0.39515,0.11578,0.33333 +2025-12-07,0.28956,0.41119,0.12414,0.33333 +2025-12-08,0.29568,0.42942,0.12427,0.33333 +2025-12-09,0.29601,0.42677,0.12793,0.33333 +2025-12-10,0.30042,0.43101,0.1369,0.33333 +2025-12-11,0.31143,0.45463,0.14632,0.33333 +2025-12-12,0.31257,0.44603,0.15834,0.33333 +2025-12-13,0.31391,0.43938,0.16901,0.33333 +2025-12-14,0.28511,0.45507,0.17802,0.22222 +2025-12-15,0.28701,0.45435,0.18446,0.22222 +2025-12-16,0.29066,0.45595,0.19379,0.22222 +2025-12-17,0.29411,0.461,0.19913,0.22222 +2025-12-18,0.29596,0.45684,0.20881,0.22222 +2025-12-19,0.29657,0.45737,0.21012,0.22222 +2025-12-20,0.2516,0.43225,0.21143,0.11111 +2025-12-21,0.26181,0.4595,0.21483,0.11111 +2025-12-22,0.2768,0.49973,0.21957,0.11111 +2025-12-23,0.28059,0.50348,0.22718,0.11111 +2025-12-24,0.28597,0.50843,0.23836,0.11111 +2025-12-25,0.30157,0.54351,0.25008,0.11111 +2025-12-26,0.32445,0.58224,0.28,0.11111 +2025-12-27,0.33656,0.58753,0.31103,0.11111 +2025-12-28,0.34526,0.58521,0.33945,0.11111 +2025-12-29,0.35214,0.58076,0.36455,0.11111 +2025-12-30,0.3818,0.6493,0.38498,0.11111 diff --git a/dashboard/data/mfi_nifty.csv b/dashboard/data/mfi_nifty.csv new file mode 100644 index 0000000..bb6c0e0 --- /dev/null +++ b/dashboard/data/mfi_nifty.csv @@ -0,0 +1,3853 @@ +date,MFI,persistence_norm,vol_of_vol_norm,tail_freq_norm +2010-04-28,0.33333,0,0,1 +2010-04-29,0.37579,0.12737,0,1 +2010-04-30,0.36936,0.10807,0,1 +2010-05-03,0.36727,0.095117,0.0066923,1 +2010-05-04,0.38472,0.15416,0,1 +2010-05-05,0.38559,0.15678,0,1 +2010-05-06,0.39674,0.1803,0.0099117,1 +2010-05-07,0.39945,0.18719,0.011166,1 +2010-05-10,0.62824,0.53422,0.35051,1 +2010-05-11,0.69001,0.53969,0.53035,1 +2010-05-12,0.72012,0.5249,0.63547,1 +2010-05-13,0.7438,0.53739,0.694,1 +2010-05-14,0.75292,0.50153,0.75722,1 +2010-05-17,0.75432,0.48927,0.77369,1 +2010-05-18,0.61057,0.54889,0.78281,0.5 +2010-05-19,0.7044,0.36068,0.75253,1 +2010-05-20,0.68397,0.3296,0.72233,1 +2010-05-21,0.68295,0.33765,0.71119,1 +2010-05-24,0.68927,0.36823,0.69957,1 +2010-05-25,0.65601,0.27299,0.69505,1 +2010-05-26,0.71843,0.42576,0.72953,1 +2010-05-27,0.7436,0.47294,0.75785,1 +2010-05-28,0.73864,0.48507,0.73086,1 +2010-05-31,0.72742,0.47909,0.70318,1 +2010-06-01,0.69966,0.40809,0.69089,1 +2010-06-02,0.67123,0.36988,0.64379,1 +2010-06-03,0.64085,0.3473,0.57524,1 +2010-06-04,0.60533,0.30069,0.51532,1 +2010-06-07,0.55325,0.22663,0.43311,1 +2010-06-08,0.52864,0.24099,0.34492,1 +2010-06-09,0.4094,0.27105,0.29048,0.66667 +2010-06-10,0.38068,0.23443,0.24096,0.66667 +2010-06-11,0.35854,0.21806,0.1909,0.66667 +2010-06-14,0.34458,0.21372,0.15335,0.66667 +2010-06-15,0.3324,0.21033,0.12022,0.66667 +2010-06-16,0.34383,0.23078,0.13404,0.66667 +2010-06-17,0.38025,0.2622,0.21188,0.66667 +2010-06-18,0.38674,0.24145,0.2521,0.66667 +2010-06-21,0.28607,0.19021,0.33467,0.33333 +2010-06-22,0.29579,0.17472,0.37932,0.33333 +2010-06-23,0.31351,0.17113,0.43607,0.33333 +2010-06-24,0.3626,0.26481,0.48967,0.33333 +2010-06-25,0.37804,0.28504,0.51576,0.33333 +2010-06-28,0.3743,0.25915,0.53042,0.33333 +2010-06-29,0.41499,0.37806,0.53357,0.33333 +2010-06-30,0.33395,0.45276,0.54909,0 +2010-07-01,0.32938,0.42628,0.56185,0 +2010-07-02,0.31487,0.37121,0.5734,0 +2010-07-05,0.38729,0.57797,0.5839,0 +2010-07-06,0.32102,0.3689,0.59417,0 +2010-07-07,0.27746,0.25163,0.58074,0 +2010-07-08,0.25027,0.21539,0.53541,0 +2010-07-09,0.25617,0.23712,0.53138,0 +2010-07-12,0.28674,0.31878,0.54144,0 +2010-07-13,0.26993,0.31519,0.4946,0 +2010-07-14,0.24745,0.34026,0.4021,0 +2010-07-15,0.27993,0.44058,0.3992,0 +2010-07-16,0.3351,0.55862,0.44667,0 +2010-07-19,0.34386,0.5725,0.45907,0 +2010-07-20,0.37344,0.6211,0.49922,0 +2010-07-21,0.41097,0.71254,0.52038,0 +2010-07-22,0.41693,0.70866,0.54213,0 +2010-07-23,0.41683,0.68876,0.56173,0 +2010-07-26,0.4318,0.73661,0.55879,0 +2010-07-27,0.42348,0.72976,0.54068,0 +2010-07-28,0.43773,0.74639,0.56681,0 +2010-07-29,0.44418,0.76122,0.57133,0 +2010-07-30,0.49187,0.89237,0.58323,0 +2010-08-02,0.50587,0.93368,0.58392,0 +2010-08-03,0.48338,0.86023,0.58992,0 +2010-08-04,0.47244,0.81998,0.59734,0 +2010-08-05,0.5002,0.89806,0.60255,0 +2010-08-06,0.49673,0.88004,0.61016,0 +2010-08-09,0.44375,0.72739,0.60387,0 +2010-08-10,0.38925,0.60425,0.56352,0 +2010-08-11,0.34955,0.49359,0.55506,0 +2010-08-12,0.34824,0.51915,0.52556,0 +2010-08-13,0.3118,0.45253,0.48288,0 +2010-08-16,0.33076,0.56958,0.42269,0 +2010-08-17,0.26509,0.46702,0.32825,0 +2010-08-18,0.24442,0.2326,0.25066,0.25 +2010-08-19,0.24518,0.2876,0.19793,0.25 +2010-08-20,0.18825,0.19245,0.1223,0.25 +2010-08-23,0.19511,0.22954,0.1058,0.25 +2010-08-24,0.18735,0.19826,0.11381,0.25 +2010-08-25,0.18834,0.1924,0.12261,0.25 +2010-08-26,0.17339,0.13418,0.13599,0.25 +2010-08-27,0.15091,0.052731,0.15001,0.25 +2010-08-30,0.12617,0,0.12851,0.25 +2010-08-31,0.12096,0.052908,0.059967,0.25 +2010-09-01,0.091334,0.0089938,0.015007,0.25 +2010-09-02,0.083333,0,0,0.25 +2010-09-03,0.096335,0.039004,0,0.25 +2010-09-06,0.18287,0,0.048598,0.5 +2010-09-07,0.18115,0.029335,0.014109,0.5 +2010-09-08,0.18194,0.045807,0,0.5 +2010-09-09,0.18756,0.062686,0,0.5 +2010-09-13,0.27946,0.088371,0,0.75 +2010-09-14,0.30956,0.17091,0.0077567,0.75 +2010-09-15,0.30668,0.16401,0.0060315,0.75 +2010-09-16,0.30508,0.15597,0.0092607,0.75 +2010-09-17,0.29729,0.12776,0.01411,0.75 +2010-09-20,0.31816,0.19227,0.012209,0.75 +2010-09-21,0.31588,0.18059,0.017043,0.75 +2010-09-22,0.31729,0.19578,0.0060873,0.75 +2010-09-23,0.31865,0.20595,0,0.75 +2010-09-24,0.31399,0.19197,0,0.75 +2010-09-27,0.30954,0.17863,0,0.75 +2010-09-28,0.31919,0.20758,0,0.75 +2010-09-29,0.33717,0.25238,0.0091425,0.75 +2010-09-30,0.24791,0.21692,0.0268,0.5 +2010-10-01,0.34574,0.25299,0.034212,0.75 +2010-10-04,0.31335,0.16093,0.029124,0.75 +2010-10-05,0.32084,0.19133,0.021177,0.75 +2010-10-06,0.32267,0.1972,0.020812,0.75 +2010-10-07,0.32987,0.19842,0.041188,0.75 +2010-10-08,0.33595,0.20702,0.050829,0.75 +2010-10-11,0.35408,0.25364,0.058603,0.75 +2010-10-12,0.33648,0.21177,0.047666,0.75 +2010-10-13,0.4462,0.26442,0.074187,1 +2010-10-14,0.49031,0.33146,0.13947,1 +2010-10-15,0.51729,0.31042,0.24145,1 +2010-10-18,0.53778,0.31298,0.30036,1 +2010-10-19,0.48268,0.34216,0.35589,0.75 +2010-10-20,0.48379,0.31357,0.3878,0.75 +2010-10-21,0.49992,0.28583,0.46394,0.75 +2010-10-22,0.4968,0.28938,0.45103,0.75 +2010-10-25,0.42464,0.31706,0.45687,0.5 +2010-10-26,0.42776,0.33365,0.44962,0.5 +2010-10-27,0.41981,0.3268,0.43262,0.5 +2010-10-28,0.41343,0.31648,0.42379,0.5 +2010-10-29,0.40914,0.31264,0.41479,0.5 +2010-11-01,0.40752,0.31403,0.40852,0.5 +2010-11-02,0.37673,0.22534,0.40485,0.5 +2010-11-03,0.37201,0.22339,0.39264,0.5 +2010-11-04,0.36975,0.22363,0.38563,0.5 +2010-11-08,0.34952,0.16636,0.38219,0.5 +2010-11-09,0.34311,0.15103,0.37829,0.5 +2010-11-10,0.33785,0.14988,0.36367,0.5 +2010-11-11,0.31444,0.1298,0.31352,0.5 +2010-11-12,0.32716,0.2069,0.27459,0.5 +2010-11-15,0.26213,0.26085,0.27553,0.25 +2010-11-16,0.24167,0.21976,0.25524,0.25 +2010-11-18,0.20388,0.12759,0.23404,0.25 +2010-11-19,0.18263,0.086426,0.21145,0.25 +2010-11-22,0.22845,0.18214,0.25322,0.25 +2010-11-23,0.23509,0.17587,0.2794,0.25 +2010-11-24,0.23264,0.16339,0.28454,0.25 +2010-11-25,0.22103,0.18255,0.23054,0.25 +2010-11-26,0.1359,0.1787,0.22901,0 +2010-11-29,0.13762,0.17512,0.23773,0 +2010-11-30,0.15122,0.21625,0.23741,0 +2010-12-01,0.13606,0.1718,0.23637,0 +2010-12-02,0.13069,0.15753,0.23455,0 +2010-12-03,0.1432,0.19193,0.23768,0 +2010-12-06,0.17675,0.29622,0.23403,0 +2010-12-07,0.20684,0.35233,0.2682,0 +2010-12-08,0.20024,0.31991,0.28082,0 +2010-12-09,0.21327,0.36359,0.27622,0 +2010-12-10,0.23572,0.43206,0.27509,0 +2010-12-13,0.22218,0.39443,0.27211,0 +2010-12-14,0.23273,0.42993,0.26825,0 +2010-12-15,0.24904,0.49105,0.25607,0 +2010-12-16,0.23363,0.4598,0.2411,0 +2010-12-20,0.2409,0.50298,0.21972,0 +2010-12-21,0.28209,0.59223,0.25404,0 +2010-12-22,0.27992,0.55614,0.28362,0 +2010-12-23,0.29624,0.5855,0.3032,0 +2010-12-24,0.32563,0.6383,0.33858,0 +2010-12-27,0.35141,0.64494,0.4093,0 +2010-12-28,0.40411,0.71058,0.50174,0 +2010-12-29,0.42716,0.71897,0.5625,0 +2010-12-30,0.48919,0.84079,0.62677,0 +2010-12-31,0.54858,0.94981,0.69592,0 +2011-01-03,0.55128,0.88509,0.76874,0 +2011-01-04,0.5578,0.86964,0.80376,0 +2011-01-05,0.53759,0.81446,0.79832,0 +2011-01-06,0.52554,0.78612,0.79051,0 +2011-01-07,0.57274,0.6955,0.77272,0.25 +2011-01-10,0.7167,0.8813,0.7688,0.5 +2011-01-11,0.66648,0.75596,0.74348,0.5 +2011-01-12,0.65515,0.70684,0.75862,0.5 +2011-01-13,0.68806,0.77909,0.78508,0.5 +2011-01-14,0.71444,0.82779,0.81553,0.5 +2011-01-17,0.69444,0.73515,0.84816,0.5 +2011-01-18,0.68344,0.67801,0.87232,0.5 +2011-01-19,0.6826,0.68781,0.85998,0.5 +2011-01-20,0.68036,0.68311,0.85797,0.5 +2011-01-21,0.66362,0.63356,0.85731,0.5 +2011-01-24,0.66392,0.62973,0.86203,0.5 +2011-01-25,0.67047,0.63132,0.8801,0.5 +2011-01-27,0.67338,0.6392,0.88095,0.5 +2011-01-28,0.68524,0.67375,0.88198,0.5 +2011-01-31,0.66814,0.62944,0.87499,0.5 +2011-02-01,0.6525,0.58556,0.87193,0.5 +2011-02-02,0.63647,0.54941,0.85999,0.5 +2011-02-03,0.60506,0.47483,0.84035,0.5 +2011-02-04,0.61867,0.53131,0.82471,0.5 +2011-02-07,0.57001,0.40739,0.80263,0.5 +2011-02-08,0.52584,0.32176,0.75575,0.5 +2011-02-09,0.50433,0.32536,0.68764,0.5 +2011-02-10,0.48599,0.32367,0.63429,0.5 +2011-02-11,0.45821,0.29319,0.58143,0.5 +2011-02-14,0.53959,0.33181,0.53696,0.75 +2011-02-15,0.47435,0.22384,0.44921,0.75 +2011-02-16,0.46136,0.27148,0.3626,0.75 +2011-02-17,0.44258,0.27006,0.30768,0.75 +2011-02-18,0.43984,0.31225,0.25727,0.75 +2011-02-21,0.31195,0.18894,0.24692,0.5 +2011-02-22,0.25183,0.26111,0.24438,0.25 +2011-02-23,0.27325,0.31832,0.25144,0.25 +2011-02-24,0.32116,0.20894,0.25455,0.5 +2011-02-25,0.30602,0.15752,0.26053,0.5 +2011-02-28,0.32023,0.20112,0.25955,0.5 +2011-03-01,0.4097,0.16079,0.31831,0.75 +2011-03-03,0.40143,0.093932,0.36037,0.75 +2011-03-04,0.4241,0.12639,0.39591,0.75 +2011-03-07,0.42156,0.081047,0.43362,0.75 +2011-03-08,0.40916,0.058078,0.41941,0.75 +2011-03-09,0.40244,0.066763,0.39057,0.75 +2011-03-10,0.39422,0.099071,0.33359,0.75 +2011-03-11,0.39958,0.095018,0.35371,0.75 +2011-03-14,0.39903,0.10942,0.33768,0.75 +2011-03-15,0.39842,0.13396,0.31129,0.75 +2011-03-16,0.39514,0.14871,0.28672,0.75 +2011-03-17,0.3956,0.16765,0.26915,0.75 +2011-03-18,0.38016,0.12011,0.27036,0.75 +2011-03-21,0.40109,0.17413,0.27915,0.75 +2011-03-22,0.41477,0.21003,0.28428,0.75 +2011-03-23,0.41701,0.20786,0.29316,0.75 +2011-03-24,0.4223,0.20494,0.31195,0.75 +2011-03-25,0.4213,0.20158,0.31232,0.75 +2011-03-28,0.3977,0.11765,0.32544,0.75 +2011-03-29,0.34555,0.16483,0.37181,0.5 +2011-03-30,0.35576,0.11554,0.45174,0.5 +2011-03-31,0.37987,0.11595,0.52365,0.5 +2011-04-01,0.40247,0.13841,0.569,0.5 +2011-04-04,0.41106,0.12269,0.61049,0.5 +2011-04-05,0.43117,0.11011,0.6834,0.5 +2011-04-06,0.46519,0.15893,0.73664,0.5 +2011-04-07,0.50297,0.23424,0.77466,0.5 +2011-04-08,0.43537,0.24524,0.81087,0.25 +2011-04-11,0.44229,0.2402,0.83668,0.25 +2011-04-13,0.4596,0.29277,0.83603,0.25 +2011-04-15,0.43814,0.53774,0.77669,0 +2011-04-18,0.40859,0.51928,0.7065,0 +2011-04-19,0.37641,0.50121,0.62801,0 +2011-04-20,0.31532,0.41283,0.53313,0 +2011-04-21,0.30732,0.37897,0.54298,0 +2011-04-25,0.31082,0.38803,0.54442,0 +2011-04-26,0.32477,0.45481,0.51949,0 +2011-04-27,0.32959,0.48494,0.50383,0 +2011-04-28,0.32047,0.45018,0.51123,0 +2011-04-29,0.31764,0.43706,0.51585,0 +2011-05-02,0.33538,0.42943,0.57671,0 +2011-05-03,0.41846,0.41094,0.59446,0.25 +2011-05-04,0.41705,0.38859,0.61256,0.25 +2011-05-05,0.41902,0.37161,0.63544,0.25 +2011-05-06,0.42866,0.40395,0.63203,0.25 +2011-05-09,0.41225,0.3526,0.63415,0.25 +2011-05-10,0.43785,0.42367,0.63989,0.25 +2011-05-11,0.45667,0.48282,0.63719,0.25 +2011-05-12,0.44911,0.46105,0.63629,0.25 +2011-05-13,0.44724,0.47118,0.62054,0.25 +2011-05-16,0.43366,0.47085,0.58014,0.25 +2011-05-17,0.42154,0.4677,0.54691,0.25 +2011-05-18,0.42598,0.49373,0.5342,0.25 +2011-05-19,0.44729,0.56913,0.52274,0.25 +2011-05-20,0.4112,0.51614,0.46745,0.25 +2011-05-23,0.38985,0.49195,0.42759,0.25 +2011-05-24,0.35141,0.41124,0.393,0.25 +2011-05-25,0.34487,0.41628,0.36834,0.25 +2011-05-26,0.33421,0.40914,0.34349,0.25 +2011-05-27,0.31151,0.34104,0.34349,0.25 +2011-05-30,0.28654,0.26623,0.34338,0.25 +2011-06-01,0.27442,0.22473,0.34853,0.25 +2011-06-02,0.29023,0.27715,0.34355,0.25 +2011-06-03,0.28611,0.30332,0.30502,0.25 +2011-06-06,0.26939,0.29713,0.26103,0.25 +2011-06-07,0.24615,0.26689,0.22156,0.25 +2011-06-08,0.24148,0.25794,0.2165,0.25 +2011-06-09,0.25124,0.2866,0.21712,0.25 +2011-06-10,0.28261,0.30353,0.29431,0.25 +2011-06-13,0.31621,0.32091,0.37772,0.25 +2011-06-14,0.3313,0.34514,0.39877,0.25 +2011-06-15,0.27099,0.37179,0.44119,0 +2011-06-16,0.29339,0.39577,0.4844,0 +2011-06-17,0.27519,0.30701,0.51855,0 +2011-06-20,0.38296,0.37285,0.52604,0.25 +2011-06-21,0.34111,0.2532,0.52015,0.25 +2011-06-22,0.34267,0.26831,0.5097,0.25 +2011-06-23,0.34338,0.29223,0.48793,0.25 +2011-06-24,0.44769,0.29674,0.54632,0.5 +2011-06-27,0.47904,0.3514,0.58571,0.5 +2011-06-28,0.48599,0.34287,0.61511,0.5 +2011-06-29,0.48678,0.34683,0.61352,0.5 +2011-06-30,0.47743,0.31924,0.61304,0.5 +2011-07-01,0.4809,0.33261,0.6101,0.5 +2011-07-04,0.47672,0.31964,0.61052,0.5 +2011-07-05,0.51302,0.39172,0.64734,0.5 +2011-07-06,0.53732,0.42383,0.68814,0.5 +2011-07-07,0.51756,0.35702,0.69565,0.5 +2011-07-08,0.52702,0.38534,0.69571,0.5 +2011-07-11,0.53509,0.41244,0.69284,0.5 +2011-07-12,0.56696,0.50843,0.69245,0.5 +2011-07-13,0.5736,0.54108,0.6797,0.5 +2011-07-15,0.56804,0.51761,0.68652,0.5 +2011-07-18,0.57703,0.54113,0.68996,0.5 +2011-07-19,0.57093,0.52327,0.68953,0.5 +2011-07-20,0.56901,0.51691,0.69012,0.5 +2011-07-21,0.56402,0.50081,0.69126,0.5 +2011-07-22,0.55163,0.46214,0.69276,0.5 +2011-07-25,0.53086,0.44821,0.64438,0.5 +2011-07-26,0.4973,0.4049,0.587,0.5 +2011-07-27,0.46492,0.3726,0.52217,0.5 +2011-07-28,0.44587,0.36599,0.47162,0.5 +2011-07-29,0.42126,0.35545,0.40832,0.5 +2011-08-01,0.41514,0.40506,0.34037,0.5 +2011-08-02,0.34273,0.45866,0.31954,0.25 +2011-08-03,0.33161,0.42035,0.32448,0.25 +2011-08-04,0.33696,0.41549,0.34539,0.25 +2011-08-05,0.37014,0.51364,0.34678,0.25 +2011-08-08,0.31556,0.64307,0.30361,0 +2011-08-09,0.30085,0.64202,0.26053,0 +2011-08-10,0.29114,0.63963,0.2338,0 +2011-08-11,0.27824,0.58682,0.24789,0 +2011-08-12,0.27282,0.56119,0.25725,0 +2011-08-16,0.26153,0.5175,0.2671,0 +2011-08-17,0.25334,0.49248,0.26754,0 +2011-08-18,0.1861,0.34356,0.21474,0 +2011-08-19,0.23342,0.54393,0.15633,0 +2011-08-22,0.22236,0.53379,0.13329,0 +2011-08-23,0.22758,0.5381,0.14463,0 +2011-08-24,0.23598,0.55592,0.15202,0 +2011-08-25,0.24072,0.5566,0.16557,0 +2011-08-26,0.24441,0.55579,0.17745,0 +2011-08-29,0.39772,0.62692,0.31624,0.25 +2011-08-30,0.42357,0.6302,0.39052,0.25 +2011-09-02,0.42889,0.60162,0.43504,0.25 +2011-09-05,0.43902,0.6048,0.46225,0.25 +2011-09-06,0.45506,0.64951,0.46566,0.25 +2011-09-07,0.45586,0.6661,0.45148,0.25 +2011-09-08,0.45525,0.6917,0.42403,0.25 +2011-09-09,0.45743,0.69745,0.42483,0.25 +2011-09-12,0.46497,0.72467,0.42025,0.25 +2011-09-13,0.4261,0.61305,0.41524,0.25 +2011-09-14,0.40108,0.54475,0.40849,0.25 +2011-09-15,0.39613,0.53478,0.40361,0.25 +2011-09-16,0.38662,0.53023,0.37963,0.25 +2011-09-19,0.3766,0.54794,0.33187,0.25 +2011-09-20,0.34661,0.52862,0.2612,0.25 +2011-09-21,0.30439,0.42249,0.24068,0.25 +2011-09-22,0.33587,0.25204,0.25556,0.5 +2011-09-23,0.33379,0.26234,0.23904,0.5 +2011-09-26,0.34158,0.28259,0.24215,0.5 +2011-09-27,0.34255,0.24242,0.28524,0.5 +2011-09-28,0.33669,0.19577,0.3143,0.5 +2011-09-29,0.32963,0.16616,0.32273,0.5 +2011-09-30,0.3382,0.1956,0.31901,0.5 +2011-10-03,0.32317,0.16858,0.30094,0.5 +2011-10-04,0.32413,0.18191,0.29047,0.5 +2011-10-05,0.3123,0.1708,0.26611,0.5 +2011-10-07,0.29229,0.12268,0.2542,0.5 +2011-10-10,0.29917,0.15481,0.24271,0.5 +2011-10-11,0.2924,0.14773,0.22946,0.5 +2011-10-12,0.24994,0.03257,0.21725,0.5 +2011-10-13,0.15429,0,0.21286,0.25 +2011-10-14,0.16527,0.020245,0.22555,0.25 +2011-10-17,0.16727,0.012781,0.23903,0.25 +2011-10-18,0.16554,0,0.24663,0.25 +2011-10-19,0.17018,0.0066641,0.25388,0.25 +2011-10-20,0.16916,0,0.25747,0.25 +2011-10-21,0.17595,0.021494,0.25636,0.25 +2011-10-24,0.1671,0.006074,0.24522,0.25 +2011-10-25,0.17393,0.028263,0.24353,0.25 +2011-10-28,0.18676,0.08206,0.22823,0.25 +2011-10-31,0.17622,0.056076,0.22259,0.25 +2011-11-01,0.17084,0.045064,0.21746,0.25 +2011-11-02,0.16485,0.035343,0.2092,0.25 +2011-11-03,0.19409,0.12816,0.20411,0.25 +2011-11-04,0.22031,0.20676,0.20419,0.25 +2011-11-08,0.26122,0.36013,0.17354,0.25 +2011-11-09,0.2055,0.3494,0.26711,0 +2011-11-11,0.23023,0.3463,0.3444,0 +2011-11-14,0.27559,0.39226,0.43451,0 +2011-11-15,0.29806,0.42627,0.46792,0 +2011-11-16,0.30876,0.42539,0.50088,0 +2011-11-17,0.31445,0.40594,0.5374,0 +2011-11-18,0.31813,0.3724,0.582,0 +2011-11-21,0.31206,0.31604,0.62013,0 +2011-11-22,0.3106,0.30544,0.62635,0 +2011-11-23,0.32108,0.33514,0.62808,0 +2011-11-25,0.27734,0.20973,0.6223,0 +2011-11-28,0.34941,0.17037,0.62787,0.25 +2011-11-29,0.36831,0.22207,0.63286,0.25 +2011-11-30,0.38146,0.26436,0.63002,0.25 +2011-12-01,0.37319,0.23713,0.63244,0.25 +2011-12-02,0.3966,0.29007,0.64972,0.25 +2011-12-05,0.38664,0.26099,0.64894,0.25 +2011-12-07,0.39338,0.28127,0.64887,0.25 +2011-12-08,0.38615,0.25653,0.6519,0.25 +2011-12-09,0.39519,0.27783,0.65775,0.25 +2011-12-12,0.40277,0.28979,0.66851,0.25 +2011-12-13,0.39943,0.28054,0.66775,0.25 +2011-12-14,0.38095,0.21938,0.67348,0.25 +2011-12-15,0.39604,0.26525,0.67286,0.25 +2011-12-16,0.39077,0.24078,0.68154,0.25 +2011-12-19,0.3926,0.23319,0.69462,0.25 +2011-12-20,0.37044,0.15241,0.70892,0.25 +2011-12-21,0.45418,0.14615,0.7164,0.5 +2011-12-22,0.42785,0.059572,0.72396,0.5 +2011-12-23,0.43478,0.074153,0.7302,0.5 +2011-12-27,0.43055,0.10581,0.68583,0.5 +2011-12-28,0.41174,0.097848,0.63737,0.5 +2011-12-29,0.39165,0.10325,0.57171,0.5 +2011-12-30,0.37821,0.11444,0.5202,0.5 +2012-01-03,0.34795,0.085904,0.45795,0.5 +2012-01-04,0.31455,0.054653,0.38901,0.5 +2012-01-05,0.3136,0.15502,0.28577,0.5 +2012-01-06,0.3247,0.25101,0.2231,0.5 +2012-01-09,0.34132,0.3215,0.20246,0.5 +2012-01-10,0.33697,0.32766,0.18324,0.5 +2012-01-11,0.34706,0.36446,0.17671,0.5 +2012-01-12,0.28553,0.39694,0.20964,0.25 +2012-01-13,0.29888,0.40216,0.24446,0.25 +2012-01-16,0.32247,0.44615,0.27126,0.25 +2012-01-17,0.29588,0.35118,0.28645,0.25 +2012-01-18,0.3006,0.36446,0.28734,0.25 +2012-01-19,0.30403,0.33274,0.32936,0.25 +2012-01-20,0.32729,0.3626,0.36928,0.25 +2012-01-23,0.33617,0.34305,0.41545,0.25 +2012-01-24,0.32191,0.27688,0.43884,0.25 +2012-01-25,0.32121,0.27339,0.44024,0.25 +2012-01-27,0.33445,0.27288,0.48046,0.25 +2012-01-30,0.33325,0.27004,0.4797,0.25 +2012-01-31,0.37012,0.38085,0.47952,0.25 +2012-02-01,0.36609,0.37271,0.47557,0.25 +2012-02-02,0.36503,0.38236,0.46272,0.25 +2012-02-03,0.33472,0.30595,0.4482,0.25 +2012-02-06,0.23952,0.28935,0.42921,0 +2012-02-07,0.23365,0.29408,0.40687,0 +2012-02-08,0.23861,0.29743,0.41839,0 +2012-02-09,0.25583,0.29953,0.46795,0 +2012-02-10,0.26611,0.29963,0.4987,0 +2012-02-13,0.28036,0.32436,0.51672,0 +2012-02-14,0.31257,0.38329,0.55442,0 +2012-02-15,0.40789,0.42369,0.54996,0.25 +2012-02-16,0.37519,0.32839,0.54718,0.25 +2012-02-17,0.35659,0.27862,0.54115,0.25 +2012-02-21,0.33902,0.23286,0.5342,0.25 +2012-02-22,0.35349,0.28661,0.52385,0.25 +2012-02-23,0.3584,0.31613,0.50907,0.25 +2012-02-24,0.35025,0.29435,0.50641,0.25 +2012-02-27,0.44585,0.32483,0.51273,0.5 +2012-02-28,0.49382,0.431,0.55046,0.5 +2012-02-29,0.50352,0.43966,0.5709,0.5 +2012-03-01,0.52632,0.4957,0.58325,0.5 +2012-03-02,0.53572,0.51737,0.58981,0.5 +2012-03-05,0.52941,0.50137,0.58686,0.5 +2012-03-06,0.52062,0.48136,0.58049,0.5 +2012-03-07,0.52384,0.51778,0.55375,0.5 +2012-03-09,0.49528,0.4519,0.53395,0.5 +2012-03-12,0.47242,0.40806,0.50919,0.5 +2012-03-13,0.45534,0.40433,0.4617,0.5 +2012-03-14,0.40795,0.2622,0.46166,0.5 +2012-03-15,0.40642,0.26179,0.45747,0.5 +2012-03-16,0.40759,0.26969,0.4531,0.5 +2012-03-19,0.40957,0.27553,0.45317,0.5 +2012-03-20,0.40795,0.27036,0.4535,0.5 +2012-03-21,0.39336,0.2283,0.45178,0.5 +2012-03-22,0.42378,0.3152,0.45615,0.5 +2012-03-23,0.41476,0.3069,0.43738,0.5 +2012-03-26,0.38594,0.29422,0.36361,0.5 +2012-03-27,0.35925,0.25734,0.32042,0.5 +2012-03-28,0.32278,0.20271,0.26562,0.5 +2012-03-29,0.31277,0.25812,0.1802,0.5 +2012-03-30,0.22594,0.26117,0.16665,0.25 +2012-04-02,0.18375,0.1814,0.11986,0.25 +2012-04-03,0.17098,0.19455,0.0684,0.25 +2012-04-04,0.16682,0.2241,0.026355,0.25 +2012-04-09,0.16962,0.23897,0.019873,0.25 +2012-04-10,0.15626,0.19869,0.020085,0.25 +2012-04-11,0.17807,0.25937,0.024851,0.25 +2012-04-12,0.07057,0.14048,0.071232,0 +2012-04-13,0.089572,0.17811,0.090602,0 +2012-04-16,0.087685,0.14387,0.11918,0 +2012-04-17,0.084266,0.12263,0.13017,0 +2012-04-18,0.10459,0.13834,0.17543,0 +2012-04-19,0.12768,0.17213,0.21092,0 +2012-04-20,0.13731,0.17932,0.23261,0 +2012-04-23,0.16017,0.24663,0.23387,0 +2012-04-24,0.16905,0.25737,0.24979,0 +2012-04-25,0.19146,0.30899,0.26539,0 +2012-04-26,0.22187,0.36276,0.30286,0 +2012-04-27,0.26083,0.44278,0.3397,0 +2012-04-30,0.25827,0.41461,0.3602,0 +2012-05-02,0.2603,0.39793,0.38296,0 +2012-05-03,0.27818,0.40514,0.42939,0 +2012-05-04,0.29634,0.44983,0.43919,0 +2012-05-07,0.24518,0.29012,0.44541,0 +2012-05-08,0.30337,0.22473,0.43538,0.25 +2012-05-09,0.28468,0.18435,0.41971,0.25 +2012-05-10,0.27549,0.17439,0.40208,0.25 +2012-05-11,0.2653,0.1783,0.3676,0.25 +2012-05-14,0.25337,0.18462,0.3255,0.25 +2012-05-15,0.25201,0.23119,0.27485,0.25 +2012-05-16,0.22793,0.26607,0.16772,0.25 +2012-05-17,0.20959,0.22153,0.15723,0.25 +2012-05-18,0.20945,0.24449,0.13387,0.25 +2012-05-22,0.21346,0.25176,0.13863,0.25 +2012-05-23,0.22274,0.30142,0.11681,0.25 +2012-05-24,0.20137,0.25271,0.10139,0.25 +2012-05-25,0.1759,0.19713,0.080569,0.25 +2012-05-28,0.16151,0.15284,0.081704,0.25 +2012-05-29,0.15845,0.14245,0.082908,0.25 +2012-05-30,0.16393,0.15877,0.083026,0.25 +2012-05-31,0.16767,0.17659,0.076438,0.25 +2012-06-01,0.16564,0.15587,0.091065,0.25 +2012-06-04,0.15116,0.11758,0.085905,0.25 +2012-06-05,0.15764,0.13811,0.084801,0.25 +2012-06-06,0.25467,0.12833,0.13566,0.5 +2012-06-07,0.29537,0.19426,0.19185,0.5 +2012-06-08,0.29691,0.167,0.22372,0.5 +2012-06-11,0.29291,0.14686,0.23186,0.5 +2012-06-12,0.2863,0.14437,0.21452,0.5 +2012-06-13,0.28251,0.13876,0.20877,0.5 +2012-06-14,0.27769,0.12322,0.20986,0.5 +2012-06-15,0.26668,0.13549,0.16456,0.5 +2012-06-18,0.28604,0.19643,0.16171,0.5 +2012-06-19,0.29176,0.21194,0.16333,0.5 +2012-06-20,0.21459,0.2352,0.15857,0.25 +2012-06-21,0.20575,0.21357,0.15367,0.25 +2012-06-22,0.20298,0.20509,0.15386,0.25 +2012-06-25,0.20419,0.21177,0.1508,0.25 +2012-06-26,0.2138,0.22456,0.16684,0.25 +2012-06-27,0.24676,0.25381,0.23647,0.25 +2012-06-28,0.29233,0.31316,0.31384,0.25 +2012-06-29,0.34046,0.22789,0.2935,0.5 +2012-07-02,0.31034,0.1516,0.27941,0.5 +2012-07-03,0.32007,0.19229,0.26791,0.5 +2012-07-04,0.33066,0.23034,0.26164,0.5 +2012-07-05,0.35248,0.28436,0.27308,0.5 +2012-07-06,0.36809,0.32442,0.27985,0.5 +2012-07-09,0.37346,0.34806,0.27232,0.5 +2012-07-10,0.38637,0.3518,0.3073,0.5 +2012-07-11,0.39446,0.3519,0.33149,0.5 +2012-07-12,0.40013,0.36462,0.33577,0.5 +2012-07-13,0.40656,0.38043,0.33924,0.5 +2012-07-16,0.40432,0.36675,0.34622,0.5 +2012-07-17,0.43317,0.44584,0.35366,0.5 +2012-07-18,0.32221,0.37868,0.33796,0.25 +2012-07-19,0.32492,0.39371,0.33104,0.25 +2012-07-20,0.31882,0.37979,0.32666,0.25 +2012-07-23,0.32105,0.4091,0.30405,0.25 +2012-07-24,0.31784,0.39122,0.31229,0.25 +2012-07-25,0.33876,0.44563,0.32065,0.25 +2012-07-26,0.29764,0.35339,0.28954,0.25 +2012-07-27,0.2761,0.28909,0.2892,0.25 +2012-07-30,0.3889,0.35444,0.31226,0.5 +2012-07-31,0.39266,0.34992,0.32807,0.5 +2012-08-01,0.39168,0.36276,0.31226,0.5 +2012-08-02,0.39731,0.38868,0.30324,0.5 +2012-08-03,0.39881,0.40584,0.29058,0.5 +2012-08-06,0.3891,0.37897,0.28834,0.5 +2012-08-07,0.39064,0.38261,0.2893,0.5 +2012-08-08,0.37509,0.34629,0.27898,0.5 +2012-08-09,0.40665,0.4744,0.24557,0.5 +2012-08-10,0.392,0.66175,0.26426,0.25 +2012-08-13,0.39031,0.63549,0.28545,0.25 +2012-08-14,0.39381,0.61625,0.31517,0.25 +2012-08-16,0.40648,0.6092,0.36023,0.25 +2012-08-17,0.43729,0.62194,0.43994,0.25 +2012-08-21,0.44224,0.59879,0.47794,0.25 +2012-08-22,0.44066,0.56262,0.50936,0.25 +2012-08-23,0.45806,0.58642,0.53776,0.25 +2012-08-24,0.46306,0.57835,0.56083,0.25 +2012-08-27,0.48774,0.6315,0.58173,0.25 +2012-08-29,0.49124,0.63776,0.58596,0.25 +2012-08-30,0.48855,0.62787,0.58779,0.25 +2012-08-31,0.4867,0.60977,0.60032,0.25 +2012-09-03,0.47643,0.56838,0.6109,0.25 +2012-09-04,0.48177,0.58492,0.61039,0.25 +2012-09-05,0.47484,0.56701,0.60752,0.25 +2012-09-06,0.49486,0.62603,0.60854,0.25 +2012-09-07,0.54913,0.52747,0.61991,0.5 +2012-09-10,0.54412,0.5036,0.62875,0.5 +2012-09-11,0.52954,0.45998,0.62864,0.5 +2012-09-12,0.48774,0.34347,0.61976,0.5 +2012-09-13,0.36821,0.30812,0.54651,0.25 +2012-09-14,0.3949,0.217,0.4677,0.5 +2012-09-17,0.39854,0.246,0.44964,0.5 +2012-09-18,0.38437,0.23113,0.42199,0.5 +2012-09-20,0.39022,0.24527,0.42539,0.5 +2012-09-21,0.51758,0.28058,0.52217,0.75 +2012-09-24,0.54942,0.27938,0.61889,0.75 +2012-09-25,0.56636,0.27189,0.67718,0.75 +2012-09-26,0.56689,0.27626,0.67441,0.75 +2012-09-27,0.56845,0.28558,0.66977,0.75 +2012-09-28,0.56283,0.27638,0.66212,0.75 +2012-10-01,0.55153,0.26605,0.63854,0.75 +2012-10-03,0.55432,0.26262,0.65033,0.75 +2012-10-04,0.54591,0.26713,0.62059,0.75 +2012-10-05,0.54404,0.28131,0.6008,0.75 +2012-10-08,0.51901,0.24868,0.55835,0.75 +2012-10-09,0.49574,0.22515,0.51207,0.75 +2012-10-10,0.48267,0.22082,0.47719,0.75 +2012-10-11,0.4726,0.22622,0.44159,0.75 +2012-10-12,0.46858,0.22955,0.42619,0.75 +2012-10-15,0.4717,0.24533,0.41976,0.75 +2012-10-16,0.46955,0.26381,0.39483,0.75 +2012-10-17,0.45856,0.24384,0.38184,0.75 +2012-10-18,0.45179,0.23767,0.36769,0.75 +2012-10-19,0.45168,0.24157,0.36347,0.75 +2012-10-22,0.4692,0.28479,0.37282,0.75 +2012-10-23,0.40292,0.31328,0.39546,0.5 +2012-10-25,0.4118,0.3193,0.41611,0.5 +2012-10-29,0.41874,0.32092,0.43529,0.5 +2012-10-30,0.42157,0.32642,0.4383,0.5 +2012-10-31,0.46172,0.42975,0.4554,0.5 +2012-11-01,0.39014,0.45121,0.46922,0.25 +2012-11-02,0.38797,0.438,0.4759,0.25 +2012-11-05,0.38694,0.42687,0.48396,0.25 +2012-11-06,0.36948,0.37463,0.48381,0.25 +2012-11-07,0.29915,0.44954,0.44792,0 +2012-11-08,0.2801,0.41379,0.42651,0 +2012-11-09,0.21509,0.31602,0.32925,0 +2012-11-12,0.17104,0.2055,0.30763,0 +2012-11-15,0.15717,0.19205,0.27947,0 +2012-11-16,0.1658,0.27735,0.22004,0 +2012-11-19,0.11712,0.16335,0.188,0 +2012-11-20,0.17093,0.33119,0.18159,0 +2012-11-21,0.14731,0.28973,0.1522,0 +2012-11-22,0.12989,0.23856,0.15111,0 +2012-11-23,0.15022,0.30155,0.1491,0 +2012-11-26,0.17638,0.36868,0.16046,0 +2012-11-27,0.2104,0.22483,0.15637,0.25 +2012-11-29,0.38432,0.5309,0.12207,0.5 +2012-11-30,0.3899,0.59587,0.073816,0.5 +2012-12-03,0.37937,0.57347,0.064643,0.5 +2012-12-04,0.38478,0.6001,0.054244,0.5 +2012-12-05,0.40255,0.65039,0.057251,0.5 +2012-12-06,0.3988,0.64979,0.046612,0.5 +2012-12-07,0.39807,0.6502,0.04401,0.5 +2012-12-10,0.41638,0.65976,0.089372,0.5 +2012-12-11,0.45482,0.68204,0.18242,0.5 +2012-12-12,0.4897,0.70898,0.26013,0.5 +2012-12-13,0.49864,0.68799,0.30792,0.5 +2012-12-14,0.51175,0.71083,0.32441,0.5 +2012-12-17,0.52744,0.71026,0.37205,0.5 +2012-12-18,0.5338,0.71313,0.38827,0.5 +2012-12-19,0.54688,0.75442,0.38623,0.5 +2012-12-20,0.54244,0.74304,0.38428,0.5 +2012-12-21,0.52608,0.70053,0.37773,0.5 +2012-12-24,0.50791,0.64837,0.37535,0.5 +2012-12-26,0.49647,0.63473,0.3547,0.5 +2012-12-27,0.51439,0.67965,0.36352,0.5 +2012-12-28,0.53218,0.72527,0.37128,0.5 +2012-12-31,0.51739,0.67825,0.37393,0.5 +2013-01-02,0.59841,0.63147,0.41375,0.75 +2013-01-03,0.56757,0.53896,0.41376,0.75 +2013-01-04,0.57581,0.58084,0.39659,0.75 +2013-01-07,0.58163,0.59659,0.39829,0.75 +2013-01-08,0.57532,0.57714,0.39882,0.75 +2013-01-09,0.56578,0.54858,0.39876,0.75 +2013-01-10,0.59458,0.64253,0.39121,0.75 +2013-01-11,0.43849,0.36708,0.44839,0.5 +2013-01-14,0.35894,0.1313,0.44551,0.5 +2013-01-15,0.38366,0.20638,0.44459,0.5 +2013-01-16,0.38123,0.20645,0.43724,0.5 +2013-01-17,0.38222,0.21308,0.43357,0.5 +2013-01-18,0.37982,0.2099,0.42955,0.5 +2013-01-21,0.38118,0.2158,0.42774,0.5 +2013-01-22,0.3745,0.1934,0.4301,0.5 +2013-01-23,0.34785,0.13331,0.41023,0.5 +2013-01-24,0.31362,0.090027,0.35083,0.5 +2013-01-25,0.29989,0.10999,0.28969,0.5 +2013-01-28,0.27445,0.072464,0.2509,0.5 +2013-01-29,0.27443,0.097829,0.22547,0.5 +2013-01-30,0.26519,0.12058,0.17498,0.5 +2013-01-31,0.26805,0.13935,0.16481,0.5 +2013-02-01,0.26601,0.13833,0.1597,0.5 +2013-02-04,0.27509,0.16255,0.16272,0.5 +2013-02-05,0.32511,0.20791,0.26741,0.5 +2013-02-06,0.36487,0.23933,0.35527,0.5 +2013-02-07,0.38916,0.23461,0.43289,0.5 +2013-02-08,0.41021,0.21856,0.51206,0.5 +2013-02-11,0.43347,0.22513,0.57527,0.5 +2013-02-12,0.4782,0.32755,0.60703,0.5 +2013-02-13,0.39861,0.36471,0.58112,0.25 +2013-02-14,0.39059,0.32607,0.59571,0.25 +2013-02-15,0.38985,0.31044,0.60911,0.25 +2013-02-18,0.401,0.34183,0.61118,0.25 +2013-02-19,0.39701,0.32306,0.61797,0.25 +2013-02-20,0.38759,0.29499,0.61778,0.25 +2013-02-21,0.43172,0.16534,0.62981,0.5 +2013-02-22,0.40442,0.098443,0.61482,0.5 +2013-02-25,0.32176,0.089641,0.62564,0.25 +2013-02-26,0.40232,0.018589,0.68837,0.5 +2013-02-27,0.4547,0.1117,0.75239,0.5 +2013-02-28,0.59713,0.2191,0.82229,0.75 +2013-03-01,0.63558,0.25331,0.90341,0.75 +2013-03-04,0.6498,0.25549,0.94391,0.75 +2013-03-05,0.75222,0.25666,1,1 +2013-03-06,0.761,0.28299,1,1 +2013-03-07,0.76033,0.281,1,1 +2013-03-08,0.78241,0.34722,1,1 +2013-03-11,0.75659,0.28156,0.98822,1 +2013-03-12,0.75093,0.2781,0.9747,1 +2013-03-13,0.7405,0.25792,0.96357,1 +2013-03-14,0.74398,0.2883,0.94364,1 +2013-03-15,0.73909,0.28862,0.92864,1 +2013-03-18,0.72933,0.28045,0.90754,1 +2013-03-19,0.70682,0.2785,0.84196,1 +2013-03-20,0.68599,0.28137,0.7766,1 +2013-03-21,0.66093,0.27451,0.70828,1 +2013-03-22,0.63375,0.2712,0.63007,1 +2013-03-25,0.62189,0.27817,0.58748,1 +2013-03-26,0.6133,0.28849,0.55142,1 +2013-03-28,0.59439,0.28102,0.50216,1 +2013-04-01,0.58102,0.2718,0.47126,1 +2013-04-02,0.55661,0.22586,0.44398,1 +2013-04-03,0.54157,0.22894,0.39578,1 +2013-04-04,0.55322,0.31062,0.34905,1 +2013-04-05,0.54232,0.3313,0.29566,1 +2013-04-08,0.49019,0.43111,0.28946,0.75 +2013-04-09,0.4603,0.35124,0.27965,0.75 +2013-04-10,0.48593,0.43564,0.27215,0.75 +2013-04-11,0.40755,0.44754,0.27512,0.5 +2013-04-12,0.41413,0.46552,0.27688,0.5 +2013-04-15,0.34831,0.51901,0.27593,0.25 +2013-04-16,0.42287,0.48255,0.28605,0.5 +2013-04-17,0.38891,0.36881,0.29793,0.5 +2013-04-18,0.27927,0.30078,0.28705,0.25 +2013-04-22,0.27787,0.31389,0.26972,0.25 +2013-04-23,0.27876,0.31237,0.27392,0.25 +2013-04-25,0.27652,0.31514,0.26442,0.25 +2013-04-26,0.26025,0.27584,0.25491,0.25 +2013-04-29,0.26367,0.28791,0.25309,0.25 +2013-04-30,0.26681,0.29448,0.25595,0.25 +2013-05-02,0.26651,0.28405,0.26549,0.25 +2013-05-03,0.26743,0.28651,0.26579,0.25 +2013-05-06,0.2698,0.29324,0.26615,0.25 +2013-05-07,0.25775,0.25926,0.26399,0.25 +2013-05-08,0.25535,0.24495,0.27109,0.25 +2013-05-09,0.25834,0.25232,0.27269,0.25 +2013-05-10,0.24344,0.20755,0.27279,0.25 +2013-05-13,0.21116,0.16091,0.22258,0.25 +2013-05-14,0.17379,0.086981,0.18438,0.25 +2013-05-15,0.24615,0.022519,0.21592,0.5 +2013-05-16,0.23425,0,0.20275,0.5 +2013-05-17,0.23871,0.044688,0.17143,0.5 +2013-05-20,0.23046,0.019129,0.17226,0.5 +2013-05-21,0.24633,0.045227,0.19377,0.5 +2013-05-22,0.23663,0.016576,0.19331,0.5 +2013-05-23,0.23919,0,0.21756,0.5 +2013-05-24,0.23982,0,0.21947,0.5 +2013-05-27,0.2403,0,0.22089,0.5 +2013-05-28,0.24081,0,0.22242,0.5 +2013-05-29,0.25343,0.037294,0.22299,0.5 +2013-05-30,0.25848,0.060489,0.21496,0.5 +2013-05-31,0.27503,0.088163,0.23694,0.5 +2013-06-03,0.29429,0.14375,0.23911,0.5 +2013-06-04,0.29274,0.13677,0.24143,0.5 +2013-06-05,0.30546,0.17,0.24639,0.5 +2013-06-06,0.33372,0.2461,0.25505,0.5 +2013-06-07,0.33394,0.25315,0.24868,0.5 +2013-06-10,0.34114,0.26136,0.26205,0.5 +2013-06-11,0.34202,0.22668,0.29939,0.5 +2013-06-12,0.35314,0.22456,0.33486,0.5 +2013-06-13,0.35545,0.21427,0.35209,0.5 +2013-06-14,0.36547,0.25141,0.34501,0.5 +2013-06-17,0.36643,0.26134,0.33794,0.5 +2013-06-18,0.36603,0.2702,0.32787,0.5 +2013-06-19,0.35586,0.2664,0.30119,0.5 +2013-06-20,0.42204,0.2143,0.30182,0.75 +2013-06-21,0.40987,0.18025,0.29936,0.75 +2013-06-24,0.4186,0.1882,0.3176,0.75 +2013-06-25,0.42272,0.20495,0.3132,0.75 +2013-06-26,0.34869,0.2362,0.30988,0.5 +2013-06-27,0.34112,0.20579,0.31756,0.5 +2013-06-28,0.47907,0.31309,0.37412,0.75 +2013-07-01,0.48522,0.33051,0.37515,0.75 +2013-07-02,0.48373,0.32211,0.37908,0.75 +2013-07-03,0.49248,0.346,0.38143,0.75 +2013-07-04,0.50775,0.38774,0.38552,0.75 +2013-07-05,0.5092,0.40666,0.37095,0.75 +2013-07-08,0.51527,0.42205,0.37377,0.75 +2013-07-09,0.50894,0.39933,0.3775,0.75 +2013-07-10,0.50079,0.36845,0.38392,0.75 +2013-07-11,0.51058,0.40025,0.38148,0.75 +2013-07-12,0.438,0.4309,0.38311,0.5 +2013-07-15,0.43413,0.41402,0.38836,0.5 +2013-07-16,0.41806,0.36601,0.38816,0.5 +2013-07-17,0.38975,0.29128,0.37797,0.5 +2013-07-18,0.37511,0.26345,0.3619,0.5 +2013-07-19,0.36121,0.23592,0.34771,0.5 +2013-07-22,0.39177,0.32926,0.34604,0.5 +2013-07-23,0.39359,0.36218,0.31858,0.5 +2013-07-24,0.37421,0.35803,0.26462,0.5 +2013-07-25,0.35866,0.36356,0.21242,0.5 +2013-07-26,0.36099,0.36129,0.2217,0.5 +2013-07-29,0.3695,0.35788,0.25062,0.5 +2013-07-30,0.3689,0.33314,0.27355,0.5 +2013-07-31,0.40557,0.41748,0.29924,0.5 +2013-08-01,0.39299,0.57677,0.35219,0.25 +2013-08-02,0.423,0.6102,0.40879,0.25 +2013-08-05,0.44672,0.63645,0.45373,0.25 +2013-08-06,0.48565,0.49394,0.46301,0.5 +2013-08-07,0.47702,0.45948,0.47159,0.5 +2013-08-08,0.43468,0.34133,0.4627,0.5 +2013-08-12,0.31158,0.29737,0.38738,0.25 +2013-08-13,0.31296,0.3008,0.38807,0.25 +2013-08-14,0.31111,0.30352,0.3798,0.25 +2013-08-16,0.4395,0.32073,0.49777,0.5 +2013-08-19,0.51912,0.49147,0.5659,0.5 +2013-08-20,0.53033,0.46523,0.62576,0.5 +2013-08-21,0.53701,0.43649,0.67455,0.5 +2013-08-22,0.569,0.47026,0.73675,0.5 +2013-08-23,0.58701,0.48856,0.77246,0.5 +2013-08-26,0.59225,0.47469,0.80205,0.5 +2013-08-27,0.6496,0.39283,0.80598,0.75 +2013-08-28,0.62432,0.32099,0.80196,0.75 +2013-08-29,0.61878,0.28888,0.81746,0.75 +2013-08-30,0.61886,0.29083,0.81576,0.75 +2013-09-02,0.61522,0.28555,0.8101,0.75 +2013-09-03,0.70294,0.28292,0.82591,1 +2013-09-04,0.7185,0.32796,0.82754,1 +2013-09-05,0.71598,0.35531,0.79263,1 +2013-09-06,0.71113,0.36358,0.7698,1 +2013-09-10,0.7108,0.37914,0.75327,1 +2013-09-11,0.67844,0.3032,0.73213,1 +2013-09-12,0.67179,0.31665,0.69871,1 +2013-09-13,0.66086,0.32835,0.65422,1 +2013-09-16,0.6478,0.33906,0.60435,1 +2013-09-17,0.6313,0.36424,0.52968,1 +2013-09-18,0.6029,0.36485,0.44385,1 +2013-09-19,0.57469,0.36962,0.35444,1 +2013-09-20,0.48509,0.4064,0.29888,0.75 +2013-09-23,0.45818,0.38821,0.23634,0.75 +2013-09-24,0.43205,0.36161,0.18455,0.75 +2013-09-25,0.43228,0.40653,0.1403,0.75 +2013-09-26,0.43547,0.4439,0.11253,0.75 +2013-09-27,0.44511,0.50491,0.080424,0.75 +2013-09-30,0.3824,0.48143,0.16577,0.5 +2013-10-01,0.40323,0.48542,0.22428,0.5 +2013-10-03,0.41399,0.48527,0.25671,0.5 +2013-10-04,0.41359,0.45405,0.28671,0.5 +2013-10-07,0.43694,0.49839,0.31243,0.5 +2013-10-08,0.45265,0.52155,0.33642,0.5 +2013-10-09,0.48281,0.58873,0.35971,0.5 +2013-10-10,0.4439,0.66327,0.41842,0.25 +2013-10-11,0.4738,0.70101,0.4704,0.25 +2013-10-14,0.50017,0.70331,0.5472,0.25 +2013-10-15,0.52749,0.71873,0.61375,0.25 +2013-10-17,0.54852,0.73087,0.66468,0.25 +2013-10-18,0.44262,0.65923,0.66864,0 +2013-10-21,0.41311,0.58351,0.65581,0 +2013-10-22,0.41228,0.57737,0.65947,0 +2013-10-23,0.40091,0.54192,0.66081,0 +2013-10-24,0.42194,0.62952,0.63629,0 +2013-10-25,0.41376,0.64739,0.59388,0 +2013-10-28,0.38895,0.66009,0.50675,0 +2013-10-29,0.38436,0.63212,0.52097,0 +2013-10-30,0.37308,0.59156,0.52769,0 +2013-10-31,0.37675,0.5931,0.53715,0 +2013-11-01,0.39162,0.62552,0.54934,0 +2013-11-05,0.34271,0.47283,0.55529,0 +2013-11-06,0.30488,0.37221,0.54242,0 +2013-11-07,0.31309,0.43394,0.50533,0 +2013-11-08,0.29829,0.41107,0.48381,0 +2013-11-11,0.27841,0.392,0.44322,0 +2013-11-12,0.27234,0.40243,0.41459,0 +2013-11-13,0.25915,0.38489,0.39254,0 +2013-11-14,0.25657,0.36604,0.40366,0 +2013-11-18,0.35798,0.40954,0.4144,0.25 +2013-11-19,0.36634,0.43704,0.41197,0.25 +2013-11-20,0.34355,0.36361,0.41704,0.25 +2013-11-21,0.36808,0.4072,0.44704,0.25 +2013-11-22,0.35734,0.35458,0.46743,0.25 +2013-11-25,0.36011,0.31752,0.51281,0.25 +2013-11-26,0.3835,0.35025,0.55027,0.25 +2013-11-27,0.38751,0.36279,0.54973,0.25 +2013-11-28,0.37655,0.36056,0.51909,0.25 +2013-11-29,0.36432,0.34724,0.49573,0.25 +2013-12-02,0.35802,0.34315,0.48091,0.25 +2013-12-03,0.38059,0.40866,0.48312,0.25 +2013-12-04,0.37338,0.37506,0.49509,0.25 +2013-12-05,0.36492,0.33449,0.51028,0.25 +2013-12-06,0.35372,0.28469,0.52645,0.25 +2013-12-09,0.33261,0.21501,0.53282,0.25 +2013-12-10,0.32377,0.1834,0.53792,0.25 +2013-12-11,0.33242,0.20579,0.54147,0.25 +2013-12-12,0.33365,0.21575,0.53522,0.25 +2013-12-13,0.33288,0.21967,0.52897,0.25 +2013-12-16,0.32403,0.19474,0.52735,0.25 +2013-12-17,0.33735,0.23729,0.52476,0.25 +2013-12-18,0.33485,0.21948,0.53508,0.25 +2013-12-19,0.33347,0.20577,0.54465,0.25 +2013-12-20,0.33144,0.20203,0.5423,0.25 +2013-12-23,0.30935,0.16437,0.51367,0.25 +2013-12-24,0.31751,0.21563,0.4869,0.25 +2013-12-26,0.31184,0.26381,0.42171,0.25 +2013-12-27,0.28474,0.29181,0.3124,0.25 +2013-12-30,0.26871,0.25426,0.30187,0.25 +2013-12-31,0.21989,0.33028,0.32939,0 +2014-01-02,0.2316,0.32832,0.36649,0 +2014-01-03,0.20272,0.20972,0.39843,0 +2014-01-06,0.23762,0.30462,0.40823,0 +2014-01-07,0.27203,0.3979,0.41819,0 +2014-01-08,0.24999,0.35075,0.39922,0 +2014-01-09,0.25406,0.40835,0.35383,0 +2014-01-10,0.27028,0.44791,0.36293,0 +2014-01-13,0.23578,0.37969,0.32766,0 +2014-01-14,0.20922,0.36178,0.26587,0 +2014-01-15,0.20595,0.35613,0.26172,0 +2014-01-16,0.19087,0.31633,0.25627,0 +2014-01-17,0.18405,0.29431,0.25784,0 +2014-01-20,0.19168,0.31694,0.25811,0 +2014-01-21,0.20118,0.34704,0.2565,0 +2014-01-22,0.20818,0.3633,0.26123,0 +2014-01-23,0.21498,0.37483,0.27011,0 +2014-01-24,0.20736,0.3482,0.27387,0 +2014-01-27,0.32514,0.45431,0.27112,0.25 +2014-01-28,0.30478,0.40848,0.25587,0.25 +2014-01-29,0.30729,0.41895,0.25293,0.25 +2014-01-30,0.3112,0.43321,0.25038,0.25 +2014-01-31,0.30313,0.40884,0.25054,0.25 +2014-02-03,0.2817,0.34431,0.25078,0.25 +2014-02-04,0.2681,0.33793,0.21638,0.25 +2014-02-05,0.26456,0.33753,0.20616,0.25 +2014-02-06,0.26243,0.3309,0.2064,0.25 +2014-02-07,0.2627,0.3346,0.2035,0.25 +2014-02-10,0.26556,0.34048,0.20619,0.25 +2014-02-11,0.27106,0.35155,0.21163,0.25 +2014-02-12,0.31876,0.38559,0.32067,0.25 +2014-02-13,0.32351,0.4023,0.31825,0.25 +2014-02-14,0.32561,0.41655,0.31029,0.25 +2014-02-18,0.3283,0.43321,0.3017,0.25 +2014-02-19,0.31884,0.41617,0.29034,0.25 +2014-02-20,0.30314,0.38546,0.27396,0.25 +2014-02-21,0.29297,0.36601,0.26288,0.25 +2014-02-24,0.30405,0.41901,0.24316,0.25 +2014-02-25,0.30956,0.43854,0.24016,0.25 +2014-02-26,0.31248,0.44742,0.24003,0.25 +2014-02-28,0.33172,0.49429,0.25087,0.25 +2014-03-03,0.33919,0.51706,0.25051,0.25 +2014-03-04,0.34639,0.53595,0.25323,0.25 +2014-03-05,0.34513,0.52646,0.25893,0.25 +2014-03-06,0.33611,0.50019,0.25815,0.25 +2014-03-07,0.43659,0.5521,0.25768,0.5 +2014-03-10,0.42021,0.50696,0.25369,0.5 +2014-03-11,0.39631,0.43063,0.25829,0.5 +2014-03-12,0.34651,0.54475,0.24478,0.25 +2014-03-13,0.33751,0.52972,0.23281,0.25 +2014-03-14,0.346,0.55851,0.22951,0.25 +2014-03-18,0.35672,0.5927,0.22746,0.25 +2014-03-19,0.41578,0.6728,0.32454,0.25 +2014-03-20,0.46502,0.75773,0.38732,0.25 +2014-03-21,0.4778,0.73714,0.44627,0.25 +2014-03-24,0.4525,0.66095,0.44656,0.25 +2014-03-25,0.42866,0.58345,0.45252,0.25 +2014-03-26,0.43804,0.60348,0.46065,0.25 +2014-03-27,0.42974,0.57516,0.46406,0.25 +2014-03-28,0.42357,0.55597,0.46474,0.25 +2014-03-31,0.40856,0.57762,0.39805,0.25 +2014-04-01,0.41792,0.58481,0.41894,0.25 +2014-04-02,0.43718,0.57266,0.48887,0.25 +2014-04-03,0.46075,0.59762,0.53463,0.25 +2014-04-04,0.46837,0.60545,0.54966,0.25 +2014-04-07,0.45562,0.56096,0.5559,0.25 +2014-04-09,0.50216,0.47938,0.5271,0.5 +2014-04-10,0.46502,0.40451,0.49055,0.5 +2014-04-11,0.47233,0.4277,0.48931,0.5 +2014-04-15,0.47065,0.42294,0.48901,0.5 +2014-04-16,0.47207,0.42399,0.49221,0.5 +2014-04-17,0.56808,0.43913,0.5151,0.75 +2014-04-21,0.57935,0.44935,0.5387,0.75 +2014-04-22,0.58022,0.45104,0.53962,0.75 +2014-04-23,0.53226,0.30444,0.54234,0.75 +2014-04-25,0.4624,0.34355,0.54366,0.5 +2014-04-28,0.45636,0.3296,0.53949,0.5 +2014-04-29,0.44572,0.31641,0.52074,0.5 +2014-04-30,0.44255,0.29795,0.52971,0.5 +2014-05-02,0.45341,0.31106,0.54917,0.5 +2014-05-05,0.46509,0.33246,0.5628,0.5 +2014-05-06,0.47228,0.33152,0.58532,0.5 +2014-05-07,0.45682,0.32314,0.54731,0.5 +2014-05-08,0.44324,0.30459,0.52514,0.5 +2014-05-09,0.53502,0.27789,0.57717,0.75 +2014-05-12,0.80504,0.72185,0.69327,1 +2014-05-13,0.84403,0.76617,0.76593,1 +2014-05-14,0.84753,0.72574,0.81686,1 +2014-05-15,0.86446,0.74055,0.85282,1 +2014-05-16,0.86091,0.73192,0.8508,1 +2014-05-19,0.84946,0.72495,0.82344,1 +2014-05-20,0.83514,0.71254,0.79287,1 +2014-05-21,0.81855,0.7177,0.73795,1 +2014-05-22,0.81272,0.72427,0.71389,1 +2014-05-23,0.80488,0.70979,0.70485,1 +2014-05-26,0.80547,0.73,0.68641,1 +2014-05-27,0.73981,0.78007,0.68937,0.75 +2014-05-28,0.7395,0.76927,0.69922,0.75 +2014-05-29,0.72814,0.74095,0.69347,0.75 +2014-05-30,0.71662,0.70949,0.69038,0.75 +2014-06-02,0.69467,0.64473,0.68927,0.75 +2014-06-03,0.61394,0.65241,0.6894,0.5 +2014-06-04,0.6122,0.64711,0.6895,0.5 +2014-06-05,0.60408,0.62536,0.68688,0.5 +2014-06-06,0.60889,0.6402,0.68646,0.5 +2014-06-09,0.61528,0.6524,0.69345,0.5 +2014-06-10,0.61359,0.63987,0.7009,0.5 +2014-06-11,0.62029,0.65145,0.70943,0.5 +2014-06-12,0.61118,0.64282,0.69071,0.5 +2014-06-13,0.57952,0.59491,0.64364,0.5 +2014-06-16,0.54625,0.5421,0.59666,0.5 +2014-06-17,0.52258,0.52513,0.54262,0.5 +2014-06-18,0.50973,0.53845,0.49072,0.5 +2014-06-19,0.53309,0.65823,0.44103,0.5 +2014-06-20,0.35075,0.37142,0.43081,0.25 +2014-06-23,0.20863,0.23024,0.39565,0 +2014-06-24,0.20256,0.25323,0.35445,0 +2014-06-25,0.16023,0.18135,0.29935,0 +2014-06-26,0.13847,0.18414,0.23127,0 +2014-06-27,0.12283,0.1537,0.21478,0 +2014-06-30,0.11127,0.13662,0.19719,0 +2014-07-01,0.0957,0.090108,0.19699,0 +2014-07-02,0.079001,0.055641,0.18136,0 +2014-07-03,0.062253,0.050085,0.13667,0 +2014-07-04,0.066812,0.093065,0.10737,0 +2014-07-07,0.069244,0.084267,0.12347,0 +2014-07-08,0.15756,0.082994,0.1397,0.25 +2014-07-09,0.16237,0.11612,0.12097,0.25 +2014-07-10,0.17798,0.15663,0.12732,0.25 +2014-07-11,0.18457,0.17859,0.12512,0.25 +2014-07-14,0.16195,0.11782,0.11803,0.25 +2014-07-15,0.16028,0.10489,0.12594,0.25 +2014-07-16,0.18203,0.13899,0.1571,0.25 +2014-07-17,0.16318,0.084656,0.15487,0.25 +2014-07-18,0.15644,0.07451,0.1448,0.25 +2014-07-21,0.16399,0.1056,0.13636,0.25 +2014-07-22,0.16113,0.062107,0.17127,0.25 +2014-07-23,0.16736,0.034937,0.21715,0.25 +2014-07-24,0.19224,0.062537,0.26419,0.25 +2014-07-25,0.21857,0.096506,0.30919,0.25 +2014-07-28,0.23669,0.12675,0.33332,0.25 +2014-07-30,0.23019,0.086348,0.35423,0.25 +2014-07-31,0.2351,0.096249,0.35905,0.25 +2014-08-01,0.24596,0.12772,0.36016,0.25 +2014-08-04,0.25899,0.16582,0.36116,0.25 +2014-08-05,0.26851,0.19104,0.36448,0.25 +2014-08-06,0.27958,0.21882,0.36991,0.25 +2014-08-07,0.28262,0.22381,0.37404,0.25 +2014-08-08,0.28141,0.22353,0.3707,0.25 +2014-08-11,0.2913,0.25974,0.36415,0.25 +2014-08-12,0.30397,0.29658,0.36532,0.25 +2014-08-13,0.29802,0.28045,0.36362,0.25 +2014-08-14,0.31073,0.31917,0.36302,0.25 +2014-08-18,0.30037,0.28873,0.36237,0.25 +2014-08-19,0.29073,0.2588,0.36338,0.25 +2014-08-20,0.31229,0.32617,0.36071,0.25 +2014-08-21,0.25481,0.39125,0.37319,0 +2014-08-22,0.27669,0.4137,0.41638,0 +2014-08-25,0.32463,0.52374,0.45015,0 +2014-08-26,0.38996,0.68062,0.48925,0 +2014-08-27,0.43795,0.74679,0.56705,0 +2014-08-28,0.45249,0.72516,0.63231,0 +2014-09-01,0.46997,0.7658,0.6441,0 +2014-09-02,0.47762,0.75048,0.6824,0 +2014-09-03,0.48241,0.72752,0.71971,0 +2014-09-04,0.51284,0.78935,0.74917,0 +2014-09-05,0.53877,0.85056,0.76574,0 +2014-09-08,0.51318,0.77966,0.75988,0 +2014-09-09,0.49243,0.73335,0.74393,0 +2014-09-10,0.4826,0.72023,0.72759,0 +2014-09-11,0.47618,0.70138,0.72717,0 +2014-09-12,0.48657,0.73033,0.72938,0 +2014-09-15,0.46662,0.66694,0.73291,0 +2014-09-16,0.44504,0.60215,0.73297,0 +2014-09-17,0.43061,0.56532,0.72651,0 +2014-09-18,0.50593,0.53389,0.73389,0.25 +2014-09-19,0.47681,0.45078,0.72965,0.25 +2014-09-22,0.49001,0.49323,0.72682,0.25 +2014-09-23,0.56446,0.43538,0.75798,0.5 +2014-09-24,0.54291,0.35626,0.77247,0.5 +2014-09-25,0.5513,0.36612,0.78779,0.5 +2014-09-26,0.5673,0.39089,0.81103,0.5 +2014-09-29,0.55917,0.36997,0.80754,0.5 +2014-09-30,0.57448,0.41635,0.8071,0.5 +2014-10-01,0.57829,0.4278,0.80708,0.5 +2014-10-07,0.56327,0.39207,0.79775,0.5 +2014-10-08,0.54421,0.34356,0.78906,0.5 +2014-10-09,0.51351,0.28093,0.75962,0.5 +2014-10-10,0.52359,0.33456,0.7362,0.5 +2014-10-13,0.49976,0.29073,0.70855,0.5 +2014-10-14,0.47775,0.29443,0.63881,0.5 +2014-10-16,0.44946,0.27694,0.57144,0.5 +2014-10-17,0.42631,0.26093,0.51801,0.5 +2014-10-20,0.40985,0.2502,0.47934,0.5 +2014-10-21,0.38518,0.23371,0.42184,0.5 +2014-10-22,0.35243,0.19351,0.36379,0.5 +2014-10-27,0.3371,0.20678,0.30451,0.5 +2014-10-28,0.33549,0.24526,0.26121,0.5 +2014-10-29,0.34517,0.24299,0.29252,0.5 +2014-10-30,0.35865,0.24512,0.33082,0.5 +2014-10-31,0.36194,0.25651,0.32932,0.5 +2014-11-03,0.33588,0.19176,0.31588,0.5 +2014-11-05,0.34951,0.23816,0.31038,0.5 +2014-11-07,0.37069,0.29048,0.32158,0.5 +2014-11-10,0.38676,0.34323,0.31704,0.5 +2014-11-11,0.33313,0.425,0.32438,0.25 +2014-11-12,0.33612,0.42238,0.33597,0.25 +2014-11-13,0.38915,0.46914,0.44832,0.25 +2014-11-14,0.34858,0.52357,0.52218,0 +2014-11-17,0.37835,0.55493,0.58012,0 +2014-11-18,0.39476,0.54966,0.63463,0 +2014-11-19,0.40578,0.56034,0.65701,0 +2014-11-20,0.4116,0.53617,0.69862,0 +2014-11-21,0.40704,0.50169,0.71944,0 +2014-11-24,0.42445,0.53069,0.74267,0 +2014-11-25,0.43922,0.57145,0.74622,0 +2014-11-26,0.45908,0.62578,0.75145,0 +2014-11-27,0.43497,0.54722,0.75769,0 +2014-11-28,0.4335,0.54464,0.75586,0 +2014-12-01,0.42217,0.51917,0.74733,0 +2014-12-02,0.4371,0.57299,0.7383,0 +2014-12-03,0.43779,0.60512,0.70825,0 +2014-12-04,0.44085,0.6363,0.68627,0 +2014-12-05,0.41094,0.62381,0.60901,0 +2014-12-08,0.38003,0.58429,0.55579,0 +2014-12-09,0.40924,0.70552,0.52219,0 +2014-12-10,0.37808,0.65503,0.47921,0 +2014-12-11,0.35867,0.64099,0.43502,0 +2014-12-12,0.35169,0.6338,0.42127,0 +2014-12-15,0.29646,0.48067,0.40872,0 +2014-12-16,0.38511,0.49008,0.41524,0.25 +2014-12-17,0.37611,0.45996,0.41836,0.25 +2014-12-18,0.4827,0.4304,0.5177,0.5 +2014-12-19,0.51885,0.43815,0.61841,0.5 +2014-12-22,0.55148,0.43373,0.72069,0.5 +2014-12-23,0.57087,0.41927,0.79334,0.5 +2014-12-24,0.5911,0.40528,0.86801,0.5 +2014-12-26,0.55682,0.36684,0.80362,0.5 +2014-12-29,0.53454,0.36497,0.73865,0.5 +2014-12-30,0.51078,0.35926,0.67309,0.5 +2014-12-31,0.49226,0.37088,0.6059,0.5 +2015-01-02,0.46679,0.34094,0.55942,0.5 +2015-01-05,0.44146,0.31259,0.51179,0.5 +2015-01-06,0.51504,0.24391,0.5512,0.75 +2015-01-07,0.51571,0.23075,0.56636,0.75 +2015-01-08,0.52514,0.21032,0.61511,0.75 +2015-01-09,0.52294,0.17245,0.64636,0.75 +2015-01-12,0.53355,0.18754,0.66311,0.75 +2015-01-13,0.54004,0.21045,0.65968,0.75 +2015-01-14,0.54197,0.21917,0.65674,0.75 +2015-01-15,0.59876,0.16461,0.63166,1 +2015-01-16,0.56849,0.10463,0.60084,1 +2015-01-19,0.55248,0.10211,0.55532,1 +2015-01-20,0.53592,0.097249,0.51051,1 +2015-01-21,0.52158,0.076431,0.48832,1 +2015-01-22,0.51718,0.10152,0.45003,1 +2015-01-23,0.50594,0.095041,0.42277,1 +2015-01-27,0.51318,0.094832,0.44469,1 +2015-01-28,0.51697,0.094535,0.45637,1 +2015-01-29,0.53754,0.15588,0.45674,1 +2015-01-30,0.44895,0.15438,0.44248,0.75 +2015-02-02,0.43924,0.14125,0.42649,0.75 +2015-02-03,0.36328,0.15343,0.43642,0.5 +2015-02-04,0.37159,0.16137,0.45339,0.5 +2015-02-05,0.38811,0.18094,0.4834,0.5 +2015-02-06,0.40109,0.18958,0.5137,0.5 +2015-02-09,0.41109,0.19649,0.53677,0.5 +2015-02-10,0.41594,0.18209,0.56572,0.5 +2015-02-11,0.41595,0.16889,0.57895,0.5 +2015-02-12,0.4068,0.14456,0.57586,0.5 +2015-02-13,0.40787,0.1573,0.5663,0.5 +2015-02-16,0.40801,0.16442,0.55962,0.5 +2015-02-18,0.41581,0.19754,0.54988,0.5 +2015-02-19,0.35642,0.21627,0.60298,0.25 +2015-02-20,0.36711,0.23948,0.61184,0.25 +2015-02-23,0.35473,0.23503,0.57915,0.25 +2015-02-24,0.33675,0.22472,0.53554,0.25 +2015-02-25,0.33286,0.25971,0.48888,0.25 +2015-02-26,0.30415,0.22897,0.43347,0.25 +2015-02-27,0.30465,0.31721,0.34674,0.25 +2015-03-02,0.27925,0.49387,0.34388,0 +2015-03-03,0.26758,0.46058,0.34216,0 +2015-03-04,0.27847,0.48862,0.34678,0 +2015-03-05,0.28621,0.5169,0.34172,0 +2015-03-09,0.35513,0.41769,0.39771,0.25 +2015-03-10,0.36451,0.40138,0.44216,0.25 +2015-03-11,0.37033,0.4121,0.44889,0.25 +2015-03-12,0.35959,0.41186,0.41691,0.25 +2015-03-13,0.3486,0.40672,0.38908,0.25 +2015-03-16,0.33299,0.39011,0.35886,0.25 +2015-03-17,0.34765,0.42509,0.36787,0.25 +2015-03-18,0.33763,0.3954,0.36748,0.25 +2015-03-19,0.33544,0.38889,0.36742,0.25 +2015-03-20,0.32437,0.36017,0.36294,0.25 +2015-03-23,0.31599,0.34708,0.35089,0.25 +2015-03-24,0.33624,0.40189,0.35682,0.25 +2015-03-25,0.36019,0.46671,0.36385,0.25 +2015-03-26,0.41022,0.38089,0.34976,0.5 +2015-03-27,0.38091,0.29529,0.34743,0.5 +2015-03-30,0.36434,0.23275,0.36027,0.5 +2015-03-31,0.35751,0.20216,0.37038,0.5 +2015-04-01,0.35576,0.1791,0.38817,0.5 +2015-04-06,0.36226,0.18075,0.40603,0.5 +2015-04-07,0.34116,0.1769,0.34658,0.5 +2015-04-08,0.34221,0.18996,0.33667,0.5 +2015-04-09,0.34904,0.19351,0.35361,0.5 +2015-04-10,0.34757,0.15232,0.39039,0.5 +2015-04-13,0.36284,0.17238,0.41613,0.5 +2015-04-16,0.34408,0.13258,0.39965,0.5 +2015-04-17,0.33219,0.094549,0.40203,0.5 +2015-04-20,0.35727,0.16925,0.40257,0.5 +2015-04-21,0.36548,0.19395,0.40248,0.5 +2015-04-22,0.36479,0.19195,0.40244,0.5 +2015-04-23,0.38054,0.23906,0.40257,0.5 +2015-04-24,0.28958,0.23449,0.38425,0.25 +2015-04-27,0.28376,0.23326,0.36803,0.25 +2015-04-28,0.28533,0.2395,0.36649,0.25 +2015-04-29,0.28173,0.22407,0.37113,0.25 +2015-04-30,0.29402,0.25628,0.37579,0.25 +2015-05-04,0.30222,0.27609,0.38058,0.25 +2015-05-05,0.28674,0.23176,0.37847,0.25 +2015-05-06,0.36222,0.16001,0.42664,0.5 +2015-05-07,0.3731,0.16065,0.45866,0.5 +2015-05-08,0.38177,0.14187,0.50345,0.5 +2015-05-11,0.39722,0.14524,0.54641,0.5 +2015-05-12,0.42492,0.17904,0.59571,0.5 +2015-05-13,0.46128,0.27399,0.60985,0.5 +2015-05-14,0.40091,0.32466,0.62808,0.25 +2015-05-15,0.42222,0.40629,0.61037,0.25 +2015-05-18,0.43628,0.44559,0.61326,0.25 +2015-05-19,0.43171,0.43189,0.61324,0.25 +2015-05-20,0.43809,0.4511,0.61317,0.25 +2015-05-21,0.45428,0.46184,0.651,0.25 +2015-05-22,0.47457,0.47261,0.70111,0.25 +2015-05-25,0.46981,0.46414,0.69529,0.25 +2015-05-26,0.45832,0.44452,0.68044,0.25 +2015-05-27,0.45878,0.45933,0.66701,0.25 +2015-05-28,0.47115,0.51843,0.645,0.25 +2015-05-29,0.46203,0.48623,0.64986,0.25 +2015-06-01,0.45123,0.44241,0.66127,0.25 +2015-06-02,0.4254,0.36576,0.66045,0.25 +2015-06-03,0.43623,0.4025,0.6562,0.25 +2015-06-04,0.42629,0.37826,0.65061,0.25 +2015-06-05,0.43846,0.4219,0.64347,0.25 +2015-06-08,0.43138,0.41998,0.62416,0.25 +2015-06-09,0.42922,0.42056,0.61709,0.25 +2015-06-10,0.42326,0.40864,0.61115,0.25 +2015-06-11,0.42561,0.43121,0.59563,0.25 +2015-06-12,0.41148,0.40388,0.58056,0.25 +2015-06-15,0.43054,0.45767,0.58394,0.25 +2015-06-16,0.46391,0.55582,0.58591,0.25 +2015-06-17,0.39934,0.60903,0.589,0 +2015-06-18,0.40542,0.62597,0.59029,0 +2015-06-19,0.38789,0.57649,0.58718,0 +2015-06-22,0.36133,0.45932,0.62466,0 +2015-06-23,0.31781,0.33368,0.61975,0 +2015-06-24,0.32154,0.37584,0.58878,0 +2015-06-25,0.30176,0.37388,0.5314,0 +2015-06-26,0.30523,0.396,0.51969,0 +2015-06-29,0.304,0.42486,0.48714,0 +2015-06-30,0.29363,0.42469,0.45621,0 +2015-07-01,0.29067,0.42336,0.44865,0 +2015-07-02,0.28086,0.38913,0.45344,0 +2015-07-03,0.2849,0.41025,0.44445,0 +2015-07-06,0.29498,0.42493,0.46003,0 +2015-07-07,0.29884,0.41874,0.47777,0 +2015-07-08,0.26434,0.33916,0.45385,0 +2015-07-09,0.25831,0.34578,0.42913,0 +2015-07-10,0.27339,0.39304,0.42713,0 +2015-07-13,0.30342,0.48884,0.42141,0 +2015-07-14,0.24229,0.31644,0.41044,0 +2015-07-15,0.24698,0.34441,0.39652,0 +2015-07-16,0.23167,0.31181,0.38321,0 +2015-07-17,0.22787,0.3003,0.38332,0 +2015-07-20,0.25041,0.36511,0.38613,0 +2015-07-21,0.25547,0.37706,0.38935,0 +2015-07-22,0.20534,0.24729,0.36875,0 +2015-07-23,0.217,0.2941,0.3569,0 +2015-07-24,0.20679,0.27321,0.34716,0 +2015-07-27,0.30571,0.32711,0.34002,0.25 +2015-07-28,0.28522,0.27853,0.32713,0.25 +2015-07-29,0.28996,0.29515,0.32472,0.25 +2015-07-30,0.28921,0.2975,0.32013,0.25 +2015-07-31,0.28907,0.28756,0.32964,0.25 +2015-08-03,0.27723,0.27295,0.30873,0.25 +2015-08-04,0.2685,0.28272,0.27279,0.25 +2015-08-05,0.26497,0.27294,0.27198,0.25 +2015-08-06,0.26518,0.26211,0.28344,0.25 +2015-08-07,0.2781,0.29038,0.29393,0.25 +2015-08-10,0.28499,0.30021,0.30475,0.25 +2015-08-11,0.2961,0.29623,0.34208,0.25 +2015-08-12,0.30984,0.34162,0.33788,0.25 +2015-08-13,0.28728,0.27986,0.33198,0.25 +2015-08-14,0.34629,0.2122,0.32665,0.5 +2015-08-17,0.33646,0.19168,0.3177,0.5 +2015-08-18,0.35333,0.25561,0.30437,0.5 +2015-08-19,0.36863,0.29439,0.31151,0.5 +2015-08-20,0.3649,0.26509,0.32961,0.5 +2015-08-21,0.3803,0.30603,0.33486,0.5 +2015-08-24,0.66026,0.48702,0.74376,0.75 +2015-08-25,0.72014,0.4958,0.91463,0.75 +2015-08-26,0.74875,0.49624,1,0.75 +2015-08-27,0.7521,0.5063,1,0.75 +2015-08-28,0.74213,0.4764,1,0.75 +2015-08-31,0.74287,0.4786,1,0.75 +2015-09-01,0.73621,0.45862,1,0.75 +2015-09-02,0.7255,0.45855,0.96793,0.75 +2015-09-03,0.71438,0.45475,0.93838,0.75 +2015-09-04,0.70991,0.47022,0.90951,0.75 +2015-09-07,0.62873,0.49367,0.8925,0.5 +2015-09-08,0.61844,0.48461,0.87073,0.5 +2015-09-09,0.61163,0.48397,0.85091,0.5 +2015-09-10,0.60314,0.47611,0.8333,0.5 +2015-09-11,0.60631,0.50156,0.81737,0.5 +2015-09-14,0.59474,0.48258,0.80163,0.5 +2015-09-15,0.5886,0.47206,0.79375,0.5 +2015-09-16,0.5767,0.46302,0.76707,0.5 +2015-09-18,0.56066,0.44171,0.74028,0.5 +2015-09-21,0.55274,0.42839,0.72984,0.5 +2015-09-22,0.53065,0.39479,0.69714,0.5 +2015-09-23,0.50977,0.38019,0.64911,0.5 +2015-09-24,0.50729,0.40232,0.61955,0.5 +2015-09-28,0.50593,0.42881,0.58898,0.5 +2015-09-29,0.42731,0.44519,0.58675,0.25 +2015-09-30,0.41816,0.42296,0.58153,0.25 +2015-10-01,0.40646,0.39314,0.57623,0.25 +2015-10-05,0.40117,0.37299,0.58051,0.25 +2015-10-06,0.39969,0.35876,0.59033,0.25 +2015-10-07,0.40532,0.36934,0.59662,0.25 +2015-10-08,0.31431,0.33946,0.60348,0 +2015-10-09,0.3207,0.34847,0.61363,0 +2015-10-12,0.31851,0.33885,0.61668,0 +2015-10-13,0.32161,0.37854,0.58629,0 +2015-10-14,0.32451,0.40614,0.56738,0 +2015-10-15,0.32384,0.45958,0.51195,0 +2015-10-16,0.27864,0.45192,0.38399,0 +2015-10-19,0.29013,0.45469,0.41569,0 +2015-10-20,0.28264,0.40488,0.44302,0 +2015-10-21,0.27383,0.3616,0.45989,0 +2015-10-23,0.26814,0.30795,0.49645,0 +2015-10-26,0.22432,0.16559,0.50737,0 +2015-10-27,0.22101,0.18395,0.47909,0 +2015-10-28,0.20871,0.15382,0.4723,0 +2015-10-29,0.21351,0.17727,0.46327,0 +2015-10-30,0.20733,0.17773,0.44427,0 +2015-11-02,0.21656,0.18758,0.4621,0 +2015-11-03,0.23844,0.20288,0.51244,0 +2015-11-04,0.27099,0.25241,0.56056,0 +2015-11-05,0.29866,0.30673,0.58925,0 +2015-11-06,0.28796,0.26131,0.60258,0 +2015-11-09,0.29266,0.26544,0.61253,0 +2015-11-10,0.38069,0.29143,0.60065,0.25 +2015-11-13,0.36271,0.25907,0.57905,0.25 +2015-11-16,0.34901,0.24226,0.55477,0.25 +2015-11-17,0.35272,0.29166,0.51651,0.25 +2015-11-18,0.37048,0.38704,0.47439,0.25 +2015-11-19,0.52843,0.58733,0.49796,0.5 +2015-11-20,0.50753,0.50291,0.51969,0.5 +2015-11-23,0.51594,0.53914,0.50867,0.5 +2015-11-24,0.5229,0.56257,0.50613,0.5 +2015-11-26,0.5186,0.5517,0.5041,0.5 +2015-11-27,0.52092,0.56175,0.501,0.5 +2015-11-30,0.50431,0.52466,0.48827,0.5 +2015-12-01,0.52339,0.56493,0.50524,0.5 +2015-12-02,0.52769,0.56197,0.5211,0.5 +2015-12-03,0.52462,0.54964,0.52421,0.5 +2015-12-04,0.53333,0.57836,0.52164,0.5 +2015-12-07,0.51165,0.51656,0.51838,0.5 +2015-12-08,0.50563,0.49795,0.51892,0.5 +2015-12-09,0.51355,0.52645,0.51422,0.5 +2015-12-10,0.5195,0.55335,0.50515,0.5 +2015-12-11,0.52336,0.57891,0.49118,0.5 +2015-12-14,0.51685,0.57004,0.4805,0.5 +2015-12-15,0.51202,0.56996,0.4661,0.5 +2015-12-16,0.50769,0.56894,0.45412,0.5 +2015-12-17,0.49181,0.5348,0.44064,0.5 +2015-12-18,0.47793,0.53473,0.39906,0.5 +2015-12-21,0.47799,0.57942,0.35456,0.5 +2015-12-22,0.48283,0.62764,0.32085,0.5 +2015-12-23,0.46297,0.6002,0.2887,0.5 +2015-12-24,0.45306,0.61037,0.24882,0.5 +2015-12-28,0.39366,0.6874,0.24359,0.25 +2015-12-29,0.38016,0.65505,0.23544,0.25 +2015-12-30,0.38803,0.6752,0.23889,0.25 +2015-12-31,0.40853,0.72797,0.24762,0.25 +2016-01-04,0.45132,0.59679,0.25717,0.5 +2016-01-05,0.33514,0.51602,0.2394,0.25 +2016-01-06,0.31576,0.47681,0.22046,0.25 +2016-01-07,0.38295,0.41067,0.23817,0.5 +2016-01-08,0.37285,0.35785,0.26071,0.5 +2016-01-11,0.38282,0.36859,0.27985,0.5 +2016-01-12,0.38366,0.36752,0.28346,0.5 +2016-01-13,0.36294,0.31594,0.27288,0.5 +2016-01-14,0.33492,0.28205,0.2227,0.5 +2016-01-15,0.31257,0.2583,0.17942,0.5 +2016-01-18,0.31655,0.29124,0.15842,0.5 +2016-01-19,0.32641,0.3293,0.14994,0.5 +2016-01-20,0.33704,0.37398,0.13713,0.5 +2016-01-21,0.31027,0.33773,0.093095,0.5 +2016-01-22,0.29736,0.29465,0.097431,0.5 +2016-01-25,0.2863,0.23305,0.12585,0.5 +2016-01-27,0.31155,0.3025,0.13215,0.5 +2016-01-28,0.32954,0.35542,0.13321,0.5 +2016-01-29,0.31644,0.30366,0.14567,0.5 +2016-02-01,0.30047,0.25825,0.14316,0.5 +2016-02-02,0.29045,0.22506,0.14629,0.5 +2016-02-03,0.29662,0.24653,0.14332,0.5 +2016-02-04,0.294,0.24152,0.14049,0.5 +2016-02-05,0.29162,0.2392,0.13564,0.5 +2016-02-08,0.30104,0.26212,0.14099,0.5 +2016-02-09,0.30149,0.26991,0.13456,0.5 +2016-02-10,0.29832,0.26628,0.12867,0.5 +2016-02-11,0.39909,0.30711,0.14017,0.75 +2016-02-12,0.3617,0.2023,0.13281,0.75 +2016-02-15,0.36407,0.16083,0.18138,0.75 +2016-02-16,0.32948,0.26267,0.22578,0.5 +2016-02-17,0.32884,0.22376,0.26277,0.5 +2016-02-18,0.3469,0.24425,0.29645,0.5 +2016-02-19,0.28209,0.27333,0.32293,0.25 +2016-02-22,0.28596,0.28888,0.319,0.25 +2016-02-23,0.27352,0.25429,0.31627,0.25 +2016-02-24,0.27039,0.25607,0.30511,0.25 +2016-02-25,0.25942,0.23091,0.29736,0.25 +2016-02-26,0.2608,0.24357,0.28882,0.25 +2016-02-29,0.26486,0.25079,0.29378,0.25 +2016-03-01,0.33226,0.22856,0.26822,0.5 +2016-03-02,0.36883,0.34316,0.26334,0.5 +2016-03-03,0.37533,0.37057,0.25542,0.5 +2016-03-04,0.37571,0.38461,0.24251,0.5 +2016-03-08,0.40394,0.46916,0.24267,0.5 +2016-03-09,0.39712,0.4485,0.24286,0.5 +2016-03-10,0.38384,0.41063,0.2409,0.5 +2016-03-11,0.40716,0.46171,0.25977,0.5 +2016-03-14,0.44402,0.52213,0.30993,0.5 +2016-03-15,0.46131,0.53552,0.34841,0.5 +2016-03-16,0.47498,0.53514,0.38981,0.5 +2016-03-17,0.49529,0.56164,0.42422,0.5 +2016-03-18,0.50134,0.55656,0.44746,0.5 +2016-03-21,0.50937,0.55714,0.47099,0.5 +2016-03-22,0.51348,0.54417,0.49627,0.5 +2016-03-23,0.53038,0.57928,0.51185,0.5 +2016-03-28,0.52634,0.55749,0.52152,0.5 +2016-03-29,0.48539,0.66802,0.53816,0.25 +2016-03-30,0.50735,0.72819,0.54387,0.25 +2016-03-31,0.46647,0.61761,0.5318,0.25 +2016-04-01,0.47275,0.64115,0.52709,0.25 +2016-04-04,0.46828,0.64684,0.50801,0.25 +2016-04-05,0.45107,0.6383,0.46492,0.25 +2016-04-06,0.41092,0.56645,0.41631,0.25 +2016-04-07,0.41972,0.59344,0.41573,0.25 +2016-04-08,0.40979,0.56755,0.41183,0.25 +2016-04-11,0.40053,0.54008,0.41153,0.25 +2016-04-12,0.39579,0.52618,0.41119,0.25 +2016-04-13,0.3905,0.50792,0.41358,0.25 +2016-04-18,0.40397,0.54764,0.41428,0.25 +2016-04-20,0.22435,0.28533,0.3877,0 +2016-04-21,0.18654,0.22448,0.33513,0 +2016-04-22,0.19344,0.28657,0.29376,0 +2016-04-25,0.1758,0.25449,0.27291,0 +2016-04-26,0.16669,0.24549,0.25457,0 +2016-04-27,0.15706,0.22387,0.24732,0 +2016-04-28,0.13655,0.19383,0.21582,0 +2016-04-29,0.11948,0.14283,0.21559,0 +2016-05-02,0.11969,0.16403,0.19503,0 +2016-05-03,0.11158,0.16684,0.16788,0 +2016-05-04,0.099171,0.15386,0.14365,0 +2016-05-05,0.10316,0.17596,0.13352,0 +2016-05-06,0.10173,0.16317,0.14201,0 +2016-05-09,0.095213,0.14767,0.13797,0 +2016-05-10,0.074891,0.090539,0.13413,0 +2016-05-11,0.084565,0.12204,0.13165,0 +2016-05-12,0.09215,0.13744,0.13901,0 +2016-05-13,0.099722,0.15982,0.13935,0 +2016-05-16,0.11255,0.201,0.13665,0 +2016-05-17,0.10374,0.17503,0.1362,0 +2016-05-18,0.11453,0.18655,0.15703,0 +2016-05-19,0.10596,0.15294,0.16495,0 +2016-05-20,0.11142,0.18554,0.14872,0 +2016-05-23,0.11999,0.2089,0.15107,0 +2016-05-24,0.13206,0.24361,0.15257,0 +2016-05-25,0.21975,0.24486,0.1644,0.25 +2016-05-26,0.29524,0.45392,0.1818,0.25 +2016-05-27,0.31807,0.50837,0.19583,0.25 +2016-05-30,0.2945,0.47878,0.15471,0.25 +2016-05-31,0.30427,0.50486,0.15794,0.25 +2016-06-01,0.29673,0.48208,0.15812,0.25 +2016-06-02,0.28685,0.45741,0.15315,0.25 +2016-06-03,0.2931,0.46514,0.16415,0.25 +2016-06-06,0.31885,0.49973,0.20682,0.25 +2016-06-07,0.34597,0.52399,0.2639,0.25 +2016-06-08,0.37321,0.56431,0.30532,0.25 +2016-06-09,0.40085,0.62329,0.32925,0.25 +2016-06-10,0.40474,0.61554,0.34867,0.25 +2016-06-13,0.40962,0.61348,0.36537,0.25 +2016-06-14,0.4117,0.60499,0.38011,0.25 +2016-06-15,0.39678,0.56156,0.37878,0.25 +2016-06-16,0.39472,0.55653,0.37764,0.25 +2016-06-17,0.41953,0.63495,0.37363,0.25 +2016-06-20,0.43622,0.68429,0.37438,0.25 +2016-06-21,0.43085,0.66707,0.37547,0.25 +2016-06-22,0.43812,0.6847,0.37967,0.25 +2016-06-23,0.43416,0.67124,0.38124,0.25 +2016-06-24,0.52715,0.68899,0.39247,0.5 +2016-06-27,0.49153,0.57468,0.39991,0.5 +2016-06-28,0.49473,0.57704,0.40715,0.5 +2016-06-29,0.49828,0.58825,0.40657,0.5 +2016-06-30,0.50799,0.60804,0.41593,0.5 +2016-07-01,0.50547,0.59391,0.42251,0.5 +2016-07-04,0.49978,0.5804,0.41895,0.5 +2016-07-05,0.53949,0.6893,0.42918,0.5 +2016-07-07,0.39326,0.48061,0.44917,0.25 +2016-07-08,0.37035,0.41662,0.44442,0.25 +2016-07-11,0.43373,0.38305,0.41814,0.5 +2016-07-12,0.43351,0.38743,0.41309,0.5 +2016-07-13,0.4257,0.36868,0.4084,0.5 +2016-07-14,0.42525,0.36909,0.40666,0.5 +2016-07-15,0.42252,0.36144,0.40613,0.5 +2016-07-18,0.41446,0.34081,0.40258,0.5 +2016-07-19,0.41288,0.36052,0.37812,0.5 +2016-07-20,0.41801,0.38037,0.37366,0.5 +2016-07-21,0.41889,0.39487,0.36179,0.5 +2016-07-22,0.42279,0.39853,0.36984,0.5 +2016-07-25,0.41777,0.38859,0.36473,0.5 +2016-07-26,0.41739,0.39444,0.35772,0.5 +2016-07-27,0.43234,0.4439,0.35313,0.5 +2016-07-28,0.4271,0.4208,0.36051,0.5 +2016-07-29,0.43075,0.42727,0.36498,0.5 +2016-08-01,0.44459,0.45579,0.37796,0.5 +2016-08-02,0.46248,0.49783,0.38961,0.5 +2016-08-03,0.45686,0.46263,0.40795,0.5 +2016-08-04,0.4595,0.45178,0.42672,0.5 +2016-08-05,0.48979,0.29351,0.42585,0.75 +2016-08-08,0.42344,0.36376,0.40655,0.5 +2016-08-09,0.41519,0.35746,0.38812,0.5 +2016-08-10,0.40805,0.35218,0.37197,0.5 +2016-08-11,0.37576,0.27478,0.35249,0.5 +2016-08-16,0.35958,0.2677,0.31105,0.5 +2016-08-17,0.34277,0.26509,0.26323,0.5 +2016-08-18,0.32153,0.26304,0.20156,0.5 +2016-08-19,0.31263,0.24894,0.18896,0.5 +2016-08-22,0.29919,0.22095,0.17662,0.5 +2016-08-23,0.32518,0.27055,0.20499,0.5 +2016-08-24,0.229,0.20061,0.23638,0.25 +2016-08-25,0.23787,0.20272,0.26089,0.25 +2016-08-26,0.24247,0.19462,0.28278,0.25 +2016-08-29,0.25401,0.2017,0.31032,0.25 +2016-08-30,0.34596,0.2254,0.31246,0.5 +2016-08-31,0.35372,0.25081,0.31036,0.5 +2016-09-01,0.35363,0.25057,0.31032,0.5 +2016-09-02,0.35004,0.26192,0.28818,0.5 +2016-09-06,0.43056,0.26983,0.27185,0.75 +2016-09-07,0.42235,0.259,0.25804,0.75 +2016-09-08,0.42025,0.25384,0.25692,0.75 +2016-09-09,0.41979,0.2504,0.25897,0.75 +2016-09-12,0.5538,0.36532,0.29607,1 +2016-09-14,0.54637,0.31316,0.32597,1 +2016-09-15,0.55526,0.31772,0.34805,1 +2016-09-16,0.54367,0.29174,0.33928,1 +2016-09-19,0.54818,0.31282,0.33172,1 +2016-09-20,0.55122,0.33932,0.31434,1 +2016-09-21,0.56912,0.41509,0.29227,1 +2016-09-22,0.49062,0.3995,0.32236,0.75 +2016-09-23,0.49272,0.38765,0.3405,0.75 +2016-09-26,0.49357,0.38998,0.34073,0.75 +2016-09-27,0.49124,0.38771,0.33601,0.75 +2016-09-28,0.49152,0.39507,0.32948,0.75 +2016-09-29,0.57788,0.39433,0.3393,1 +2016-09-30,0.56728,0.35224,0.3496,1 +2016-10-03,0.56414,0.3218,0.37063,1 +2016-10-04,0.5593,0.291,0.38688,1 +2016-10-05,0.5581,0.28676,0.38754,1 +2016-10-06,0.53911,0.26236,0.35499,1 +2016-10-07,0.53233,0.2798,0.31719,1 +2016-10-10,0.53349,0.31328,0.28718,1 +2016-10-13,0.50306,0.26339,0.2458,1 +2016-10-14,0.47915,0.23598,0.20149,1 +2016-10-17,0.39843,0.23041,0.21488,0.75 +2016-10-18,0.49289,0.26029,0.21837,1 +2016-10-19,0.4771,0.2111,0.2202,1 +2016-10-20,0.48482,0.23249,0.22197,1 +2016-10-21,0.41233,0.26526,0.22174,0.75 +2016-10-24,0.41761,0.28541,0.21742,0.75 +2016-10-25,0.42495,0.31238,0.21247,0.75 +2016-10-26,0.39844,0.23597,0.20935,0.75 +2016-10-27,0.33663,0.25599,0.2539,0.5 +2016-10-28,0.34894,0.25715,0.28966,0.5 +2016-11-01,0.36675,0.26702,0.33322,0.5 +2016-11-02,0.3619,0.23814,0.34756,0.5 +2016-11-03,0.36283,0.22228,0.36622,0.5 +2016-11-04,0.36264,0.2043,0.38361,0.5 +2016-11-07,0.37123,0.22537,0.38833,0.5 +2016-11-08,0.36264,0.23055,0.35738,0.5 +2016-11-09,0.35819,0.24216,0.33242,0.5 +2016-11-10,0.38378,0.3185,0.33284,0.5 +2016-11-11,0.52029,0.44151,0.36936,0.75 +2016-11-15,0.71176,0.70891,0.42638,1 +2016-11-16,0.62917,0.65887,0.47864,0.75 +2016-11-17,0.65239,0.70006,0.50711,0.75 +2016-11-18,0.66812,0.73098,0.52339,0.75 +2016-11-21,0.65294,0.66744,0.54137,0.75 +2016-11-22,0.65708,0.6674,0.55385,0.75 +2016-11-23,0.6524,0.65201,0.55518,0.75 +2016-11-24,0.64531,0.62843,0.5575,0.75 +2016-11-25,0.65224,0.66751,0.53922,0.75 +2016-11-28,0.64775,0.65529,0.53796,0.75 +2016-11-29,0.64786,0.67557,0.518,0.75 +2016-11-30,0.64019,0.67241,0.49815,0.75 +2016-12-01,0.57157,0.71251,0.5022,0.5 +2016-12-02,0.56353,0.68868,0.50189,0.5 +2016-12-05,0.55641,0.66669,0.50254,0.5 +2016-12-06,0.55548,0.65079,0.51567,0.5 +2016-12-07,0.55271,0.63957,0.51856,0.5 +2016-12-08,0.54409,0.62072,0.51154,0.5 +2016-12-09,0.52903,0.57999,0.50711,0.5 +2016-12-12,0.49856,0.53722,0.45846,0.5 +2016-12-13,0.47271,0.50433,0.4138,0.5 +2016-12-14,0.46355,0.53476,0.35589,0.5 +2016-12-15,0.46346,0.56455,0.32582,0.5 +2016-12-16,0.45608,0.57844,0.2898,0.5 +2016-12-19,0.46102,0.59364,0.28943,0.5 +2016-12-20,0.47136,0.60552,0.30856,0.5 +2016-12-21,0.49622,0.6337,0.35495,0.5 +2016-12-22,0.51164,0.6125,0.42241,0.5 +2016-12-23,0.5161,0.56459,0.4837,0.5 +2016-12-26,0.33135,0.21804,0.52602,0.25 +2016-12-27,0.28268,0.33976,0.50828,0 +2016-12-28,0.24722,0.25984,0.48181,0 +2016-12-29,0.22883,0.22759,0.45889,0 +2016-12-30,0.2444,0.29393,0.43928,0 +2017-01-02,0.21023,0.21837,0.41231,0 +2017-01-03,0.2182,0.27026,0.38434,0 +2017-01-04,0.23523,0.31972,0.38597,0 +2017-01-05,0.21511,0.23321,0.4121,0 +2017-01-06,0.22735,0.26994,0.41212,0 +2017-01-09,0.22355,0.25983,0.41083,0 +2017-01-10,0.23072,0.27908,0.41307,0 +2017-01-11,0.24099,0.29758,0.42539,0 +2017-01-12,0.24384,0.2949,0.43662,0 +2017-01-13,0.24814,0.31365,0.43078,0 +2017-01-16,0.26032,0.34348,0.43748,0 +2017-01-17,0.27423,0.36501,0.45768,0 +2017-01-18,0.28416,0.37153,0.48094,0 +2017-01-19,0.31026,0.44178,0.489,0 +2017-01-20,0.31448,0.44987,0.49358,0 +2017-01-23,0.30327,0.43376,0.47603,0 +2017-01-24,0.30098,0.43837,0.46458,0 +2017-01-25,0.41151,0.5334,0.45111,0.25 +2017-01-27,0.39669,0.50782,0.43224,0.25 +2017-01-30,0.39171,0.50802,0.41712,0.25 +2017-01-31,0.38829,0.48316,0.43171,0.25 +2017-02-01,0.48727,0.5245,0.4373,0.5 +2017-02-02,0.46679,0.47901,0.42137,0.5 +2017-02-03,0.47095,0.53138,0.38146,0.5 +2017-02-06,0.46411,0.55024,0.34208,0.5 +2017-02-07,0.43604,0.49193,0.3162,0.5 +2017-02-08,0.46578,0.58297,0.31436,0.5 +2017-02-09,0.48352,0.6402,0.31038,0.5 +2017-02-10,0.49324,0.63219,0.34753,0.5 +2017-02-13,0.51835,0.68355,0.37151,0.5 +2017-02-14,0.52881,0.68197,0.40446,0.5 +2017-02-15,0.52554,0.64597,0.43065,0.5 +2017-02-16,0.54886,0.69706,0.44951,0.5 +2017-02-17,0.55602,0.71264,0.45542,0.5 +2017-02-20,0.55632,0.70802,0.46094,0.5 +2017-02-21,0.56,0.71528,0.46472,0.5 +2017-02-22,0.55867,0.71402,0.46198,0.5 +2017-02-23,0.57309,0.75022,0.46906,0.5 +2017-02-27,0.57655,0.74085,0.48879,0.5 +2017-02-28,0.57631,0.72117,0.50774,0.5 +2017-03-01,0.56845,0.69038,0.51496,0.5 +2017-03-02,0.5647,0.67802,0.51609,0.5 +2017-03-03,0.55899,0.66064,0.51634,0.5 +2017-03-06,0.5576,0.66797,0.50484,0.5 +2017-03-07,0.55067,0.65337,0.49865,0.5 +2017-03-08,0.5543,0.66482,0.49808,0.5 +2017-03-09,0.52812,0.57803,0.50634,0.5 +2017-03-10,0.45669,0.60099,0.51907,0.25 +2017-03-14,0.50683,0.5062,0.5143,0.5 +2017-03-15,0.48112,0.43622,0.50714,0.5 +2017-03-16,0.41607,0.267,0.4812,0.5 +2017-03-17,0.318,0.25087,0.45313,0.25 +2017-03-20,0.30211,0.2378,0.41853,0.25 +2017-03-21,0.29701,0.26069,0.38035,0.25 +2017-03-22,0.28771,0.22206,0.39108,0.25 +2017-03-23,0.29321,0.26879,0.36085,0.25 +2017-03-24,0.26783,0.22712,0.32637,0.25 +2017-03-27,0.25377,0.19652,0.31479,0.25 +2017-03-28,0.24263,0.18976,0.28813,0.25 +2017-03-29,0.22391,0.16219,0.25953,0.25 +2017-03-30,0.22046,0.17908,0.2323,0.25 +2017-03-31,0.21289,0.17801,0.21066,0.25 +2017-04-03,0.20199,0.15318,0.2028,0.25 +2017-04-05,0.19734,0.14138,0.20064,0.25 +2017-04-06,0.21829,0.16108,0.24379,0.25 +2017-04-07,0.21276,0.13895,0.24934,0.25 +2017-04-10,0.20564,0.11097,0.25596,0.25 +2017-04-11,0.20384,0.10506,0.25647,0.25 +2017-04-12,0.19849,0.1049,0.24055,0.25 +2017-04-13,0.19794,0.11459,0.22922,0.25 +2017-04-17,0.192,0.095393,0.23062,0.25 +2017-04-18,0.19648,0.10417,0.23528,0.25 +2017-04-19,0.21023,0.13531,0.24537,0.25 +2017-04-20,0.22069,0.15672,0.25536,0.25 +2017-04-21,0.23003,0.1499,0.29019,0.25 +2017-04-24,0.21756,0.11476,0.28791,0.25 +2017-04-25,0.23775,0.17878,0.28446,0.25 +2017-04-26,0.25317,0.2414,0.26812,0.25 +2017-04-27,0.2047,0.35125,0.26285,0 +2017-04-28,0.21769,0.39869,0.25437,0 +2017-05-02,0.22906,0.44245,0.24471,0 +2017-05-03,0.24016,0.48336,0.23712,0 +2017-05-04,0.23083,0.4623,0.2302,0 +2017-05-05,0.25916,0.55919,0.2183,0 +2017-05-08,0.21363,0.49459,0.14631,0 +2017-05-09,0.22277,0.52315,0.14515,0 +2017-05-10,0.19943,0.45868,0.13961,0 +2017-05-11,0.17546,0.38776,0.13863,0 +2017-05-12,0.17428,0.39454,0.1283,0 +2017-05-15,0.16785,0.39158,0.11197,0 +2017-05-16,0.16232,0.39283,0.094124,0 +2017-05-17,0.16806,0.40561,0.098582,0 +2017-05-18,0.16323,0.36644,0.12326,0 +2017-05-19,0.13562,0.28122,0.12563,0 +2017-05-22,0.14673,0.35578,0.084402,0 +2017-05-23,0.14956,0.36088,0.087792,0 +2017-05-24,0.15086,0.36785,0.084725,0 +2017-05-25,0.2508,0.35123,0.15116,0.25 +2017-05-26,0.32419,0.49724,0.22534,0.25 +2017-05-29,0.32022,0.47241,0.23825,0.25 +2017-05-30,0.32545,0.48564,0.24072,0.25 +2017-05-31,0.33036,0.50034,0.24074,0.25 +2017-06-01,0.33274,0.52658,0.22164,0.25 +2017-06-02,0.32776,0.52608,0.2072,0.25 +2017-06-05,0.33881,0.5656,0.20083,0.25 +2017-06-06,0.33058,0.48467,0.25706,0.25 +2017-06-07,0.34191,0.47065,0.30509,0.25 +2017-06-08,0.35992,0.48324,0.34652,0.25 +2017-06-09,0.37529,0.49382,0.38205,0.25 +2017-06-12,0.3801,0.48947,0.40082,0.25 +2017-06-13,0.3759,0.45109,0.42662,0.25 +2017-06-14,0.39586,0.48352,0.45406,0.25 +2017-06-15,0.39732,0.46662,0.47534,0.25 +2017-06-16,0.40744,0.46956,0.50275,0.25 +2017-06-19,0.39859,0.44104,0.50474,0.25 +2017-06-20,0.40718,0.46368,0.50786,0.25 +2017-06-21,0.42736,0.50853,0.52357,0.25 +2017-06-22,0.4346,0.51466,0.53914,0.25 +2017-06-23,0.43172,0.49932,0.54583,0.25 +2017-06-27,0.43506,0.50665,0.54854,0.25 +2017-06-28,0.43642,0.51506,0.54419,0.25 +2017-06-29,0.4599,0.56654,0.56314,0.25 +2017-06-30,0.49121,0.64782,0.57582,0.25 +2017-07-03,0.47215,0.59068,0.57578,0.25 +2017-07-04,0.4546,0.53803,0.57577,0.25 +2017-07-05,0.45802,0.54951,0.57457,0.25 +2017-07-06,0.47753,0.59898,0.58361,0.25 +2017-07-07,0.25356,0.20714,0.55354,0 +2017-07-10,0.30848,0.20336,0.47209,0.25 +2017-07-11,0.28814,0.18561,0.42881,0.25 +2017-07-12,0.26627,0.16881,0.37999,0.25 +2017-07-13,0.23251,0.13892,0.30861,0.25 +2017-07-14,0.20372,0.10819,0.25297,0.25 +2017-07-17,0.19396,0.1193,0.21256,0.25 +2017-07-18,0.21585,0.1381,0.25944,0.25 +2017-07-19,0.25104,0.24919,0.25394,0.25 +2017-07-20,0.2465,0.23603,0.25347,0.25 +2017-07-21,0.24112,0.22157,0.25179,0.25 +2017-07-24,0.24026,0.23228,0.23849,0.25 +2017-07-25,0.24075,0.23242,0.23982,0.25 +2017-07-26,0.22308,0.18483,0.23441,0.25 +2017-07-27,0.21382,0.16994,0.22152,0.25 +2017-07-28,0.23015,0.2225,0.21794,0.25 +2017-07-31,0.22941,0.22585,0.21238,0.25 +2017-08-01,0.24749,0.25934,0.23312,0.25 +2017-08-02,0.24115,0.23318,0.24027,0.25 +2017-08-03,0.22776,0.20245,0.23084,0.25 +2017-08-04,0.23517,0.23528,0.22022,0.25 +2017-08-07,0.22376,0.20346,0.21781,0.25 +2017-08-08,0.22011,0.18546,0.22487,0.25 +2017-08-09,0.23156,0.21837,0.22632,0.25 +2017-08-10,0.23258,0.24928,0.19846,0.25 +2017-08-11,0.27965,0.4074,0.18156,0.25 +2017-08-14,0.34983,0.56987,0.22962,0.25 +2017-08-16,0.38671,0.60197,0.30816,0.25 +2017-08-17,0.37889,0.5178,0.36887,0.25 +2017-08-18,0.37691,0.48244,0.39829,0.25 +2017-08-21,0.41243,0.57153,0.41576,0.25 +2017-08-22,0.34207,0.59561,0.4306,0 +2017-08-23,0.31923,0.52659,0.43111,0 +2017-08-24,0.30139,0.48986,0.4143,0 +2017-08-28,0.30394,0.51667,0.39514,0 +2017-08-29,0.29391,0.49572,0.38601,0 +2017-08-30,0.32017,0.58106,0.37944,0 +2017-08-31,0.30766,0.54279,0.38019,0 +2017-09-01,0.31151,0.55637,0.37815,0 +2017-09-04,0.3087,0.54815,0.37794,0 +2017-09-05,0.30726,0.54379,0.37798,0 +2017-09-06,0.30782,0.54858,0.37488,0 +2017-09-07,0.3171,0.57391,0.3774,0 +2017-09-08,0.34233,0.63319,0.3938,0 +2017-09-11,0.30356,0.53426,0.37643,0 +2017-09-12,0.30022,0.55689,0.34378,0 +2017-09-13,0.27854,0.51978,0.31584,0 +2017-09-14,0.28405,0.56577,0.28638,0 +2017-09-15,0.30643,0.63919,0.28011,0 +2017-09-18,0.30233,0.61646,0.29054,0 +2017-09-19,0.29862,0.59812,0.29772,0 +2017-09-20,0.33009,0.68064,0.30963,0 +2017-09-21,0.3513,0.69878,0.35513,0 +2017-09-22,0.39547,0.58816,0.34825,0.25 +2017-09-25,0.40279,0.62006,0.33829,0.25 +2017-09-26,0.37428,0.53923,0.33361,0.25 +2017-09-27,0.41672,0.41805,0.33213,0.5 +2017-09-28,0.41993,0.43789,0.32189,0.5 +2017-09-29,0.42401,0.46023,0.31179,0.5 +2017-10-03,0.41745,0.43572,0.31663,0.5 +2017-10-04,0.42307,0.46293,0.30629,0.5 +2017-10-05,0.42833,0.48803,0.29697,0.5 +2017-10-06,0.434,0.50395,0.29805,0.5 +2017-10-09,0.43255,0.47602,0.32162,0.5 +2017-10-10,0.44213,0.4827,0.34368,0.5 +2017-10-11,0.42362,0.42102,0.34985,0.5 +2017-10-12,0.41925,0.41587,0.34189,0.5 +2017-10-13,0.43092,0.45128,0.34147,0.5 +2017-10-16,0.43337,0.45536,0.34474,0.5 +2017-10-17,0.43076,0.4458,0.3465,0.5 +2017-10-18,0.43535,0.46408,0.34197,0.5 +2017-10-19,0.4285,0.45085,0.33464,0.5 +2017-10-23,0.41718,0.41927,0.33228,0.5 +2017-10-24,0.42314,0.4432,0.32623,0.5 +2017-10-25,0.40993,0.40547,0.32433,0.5 +2017-10-26,0.41967,0.43068,0.32833,0.5 +2017-10-27,0.40786,0.40157,0.322,0.5 +2017-10-30,0.39338,0.3632,0.31694,0.5 +2017-10-31,0.39964,0.38317,0.31575,0.5 +2017-11-01,0.39458,0.37747,0.30628,0.5 +2017-11-02,0.36351,0.29513,0.29541,0.5 +2017-11-03,0.35501,0.27883,0.2862,0.5 +2017-11-06,0.37299,0.3673,0.25166,0.5 +2017-11-07,0.21793,0.15417,0.24961,0.25 +2017-11-08,0.23167,0.20156,0.24347,0.25 +2017-11-09,0.26126,0.29712,0.23665,0.25 +2017-11-10,0.2001,0.35297,0.24734,0 +2017-11-13,0.17927,0.29985,0.23795,0 +2017-11-14,0.17916,0.31297,0.22452,0 +2017-11-15,0.15294,0.2965,0.16232,0 +2017-11-16,0.1573,0.34613,0.12579,0 +2017-11-17,0.17609,0.40586,0.12242,0 +2017-11-20,0.17724,0.43648,0.095237,0 +2017-11-21,0.17805,0.43364,0.1005,0 +2017-11-22,0.17667,0.44566,0.084345,0 +2017-11-23,0.19907,0.51584,0.081361,0 +2017-11-24,0.19102,0.4535,0.11956,0 +2017-11-27,0.20881,0.43422,0.1922,0 +2017-11-28,0.24397,0.47558,0.25633,0 +2017-11-29,0.25835,0.46614,0.30892,0 +2017-11-30,0.31671,0.39099,0.30914,0.25 +2017-12-01,0.37096,0.55471,0.30819,0.25 +2017-12-04,0.3502,0.48994,0.31065,0.25 +2017-12-05,0.36827,0.54595,0.30885,0.25 +2017-12-06,0.35734,0.51367,0.30834,0.25 +2017-12-07,0.47382,0.57223,0.34924,0.5 +2017-12-08,0.5198,0.64397,0.41542,0.5 +2017-12-11,0.52622,0.64438,0.43429,0.5 +2017-12-12,0.5352,0.67605,0.42954,0.5 +2017-12-13,0.55186,0.71812,0.43747,0.5 +2017-12-14,0.5508,0.7054,0.447,0.5 +2017-12-15,0.54352,0.69053,0.44003,0.5 +2017-12-18,0.5616,0.75689,0.42792,0.5 +2017-12-19,0.56598,0.77025,0.4277,0.5 +2017-12-20,0.55872,0.74872,0.42743,0.5 +2017-12-21,0.55979,0.74439,0.43499,0.5 +2017-12-22,0.57858,0.79238,0.44336,0.5 +2017-12-26,0.59241,0.81432,0.46291,0.5 +2017-12-27,0.59778,0.82499,0.46834,0.5 +2017-12-28,0.59742,0.81934,0.47292,0.5 +2017-12-29,0.59786,0.79584,0.49774,0.5 +2018-01-02,0.60695,0.81801,0.50285,0.5 +2018-01-03,0.58438,0.7459,0.50725,0.5 +2018-01-04,0.57407,0.71267,0.50955,0.5 +2018-01-05,0.56436,0.68237,0.5107,0.5 +2018-01-08,0.56092,0.67366,0.50909,0.5 +2018-01-09,0.5444,0.65004,0.48317,0.5 +2018-01-10,0.5338,0.67017,0.43122,0.5 +2018-01-11,0.53205,0.68317,0.41298,0.5 +2018-01-12,0.57731,0.82707,0.40487,0.5 +2018-01-15,0.47262,0.71612,0.45176,0.25 +2018-01-16,0.51521,0.81804,0.47759,0.25 +2018-01-17,0.50083,0.75813,0.49436,0.25 +2018-01-18,0.5096,0.7689,0.5099,0.25 +2018-01-19,0.48968,0.6971,0.52194,0.25 +2018-01-22,0.35896,0.56283,0.51404,0 +2018-01-23,0.4358,0.59748,0.45992,0.25 +2018-01-24,0.37701,0.45452,0.4265,0.25 +2018-01-25,0.38625,0.50747,0.40126,0.25 +2018-01-29,0.36655,0.49147,0.3582,0.25 +2018-01-30,0.34442,0.4836,0.29965,0.25 +2018-01-31,0.31739,0.43739,0.26478,0.25 +2018-02-01,0.31674,0.45299,0.24722,0.25 +2018-02-02,0.39629,0.33108,0.35777,0.5 +2018-02-05,0.47823,0.49852,0.43617,0.5 +2018-02-06,0.60987,0.56111,0.51851,0.75 +2018-02-07,0.5963,0.50564,0.53326,0.75 +2018-02-08,0.61047,0.48346,0.59795,0.75 +2018-02-09,0.63356,0.5067,0.64399,0.75 +2018-02-12,0.65661,0.51793,0.70189,0.75 +2018-02-14,0.65126,0.51466,0.68912,0.75 +2018-02-15,0.66017,0.53991,0.69061,0.75 +2018-02-16,0.65439,0.53309,0.68009,0.75 +2018-02-19,0.65258,0.53658,0.67116,0.75 +2018-02-20,0.64738,0.53031,0.66182,0.75 +2018-02-21,0.65008,0.54486,0.65538,0.75 +2018-02-22,0.64435,0.52477,0.65829,0.75 +2018-02-23,0.62042,0.46378,0.64748,0.75 +2018-02-26,0.6013,0.45338,0.60052,0.75 +2018-02-27,0.57906,0.43711,0.55007,0.75 +2018-02-28,0.56209,0.43768,0.49859,0.75 +2018-03-01,0.55357,0.44711,0.46362,0.75 +2018-03-05,0.54148,0.44299,0.43144,0.75 +2018-03-06,0.5365,0.46227,0.39723,0.75 +2018-03-07,0.53106,0.47631,0.36687,0.75 +2018-03-08,0.52348,0.48393,0.3365,0.75 +2018-03-09,0.43996,0.50521,0.31466,0.5 +2018-03-12,0.47939,0.37605,0.31211,0.75 +2018-03-13,0.44143,0.2801,0.29418,0.75 +2018-03-14,0.44776,0.33292,0.26036,0.75 +2018-03-15,0.44889,0.34864,0.24803,0.75 +2018-03-16,0.42815,0.29153,0.24291,0.75 +2018-03-19,0.4671,0.42124,0.23006,0.75 +2018-03-20,0.36373,0.35264,0.23854,0.5 +2018-03-21,0.36413,0.34638,0.24601,0.5 +2018-03-22,0.30871,0.42243,0.25371,0.25 +2018-03-23,0.31055,0.42274,0.25892,0.25 +2018-03-26,0.31952,0.45427,0.25427,0.25 +2018-03-27,0.30812,0.42912,0.24524,0.25 +2018-03-28,0.3004,0.43485,0.21636,0.25 +2018-04-02,0.29562,0.42249,0.21438,0.25 +2018-04-03,0.29243,0.41531,0.212,0.25 +2018-04-04,0.28589,0.39002,0.21764,0.25 +2018-04-05,0.40339,0.48141,0.22876,0.5 +2018-04-06,0.35873,0.34904,0.22715,0.5 +2018-04-09,0.35338,0.34419,0.21595,0.5 +2018-04-10,0.35485,0.38584,0.17872,0.5 +2018-04-11,0.36209,0.42025,0.16602,0.5 +2018-04-12,0.37005,0.45109,0.15907,0.5 +2018-04-13,0.37384,0.46362,0.15791,0.5 +2018-04-16,0.4115,0.47305,0.26147,0.5 +2018-04-17,0.45248,0.49936,0.35806,0.5 +2018-04-18,0.48185,0.51167,0.43386,0.5 +2018-04-19,0.5056,0.51054,0.50627,0.5 +2018-04-20,0.52766,0.5191,0.56387,0.5 +2018-04-23,0.5606,0.55932,0.62249,0.5 +2018-04-24,0.61196,0.65664,0.67925,0.5 +2018-04-25,0.5856,0.77965,0.72714,0.25 +2018-04-26,0.59229,0.76015,0.76673,0.25 +2018-04-27,0.6026,0.75614,0.80165,0.25 +2018-04-30,0.62665,0.79292,0.83705,0.25 +2018-05-02,0.61535,0.73756,0.85849,0.25 +2018-05-03,0.62904,0.76826,0.86888,0.25 +2018-05-04,0.62517,0.76006,0.86546,0.25 +2018-05-07,0.62683,0.75811,0.8724,0.25 +2018-05-08,0.62234,0.73779,0.87923,0.25 +2018-05-09,0.60384,0.67021,0.89132,0.25 +2018-05-10,0.60643,0.67857,0.89072,0.25 +2018-05-11,0.59815,0.65326,0.89118,0.25 +2018-05-14,0.57743,0.58705,0.89525,0.25 +2018-05-15,0.59393,0.63074,0.90107,0.25 +2018-05-16,0.5977,0.63765,0.90544,0.25 +2018-05-17,0.47479,0.29097,0.8834,0.25 +2018-05-18,0.44385,0.50158,0.82997,0 +2018-05-21,0.46349,0.61493,0.77554,0 +2018-05-22,0.43106,0.58035,0.71282,0 +2018-05-23,0.46769,0.50061,0.65245,0.25 +2018-05-24,0.48178,0.60455,0.59079,0.25 +2018-05-25,0.4894,0.66611,0.55208,0.25 +2018-05-28,0.5225,0.71573,0.60176,0.25 +2018-05-29,0.51926,0.72311,0.58466,0.25 +2018-05-30,0.4932,0.69367,0.53593,0.25 +2018-05-31,0.45884,0.60315,0.52337,0.25 +2018-06-01,0.42998,0.55575,0.48419,0.25 +2018-06-04,0.40094,0.50086,0.45196,0.25 +2018-06-05,0.37389,0.46634,0.40533,0.25 +2018-06-06,0.34753,0.436,0.35659,0.25 +2018-06-07,0.34433,0.46301,0.31996,0.25 +2018-06-08,0.32151,0.42731,0.28722,0.25 +2018-06-11,0.33256,0.48924,0.25843,0.25 +2018-06-12,0.32056,0.4817,0.22998,0.25 +2018-06-13,0.31248,0.46612,0.22132,0.25 +2018-06-14,0.31507,0.47691,0.21829,0.25 +2018-06-15,0.32084,0.4756,0.23693,0.25 +2018-06-18,0.36832,0.5745,0.28046,0.25 +2018-06-19,0.3481,0.50289,0.29142,0.25 +2018-06-20,0.34254,0.48609,0.29152,0.25 +2018-06-21,0.35221,0.51072,0.2959,0.25 +2018-06-22,0.36565,0.55036,0.2966,0.25 +2018-06-25,0.33702,0.46602,0.29503,0.25 +2018-06-26,0.33415,0.46847,0.28397,0.25 +2018-06-27,0.30906,0.40846,0.26872,0.25 +2018-06-28,0.31646,0.43952,0.25985,0.25 +2018-06-29,0.32896,0.47181,0.26506,0.25 +2018-07-02,0.33838,0.49225,0.27288,0.25 +2018-07-03,0.34971,0.54776,0.25136,0.25 +2018-07-04,0.24635,0.50361,0.23544,0 +2018-07-05,0.23344,0.46046,0.23987,0 +2018-07-06,0.23181,0.4605,0.23494,0 +2018-07-09,0.22009,0.43472,0.22556,0 +2018-07-10,0.23068,0.46709,0.22496,0 +2018-07-11,0.24242,0.47896,0.24831,0 +2018-07-12,0.24182,0.47132,0.25415,0 +2018-07-13,0.23936,0.44915,0.26894,0 +2018-07-16,0.22756,0.41969,0.26299,0 +2018-07-17,0.2373,0.45136,0.26054,0 +2018-07-18,0.21851,0.39907,0.25647,0 +2018-07-19,0.23958,0.46455,0.25417,0 +2018-07-20,0.22091,0.41311,0.24964,0 +2018-07-23,0.22251,0.41658,0.25094,0 +2018-07-24,0.2226,0.41651,0.25131,0 +2018-07-25,0.22557,0.42016,0.25655,0 +2018-07-26,0.23901,0.4443,0.27272,0 +2018-07-27,0.21196,0.36594,0.26995,0 +2018-07-30,0.21569,0.38055,0.26652,0 +2018-07-31,0.2237,0.37962,0.29149,0 +2018-08-01,0.24177,0.41224,0.31306,0 +2018-08-02,0.22758,0.37766,0.30508,0 +2018-08-03,0.25205,0.4494,0.30675,0 +2018-08-06,0.24,0.41158,0.30841,0 +2018-08-07,0.27316,0.51121,0.30828,0 +2018-08-08,0.25721,0.46512,0.3065,0 +2018-08-09,0.22978,0.38426,0.30508,0 +2018-08-10,0.21495,0.35778,0.28707,0 +2018-08-13,0.20542,0.35417,0.2621,0 +2018-08-14,0.20886,0.37814,0.24843,0 +2018-08-16,0.20519,0.39626,0.21932,0 +2018-08-17,0.18402,0.36973,0.18234,0 +2018-08-20,0.19686,0.41996,0.17062,0 +2018-08-21,0.17448,0.35062,0.17282,0 +2018-08-23,0.20985,0.45612,0.17343,0 +2018-08-24,0.22989,0.52791,0.16176,0 +2018-08-27,0.30195,0.50478,0.15107,0.25 +2018-08-28,0.3081,0.52836,0.14593,0.25 +2018-08-29,0.30206,0.5108,0.14539,0.25 +2018-08-30,0.30847,0.53139,0.14402,0.25 +2018-08-31,0.31765,0.56049,0.14247,0.25 +2018-09-03,0.30147,0.50544,0.14897,0.25 +2018-09-04,0.30771,0.51373,0.1594,0.25 +2018-09-05,0.31141,0.51199,0.17222,0.25 +2018-09-06,0.31318,0.51069,0.17886,0.25 +2018-09-07,0.30167,0.48795,0.16708,0.25 +2018-09-10,0.38865,0.50969,0.15626,0.5 +2018-09-11,0.54532,0.71949,0.16646,0.75 +2018-09-12,0.55331,0.73594,0.17399,0.75 +2018-09-14,0.57182,0.74146,0.22399,0.75 +2018-09-17,0.63294,0.86051,0.28832,0.75 +2018-09-18,0.65467,0.86193,0.35209,0.75 +2018-09-19,0.67816,0.8937,0.39077,0.75 +2018-09-21,0.67281,0.85537,0.41304,0.75 +2018-09-24,0.76662,0.86662,0.43324,1 +2018-09-25,0.77645,0.87594,0.45342,1 +2018-09-26,0.75515,0.81792,0.44752,1 +2018-09-27,0.74986,0.80712,0.44245,1 +2018-09-28,0.74532,0.8042,0.43175,1 +2018-10-01,0.73874,0.80339,0.41282,1 +2018-10-03,0.73384,0.80088,0.40065,1 +2018-10-04,0.77283,0.90382,0.41467,1 +2018-10-05,0.81159,1,0.43476,1 +2018-10-08,0.7543,0.80771,0.45518,1 +2018-10-09,0.75358,0.79583,0.46492,1 +2018-10-10,0.76244,0.78824,0.49907,1 +2018-10-11,0.78703,0.83917,0.52192,1 +2018-10-12,0.82609,0.89295,0.58533,1 +2018-10-15,0.79874,0.79411,0.60213,1 +2018-10-16,0.7802,0.76772,0.57288,1 +2018-10-17,0.76939,0.76086,0.54732,1 +2018-10-19,0.76618,0.76186,0.5367,1 +2018-10-22,0.74838,0.72861,0.51651,1 +2018-10-23,0.72327,0.7116,0.45822,1 +2018-10-24,0.70188,0.69526,0.4104,1 +2018-10-25,0.69424,0.71138,0.37133,1 +2018-10-26,0.63612,0.70922,0.3658,0.83333 +2018-10-29,0.56794,0.69565,0.3415,0.66667 +2018-10-30,0.54566,0.64453,0.32577,0.66667 +2018-10-31,0.53209,0.61008,0.31953,0.66667 +2018-11-01,0.51336,0.55718,0.31624,0.66667 +2018-11-02,0.49696,0.51139,0.31282,0.66667 +2018-11-05,0.48148,0.47133,0.30645,0.66667 +2018-11-06,0.49797,0.52726,0.29997,0.66667 +2018-11-07,0.45262,0.55151,0.30636,0.5 +2018-11-09,0.46086,0.56404,0.31854,0.5 +2018-11-12,0.45604,0.55018,0.31792,0.5 +2018-11-13,0.44967,0.53962,0.30938,0.5 +2018-11-14,0.45193,0.5323,0.32349,0.5 +2018-11-15,0.47267,0.57005,0.34795,0.5 +2018-11-16,0.47909,0.56326,0.37402,0.5 +2018-11-19,0.38761,0.42324,0.40627,0.33333 +2018-11-20,0.36317,0.4971,0.42573,0.16667 +2018-11-21,0.36431,0.4743,0.45195,0.16667 +2018-11-22,0.3833,0.50321,0.48001,0.16667 +2018-11-26,0.36414,0.43702,0.48873,0.16667 +2018-11-27,0.24154,0.22956,0.49505,0 +2018-11-28,0.24511,0.28341,0.45192,0 +2018-11-29,0.22425,0.26156,0.4112,0 +2018-11-30,0.21962,0.24247,0.41638,0 +2018-12-03,0.22237,0.25499,0.41211,0 +2018-12-04,0.23757,0.31338,0.39932,0 +2018-12-05,0.23047,0.31346,0.37795,0 +2018-12-06,0.22857,0.32916,0.35654,0 +2018-12-07,0.23483,0.34786,0.35664,0 +2018-12-10,0.24088,0.36548,0.35715,0 +2018-12-11,0.22269,0.31709,0.35099,0 +2018-12-12,0.22826,0.3248,0.35999,0 +2018-12-13,0.23433,0.32404,0.37895,0 +2018-12-14,0.26093,0.40602,0.37676,0 +2018-12-17,0.27857,0.46975,0.36597,0 +2018-12-18,0.28531,0.51312,0.34281,0 +2018-12-19,0.28096,0.49221,0.35066,0 +2018-12-20,0.28619,0.49966,0.3589,0 +2018-12-21,0.31663,0.42391,0.35931,0.16667 +2018-12-24,0.3271,0.45551,0.35912,0.16667 +2018-12-26,0.32404,0.44786,0.35761,0.16667 +2018-12-27,0.33067,0.46806,0.35729,0.16667 +2018-12-28,0.31676,0.44124,0.34238,0.16667 +2018-12-31,0.30969,0.43631,0.32609,0.16667 +2019-01-02,0.30699,0.44277,0.31152,0.16667 +2019-01-03,0.30297,0.43845,0.30379,0.16667 +2019-01-04,0.304,0.43543,0.30989,0.16667 +2019-01-07,0.30695,0.44178,0.3124,0.16667 +2019-01-08,0.31201,0.45596,0.31341,0.16667 +2019-01-09,0.32034,0.46889,0.32547,0.16667 +2019-01-10,0.32522,0.47211,0.33687,0.16667 +2019-01-11,0.3411,0.50481,0.35181,0.16667 +2019-01-14,0.36599,0.54005,0.39125,0.16667 +2019-01-15,0.35367,0.49827,0.39608,0.16667 +2019-01-16,0.32318,0.40871,0.39418,0.16667 +2019-01-17,0.33254,0.45557,0.37539,0.16667 +2019-01-18,0.341,0.48154,0.3748,0.16667 +2019-01-21,0.33943,0.46123,0.39038,0.16667 +2019-01-22,0.33057,0.42191,0.40315,0.16667 +2019-01-23,0.32678,0.40566,0.40802,0.16667 +2019-01-24,0.32799,0.37954,0.43778,0.16667 +2019-01-25,0.31626,0.36358,0.41852,0.16667 +2019-01-28,0.3032,0.37815,0.36478,0.16667 +2019-01-29,0.2708,0.35075,0.29498,0.16667 +2019-01-30,0.28245,0.40663,0.27407,0.16667 +2019-01-31,0.2979,0.32283,0.23753,0.33333 +2019-02-01,0.30146,0.33622,0.23483,0.33333 +2019-02-04,0.32478,0.40369,0.23734,0.33333 +2019-02-05,0.24642,0.3376,0.235,0.16667 +2019-02-06,0.23202,0.29962,0.22977,0.16667 +2019-02-07,0.21516,0.26059,0.21823,0.16667 +2019-02-08,0.20376,0.22663,0.21797,0.16667 +2019-02-11,0.20351,0.24524,0.19861,0.16667 +2019-02-12,0.19967,0.25008,0.18228,0.16667 +2019-02-14,0.18685,0.23254,0.16133,0.16667 +2019-02-15,0.18041,0.21389,0.16068,0.16667 +2019-02-18,0.18832,0.20372,0.19458,0.16667 +2019-02-19,0.20192,0.19328,0.24582,0.16667 +2019-02-20,0.19856,0.18316,0.24587,0.16667 +2019-02-21,0.20015,0.18754,0.24625,0.16667 +2019-02-22,0.19861,0.18312,0.24605,0.16667 +2019-02-25,0.19241,0.16737,0.24321,0.16667 +2019-02-26,0.17801,0.14803,0.21934,0.16667 +2019-02-27,0.19494,0.19842,0.21973,0.16667 +2019-02-28,0.18909,0.1792,0.2214,0.16667 +2019-03-01,0.17733,0.12882,0.23651,0.16667 +2019-03-05,0.18077,0.13785,0.23781,0.16667 +2019-03-06,0.18392,0.1464,0.23869,0.16667 +2019-03-07,0.18929,0.15854,0.24267,0.16667 +2019-03-08,0.20907,0.20943,0.25111,0.16667 +2019-03-11,0.19517,0.18733,0.23151,0.16667 +2019-03-12,0.21297,0.25095,0.22128,0.16667 +2019-03-13,0.21906,0.26888,0.22164,0.16667 +2019-03-14,0.20999,0.24091,0.22239,0.16667 +2019-03-15,0.22878,0.31007,0.2096,0.16667 +2019-03-18,0.15846,0.27916,0.19623,0 +2019-03-19,0.15818,0.27699,0.19755,0 +2019-03-20,0.14591,0.24373,0.19398,0 +2019-03-22,0.15842,0.28009,0.19518,0 +2019-03-25,0.17751,0.33701,0.19552,0 +2019-03-26,0.21411,0.44259,0.19973,0 +2019-03-27,0.19691,0.42152,0.16921,0 +2019-03-28,0.19224,0.39723,0.17951,0 +2019-04-01,0.20848,0.43053,0.19491,0 +2019-04-02,0.21345,0.4356,0.20474,0 +2019-04-03,0.22267,0.45085,0.21716,0 +2019-04-04,0.21823,0.46028,0.19441,0 +2019-04-05,0.21227,0.49472,0.14207,0 +2019-04-08,0.2157,0.50505,0.14205,0 +2019-04-09,0.2133,0.5005,0.13941,0 +2019-04-10,0.22554,0.53802,0.13862,0 +2019-04-11,0.22166,0.52455,0.14044,0 +2019-04-12,0.22355,0.5303,0.14035,0 +2019-04-15,0.21695,0.50599,0.14487,0 +2019-04-16,0.2169,0.50477,0.14594,0 +2019-04-18,0.20503,0.47653,0.13856,0 +2019-04-22,0.24232,0.4153,0.145,0.16667 +2019-04-23,0.21828,0.3423,0.14588,0.16667 +2019-04-24,0.18644,0.22923,0.16343,0.16667 +2019-04-25,0.21625,0.29956,0.18252,0.16667 +2019-04-26,0.19762,0.21368,0.21253,0.16667 +2019-04-30,0.19684,0.19997,0.22388,0.16667 +2019-05-02,0.20628,0.22022,0.23196,0.16667 +2019-05-03,0.22615,0.28795,0.22384,0.16667 +2019-05-06,0.21527,0.25961,0.21953,0.16667 +2019-05-07,0.22172,0.28882,0.20966,0.16667 +2019-05-08,0.22566,0.32927,0.18104,0.16667 +2019-05-09,0.21553,0.30336,0.17655,0.16667 +2019-05-10,0.22246,0.32289,0.17783,0.16667 +2019-05-13,0.20341,0.24409,0.19947,0.16667 +2019-05-14,0.2159,0.27992,0.2011,0.16667 +2019-05-15,0.2246,0.3037,0.20343,0.16667 +2019-05-16,0.21403,0.27133,0.20408,0.16667 +2019-05-17,0.23819,0.33733,0.21058,0.16667 +2019-05-20,0.4498,0.63053,0.38553,0.33333 +2019-05-21,0.48709,0.60313,0.52482,0.33333 +2019-05-22,0.50225,0.58851,0.5849,0.33333 +2019-05-23,0.51954,0.58713,0.63817,0.33333 +2019-05-24,0.52682,0.57719,0.66992,0.33333 +2019-05-27,0.52805,0.56725,0.68357,0.33333 +2019-05-28,0.53043,0.5707,0.68724,0.33333 +2019-05-29,0.52058,0.56429,0.66411,0.33333 +2019-05-30,0.51151,0.55626,0.64493,0.33333 +2019-05-31,0.50538,0.55979,0.62303,0.33333 +2019-06-03,0.49186,0.5365,0.60575,0.33333 +2019-06-04,0.48921,0.54564,0.58866,0.33333 +2019-06-06,0.43506,0.55866,0.57985,0.16667 +2019-06-07,0.4284,0.55188,0.56665,0.16667 +2019-06-10,0.43263,0.56745,0.56376,0.16667 +2019-06-11,0.43604,0.57721,0.56425,0.16667 +2019-06-12,0.44252,0.59484,0.56604,0.16667 +2019-06-13,0.44264,0.58176,0.5795,0.16667 +2019-06-14,0.43852,0.55796,0.59094,0.16667 +2019-06-17,0.44263,0.56543,0.59579,0.16667 +2019-06-18,0.43927,0.54258,0.60858,0.16667 +2019-06-19,0.45063,0.56981,0.6154,0.16667 +2019-06-20,0.44433,0.55412,0.61221,0.16667 +2019-06-21,0.43159,0.54865,0.57944,0.16667 +2019-06-24,0.42289,0.55866,0.54334,0.16667 +2019-06-25,0.41019,0.55884,0.50505,0.16667 +2019-06-26,0.40852,0.55615,0.50275,0.16667 +2019-06-27,0.4117,0.57046,0.49799,0.16667 +2019-06-28,0.41566,0.57672,0.5036,0.16667 +2019-07-01,0.3904,0.48159,0.52294,0.16667 +2019-07-02,0.282,0.30977,0.53622,0 +2019-07-03,0.29358,0.3504,0.53034,0 +2019-07-04,0.31013,0.38457,0.54583,0 +2019-07-05,0.27783,0.3308,0.50271,0 +2019-07-08,0.35413,0.46109,0.43463,0.16667 +2019-07-09,0.29079,0.35977,0.34593,0.16667 +2019-07-10,0.24784,0.36489,0.21196,0.16667 +2019-07-11,0.24943,0.36381,0.21781,0.16667 +2019-07-12,0.25164,0.36385,0.22441,0.16667 +2019-07-15,0.26936,0.41051,0.2309,0.16667 +2019-07-16,0.27077,0.4076,0.23805,0.16667 +2019-07-17,0.27995,0.40322,0.26994,0.16667 +2019-07-18,0.29201,0.42964,0.27973,0.16667 +2019-07-19,0.35536,0.45781,0.27493,0.33333 +2019-07-22,0.35493,0.4607,0.27077,0.33333 +2019-07-23,0.35213,0.4551,0.26796,0.33333 +2019-07-24,0.35016,0.45276,0.26439,0.33333 +2019-07-25,0.35827,0.46738,0.2741,0.33333 +2019-07-26,0.36042,0.46517,0.28275,0.33333 +2019-07-29,0.37113,0.49223,0.28782,0.33333 +2019-07-30,0.37452,0.47729,0.31294,0.33333 +2019-07-31,0.39029,0.51386,0.32368,0.33333 +2019-08-01,0.37347,0.45713,0.32994,0.33333 +2019-08-02,0.36692,0.43572,0.33172,0.33333 +2019-08-05,0.35874,0.41221,0.33067,0.33333 +2019-08-06,0.36507,0.43426,0.32762,0.33333 +2019-08-07,0.36322,0.42815,0.32817,0.33333 +2019-08-08,0.37702,0.4437,0.35403,0.33333 +2019-08-09,0.38693,0.44695,0.38051,0.33333 +2019-08-13,0.39705,0.44961,0.40821,0.33333 +2019-08-14,0.40042,0.4493,0.41863,0.33333 +2019-08-16,0.37744,0.39938,0.39961,0.33333 +2019-08-19,0.38588,0.46381,0.36049,0.33333 +2019-08-20,0.36624,0.41709,0.34828,0.33333 +2019-08-21,0.34956,0.53539,0.34663,0.16667 +2019-08-22,0.35295,0.54654,0.34565,0.16667 +2019-08-23,0.35527,0.55345,0.34568,0.16667 +2019-08-26,0.41809,0.56053,0.36041,0.33333 +2019-08-27,0.39483,0.47639,0.37476,0.33333 +2019-08-28,0.40046,0.47858,0.38946,0.33333 +2019-08-29,0.40239,0.46768,0.40616,0.33333 +2019-08-30,0.39263,0.46543,0.37914,0.33333 +2019-09-03,0.44169,0.45086,0.37422,0.5 +2019-09-04,0.37773,0.41656,0.3833,0.33333 +2019-09-05,0.38053,0.4343,0.37394,0.33333 +2019-09-06,0.36895,0.40953,0.36398,0.33333 +2019-09-09,0.35709,0.38797,0.34997,0.33333 +2019-09-11,0.3401,0.36765,0.31931,0.33333 +2019-09-12,0.33667,0.38741,0.28926,0.33333 +2019-09-13,0.34178,0.38652,0.30547,0.33333 +2019-09-16,0.33463,0.39124,0.27932,0.33333 +2019-09-17,0.32248,0.39971,0.23441,0.33333 +2019-09-18,0.30565,0.37603,0.20759,0.33333 +2019-09-19,0.29747,0.37617,0.18291,0.33333 +2019-09-20,0.4529,0.5087,0.35,0.5 +2019-09-23,0.56593,0.71908,0.47872,0.5 +2019-09-24,0.57204,0.65629,0.55984,0.5 +2019-09-25,0.59497,0.65299,0.63191,0.5 +2019-09-26,0.60848,0.66131,0.66414,0.5 +2019-09-27,0.61822,0.66139,0.69327,0.5 +2019-09-30,0.62609,0.66948,0.70878,0.5 +2019-10-01,0.6168,0.65046,0.69995,0.5 +2019-10-03,0.6178,0.63393,0.71947,0.5 +2019-10-04,0.61986,0.62738,0.73221,0.5 +2019-10-07,0.62297,0.62667,0.74223,0.5 +2019-10-09,0.62069,0.61804,0.74404,0.5 +2019-10-10,0.62096,0.62063,0.74226,0.5 +2019-10-11,0.57664,0.64643,0.75017,0.33333 +2019-10-14,0.58007,0.6459,0.76098,0.33333 +2019-10-15,0.58423,0.64815,0.77119,0.33333 +2019-10-16,0.59306,0.65044,0.79542,0.33333 +2019-10-17,0.60572,0.66147,0.82236,0.33333 +2019-10-18,0.57194,0.68349,0.86567,0.16667 +2019-10-22,0.58399,0.67529,0.91002,0.16667 +2019-10-23,0.59653,0.6826,0.94032,0.16667 +2019-10-24,0.61139,0.69688,0.97062,0.16667 +2019-10-25,0.62437,0.70643,1,0.16667 +2019-10-29,0.61277,0.67164,1,0.16667 +2019-10-30,0.60767,0.65634,1,0.16667 +2019-10-31,0.60272,0.66278,0.97871,0.16667 +2019-11-01,0.60908,0.68408,0.97651,0.16667 +2019-11-04,0.62546,0.71195,0.99777,0.16667 +2019-11-05,0.6318,0.72873,1,0.16667 +2019-11-06,0.66935,0.84138,1,0.16667 +2019-11-07,0.41866,0.25598,1,0 +2019-11-08,0.44924,0.34772,1,0 +2019-11-11,0.45354,0.37706,0.98354,0 +2019-11-13,0.4096,0.30887,0.91993,0 +2019-11-14,0.38457,0.30949,0.84421,0 +2019-11-15,0.33647,0.32741,0.68198,0 +2019-11-18,0.25842,0.37228,0.40297,0 +2019-11-19,0.23311,0.38583,0.31351,0 +2019-11-20,0.24605,0.39792,0.34024,0 +2019-11-21,0.25455,0.4051,0.35853,0 +2019-11-22,0.26664,0.415,0.38492,0 +2019-11-25,0.29333,0.34361,0.36971,0.16667 +2019-11-26,0.27624,0.31399,0.34806,0.16667 +2019-11-27,0.2633,0.31672,0.3065,0.16667 +2019-11-28,0.25247,0.324,0.26673,0.16667 +2019-11-29,0.23728,0.33046,0.2147,0.16667 +2019-12-02,0.23139,0.32177,0.20574,0.16667 +2019-12-03,0.21955,0.2883,0.20369,0.16667 +2019-12-04,0.21685,0.27689,0.207,0.16667 +2019-12-05,0.22216,0.28985,0.20997,0.16667 +2019-12-06,0.21124,0.25489,0.21217,0.16667 +2019-12-09,0.19609,0.20169,0.2199,0.16667 +2019-12-10,0.22206,0.27043,0.22909,0.16667 +2019-12-11,0.18552,0.18177,0.20812,0.16667 +2019-12-12,0.18125,0.18581,0.19128,0.16667 +2019-12-13,0.18011,0.19497,0.17869,0.16667 +2019-12-16,0.17129,0.16704,0.18017,0.16667 +2019-12-17,0.16325,0.14452,0.17857,0.16667 +2019-12-18,0.1628,0.14505,0.17667,0.16667 +2019-12-19,0.16571,0.14441,0.18605,0.16667 +2019-12-20,0.1614,0.17734,0.14018,0.16667 +2019-12-23,0.19595,0.28083,0.14034,0.16667 +2019-12-24,0.20622,0.3106,0.1414,0.16667 +2019-12-26,0.20824,0.31714,0.1409,0.16667 +2019-12-27,0.21992,0.35377,0.13932,0.16667 +2019-12-30,0.18648,0.25458,0.1382,0.16667 +2019-12-31,0.17507,0.22417,0.13438,0.16667 +2020-01-01,0.16776,0.20505,0.13156,0.16667 +2020-01-02,0.15436,0.17673,0.11969,0.16667 +2020-01-03,0.14965,0.17161,0.11066,0.16667 +2020-01-06,0.23647,0.21298,0.1631,0.33333 +2020-01-07,0.2169,0.28374,0.20031,0.16667 +2020-01-08,0.22698,0.28593,0.22834,0.16667 +2020-01-09,0.29264,0.24879,0.29579,0.33333 +2020-01-10,0.30586,0.23766,0.34659,0.33333 +2020-01-13,0.32231,0.25065,0.38296,0.33333 +2020-01-14,0.32647,0.23672,0.40936,0.33333 +2020-01-15,0.33472,0.25761,0.4132,0.33333 +2020-01-16,0.34035,0.28253,0.40519,0.33333 +2020-01-17,0.35627,0.33736,0.3981,0.33333 +2020-01-20,0.34907,0.31739,0.39649,0.33333 +2020-01-21,0.34743,0.31982,0.38915,0.33333 +2020-01-22,0.34783,0.32176,0.38841,0.33333 +2020-01-23,0.34723,0.32123,0.38714,0.33333 +2020-01-24,0.34595,0.32098,0.38356,0.33333 +2020-01-27,0.35228,0.34103,0.38249,0.33333 +2020-01-28,0.35679,0.35533,0.3817,0.33333 +2020-01-29,0.35672,0.35853,0.37829,0.33333 +2020-01-30,0.35507,0.35775,0.37413,0.33333 +2020-01-31,0.34049,0.33869,0.34944,0.33333 +2020-02-03,0.38727,0.32687,0.33495,0.5 +2020-02-04,0.55228,0.59991,0.39028,0.66667 +2020-02-05,0.56628,0.60689,0.4253,0.66667 +2020-02-06,0.57337,0.60105,0.4524,0.66667 +2020-02-07,0.58763,0.62842,0.46782,0.66667 +2020-02-10,0.59118,0.63621,0.47066,0.66667 +2020-02-11,0.59291,0.641,0.47105,0.66667 +2020-02-12,0.58971,0.6495,0.45295,0.66667 +2020-02-13,0.59185,0.64788,0.461,0.66667 +2020-02-14,0.615,0.70607,0.47226,0.66667 +2020-02-17,0.58227,0.75427,0.49254,0.5 +2020-02-18,0.58747,0.75177,0.51064,0.5 +2020-02-19,0.60711,0.80247,0.51886,0.5 +2020-02-20,0.56623,0.83846,0.52688,0.33333 +2020-02-24,0.59056,0.7471,0.52458,0.5 +2020-02-25,0.55703,0.64843,0.52265,0.5 +2020-02-26,0.5449,0.6136,0.52109,0.5 +2020-02-27,0.52569,0.57085,0.50621,0.5 +2020-02-28,0.53926,0.42285,0.52826,0.66667 +2020-03-02,0.52698,0.39755,0.51671,0.66667 +2020-03-03,0.52821,0.39324,0.52472,0.66667 +2020-03-04,0.51806,0.37052,0.51699,0.66667 +2020-03-05,0.51519,0.38245,0.49646,0.66667 +2020-03-06,0.55026,0.32716,0.49029,0.83333 +2020-03-09,0.70653,0.57544,0.54414,1 +2020-03-11,0.66875,0.44386,0.56239,1 +2020-03-12,0.69074,0.32507,0.74714,1 +2020-03-13,0.80925,0.53351,0.89423,1 +2020-03-16,0.87615,0.62844,1,1 +2020-03-17,0.87904,0.63711,1,1 +2020-03-18,0.88194,0.64582,1,1 +2020-03-19,0.84254,0.65263,1,0.875 +2020-03-20,0.84159,0.64976,1,0.875 +2020-03-23,0.91844,0.75533,1,1 +2020-03-24,0.88776,0.66329,1,1 +2020-03-25,0.88252,0.64757,1,1 +2020-03-26,0.88107,0.64321,1,1 +2020-03-27,0.86334,0.61955,0.97048,1 +2020-03-30,0.83873,0.58817,0.92801,1 +2020-03-31,0.81748,0.5741,0.87833,1 +2020-04-01,0.79253,0.5564,0.82119,1 +2020-04-03,0.76666,0.53536,0.76463,1 +2020-04-07,0.73448,0.49325,0.71017,1 +2020-04-08,0.6959,0.43183,0.65588,1 +2020-04-09,0.63154,0.41246,0.60718,0.875 +2020-04-13,0.60499,0.38055,0.55942,0.875 +2020-04-15,0.58715,0.3743,0.51216,0.875 +2020-04-16,0.5817,0.40273,0.46738,0.875 +2020-04-17,0.53252,0.40965,0.43792,0.75 +2020-04-20,0.52311,0.39675,0.42258,0.75 +2020-04-21,0.51306,0.382,0.40717,0.75 +2020-04-22,0.49724,0.34512,0.39662,0.75 +2020-04-23,0.49284,0.34079,0.38772,0.75 +2020-04-24,0.45573,0.36262,0.37955,0.625 +2020-04-27,0.42455,0.39186,0.3818,0.5 +2020-04-28,0.45253,0.47151,0.38608,0.5 +2020-04-29,0.42103,0.47958,0.40852,0.375 +2020-04-30,0.43141,0.47525,0.44397,0.375 +2020-05-04,0.39765,0.48752,0.45543,0.25 +2020-05-05,0.39571,0.47077,0.46637,0.25 +2020-05-06,0.36679,0.49711,0.47826,0.125 +2020-05-07,0.37947,0.5231,0.49032,0.125 +2020-05-08,0.34855,0.41866,0.50199,0.125 +2020-05-11,0.31326,0.43611,0.50366,0 +2020-05-12,0.32558,0.46526,0.51148,0 +2020-05-13,0.31287,0.4091,0.52951,0 +2020-05-14,0.31913,0.43557,0.52183,0 +2020-05-15,0.32609,0.46746,0.51081,0 +2020-05-18,0.28889,0.40368,0.46297,0 +2020-05-19,0.24777,0.35121,0.3921,0 +2020-05-20,0.24588,0.34388,0.39377,0 +2020-05-21,0.22675,0.28973,0.39053,0 +2020-05-22,0.2512,0.38044,0.37316,0 +2020-05-26,0.26919,0.44973,0.35785,0 +2020-05-27,0.24381,0.41859,0.31284,0 +2020-05-28,0.23831,0.42387,0.29105,0 +2020-05-29,0.22276,0.40818,0.2601,0 +2020-06-01,0.21942,0.41791,0.24034,0 +2020-06-02,0.22703,0.4562,0.22488,0 +2020-06-03,0.25044,0.50206,0.24927,0 +2020-06-04,0.25602,0.49954,0.26853,0 +2020-06-05,0.26958,0.50934,0.29941,0 +2020-06-08,0.28183,0.51751,0.32798,0 +2020-06-09,0.2883,0.52208,0.34281,0 +2020-06-10,0.29771,0.52466,0.36847,0 +2020-06-11,0.30001,0.51707,0.38295,0 +2020-06-12,0.298,0.49624,0.39775,0 +2020-06-15,0.23067,0.28901,0.403,0 +2020-06-16,0.21975,0.26841,0.39082,0 +2020-06-17,0.21483,0.27143,0.37306,0 +2020-06-18,0.19508,0.24061,0.34462,0 +2020-06-19,0.1823,0.23948,0.30742,0 +2020-06-22,0.15524,0.20009,0.26564,0 +2020-06-23,0.12234,0.15072,0.21631,0 +2020-06-24,0.12138,0.16909,0.19504,0 +2020-06-25,0.10009,0.11372,0.18655,0 +2020-06-26,0.12244,0.17782,0.1895,0 +2020-06-29,0.15353,0.2664,0.19419,0 +2020-06-30,0.17763,0.33685,0.19604,0 +2020-07-01,0.18306,0.35664,0.19255,0 +2020-07-02,0.18704,0.3899,0.17123,0 +2020-07-03,0.17681,0.37311,0.15732,0 +2020-07-06,0.16263,0.33703,0.15086,0 +2020-07-07,0.19885,0.44067,0.15587,0 +2020-07-08,0.14207,0.32156,0.10465,0 +2020-07-09,0.14721,0.32453,0.11711,0 +2020-07-10,0.15007,0.3257,0.12452,0 +2020-07-13,0.12942,0.25674,0.13151,0 +2020-07-14,0.11499,0.2187,0.12628,0 +2020-07-15,0.095639,0.15663,0.13028,0 +2020-07-16,0.095929,0.15679,0.131,0 +2020-07-17,0.099516,0.17315,0.1254,0 +2020-07-20,0.10259,0.18769,0.12009,0 +2020-07-21,0.10488,0.19527,0.11938,0 +2020-07-22,0.10486,0.1999,0.11467,0 +2020-07-23,0.12294,0.23014,0.13867,0 +2020-07-24,0.13925,0.26202,0.15573,0 +2020-07-27,0.14659,0.27926,0.1605,0 +2020-07-28,0.14416,0.26789,0.1646,0 +2020-07-29,0.16274,0.32363,0.16458,0 +2020-07-30,0.12156,0.21575,0.14894,0 +2020-07-31,0.1149,0.22759,0.1171,0 +2020-08-03,0.10235,0.19479,0.11225,0 +2020-08-04,0.1175,0.23824,0.11426,0 +2020-08-05,0.11035,0.21547,0.11557,0 +2020-08-06,0.10941,0.21934,0.10888,0 +2020-08-07,0.10948,0.22471,0.10374,0 +2020-08-10,0.11319,0.23876,0.10081,0 +2020-08-11,0.12647,0.2785,0.10092,0 +2020-08-12,0.13576,0.29342,0.11385,0 +2020-08-13,0.17349,0.35782,0.16265,0 +2020-08-14,0.17444,0.35297,0.17034,0 +2020-08-17,0.18678,0.37593,0.18441,0 +2020-08-18,0.18684,0.37352,0.187,0 +2020-08-19,0.17997,0.34767,0.19222,0 +2020-08-20,0.18125,0.35161,0.19215,0 +2020-08-21,0.17527,0.33264,0.19318,0 +2020-08-24,0.18816,0.37364,0.19084,0 +2020-08-25,0.21367,0.44195,0.19906,0 +2020-08-26,0.22875,0.47728,0.20897,0 +2020-08-27,0.22281,0.44273,0.2257,0 +2020-08-28,0.20913,0.39229,0.2351,0 +2020-08-31,0.24834,0.38745,0.23256,0.125 +2020-09-01,0.25935,0.42285,0.23021,0.125 +2020-09-02,0.25779,0.42373,0.22464,0.125 +2020-09-03,0.25931,0.43469,0.21822,0.125 +2020-09-04,0.23872,0.37047,0.22067,0.125 +2020-09-07,0.22988,0.33803,0.22661,0.125 +2020-09-08,0.23102,0.34054,0.22753,0.125 +2020-09-09,0.23437,0.34753,0.23057,0.125 +2020-09-10,0.23023,0.33587,0.2298,0.125 +2020-09-11,0.22861,0.33173,0.2291,0.125 +2020-09-14,0.19156,0.22048,0.2292,0.125 +2020-09-15,0.20563,0.26606,0.22582,0.125 +2020-09-16,0.20776,0.27978,0.21849,0.125 +2020-09-17,0.21033,0.29357,0.21241,0.125 +2020-09-18,0.20392,0.27843,0.20831,0.125 +2020-09-21,0.22524,0.21969,0.20603,0.25 +2020-09-22,0.23854,0.26084,0.20479,0.25 +2020-09-23,0.22259,0.21776,0.2,0.25 +2020-09-24,0.24804,0.19156,0.17756,0.375 +2020-09-25,0.34445,0.43347,0.22489,0.375 +2020-09-28,0.38235,0.49465,0.27739,0.375 +2020-09-29,0.38959,0.47592,0.31785,0.375 +2020-09-30,0.40097,0.49991,0.32799,0.375 +2020-10-01,0.39784,0.47978,0.33874,0.375 +2020-10-05,0.39873,0.4763,0.3449,0.375 +2020-10-06,0.39858,0.47368,0.34707,0.375 +2020-10-07,0.39417,0.4592,0.34831,0.375 +2020-10-08,0.39407,0.45144,0.35578,0.375 +2020-10-09,0.39545,0.4462,0.36515,0.375 +2020-10-12,0.4057,0.4668,0.3753,0.375 +2020-10-13,0.38796,0.50691,0.40696,0.25 +2020-10-14,0.40419,0.52557,0.43699,0.25 +2020-10-15,0.42733,0.47068,0.4363,0.375 +2020-10-16,0.43273,0.48761,0.43558,0.375 +2020-10-19,0.44226,0.51596,0.43582,0.375 +2020-10-20,0.43563,0.4956,0.43629,0.375 +2020-10-21,0.4368,0.49905,0.43636,0.375 +2020-10-22,0.44417,0.53006,0.42746,0.375 +2020-10-23,0.456,0.56836,0.42464,0.375 +2020-10-26,0.44612,0.53176,0.4316,0.375 +2020-10-27,0.44712,0.53012,0.43625,0.375 +2020-10-28,0.44401,0.53137,0.42566,0.375 +2020-10-29,0.43721,0.52002,0.41661,0.375 +2020-10-30,0.43872,0.52793,0.41323,0.375 +2020-11-02,0.46528,0.6134,0.40744,0.375 +2020-11-03,0.42057,0.60472,0.40697,0.25 +2020-11-04,0.42168,0.60553,0.40951,0.25 +2020-11-05,0.45895,0.71821,0.40862,0.25 +2020-11-06,0.36934,0.56653,0.41649,0.125 +2020-11-09,0.34794,0.50267,0.41615,0.125 +2020-11-10,0.37661,0.59671,0.40811,0.125 +2020-11-11,0.36314,0.56102,0.40341,0.125 +2020-11-12,0.36769,0.601,0.37706,0.125 +2020-11-13,0.36093,0.62634,0.33144,0.125 +2020-11-17,0.33352,0.60601,0.26955,0.125 +2020-11-18,0.3335,0.60321,0.27229,0.125 +2020-11-19,0.32568,0.58688,0.26515,0.125 +2020-11-20,0.31849,0.5792,0.25125,0.125 +2020-11-23,0.30898,0.57624,0.22569,0.125 +2020-11-24,0.28335,0.52374,0.20131,0.125 +2020-11-25,0.26266,0.48704,0.17593,0.125 +2020-11-26,0.29511,0.61274,0.1476,0.125 +2020-11-27,0.26672,0.65561,0.14456,0 +2020-12-01,0.25547,0.62726,0.13916,0 +2020-12-02,0.24642,0.60717,0.1321,0 +2020-12-03,0.2524,0.63117,0.12603,0 +2020-12-04,0.23692,0.59209,0.11866,0 +2020-12-07,0.23098,0.55928,0.13367,0 +2020-12-08,0.25347,0.61101,0.14939,0 +2020-12-09,0.25292,0.58245,0.17631,0 +2020-12-10,0.25068,0.5581,0.19394,0 +2020-12-11,0.27354,0.60825,0.21239,0 +2020-12-14,0.28303,0.61824,0.23084,0 +2020-12-15,0.29081,0.62021,0.25222,0 +2020-12-16,0.30566,0.64685,0.27013,0 +2020-12-17,0.30762,0.64271,0.28014,0 +2020-12-18,0.32591,0.67385,0.3039,0 +2020-12-21,0.29425,0.42193,0.33582,0.125 +2020-12-22,0.31852,0.45205,0.3785,0.125 +2020-12-23,0.31876,0.41653,0.41477,0.125 +2020-12-24,0.32427,0.41376,0.43405,0.125 +2020-12-28,0.32523,0.42239,0.42829,0.125 +2020-12-29,0.32482,0.4055,0.44397,0.125 +2020-12-30,0.33913,0.43584,0.45654,0.125 +2020-12-31,0.3565,0.46772,0.47677,0.125 +2021-01-01,0.37522,0.5036,0.49707,0.125 +2021-01-04,0.38365,0.49954,0.52639,0.125 +2021-01-05,0.39443,0.49721,0.56109,0.125 +2021-01-06,0.40651,0.50645,0.58807,0.125 +2021-01-07,0.41242,0.49883,0.61342,0.125 +2021-01-08,0.39402,0.43194,0.62513,0.125 +2021-01-11,0.40978,0.4684,0.63594,0.125 +2021-01-12,0.4184,0.48337,0.64682,0.125 +2021-01-13,0.43038,0.50993,0.6562,0.125 +2021-01-14,0.43273,0.50808,0.66511,0.125 +2021-01-15,0.43172,0.50334,0.66684,0.125 +2021-01-18,0.43589,0.51623,0.66645,0.125 +2021-01-19,0.44025,0.54688,0.64885,0.125 +2021-01-20,0.43897,0.56373,0.62819,0.125 +2021-01-21,0.43242,0.56798,0.60427,0.125 +2021-01-22,0.41598,0.53621,0.58674,0.125 +2021-01-25,0.40776,0.53125,0.56703,0.125 +2021-01-27,0.39818,0.52167,0.54787,0.125 +2021-01-28,0.39618,0.5392,0.52434,0.125 +2021-01-29,0.39125,0.54733,0.50141,0.125 +2021-02-01,0.46006,0.58816,0.54201,0.25 +2021-02-02,0.54802,0.8175,0.57656,0.25 +2021-02-03,0.52589,0.8315,0.62118,0.125 +2021-02-04,0.53571,0.83121,0.65092,0.125 +2021-02-05,0.54057,0.83396,0.66275,0.125 +2021-02-08,0.5373,0.81984,0.66706,0.125 +2021-02-09,0.53191,0.80332,0.66739,0.125 +2021-02-10,0.5396,0.8148,0.67899,0.125 +2021-02-11,0.54962,0.81253,0.71133,0.125 +2021-02-12,0.54626,0.80761,0.70618,0.125 +2021-02-15,0.54124,0.80081,0.69791,0.125 +2021-02-16,0.53482,0.79278,0.68668,0.125 +2021-02-17,0.52873,0.78914,0.67204,0.125 +2021-02-18,0.52143,0.78065,0.65863,0.125 +2021-02-19,0.52325,0.80415,0.64059,0.125 +2021-02-22,0.51556,0.79603,0.62565,0.125 +2021-02-23,0.49724,0.75637,0.61033,0.125 +2021-02-24,0.47729,0.71869,0.58819,0.125 +2021-02-25,0.45885,0.68586,0.5657,0.125 +2021-02-26,0.47717,0.63581,0.54569,0.25 +2021-03-01,0.47726,0.64418,0.5376,0.25 +2021-03-02,0.47618,0.64465,0.5339,0.25 +2021-03-03,0.47412,0.64454,0.52783,0.25 +2021-03-04,0.46826,0.63328,0.52149,0.25 +2021-03-05,0.46827,0.64286,0.51196,0.25 +2021-03-08,0.46838,0.64941,0.50573,0.25 +2021-03-09,0.47103,0.65914,0.50396,0.25 +2021-03-10,0.47397,0.66425,0.50766,0.25 +2021-03-12,0.47531,0.66609,0.50982,0.25 +2021-03-15,0.48807,0.70025,0.51397,0.25 +2021-03-16,0.39854,0.53873,0.53191,0.125 +2021-03-17,0.39402,0.52319,0.53387,0.125 +2021-03-18,0.39451,0.52726,0.53128,0.125 +2021-03-19,0.3906,0.5246,0.52219,0.125 +2021-03-22,0.3899,0.52226,0.52245,0.125 +2021-03-23,0.40101,0.55229,0.52573,0.125 +2021-03-24,0.38408,0.49932,0.52792,0.125 +2021-03-25,0.38077,0.49635,0.52095,0.125 +2021-03-26,0.36374,0.47602,0.4902,0.125 +2021-03-30,0.35563,0.48383,0.45806,0.125 +2021-03-31,0.34204,0.47334,0.42777,0.125 +2021-04-01,0.32347,0.44741,0.39799,0.125 +2021-04-05,0.30797,0.43387,0.36505,0.125 +2021-04-06,0.28919,0.4094,0.33317,0.125 +2021-04-07,0.2883,0.43262,0.30727,0.125 +2021-04-08,0.30197,0.48506,0.29586,0.125 +2021-04-09,0.32456,0.55447,0.2942,0.125 +2021-04-12,0.33301,0.45811,0.29092,0.25 +2021-04-13,0.35559,0.52779,0.28898,0.25 +2021-04-15,0.29062,0.4618,0.28507,0.125 +2021-04-16,0.29498,0.48563,0.27432,0.125 +2021-04-19,0.27928,0.45207,0.26077,0.125 +2021-04-20,0.26567,0.42357,0.24844,0.125 +2021-04-22,0.2624,0.43141,0.2308,0.125 +2021-04-23,0.25983,0.43594,0.21855,0.125 +2021-04-26,0.25438,0.43303,0.20512,0.125 +2021-04-27,0.25535,0.43101,0.21004,0.125 +2021-04-28,0.25539,0.4314,0.20977,0.125 +2021-04-29,0.25499,0.41177,0.22819,0.125 +2021-04-30,0.23325,0.35985,0.21489,0.125 +2021-05-03,0.2175,0.33122,0.19628,0.125 +2021-05-04,0.21476,0.33947,0.17981,0.125 +2021-05-05,0.21028,0.3395,0.16634,0.125 +2021-05-06,0.2122,0.3524,0.15919,0.125 +2021-05-07,0.20204,0.32757,0.15354,0.125 +2021-05-10,0.20833,0.35279,0.1472,0.125 +2021-05-11,0.20781,0.33105,0.16739,0.125 +2021-05-12,0.20798,0.31954,0.17939,0.125 +2021-05-14,0.20392,0.28707,0.19969,0.125 +2021-05-17,0.18916,0.23448,0.20799,0.125 +2021-05-18,0.19607,0.25045,0.21275,0.125 +2021-05-19,0.18945,0.23049,0.21287,0.125 +2021-05-20,0.19414,0.25141,0.206,0.125 +2021-05-21,0.19231,0.25041,0.20153,0.125 +2021-05-24,0.18163,0.2166,0.2033,0.125 +2021-05-25,0.18976,0.23859,0.20568,0.125 +2021-05-26,0.219,0.32339,0.20862,0.125 +2021-05-27,0.10983,0.12464,0.20486,0 +2021-05-28,0.11573,0.1491,0.1981,0 +2021-05-31,0.10981,0.12425,0.20519,0 +2021-06-01,0.13053,0.16037,0.23122,0 +2021-06-02,0.16797,0.26062,0.24328,0 +2021-06-03,0.17269,0.26767,0.25041,0 +2021-06-04,0.16759,0.2722,0.23059,0 +2021-06-07,0.18577,0.29707,0.26025,0 +2021-06-08,0.19466,0.29693,0.28707,0 +2021-06-09,0.18661,0.24969,0.31013,0 +2021-06-10,0.20125,0.28103,0.32272,0 +2021-06-11,0.22281,0.33108,0.33735,0 +2021-06-14,0.26452,0.44006,0.35351,0 +2021-06-15,0.2862,0.49011,0.3685,0 +2021-06-16,0.28235,0.47555,0.37149,0 +2021-06-17,0.2797,0.46926,0.36982,0 +2021-06-18,0.28276,0.47416,0.37411,0 +2021-06-21,0.28958,0.4812,0.38755,0 +2021-06-22,0.29475,0.4859,0.39836,0 +2021-06-23,0.29702,0.47843,0.41263,0 +2021-06-24,0.31048,0.5119,0.41954,0 +2021-06-25,0.34371,0.60031,0.43081,0 +2021-06-28,0.29436,0.44426,0.43883,0 +2021-06-29,0.29001,0.43335,0.43666,0 +2021-06-30,0.28558,0.42901,0.42774,0 +2021-07-01,0.21826,0.24578,0.40899,0 +2021-07-02,0.22177,0.31887,0.34645,0 +2021-07-05,0.1855,0.26355,0.29294,0 +2021-07-06,0.15753,0.25376,0.21884,0 +2021-07-07,0.14059,0.27021,0.15157,0 +2021-07-08,0.12714,0.29826,0.083157,0 +2021-07-09,0.068157,0.19471,0.0097595,0 +2021-07-12,0.097737,0.29321,0,0 +2021-07-13,0.058215,0.16622,0.0084229,0 +2021-07-14,0.068218,0.19897,0.0056817,0 +2021-07-15,0.078211,0.23063,0.0039994,0 +2021-07-16,0.082491,0.24219,0.0052834,0 +2021-07-19,0.10086,0.16672,0.010847,0.125 +2021-07-20,0.16181,0.33125,0.029187,0.125 +2021-07-22,0.25482,0.42749,0.086981,0.25 +2021-07-23,0.24715,0.37468,0.11676,0.25 +2021-07-26,0.2588,0.38685,0.13955,0.25 +2021-07-27,0.25854,0.3733,0.15233,0.25 +2021-07-28,0.26169,0.37438,0.16069,0.25 +2021-07-29,0.26048,0.36877,0.16267,0.25 +2021-07-30,0.26216,0.37405,0.16242,0.25 +2021-08-02,0.25043,0.33591,0.16538,0.25 +2021-08-03,0.33056,0.45256,0.16413,0.375 +2021-08-04,0.35435,0.53042,0.15761,0.375 +2021-08-05,0.34461,0.50893,0.14991,0.375 +2021-08-06,0.34651,0.51723,0.14729,0.375 +2021-08-09,0.34708,0.52477,0.14147,0.375 +2021-08-10,0.3505,0.5457,0.1308,0.375 +2021-08-11,0.35672,0.5709,0.12426,0.375 +2021-08-12,0.35545,0.55423,0.13712,0.375 +2021-08-13,0.35494,0.54909,0.14074,0.375 +2021-08-16,0.34758,0.52748,0.14025,0.375 +2021-08-17,0.36117,0.55408,0.15443,0.375 +2021-08-18,0.36109,0.55501,0.15326,0.375 +2021-08-20,0.35697,0.55537,0.14056,0.375 +2021-08-23,0.36198,0.57082,0.14013,0.375 +2021-08-24,0.3512,0.53981,0.1388,0.375 +2021-08-25,0.35316,0.54131,0.14319,0.375 +2021-08-26,0.37109,0.58867,0.1496,0.375 +2021-08-27,0.37277,0.58975,0.15356,0.375 +2021-08-30,0.40876,0.57309,0.15318,0.5 +2021-08-31,0.45735,0.71799,0.15405,0.5 +2021-09-01,0.39893,0.6679,0.15389,0.375 +2021-09-02,0.38514,0.62683,0.15359,0.375 +2021-09-03,0.35583,0.67781,0.13967,0.25 +2021-09-06,0.34794,0.66373,0.13008,0.25 +2021-09-07,0.34842,0.67556,0.1197,0.25 +2021-09-08,0.35344,0.70104,0.10929,0.25 +2021-09-09,0.35967,0.72238,0.10664,0.25 +2021-09-13,0.36974,0.74205,0.11717,0.25 +2021-09-14,0.39828,0.78402,0.16083,0.25 +2021-09-15,0.38662,0.73286,0.17701,0.25 +2021-09-16,0.33331,0.69512,0.17981,0.125 +2021-09-17,0.33646,0.70763,0.17676,0.125 +2021-09-20,0.36522,0.66829,0.17738,0.25 +2021-09-21,0.3839,0.71618,0.18554,0.25 +2021-09-22,0.36432,0.65074,0.19222,0.25 +2021-09-23,0.37763,0.52774,0.23013,0.375 +2021-09-24,0.36355,0.45841,0.25724,0.375 +2021-09-27,0.37525,0.48575,0.26501,0.375 +2021-09-28,0.3846,0.49973,0.27906,0.375 +2021-09-29,0.37852,0.48651,0.27405,0.375 +2021-09-30,0.36994,0.47858,0.25625,0.375 +2021-10-01,0.36958,0.48705,0.2467,0.375 +2021-10-04,0.37272,0.49543,0.24772,0.375 +2021-10-05,0.38056,0.52075,0.24594,0.375 +2021-10-06,0.3938,0.56006,0.24635,0.375 +2021-10-07,0.38665,0.54246,0.24249,0.375 +2021-10-08,0.3815,0.53141,0.2381,0.375 +2021-10-11,0.38796,0.55779,0.23109,0.375 +2021-10-12,0.31891,0.47571,0.23102,0.25 +2021-10-13,0.31833,0.47848,0.2265,0.25 +2021-10-14,0.33596,0.53192,0.22597,0.25 +2021-10-18,0.35316,0.55218,0.25729,0.25 +2021-10-19,0.35258,0.54155,0.26619,0.25 +2021-10-20,0.34153,0.51044,0.26415,0.25 +2021-10-21,0.32457,0.45921,0.2645,0.25 +2021-10-22,0.30685,0.40794,0.2626,0.25 +2021-10-25,0.29243,0.37889,0.24841,0.25 +2021-10-26,0.26037,0.30184,0.22927,0.25 +2021-10-27,0.24918,0.30838,0.18917,0.25 +2021-10-28,0.26525,0.26097,0.15978,0.375 +2021-10-29,0.29766,0.38243,0.13554,0.375 +2021-11-01,0.32554,0.45775,0.14388,0.375 +2021-11-02,0.26952,0.39095,0.1676,0.25 +2021-11-03,0.29075,0.434,0.18825,0.25 +2021-11-04,0.32483,0.5239,0.20058,0.25 +2021-11-08,0.31489,0.6008,0.21887,0.125 +2021-11-09,0.2921,0.5327,0.2186,0.125 +2021-11-10,0.30624,0.5722,0.22152,0.125 +2021-11-11,0.30347,0.55422,0.23121,0.125 +2021-11-12,0.30532,0.5594,0.23156,0.125 +2021-11-15,0.28074,0.48488,0.23235,0.125 +2021-11-16,0.28426,0.49537,0.23241,0.125 +2021-11-17,0.28009,0.49255,0.22271,0.125 +2021-11-18,0.27636,0.48614,0.21795,0.125 +2021-11-22,0.32192,0.49484,0.22093,0.25 +2021-11-23,0.31295,0.46172,0.22714,0.25 +2021-11-24,0.31293,0.46134,0.22746,0.25 +2021-11-25,0.30539,0.43983,0.22633,0.25 +2021-11-26,0.35868,0.45254,0.24849,0.375 +2021-11-29,0.33164,0.35081,0.26911,0.375 +2021-11-30,0.34184,0.3657,0.28483,0.375 +2021-12-01,0.33036,0.3587,0.25738,0.375 +2021-12-02,0.33514,0.37659,0.25384,0.375 +2021-12-03,0.34612,0.39655,0.26681,0.375 +2021-12-06,0.35579,0.41212,0.28024,0.375 +2021-12-07,0.35932,0.42696,0.276,0.375 +2021-12-08,0.36738,0.45736,0.26978,0.375 +2021-12-09,0.34999,0.41861,0.25636,0.375 +2021-12-10,0.36811,0.49897,0.23037,0.375 +2021-12-13,0.32077,0.48721,0.2251,0.25 +2021-12-14,0.31624,0.48014,0.21858,0.25 +2021-12-15,0.32825,0.51422,0.22053,0.25 +2021-12-16,0.32791,0.50467,0.22905,0.25 +2021-12-17,0.3198,0.46073,0.24866,0.25 +2021-12-20,0.34119,0.51902,0.25454,0.25 +2021-12-21,0.34081,0.51734,0.25508,0.25 +2021-12-22,0.32695,0.48222,0.24863,0.25 +2021-12-23,0.31847,0.47253,0.23287,0.25 +2021-12-24,0.31302,0.48453,0.20454,0.25 +2021-12-27,0.31978,0.51976,0.18958,0.25 +2021-12-28,0.30827,0.50458,0.17023,0.25 +2021-12-29,0.31201,0.50011,0.18592,0.25 +2021-12-30,0.32843,0.53815,0.19715,0.25 +2021-12-31,0.33908,0.55219,0.21504,0.25 +2022-01-03,0.31249,0.58249,0.22999,0.125 +2022-01-04,0.31787,0.57598,0.25265,0.125 +2022-01-05,0.31952,0.56896,0.2646,0.125 +2022-01-06,0.33948,0.62791,0.26553,0.125 +2022-01-07,0.35769,0.80021,0.27286,0 +2022-01-10,0.34898,0.76798,0.27897,0 +2022-01-11,0.3493,0.76419,0.2837,0 +2022-01-12,0.34842,0.75237,0.29288,0 +2022-01-13,0.34411,0.73429,0.29804,0 +2022-01-14,0.34757,0.74585,0.29686,0 +2022-01-17,0.34345,0.71719,0.31317,0 +2022-01-18,0.31568,0.63024,0.3168,0 +2022-01-19,0.33744,0.70355,0.30879,0 +2022-01-20,0.32764,0.68601,0.29691,0 +2022-01-21,0.3305,0.70117,0.29032,0 +2022-01-24,0.35658,0.67106,0.27369,0.125 +2022-01-25,0.33391,0.60931,0.26742,0.125 +2022-01-27,0.33035,0.59863,0.26741,0.125 +2022-01-28,0.34306,0.63495,0.26922,0.125 +2022-01-31,0.30477,0.51029,0.27902,0.125 +2022-02-01,0.31911,0.52727,0.30505,0.125 +2022-02-02,0.3323,0.54174,0.33017,0.125 +2022-02-03,0.33718,0.55979,0.32674,0.125 +2022-02-04,0.32467,0.52882,0.32019,0.125 +2022-02-07,0.30289,0.46375,0.31991,0.125 +2022-02-08,0.28781,0.41988,0.31855,0.125 +2022-02-09,0.28426,0.40683,0.32095,0.125 +2022-02-10,0.25863,0.34395,0.30696,0.125 +2022-02-11,0.25039,0.33538,0.29078,0.125 +2022-02-14,0.32358,0.43121,0.28954,0.25 +2022-02-15,0.46932,0.68625,0.34672,0.375 +2022-02-16,0.43657,0.57005,0.36467,0.375 +2022-02-17,0.44974,0.60245,0.37176,0.375 +2022-02-18,0.46323,0.63254,0.38215,0.375 +2022-02-21,0.47085,0.65361,0.38394,0.375 +2022-02-22,0.47316,0.66459,0.37988,0.375 +2022-02-23,0.47111,0.67101,0.36732,0.375 +2022-02-24,0.45412,0.50834,0.35401,0.5 +2022-02-25,0.48715,0.60678,0.35467,0.5 +2022-02-28,0.4728,0.56669,0.3517,0.5 +2022-03-02,0.46241,0.56545,0.32177,0.5 +2022-03-03,0.45823,0.5654,0.3093,0.5 +2022-03-04,0.45123,0.55885,0.29483,0.5 +2022-03-07,0.44902,0.56466,0.28241,0.5 +2022-03-08,0.43943,0.57453,0.24377,0.5 +2022-03-09,0.39639,0.58962,0.22455,0.375 +2022-03-10,0.39215,0.5905,0.21094,0.375 +2022-03-11,0.38053,0.57486,0.19174,0.375 +2022-03-14,0.37448,0.57439,0.17404,0.375 +2022-03-15,0.3723,0.574,0.16791,0.375 +2022-03-16,0.3756,0.57319,0.17862,0.375 +2022-03-17,0.38083,0.57953,0.18795,0.375 +2022-03-21,0.37619,0.57441,0.17917,0.375 +2022-03-22,0.37892,0.59037,0.17138,0.375 +2022-03-23,0.38358,0.60708,0.16867,0.375 +2022-03-24,0.39042,0.62869,0.16756,0.375 +2022-03-25,0.39793,0.64857,0.17023,0.375 +2022-03-28,0.40631,0.66506,0.17887,0.375 +2022-03-29,0.42072,0.68446,0.20269,0.375 +2022-03-30,0.36699,0.60884,0.24213,0.25 +2022-03-31,0.36146,0.6752,0.28418,0.125 +2022-04-01,0.36443,0.64819,0.32009,0.125 +2022-04-04,0.36173,0.62096,0.33925,0.125 +2022-04-05,0.35195,0.57432,0.35651,0.125 +2022-04-06,0.35349,0.56909,0.36639,0.125 +2022-04-07,0.35103,0.55611,0.37198,0.125 +2022-04-08,0.43578,0.80826,0.37407,0.125 +2022-04-11,0.32907,0.60853,0.37868,0 +2022-04-12,0.3432,0.65722,0.37239,0 +2022-04-13,0.35058,0.66698,0.38476,0 +2022-04-18,0.33374,0.62084,0.38037,0 +2022-04-19,0.33788,0.64726,0.36637,0 +2022-04-20,0.31278,0.60785,0.33049,0 +2022-04-21,0.29913,0.62953,0.26787,0 +2022-04-22,0.30386,0.65746,0.2541,0 +2022-04-25,0.28847,0.62028,0.24514,0 +2022-04-26,0.30765,0.68902,0.23394,0 +2022-04-27,0.31859,0.73415,0.22163,0 +2022-04-28,0.30916,0.72393,0.20356,0 +2022-04-29,0.29858,0.70817,0.18758,0 +2022-05-02,0.27501,0.63745,0.18758,0 +2022-05-04,0.26859,0.48968,0.1911,0.125 +2022-05-05,0.22395,0.35658,0.19026,0.125 +2022-05-06,0.20843,0.31215,0.18814,0.125 +2022-05-09,0.18532,0.24687,0.18408,0.125 +2022-05-10,0.17469,0.21101,0.18806,0.125 +2022-05-11,0.17591,0.2093,0.19344,0.125 +2022-05-12,0.15425,0.14368,0.19408,0.125 +2022-05-13,0.13258,0.085196,0.18755,0.125 +2022-05-16,0.14392,0.13503,0.17174,0.125 +2022-05-17,0.16616,0.097456,0.15102,0.25 +2022-05-18,0.13337,0.017967,0.13214,0.25 +2022-05-19,0.17606,0,0.15319,0.375 +2022-05-20,0.30969,0.22289,0.20619,0.5 +2022-05-23,0.30164,0.17785,0.22706,0.5 +2022-05-24,0.31633,0.20218,0.24682,0.5 +2022-05-25,0.3244,0.20947,0.26373,0.5 +2022-05-26,0.32476,0.20756,0.26672,0.5 +2022-05-27,0.32067,0.19244,0.26958,0.5 +2022-05-30,0.31702,0.21267,0.2384,0.5 +2022-05-31,0.30539,0.18968,0.22648,0.5 +2022-06-01,0.31144,0.21812,0.21621,0.5 +2022-06-02,0.31878,0.23644,0.2199,0.5 +2022-06-03,0.3271,0.24997,0.23134,0.5 +2022-06-06,0.34241,0.28384,0.2434,0.5 +2022-06-07,0.34522,0.28194,0.25372,0.5 +2022-06-08,0.35925,0.28344,0.29432,0.5 +2022-06-09,0.37089,0.28937,0.32331,0.5 +2022-06-10,0.37416,0.2867,0.33577,0.5 +2022-06-13,0.39365,0.34268,0.33826,0.5 +2022-06-14,0.39234,0.33836,0.33866,0.5 +2022-06-15,0.37351,0.40414,0.3414,0.375 +2022-06-16,0.37119,0.39658,0.34199,0.375 +2022-06-17,0.36592,0.38183,0.34092,0.375 +2022-06-20,0.3679,0.3877,0.34101,0.375 +2022-06-21,0.35345,0.35584,0.32952,0.375 +2022-06-22,0.36224,0.39429,0.31743,0.375 +2022-06-23,0.37196,0.43191,0.30899,0.375 +2022-06-24,0.35933,0.40841,0.29459,0.375 +2022-06-27,0.37161,0.45203,0.2878,0.375 +2022-06-28,0.35608,0.52399,0.29426,0.25 +2022-06-29,0.39442,0.63439,0.29888,0.25 +2022-06-30,0.30562,0.48785,0.30402,0.125 +2022-07-01,0.29761,0.59212,0.30072,0 +2022-07-04,0.30232,0.59479,0.31216,0 +2022-07-05,0.3078,0.60185,0.32155,0 +2022-07-06,0.29904,0.58631,0.31082,0 +2022-07-07,0.29846,0.58621,0.30917,0 +2022-07-08,0.28818,0.56637,0.29817,0 +2022-07-11,0.30563,0.60312,0.31376,0 +2022-07-12,0.30122,0.58198,0.32168,0 +2022-07-13,0.30103,0.57624,0.32684,0 +2022-07-14,0.30344,0.57897,0.33135,0 +2022-07-15,0.29961,0.56017,0.33865,0 +2022-07-18,0.30173,0.56462,0.34058,0 +2022-07-19,0.29753,0.54908,0.3435,0 +2022-07-20,0.28642,0.5386,0.32067,0 +2022-07-21,0.28426,0.53825,0.31454,0 +2022-07-22,0.24379,0.39785,0.33352,0 +2022-07-25,0.27405,0.47763,0.34452,0 +2022-07-26,0.2658,0.4527,0.34469,0 +2022-07-27,0.29769,0.54577,0.34731,0 +2022-07-28,0.37001,0.64442,0.3406,0.125 +2022-07-29,0.38424,0.69469,0.33304,0.125 +2022-08-01,0.41757,0.79893,0.32876,0.125 +2022-08-02,0.36211,0.67127,0.29006,0.125 +2022-08-03,0.36068,0.68548,0.27157,0.125 +2022-08-04,0.35742,0.7057,0.24157,0.125 +2022-08-05,0.34797,0.7321,0.1868,0.125 +2022-08-08,0.34893,0.73971,0.18207,0.125 +2022-08-10,0.3423,0.7088,0.1931,0.125 +2022-08-11,0.33777,0.6808,0.20751,0.125 +2022-08-12,0.33662,0.64696,0.2379,0.125 +2022-08-16,0.33988,0.63537,0.25926,0.125 +2022-08-17,0.34557,0.63122,0.2805,0.125 +2022-08-18,0.36267,0.66927,0.29376,0.125 +2022-08-19,0.33849,0.60318,0.28728,0.125 +2022-08-22,0.35684,0.65605,0.28948,0.125 +2022-08-23,0.34361,0.62009,0.28575,0.125 +2022-08-24,0.35592,0.66312,0.27965,0.125 +2022-08-25,0.36021,0.67579,0.27984,0.125 +2022-08-26,0.36218,0.68168,0.27986,0.125 +2022-08-29,0.34568,0.63149,0.28055,0.125 +2022-08-30,0.44033,0.74247,0.32851,0.25 +2022-09-01,0.46973,0.7994,0.35979,0.25 +2022-09-02,0.46839,0.77215,0.38304,0.25 +2022-09-05,0.47597,0.77297,0.40493,0.25 +2022-09-06,0.47779,0.76662,0.41674,0.25 +2022-09-07,0.4824,0.78351,0.41369,0.25 +2022-09-08,0.47566,0.76949,0.40748,0.25 +2022-09-09,0.4707,0.75057,0.41153,0.25 +2022-09-12,0.47412,0.74175,0.43062,0.25 +2022-09-13,0.42391,0.69344,0.4533,0.125 +2022-09-14,0.42067,0.66684,0.47017,0.125 +2022-09-15,0.43288,0.69462,0.479,0.125 +2022-09-16,0.46815,0.67505,0.4794,0.25 +2022-09-19,0.45158,0.62554,0.4792,0.25 +2022-09-20,0.43907,0.59294,0.47427,0.25 +2022-09-21,0.43675,0.5903,0.46995,0.25 +2022-09-22,0.43417,0.59718,0.45534,0.25 +2022-09-23,0.41821,0.57411,0.43052,0.25 +2022-09-26,0.43098,0.64561,0.39734,0.25 +2022-09-27,0.39422,0.57467,0.35799,0.25 +2022-09-28,0.37899,0.56624,0.32073,0.25 +2022-09-29,0.36475,0.5571,0.28715,0.25 +2022-09-30,0.34408,0.53863,0.2436,0.25 +2022-10-03,0.34246,0.54655,0.23082,0.25 +2022-10-04,0.4056,0.59744,0.24434,0.375 +2022-10-06,0.38126,0.52488,0.24391,0.375 +2022-10-07,0.38335,0.53245,0.24259,0.375 +2022-10-10,0.38274,0.5366,0.23662,0.375 +2022-10-11,0.38261,0.54189,0.23093,0.375 +2022-10-12,0.36183,0.48586,0.22463,0.375 +2022-10-13,0.30089,0.43161,0.22107,0.25 +2022-10-14,0.30992,0.45585,0.22391,0.25 +2022-10-17,0.3074,0.44751,0.2247,0.25 +2022-10-18,0.30354,0.43895,0.22168,0.25 +2022-10-19,0.28331,0.38081,0.21911,0.25 +2022-10-20,0.303,0.42446,0.23454,0.25 +2022-10-21,0.32369,0.46837,0.2527,0.25 +2022-10-24,0.32664,0.4517,0.27822,0.25 +2022-10-25,0.3234,0.44829,0.2719,0.25 +2022-10-27,0.32498,0.45775,0.2672,0.25 +2022-10-28,0.33294,0.47001,0.2788,0.25 +2022-10-31,0.33188,0.46063,0.285,0.25 +2022-11-01,0.30596,0.4877,0.30519,0.125 +2022-11-02,0.31394,0.49776,0.31907,0.125 +2022-11-03,0.3283,0.52658,0.33333,0.125 +2022-11-04,0.33966,0.54144,0.35255,0.125 +2022-11-07,0.35805,0.57836,0.3708,0.125 +2022-11-09,0.33204,0.48684,0.38428,0.125 +2022-11-10,0.36347,0.56625,0.39916,0.125 +2022-11-11,0.40989,0.57926,0.40041,0.25 +2022-11-14,0.38915,0.51465,0.40282,0.25 +2022-11-15,0.41,0.58059,0.39942,0.25 +2022-11-16,0.39771,0.54491,0.39821,0.25 +2022-11-17,0.36565,0.45289,0.39406,0.25 +2022-11-18,0.33815,0.52684,0.36262,0.125 +2022-11-21,0.32244,0.49559,0.34673,0.125 +2022-11-22,0.31706,0.47976,0.34642,0.125 +2022-11-23,0.32883,0.51636,0.34512,0.125 +2022-11-24,0.2786,0.41405,0.29675,0.125 +2022-11-25,0.24764,0.36624,0.25168,0.125 +2022-11-28,0.23471,0.37269,0.20643,0.125 +2022-11-29,0.22799,0.35762,0.20134,0.125 +2022-11-30,0.218,0.32091,0.20808,0.125 +2022-12-01,0.22134,0.34116,0.19788,0.125 +2022-12-02,0.20572,0.32222,0.16994,0.125 +2022-12-05,0.20056,0.29417,0.18252,0.125 +2022-12-06,0.21893,0.3414,0.1904,0.125 +2022-12-07,0.21748,0.34465,0.18279,0.125 +2022-12-08,0.21866,0.34622,0.18476,0.125 +2022-12-09,0.22002,0.34037,0.1947,0.125 +2022-12-12,0.22652,0.35292,0.20163,0.125 +2022-12-13,0.20281,0.2726,0.21084,0.125 +2022-12-14,0.20487,0.27146,0.21816,0.125 +2022-12-15,0.24122,0.25491,0.21874,0.25 +2022-12-16,0.26389,0.32113,0.22053,0.25 +2022-12-19,0.27349,0.34437,0.22611,0.25 +2022-12-20,0.26837,0.32666,0.22845,0.25 +2022-12-21,0.26615,0.31117,0.23727,0.25 +2022-12-22,0.23304,0.21343,0.2357,0.25 +2022-12-23,0.26001,0.29152,0.2385,0.25 +2022-12-26,0.32508,0.46081,0.26443,0.25 +2022-12-27,0.33447,0.46148,0.29194,0.25 +2022-12-28,0.33052,0.4355,0.30605,0.25 +2022-12-29,0.33652,0.43874,0.32082,0.25 +2022-12-30,0.34522,0.4566,0.32907,0.25 +2023-01-02,0.34922,0.4607,0.33696,0.25 +2023-01-03,0.34585,0.45705,0.33049,0.25 +2023-01-04,0.34771,0.47297,0.32017,0.25 +2023-01-05,0.35635,0.49446,0.32458,0.25 +2023-01-06,0.34734,0.46562,0.32638,0.25 +2023-01-09,0.35043,0.4761,0.32518,0.25 +2023-01-10,0.37051,0.53653,0.32498,0.25 +2023-01-11,0.35389,0.50673,0.30494,0.25 +2023-01-12,0.3568,0.53678,0.28362,0.25 +2023-01-13,0.35661,0.54327,0.27655,0.25 +2023-01-16,0.34221,0.52063,0.256,0.25 +2023-01-17,0.32981,0.50087,0.23857,0.25 +2023-01-18,0.32216,0.4905,0.22599,0.25 +2023-01-19,0.32099,0.4898,0.22317,0.25 +2023-01-20,0.31808,0.49828,0.20595,0.25 +2023-01-23,0.31027,0.49966,0.18115,0.25 +2023-01-24,0.30953,0.5105,0.16809,0.25 +2023-01-25,0.29298,0.48402,0.14491,0.25 +2023-01-27,0.31747,0.56114,0.14128,0.25 +2023-01-30,0.29432,0.49387,0.1391,0.25 +2023-01-31,0.3078,0.53438,0.13903,0.25 +2023-02-01,0.32472,0.5855,0.13865,0.25 +2023-02-02,0.33695,0.62119,0.13964,0.25 +2023-02-03,0.33175,0.59993,0.14533,0.25 +2023-02-06,0.2556,0.49549,0.14631,0.125 +2023-02-07,0.25288,0.48951,0.14412,0.125 +2023-02-08,0.24713,0.48397,0.13242,0.125 +2023-02-09,0.23316,0.44856,0.12591,0.125 +2023-02-10,0.23667,0.47035,0.11465,0.125 +2023-02-13,0.2347,0.47334,0.10576,0.125 +2023-02-14,0.23074,0.46758,0.099643,0.125 +2023-02-15,0.23787,0.49163,0.096966,0.125 +2023-02-16,0.2495,0.51858,0.10491,0.125 +2023-02-17,0.254,0.52885,0.10814,0.125 +2023-02-20,0.24724,0.50612,0.1106,0.125 +2023-02-21,0.22235,0.4256,0.11646,0.125 +2023-02-22,0.25191,0.39505,0.11069,0.25 +2023-02-23,0.23071,0.3339,0.10822,0.25 +2023-02-24,0.23682,0.34742,0.11305,0.25 +2023-02-27,0.24216,0.35277,0.12371,0.25 +2023-02-28,0.24804,0.36158,0.13254,0.25 +2023-03-01,0.24433,0.35496,0.12803,0.25 +2023-03-02,0.24963,0.37067,0.12821,0.25 +2023-03-03,0.30239,0.406,0.12617,0.375 +2023-03-06,0.30792,0.42113,0.12762,0.375 +2023-03-08,0.30389,0.41091,0.12577,0.375 +2023-03-09,0.31665,0.44744,0.1275,0.375 +2023-03-10,0.29244,0.35815,0.14416,0.375 +2023-03-13,0.33992,0.47691,0.16785,0.375 +2023-03-14,0.33984,0.45629,0.18822,0.375 +2023-03-15,0.32935,0.42491,0.18813,0.375 +2023-03-16,0.32506,0.40814,0.19205,0.375 +2023-03-17,0.34763,0.4758,0.19209,0.375 +2023-03-20,0.34928,0.491,0.18183,0.375 +2023-03-21,0.34619,0.48578,0.1778,0.375 +2023-03-22,0.35033,0.49623,0.17974,0.375 +2023-03-23,0.36345,0.52879,0.18657,0.375 +2023-03-24,0.35075,0.48803,0.18922,0.375 +2023-03-27,0.34373,0.46489,0.1913,0.375 +2023-03-28,0.35866,0.50223,0.19875,0.375 +2023-03-29,0.35697,0.49628,0.19963,0.375 +2023-03-31,0.40086,0.50937,0.19322,0.5 +2023-04-03,0.36922,0.42433,0.18332,0.5 +2023-04-05,0.35904,0.40538,0.17173,0.5 +2023-04-06,0.34922,0.37912,0.16853,0.5 +2023-04-10,0.38656,0.49526,0.16441,0.5 +2023-04-11,0.37179,0.56537,0.17498,0.375 +2023-04-12,0.36725,0.54378,0.18296,0.375 +2023-04-13,0.37653,0.54068,0.21392,0.375 +2023-04-17,0.37191,0.52895,0.21177,0.375 +2023-04-18,0.3737,0.52971,0.21638,0.375 +2023-04-19,0.38448,0.54573,0.2327,0.375 +2023-04-20,0.3953,0.56218,0.24873,0.375 +2023-04-21,0.37208,0.59598,0.27027,0.25 +2023-04-24,0.37285,0.58512,0.28342,0.25 +2023-04-25,0.38118,0.59811,0.29543,0.25 +2023-04-26,0.37969,0.57774,0.31133,0.25 +2023-04-27,0.34441,0.46931,0.31393,0.25 +2023-04-28,0.28109,0.42768,0.29059,0.125 +2023-05-02,0.27036,0.43018,0.25589,0.125 +2023-05-03,0.26999,0.42599,0.25898,0.125 +2023-05-04,0.27328,0.43006,0.26477,0.125 +2023-05-05,0.29006,0.48313,0.26204,0.125 +2023-05-08,0.31276,0.54615,0.26714,0.125 +2023-05-09,0.29317,0.49052,0.26398,0.125 +2023-05-10,0.30161,0.50927,0.27057,0.125 +2023-05-11,0.30976,0.52844,0.27586,0.125 +2023-05-12,0.32406,0.56812,0.27904,0.125 +2023-05-15,0.32034,0.55658,0.27943,0.125 +2023-05-16,0.32634,0.57393,0.28009,0.125 +2023-05-17,0.31033,0.51698,0.289,0.125 +2023-05-18,0.29384,0.59874,0.2828,0 +2023-05-19,0.30318,0.63893,0.2706,0 +2023-05-22,0.30954,0.6754,0.25322,0 +2023-05-23,0.2986,0.64378,0.25203,0 +2023-05-24,0.30503,0.66443,0.25067,0 +2023-05-25,0.30609,0.66445,0.25382,0 +2023-05-26,0.29439,0.62813,0.25505,0 +2023-05-29,0.30293,0.66822,0.24056,0 +2023-05-30,0.30629,0.6742,0.24468,0 +2023-05-31,0.29929,0.65597,0.24189,0 +2023-06-01,0.28949,0.62914,0.23934,0 +2023-06-02,0.27526,0.58876,0.23702,0 +2023-06-05,0.28923,0.63976,0.22794,0 +2023-06-06,0.30446,0.68035,0.23303,0 +2023-06-07,0.2854,0.62138,0.23482,0 +2023-06-08,0.28453,0.63266,0.22094,0 +2023-06-09,0.27667,0.62102,0.20899,0 +2023-06-12,0.27494,0.62529,0.19954,0 +2023-06-13,0.26323,0.60884,0.18085,0 +2023-06-14,0.26512,0.62049,0.17486,0 +2023-06-15,0.22833,0.51417,0.17084,0 +2023-06-16,0.14968,0.28705,0.162,0 +2023-06-19,0.18602,0.41869,0.13937,0 +2023-06-20,0.16614,0.38708,0.11133,0 +2023-06-21,0.15121,0.36904,0.084585,0 +2023-06-22,0.11352,0.29313,0.047435,0 +2023-06-23,0.1036,0.30586,0.0049342,0 +2023-06-26,0.090513,0.27154,0,0 +2023-06-27,0.066341,0.19902,0,0 +2023-06-28,0.10218,0.30601,0.00051825,0 +2023-06-30,0.21376,0.48693,0.029339,0.125 +2023-07-03,0.24845,0.56433,0.056004,0.125 +2023-07-04,0.25257,0.57296,0.059761,0.125 +2023-07-05,0.25576,0.57663,0.065645,0.125 +2023-07-06,0.25178,0.55201,0.078312,0.125 +2023-07-07,0.28225,0.62627,0.095462,0.125 +2023-07-10,0.25925,0.54655,0.10619,0.125 +2023-07-11,0.26152,0.55743,0.10212,0.125 +2023-07-12,0.26453,0.57024,0.098341,0.125 +2023-07-13,0.27316,0.59551,0.098968,0.125 +2023-07-14,0.25359,0.536,0.099768,0.125 +2023-07-17,0.26441,0.56445,0.10378,0.125 +2023-07-18,0.24824,0.5071,0.11262,0.125 +2023-07-19,0.26444,0.55632,0.112,0.125 +2023-07-20,0.2618,0.54823,0.11217,0.125 +2023-07-21,0.33075,0.61242,0.12983,0.25 +2023-07-24,0.3186,0.55704,0.14876,0.25 +2023-07-25,0.33038,0.58726,0.15387,0.25 +2023-07-26,0.33366,0.59432,0.15667,0.25 +2023-07-27,0.33208,0.58454,0.16169,0.25 +2023-07-28,0.33076,0.57803,0.16424,0.25 +2023-07-31,0.32958,0.57449,0.16427,0.25 +2023-08-01,0.32591,0.55871,0.16903,0.25 +2023-08-02,0.29613,0.47536,0.16303,0.25 +2023-08-03,0.3056,0.50929,0.1575,0.25 +2023-08-04,0.30883,0.52164,0.15485,0.25 +2023-08-07,0.30924,0.5226,0.15514,0.25 +2023-08-08,0.31872,0.55238,0.15379,0.25 +2023-08-09,0.31879,0.55731,0.14907,0.25 +2023-08-10,0.3,0.50152,0.14848,0.25 +2023-08-11,0.24203,0.45299,0.14811,0.125 +2023-08-14,0.24018,0.44411,0.15144,0.125 +2023-08-16,0.25398,0.47065,0.16629,0.125 +2023-08-17,0.25618,0.47214,0.1714,0.125 +2023-08-18,0.25234,0.46213,0.16988,0.125 +2023-08-21,0.27163,0.50914,0.18076,0.125 +2023-08-22,0.27583,0.50885,0.19364,0.125 +2023-08-23,0.29043,0.53339,0.21289,0.125 +2023-08-24,0.29351,0.52868,0.22687,0.125 +2023-08-25,0.30439,0.55503,0.23312,0.125 +2023-08-28,0.29064,0.50289,0.24404,0.125 +2023-08-29,0.30915,0.54732,0.25512,0.125 +2023-08-30,0.32128,0.57636,0.26247,0.125 +2023-08-31,0.31652,0.56102,0.26354,0.125 +2023-09-01,0.2892,0.48642,0.25616,0.125 +2023-09-04,0.25518,0.51556,0.24997,0 +2023-09-05,0.25004,0.50835,0.24178,0 +2023-09-06,0.25848,0.53875,0.23669,0 +2023-09-07,0.24746,0.51003,0.23235,0 +2023-09-08,0.25719,0.54937,0.22219,0 +2023-09-11,0.27142,0.58349,0.23075,0 +2023-09-12,0.25253,0.5176,0.24,0 +2023-09-13,0.28889,0.61339,0.25328,0 +2023-09-14,0.25836,0.51227,0.2628,0 +2023-09-15,0.23527,0.43799,0.26782,0 +2023-09-18,0.2253,0.42317,0.25274,0 +2023-09-20,0.26314,0.41319,0.25123,0.125 +2023-09-21,0.30266,0.54168,0.24129,0.125 +2023-09-22,0.29794,0.53222,0.23662,0.125 +2023-09-25,0.29336,0.53361,0.22146,0.125 +2023-09-26,0.31561,0.6029,0.21891,0.125 +2023-09-27,0.31171,0.59022,0.21993,0.125 +2023-09-28,0.3056,0.56848,0.22331,0.125 +2023-09-29,0.31702,0.60099,0.22507,0.125 +2023-10-03,0.319,0.60958,0.22242,0.125 +2023-10-04,0.32216,0.61933,0.22215,0.125 +2023-10-05,0.3175,0.60162,0.22589,0.125 +2023-10-06,0.31679,0.59777,0.2276,0.125 +2023-10-09,0.32483,0.61563,0.23387,0.125 +2023-10-10,0.34339,0.6648,0.24037,0.125 +2023-10-11,0.34175,0.65752,0.24273,0.125 +2023-10-12,0.32034,0.59934,0.23668,0.125 +2023-10-13,0.32681,0.63442,0.221,0.125 +2023-10-16,0.33421,0.66791,0.20971,0.125 +2023-10-17,0.33581,0.6727,0.20972,0.125 +2023-10-18,0.33495,0.67011,0.20975,0.125 +2023-10-19,0.32137,0.62983,0.20928,0.125 +2023-10-20,0.3304,0.6467,0.21951,0.125 +2023-10-23,0.35979,0.61274,0.21663,0.25 +2023-10-25,0.37885,0.67366,0.2129,0.25 +2023-10-26,0.44931,0.78204,0.19089,0.375 +2023-10-27,0.46191,0.82322,0.1875,0.375 +2023-10-30,0.45576,0.79969,0.19258,0.375 +2023-10-31,0.45424,0.79724,0.19048,0.375 +2023-11-01,0.44998,0.79563,0.17932,0.375 +2023-11-02,0.4666,0.8486,0.1762,0.375 +2023-11-03,0.42193,0.8299,0.18589,0.25 +2023-11-06,0.42442,0.8368,0.18646,0.25 +2023-11-07,0.39696,0.75175,0.18912,0.25 +2023-11-08,0.39204,0.73585,0.19026,0.25 +2023-11-09,0.39053,0.73081,0.19077,0.25 +2023-11-10,0.41556,0.7993,0.19738,0.25 +2023-11-13,0.43111,0.83071,0.21262,0.25 +2023-11-15,0.3996,0.73432,0.21448,0.25 +2023-11-16,0.39188,0.70625,0.2194,0.25 +2023-11-17,0.3944,0.70988,0.22331,0.25 +2023-11-20,0.40214,0.72859,0.22782,0.25 +2023-11-21,0.40497,0.72989,0.23502,0.25 +2023-11-22,0.4038,0.72013,0.24126,0.25 +2023-11-23,0.41087,0.73637,0.24626,0.25 +2023-11-24,0.43455,0.7773,0.27635,0.25 +2023-11-28,0.4374,0.75805,0.30416,0.25 +2023-11-29,0.43292,0.7363,0.31246,0.25 +2023-11-30,0.42065,0.68723,0.32473,0.25 +2023-12-01,0.42105,0.67897,0.33419,0.25 +2023-12-04,0.46717,0.68945,0.33708,0.375 +2023-12-05,0.46483,0.68905,0.33045,0.375 +2023-12-06,0.46568,0.70971,0.31234,0.375 +2023-12-07,0.41923,0.6956,0.31208,0.25 +2023-12-08,0.41402,0.68007,0.312,0.25 +2023-12-11,0.35626,0.63067,0.31311,0.125 +2023-12-12,0.35639,0.63113,0.31304,0.125 +2023-12-13,0.35529,0.6313,0.30957,0.125 +2023-12-14,0.37433,0.57997,0.29303,0.25 +2023-12-15,0.4335,0.65413,0.27138,0.375 +2023-12-18,0.41123,0.61038,0.2483,0.375 +2023-12-19,0.40832,0.62145,0.22851,0.375 +2023-12-20,0.45739,0.60541,0.26677,0.5 +2023-12-21,0.45769,0.58099,0.2921,0.5 +2023-12-22,0.46123,0.57228,0.3114,0.5 +2023-12-26,0.45985,0.56259,0.31695,0.5 +2023-12-27,0.44924,0.53785,0.30988,0.5 +2023-12-28,0.45887,0.57925,0.29735,0.5 +2023-12-29,0.46127,0.58741,0.2964,0.5 +2024-01-01,0.46849,0.60159,0.30387,0.5 +2024-01-02,0.46705,0.59672,0.30443,0.5 +2024-01-03,0.46362,0.59037,0.30049,0.5 +2024-01-04,0.46109,0.58987,0.29338,0.5 +2024-01-05,0.45094,0.56062,0.2922,0.5 +2024-01-08,0.43299,0.51017,0.28879,0.5 +2024-01-09,0.41332,0.48143,0.25854,0.5 +2024-01-10,0.40931,0.50192,0.22602,0.5 +2024-01-11,0.41811,0.54037,0.21397,0.5 +2024-01-12,0.40109,0.51011,0.19317,0.5 +2024-01-15,0.40068,0.52884,0.17318,0.5 +2024-01-16,0.3298,0.44178,0.17262,0.375 +2024-01-17,0.36596,0.39496,0.20292,0.5 +2024-01-18,0.37075,0.38542,0.22682,0.5 +2024-01-19,0.37362,0.36905,0.25182,0.5 +2024-01-23,0.43386,0.38131,0.29527,0.625 +2024-01-24,0.45648,0.41954,0.3249,0.625 +2024-01-25,0.45303,0.39536,0.33872,0.625 +2024-01-29,0.46194,0.40639,0.35444,0.625 +2024-01-30,0.42115,0.41032,0.35312,0.5 +2024-01-31,0.39471,0.45016,0.35896,0.375 +2024-02-01,0.37915,0.40205,0.36041,0.375 +2024-02-02,0.3909,0.4452,0.3525,0.375 +2024-02-05,0.35457,0.46126,0.35245,0.25 +2024-02-06,0.35224,0.45439,0.35233,0.25 +2024-02-07,0.35106,0.44484,0.35833,0.25 +2024-02-08,0.3484,0.43211,0.36309,0.25 +2024-02-09,0.34825,0.42386,0.3709,0.25 +2024-02-12,0.34636,0.41443,0.37467,0.25 +2024-02-13,0.3353,0.37572,0.38017,0.25 +2024-02-14,0.3189,0.34819,0.35851,0.25 +2024-02-15,0.31937,0.36039,0.34773,0.25 +2024-02-16,0.31993,0.3665,0.34328,0.25 +2024-02-19,0.3239,0.36767,0.35404,0.25 +2024-02-20,0.33325,0.39391,0.35586,0.25 +2024-02-21,0.34184,0.40968,0.36584,0.25 +2024-02-22,0.33589,0.38292,0.37475,0.25 +2024-02-23,0.32955,0.3543,0.38435,0.25 +2024-02-26,0.34986,0.41112,0.38846,0.25 +2024-02-27,0.35282,0.41025,0.3982,0.25 +2024-02-28,0.35101,0.40415,0.39888,0.25 +2024-02-29,0.36536,0.44379,0.4023,0.25 +2024-03-01,0.30822,0.39795,0.40172,0.125 +2024-03-04,0.29402,0.35616,0.40089,0.125 +2024-03-05,0.2925,0.35423,0.39826,0.125 +2024-03-06,0.21542,0.26216,0.3841,0 +2024-03-07,0.21485,0.27615,0.3684,0 +2024-03-11,0.20583,0.2567,0.36078,0 +2024-03-12,0.12564,0.061911,0.31501,0 +2024-03-13,0.13721,0,0.28664,0.125 +2024-03-14,0.15578,0.099074,0.24327,0.125 +2024-03-15,0.14028,0.10612,0.1897,0.125 +2024-03-18,0.13762,0.11335,0.17452,0.125 +2024-03-19,0.12629,0.096165,0.15769,0.125 +2024-03-20,0.11589,0.078769,0.14392,0.125 +2024-03-21,0.12306,0.091218,0.15295,0.125 +2024-03-22,0.12484,0.096422,0.15308,0.125 +2024-03-26,0.12792,0.10663,0.15212,0.125 +2024-03-27,0.12655,0.10162,0.15303,0.125 +2024-03-28,0.129,0.10926,0.15273,0.125 +2024-04-01,0.13533,0.11372,0.16728,0.125 +2024-04-02,0.14032,0.11827,0.17768,0.125 +2024-04-03,0.16223,0.17242,0.18927,0.125 +2024-04-04,0.16652,0.18484,0.18972,0.125 +2024-04-05,0.17809,0.20884,0.20042,0.125 +2024-04-08,0.17465,0.19526,0.20368,0.125 +2024-04-09,0.18079,0.19941,0.21798,0.125 +2024-04-10,0.18399,0.19087,0.2361,0.125 +2024-04-12,0.18396,0.19384,0.23304,0.125 +2024-04-15,0.20379,0.26202,0.22435,0.125 +2024-04-16,0.21543,0.29734,0.22397,0.125 +2024-04-18,0.23163,0.34676,0.22315,0.125 +2024-04-19,0.24133,0.38212,0.21688,0.125 +2024-04-22,0.24063,0.37925,0.21765,0.125 +2024-04-23,0.23191,0.35518,0.21555,0.125 +2024-04-24,0.24074,0.38534,0.21188,0.125 +2024-04-25,0.23936,0.38512,0.20795,0.125 +2024-04-26,0.24676,0.40768,0.20759,0.125 +2024-04-29,0.28869,0.53236,0.20872,0.125 +2024-04-30,0.22269,0.4587,0.20937,0 +2024-05-02,0.23228,0.48684,0.21,0 +2024-05-03,0.22591,0.47115,0.20657,0 +2024-05-06,0.23603,0.50279,0.20531,0 +2024-05-07,0.25269,0.55596,0.20212,0 +2024-05-08,0.25651,0.57116,0.19838,0 +2024-05-09,0.24999,0.44373,0.18125,0.125 +2024-05-10,0.24513,0.42883,0.18156,0.125 +2024-05-13,0.24747,0.43473,0.18267,0.125 +2024-05-14,0.2478,0.43291,0.18548,0.125 +2024-05-15,0.24509,0.42404,0.18623,0.125 +2024-05-16,0.23659,0.40118,0.1836,0.125 +2024-05-17,0.21517,0.33937,0.18114,0.125 +2024-05-21,0.22119,0.33487,0.20371,0.125 +2024-05-22,0.2249,0.32449,0.22521,0.125 +2024-05-23,0.25567,0.30766,0.20935,0.25 +2024-05-24,0.23044,0.24808,0.19324,0.25 +2024-05-27,0.23409,0.28584,0.16645,0.25 +2024-05-28,0.23302,0.31637,0.13269,0.25 +2024-05-29,0.2086,0.24458,0.13121,0.25 +2024-05-30,0.21654,0.25983,0.13979,0.25 +2024-05-31,0.21271,0.24103,0.14711,0.25 +2024-06-03,0.28631,0.2328,0.25112,0.375 +2024-06-04,0.69132,0.92805,0.64592,0.5 +2024-06-05,0.82344,0.96495,0.88038,0.625 +2024-06-06,0.84986,0.9283,0.99627,0.625 +2024-06-07,0.84925,0.92275,1,0.625 +2024-06-10,0.84111,0.89834,1,0.625 +2024-06-11,0.84254,0.90523,0.99738,0.625 +2024-06-12,0.83688,0.91311,0.97254,0.625 +2024-06-13,0.82787,0.9119,0.94671,0.625 +2024-06-14,0.8261,0.9155,0.93778,0.625 +2024-06-18,0.82629,0.9188,0.93507,0.625 +2024-06-19,0.83488,0.92094,0.95871,0.625 +2024-06-20,0.84398,0.92461,0.98233,0.625 +2024-06-21,0.85628,0.94385,1,0.625 +2024-06-24,0.81818,0.95453,1,0.5 +2024-06-25,0.81716,0.95148,1,0.5 +2024-06-26,0.81674,0.95022,1,0.5 +2024-06-27,0.81644,0.94932,1,0.5 +2024-06-28,0.81734,0.95201,1,0.5 +2024-07-01,0.81833,0.95499,1,0.5 +2024-07-02,0.81774,0.95323,1,0.5 +2024-07-03,0.81522,0.95022,0.99545,0.5 +2024-07-04,0.81762,0.96163,0.99123,0.5 +2024-07-05,0.7857,0.98209,1,0.375 +2024-07-08,0.78578,0.98234,1,0.375 +2024-07-09,0.78509,0.98027,1,0.375 +2024-07-10,0.78602,0.98306,1,0.375 +2024-07-11,0.78647,0.98442,1,0.375 +2024-07-12,0.78682,0.98545,1,0.375 +2024-07-15,0.79167,1,1,0.375 +2024-07-16,0.75,1,1,0.25 +2024-07-18,0.57408,0.59723,1,0.125 +2024-07-19,0.54755,0.51764,1,0.125 +2024-07-22,0.48664,0.33493,1,0.125 +2024-07-23,0.51081,0.42457,0.98285,0.125 +2024-07-24,0.48615,0.40736,0.92608,0.125 +2024-07-25,0.4308,0.40509,0.7623,0.125 +2024-07-26,0.3003,0.30586,0.34502,0.25 +2024-07-29,0.25657,0.24596,0.27374,0.25 +2024-07-30,0.26377,0.27078,0.27054,0.25 +2024-07-31,0.26341,0.27219,0.26805,0.25 +2024-08-01,0.25686,0.26558,0.255,0.25 +2024-08-02,0.29356,0.25446,0.25121,0.375 +2024-08-05,0.44293,0.49986,0.32892,0.5 +2024-08-06,0.42747,0.44768,0.33473,0.5 +2024-08-07,0.42988,0.43168,0.35795,0.5 +2024-08-08,0.43827,0.44283,0.37199,0.5 +2024-08-09,0.44835,0.45757,0.38747,0.5 +2024-08-12,0.4451,0.44164,0.39365,0.5 +2024-08-13,0.44186,0.43203,0.39355,0.5 +2024-08-14,0.43437,0.42473,0.37838,0.5 +2024-08-16,0.4185,0.39264,0.36284,0.5 +2024-08-19,0.39799,0.34787,0.34611,0.5 +2024-08-20,0.38651,0.33046,0.32909,0.5 +2024-08-21,0.37837,0.32584,0.30927,0.5 +2024-08-22,0.3741,0.33411,0.2882,0.5 +2024-08-23,0.37373,0.34425,0.27694,0.5 +2024-08-26,0.37021,0.34469,0.26594,0.5 +2024-08-27,0.37234,0.34241,0.27461,0.5 +2024-08-28,0.37838,0.35146,0.28369,0.5 +2024-08-29,0.38514,0.3617,0.29371,0.5 +2024-08-30,0.38762,0.3566,0.30626,0.5 +2024-09-02,0.36,0.37647,0.32853,0.375 +2024-09-03,0.36704,0.37723,0.34888,0.375 +2024-09-04,0.37449,0.37766,0.3708,0.375 +2024-09-05,0.37866,0.37294,0.38804,0.375 +2024-09-06,0.38694,0.39725,0.38856,0.375 +2024-09-09,0.35987,0.43199,0.39763,0.25 +2024-09-10,0.35722,0.41601,0.40565,0.25 +2024-09-11,0.35712,0.4105,0.41085,0.25 +2024-09-12,0.39516,0.40298,0.40752,0.375 +2024-09-13,0.38589,0.37927,0.4034,0.375 +2024-09-16,0.30732,0.26899,0.40296,0.25 +2024-09-17,0.26886,0.28848,0.3931,0.125 +2024-09-18,0.27699,0.31404,0.39192,0.125 +2024-09-19,0.26528,0.28789,0.38295,0.125 +2024-09-20,0.2874,0.24101,0.37119,0.25 +2024-09-23,0.29723,0.28771,0.35397,0.25 +2024-09-24,0.29243,0.29683,0.33045,0.25 +2024-09-25,0.29053,0.32264,0.29895,0.25 +2024-09-26,0.30327,0.36047,0.29933,0.25 +2024-09-27,0.30784,0.38318,0.29034,0.25 +2024-09-30,0.34113,0.358,0.29039,0.375 +2024-10-01,0.32888,0.32335,0.28829,0.375 +2024-10-03,0.35983,0.278,0.30149,0.5 +2024-10-04,0.38798,0.35078,0.31315,0.5 +2024-10-07,0.39664,0.37174,0.31817,0.5 +2024-10-08,0.40408,0.39047,0.32177,0.5 +2024-10-09,0.38922,0.36115,0.30652,0.5 +2024-10-10,0.38732,0.37361,0.28834,0.5 +2024-10-11,0.38493,0.38756,0.26722,0.5 +2024-10-14,0.37378,0.37795,0.24341,0.5 +2024-10-15,0.35968,0.35769,0.22135,0.5 +2024-10-16,0.35175,0.35073,0.20451,0.5 +2024-10-17,0.34098,0.33773,0.18521,0.5 +2024-10-18,0.3383,0.34978,0.16511,0.5 +2024-10-21,0.34311,0.36303,0.16631,0.5 +2024-10-22,0.33584,0.34698,0.16054,0.5 +2024-10-23,0.32863,0.32518,0.1607,0.5 +2024-10-24,0.33392,0.34126,0.16051,0.5 +2024-10-25,0.30195,0.36887,0.16198,0.375 +2024-10-28,0.29631,0.35418,0.15976,0.375 +2024-10-29,0.28817,0.33266,0.15686,0.375 +2024-10-30,0.28144,0.31207,0.15725,0.375 +2024-10-31,0.27531,0.28975,0.16118,0.375 +2024-11-01,0.28742,0.32381,0.16345,0.375 +2024-11-04,0.24038,0.30831,0.16283,0.25 +2024-11-05,0.24756,0.33351,0.15918,0.25 +2024-11-06,0.2425,0.32161,0.15589,0.25 +2024-11-07,0.25412,0.35789,0.15447,0.25 +2024-11-08,0.24816,0.34232,0.15217,0.25 +2024-11-11,0.2715,0.41649,0.148,0.25 +2024-11-12,0.23742,0.43678,0.15047,0.125 +2024-11-13,0.29231,0.59875,0.15319,0.125 +2024-11-14,0.21312,0.49046,0.1489,0 +2024-11-18,0.21472,0.49465,0.1495,0 +2024-11-19,0.21416,0.4926,0.14988,0 +2024-11-21,0.21871,0.50798,0.14816,0 +2024-11-22,0.26271,0.49635,0.16678,0.125 +2024-11-25,0.29166,0.5637,0.18628,0.125 +2024-11-26,0.27965,0.52274,0.1912,0.125 +2024-11-27,0.28635,0.53902,0.19504,0.125 +2024-11-28,0.27577,0.49684,0.20547,0.125 +2024-11-29,0.2819,0.51346,0.20724,0.125 +2024-12-02,0.28056,0.51642,0.20027,0.125 +2024-12-03,0.27298,0.50527,0.18866,0.125 +2024-12-04,0.27634,0.52658,0.17744,0.125 +2024-12-05,0.27874,0.53828,0.17294,0.125 +2024-12-06,0.26009,0.49365,0.16161,0.125 +2024-12-09,0.27281,0.52962,0.16382,0.125 +2024-12-10,0.28323,0.55506,0.16963,0.125 +2024-12-11,0.29551,0.58067,0.18086,0.125 +2024-12-12,0.30268,0.58933,0.19372,0.125 +2024-12-13,0.30238,0.58175,0.20039,0.125 +2024-12-16,0.30221,0.5739,0.20772,0.125 +2024-12-17,0.30047,0.57123,0.20519,0.125 +2024-12-18,0.29516,0.55327,0.20721,0.125 +2024-12-19,0.29194,0.54222,0.2086,0.125 +2024-12-20,0.29377,0.54694,0.20937,0.125 +2024-12-23,0.29984,0.56525,0.20928,0.125 +2024-12-24,0.29218,0.54093,0.21061,0.125 +2024-12-26,0.30865,0.58976,0.21119,0.125 +2024-12-27,0.30778,0.58639,0.21194,0.125 +2024-12-30,0.31963,0.62179,0.2121,0.125 +2024-12-31,0.31424,0.60371,0.214,0.125 +2025-01-01,0.31663,0.60421,0.22066,0.125 +2025-01-02,0.34613,0.57349,0.2149,0.25 +2025-01-03,0.34915,0.58913,0.20831,0.25 +2025-01-06,0.27904,0.50887,0.20326,0.125 +2025-01-07,0.27961,0.51719,0.19665,0.125 +2025-01-08,0.27895,0.51512,0.19673,0.125 +2025-01-09,0.28818,0.54106,0.19849,0.125 +2025-01-10,0.27783,0.51805,0.19044,0.125 +2025-01-13,0.26641,0.49745,0.17678,0.125 +2025-01-14,0.25521,0.47562,0.16502,0.125 +2025-01-15,0.26124,0.49235,0.16637,0.125 +2025-01-16,0.27157,0.52151,0.16821,0.125 +2025-01-17,0.27932,0.54318,0.16978,0.125 +2025-01-20,0.2743,0.52788,0.17003,0.125 +2025-01-21,0.26362,0.50462,0.16123,0.125 +2025-01-22,0.24654,0.46397,0.15064,0.125 +2025-01-23,0.23871,0.45275,0.13838,0.125 +2025-01-24,0.23868,0.46772,0.12333,0.125 +2025-01-27,0.2347,0.46495,0.11415,0.125 +2025-01-28,0.23329,0.47889,0.095988,0.125 +2025-01-29,0.23411,0.48459,0.092752,0.125 +2025-01-30,0.23286,0.48161,0.09198,0.125 +2025-01-31,0.21633,0.43308,0.090909,0.125 +2025-02-01,0.2048,0.39839,0.091018,0.125 +2025-02-03,0.20792,0.40881,0.089942,0.125 +2025-02-04,0.19447,0.36728,0.091115,0.125 +2025-02-05,0.17118,0.29694,0.091597,0.125 +2025-02-06,0.17686,0.31435,0.091227,0.125 +2025-02-07,0.18196,0.33,0.090885,0.125 +2025-02-10,0.17326,0.30497,0.089822,0.125 +2025-02-11,0.17692,0.33659,0.069158,0.125 +2025-02-12,0.11383,0.27267,0.068827,0 +2025-02-13,0.12628,0.29027,0.088567,0 +2025-02-14,0.13933,0.31936,0.098642,0 +2025-02-17,0.13802,0.31372,0.10032,0 +2025-02-18,0.15189,0.35481,0.10087,0 +2025-02-19,0.16355,0.39406,0.096592,0 +2025-02-20,0.19034,0.44288,0.12814,0 +2025-02-21,0.20704,0.45995,0.16118,0 +2025-02-24,0.20884,0.45326,0.17326,0 +2025-02-25,0.19812,0.40969,0.18467,0 +2025-02-27,0.2136,0.44381,0.197,0 +2025-02-28,0.22961,0.36702,0.19682,0.125 +2025-03-03,0.20701,0.29922,0.19682,0.125 +2025-03-04,0.20933,0.30902,0.19396,0.125 +2025-03-05,0.20599,0.29293,0.20005,0.125 +2025-03-06,0.21678,0.31879,0.20656,0.125 +2025-03-07,0.21363,0.30368,0.2122,0.125 +2025-03-10,0.21555,0.30407,0.21757,0.125 +2025-03-11,0.21654,0.30465,0.21997,0.125 +2025-03-12,0.22183,0.32018,0.22031,0.125 +2025-03-13,0.22539,0.32906,0.2221,0.125 +2025-03-17,0.23374,0.34722,0.229,0.125 +2025-03-18,0.23729,0.35746,0.2294,0.125 +2025-03-19,0.23037,0.33656,0.22955,0.125 +2025-03-20,0.23609,0.35338,0.2299,0.125 +2025-03-21,0.24137,0.36923,0.22988,0.125 +2025-03-24,0.2462,0.38426,0.22935,0.125 +2025-03-25,0.23806,0.3587,0.23049,0.125 +2025-03-26,0.22686,0.32448,0.23109,0.125 +2025-03-27,0.23324,0.3493,0.22541,0.125 +2025-03-28,0.22564,0.33152,0.2204,0.125 +2025-04-01,0.22074,0.31487,0.22236,0.125 +2025-04-02,0.22657,0.33311,0.22162,0.125 +2025-04-03,0.2164,0.30754,0.21666,0.125 +2025-04-04,0.20188,0.26676,0.21389,0.125 +2025-04-07,0.31505,0.44944,0.24571,0.25 +2025-04-08,0.35768,0.55727,0.26578,0.25 +2025-04-09,0.35872,0.551,0.27516,0.25 +2025-04-11,0.36857,0.55171,0.304,0.25 +2025-04-15,0.38853,0.58211,0.33349,0.25 +2025-04-16,0.39755,0.596,0.34666,0.25 +2025-04-17,0.36952,0.62304,0.36051,0.125 +2025-04-21,0.36133,0.60478,0.35422,0.125 +2025-04-22,0.35902,0.60508,0.34698,0.125 +2025-04-23,0.36202,0.60997,0.3511,0.125 +2025-04-24,0.36564,0.61904,0.35287,0.125 +2025-04-25,0.36118,0.60377,0.35476,0.125 +2025-04-28,0.35642,0.5884,0.35585,0.125 +2025-04-29,0.34041,0.54702,0.34921,0.125 +2025-04-30,0.34424,0.5616,0.34611,0.125 +2025-05-02,0.35073,0.58335,0.34385,0.125 +2025-05-05,0.35698,0.60946,0.33649,0.125 +2025-05-06,0.36544,0.63515,0.33617,0.125 +2025-05-07,0.37592,0.66055,0.34222,0.125 +2025-05-08,0.38388,0.66925,0.35738,0.125 +2025-05-09,0.38598,0.67033,0.36263,0.125 +2025-05-12,0.42631,0.67377,0.35516,0.25 +2025-05-13,0.41994,0.66454,0.34528,0.25 +2025-05-14,0.41485,0.65162,0.34292,0.25 +2025-05-15,0.40537,0.62847,0.33763,0.25 +2025-05-16,0.402,0.62326,0.33273,0.25 +2025-05-19,0.40747,0.64173,0.33067,0.25 +2025-05-20,0.40423,0.6352,0.3275,0.25 +2025-05-21,0.40559,0.64614,0.32063,0.25 +2025-05-22,0.40156,0.63482,0.31985,0.25 +2025-05-23,0.34639,0.58886,0.32531,0.125 +2025-05-26,0.35292,0.59853,0.33522,0.125 +2025-05-27,0.36157,0.6165,0.3432,0.125 +2025-05-28,0.34635,0.5676,0.34645,0.125 +2025-05-29,0.35754,0.60324,0.34439,0.125 +2025-05-30,0.36453,0.63064,0.33794,0.125 +2025-06-02,0.35984,0.6227,0.33181,0.125 +2025-06-03,0.36892,0.63468,0.34709,0.125 +2025-06-04,0.37521,0.63462,0.36603,0.125 +2025-06-05,0.38027,0.63687,0.37894,0.125 +2025-06-06,0.38362,0.63755,0.38832,0.125 +2025-06-09,0.38377,0.62893,0.39737,0.125 +2025-06-10,0.39666,0.6563,0.40868,0.125 +2025-06-11,0.39851,0.65341,0.41713,0.125 +2025-06-12,0.38993,0.62616,0.41862,0.125 +2025-06-13,0.38763,0.62053,0.41737,0.125 +2025-06-16,0.3851,0.61676,0.41355,0.125 +2025-06-17,0.38026,0.60291,0.41288,0.125 +2025-06-18,0.38026,0.60851,0.40726,0.125 +2025-06-19,0.38186,0.6269,0.39367,0.125 +2025-06-20,0.37231,0.60882,0.38312,0.125 +2025-06-23,0.23776,0.33179,0.38148,0 +2025-06-24,0.24261,0.3547,0.37312,0 +2025-06-25,0.24406,0.37237,0.35982,0 +2025-06-26,0.27368,0.48957,0.33149,0 +2025-06-27,0.24092,0.4344,0.28836,0 +2025-06-30,0.23005,0.46864,0.22152,0 +2025-07-01,0.19398,0.48013,0.10181,0 +2025-07-02,0.19522,0.49833,0.08734,0 +2025-07-03,0.18703,0.48158,0.079498,0 +2025-07-04,0.18435,0.48983,0.063235,0 +2025-07-07,0.19961,0.50998,0.088859,0 +2025-07-08,0.21609,0.53724,0.11103,0 +2025-07-09,0.22713,0.5442,0.1372,0 +2025-07-10,0.23247,0.53914,0.15825,0 +2025-07-11,0.23336,0.53279,0.16729,0 +2025-07-14,0.23694,0.53445,0.17637,0 +2025-07-15,0.24083,0.54294,0.17956,0 +2025-07-16,0.24114,0.54431,0.17911,0 +2025-07-17,0.24121,0.54201,0.18163,0 +2025-07-18,0.24558,0.5497,0.18704,0 +2025-07-21,0.24648,0.55081,0.18864,0 +2025-07-22,0.23786,0.51926,0.19431,0 +2025-07-23,0.24871,0.54975,0.19638,0 +2025-07-24,0.24227,0.52911,0.19769,0 +2025-07-25,0.23915,0.52204,0.1954,0 +2025-07-28,0.24749,0.5527,0.18976,0 +2025-07-29,0.24788,0.55414,0.18949,0 +2025-07-30,0.23573,0.51788,0.1893,0 +2025-07-31,0.27567,0.63779,0.18922,0 +2025-08-01,0.26275,0.61217,0.17608,0 +2025-08-04,0.26911,0.63765,0.16967,0 +2025-08-05,0.27227,0.65073,0.16608,0 +2025-08-06,0.25065,0.58879,0.16317,0 +2025-08-07,0.26714,0.64387,0.15754,0 +2025-08-08,0.2774,0.55433,0.15287,0.125 +2025-08-11,0.3072,0.6475,0.1491,0.125 +2025-08-12,0.29944,0.62381,0.14951,0.125 +2025-08-13,0.29756,0.61688,0.15079,0.125 +2025-08-14,0.28545,0.58061,0.15073,0.125 +2025-08-18,0.24945,0.4658,0.15754,0.125 +2025-08-19,0.23027,0.41537,0.15043,0.125 +2025-08-20,0.2177,0.39381,0.13429,0.125 +2025-08-21,0.21824,0.4188,0.11093,0.125 +2025-08-22,0.1968,0.37614,0.089261,0.125 +2025-08-25,0.19778,0.38855,0.079775,0.125 +2025-08-26,0.19178,0.37304,0.077299,0.125 +2025-08-28,0.20789,0.42556,0.073103,0.125 +2025-08-29,0.1919,0.38399,0.066711,0.125 +2025-09-01,0.1847,0.36789,0.061202,0.125 +2025-09-02,0.17438,0.3432,0.054937,0.125 +2025-09-03,0.17176,0.3355,0.054786,0.125 +2025-09-04,0.17156,0.34594,0.043742,0.125 +2025-09-05,0.19033,0.40798,0.037999,0.125 +2025-09-08,0.205,0.4409,0.049092,0.125 +2025-09-09,0.2085,0.4311,0.069386,0.125 +2025-09-10,0.2173,0.42754,0.099356,0.125 +2025-09-11,0.23288,0.44021,0.13344,0.125 +2025-09-12,0.24192,0.43311,0.16765,0.125 +2025-09-15,0.25409,0.44624,0.19104,0.125 +2025-09-16,0.24703,0.40888,0.20723,0.125 +2025-09-17,0.25319,0.41152,0.22304,0.125 +2025-09-18,0.25713,0.40761,0.23878,0.125 +2025-09-19,0.25492,0.39442,0.24534,0.125 +2025-09-22,0.27198,0.44521,0.24571,0.125 +2025-09-23,0.20364,0.36254,0.24837,0 +2025-09-24,0.20196,0.35936,0.24653,0 +2025-09-25,0.20403,0.36366,0.24844,0 +2025-09-26,0.22429,0.42263,0.25023,0 +2025-09-29,0.23075,0.43281,0.25943,0 +2025-09-30,0.24349,0.46955,0.26091,0 +2025-10-01,0.2246,0.41895,0.25486,0 +2025-10-03,0.21149,0.3778,0.25668,0 +2025-10-06,0.2189,0.39676,0.25994,0 +2025-10-07,0.21125,0.37278,0.26097,0 +2025-10-08,0.21783,0.39112,0.26236,0 +2025-10-09,0.17409,0.26683,0.25543,0 +2025-10-10,0.17603,0.27462,0.25346,0 +2025-10-13,0.17813,0.27968,0.25472,0 +2025-10-14,0.1841,0.30801,0.24428,0 +2025-10-15,0.18356,0.31744,0.23325,0 +2025-10-16,0.25869,0.43195,0.21911,0.125 +2025-10-17,0.2443,0.40319,0.20472,0.125 +2025-10-20,0.22818,0.35774,0.20182,0.125 +2025-10-21,0.22277,0.34138,0.20191,0.125 +2025-10-23,0.23703,0.38749,0.1986,0.125 +2025-10-24,0.23533,0.39341,0.18759,0.125 +2025-10-27,0.2275,0.38951,0.16798,0.125 +2025-10-28,0.21134,0.36447,0.14456,0.125 +2025-10-29,0.21273,0.38384,0.12936,0.125 +2025-10-30,0.21155,0.3923,0.11737,0.125 +2025-10-31,0.21174,0.40622,0.10399,0.125 +2025-11-03,0.20116,0.38942,0.089063,0.125 +2025-11-04,0.19456,0.37206,0.086608,0.125 +2025-11-06,0.19415,0.37041,0.087045,0.125 +2025-11-07,0.1988,0.38445,0.086944,0.125 +2025-11-10,0.20396,0.39797,0.088913,0.125 +2025-11-11,0.18653,0.34675,0.087838,0.125 +2025-11-12,0.2092,0.41626,0.08635,0.125 +2025-11-13,0.17567,0.32878,0.073219,0.125 +2025-11-14,0.21126,0.43819,0.070591,0.125 +2025-11-17,0.22707,0.47309,0.083135,0.125 +2025-11-18,0.2346,0.49898,0.079829,0.125 +2025-11-19,0.24332,0.54472,0.060244,0.125 +2025-11-20,0.23592,0.53483,0.047943,0.125 +2025-11-21,0.24062,0.54864,0.048226,0.125 +2025-11-24,0.24092,0.54936,0.048397,0.125 +2025-11-25,0.2406,0.54951,0.047304,0.125 +2025-11-26,0.26715,0.48422,0.067221,0.25 +2025-11-27,0.23622,0.37981,0.078865,0.25 +2025-11-28,0.23453,0.36817,0.085437,0.25 +2025-12-01,0.19711,0.37827,0.088069,0.125 +2025-12-02,0.19149,0.35695,0.092511,0.125 +2025-12-03,0.19272,0.35806,0.095111,0.125 +2025-12-04,0.18754,0.34091,0.096707,0.125 +2025-12-05,0.18432,0.32477,0.10319,0.125 +2025-12-08,0.19727,0.36374,0.10307,0.125 +2025-12-09,0.20982,0.40172,0.10276,0.125 +2025-12-10,0.20897,0.40372,0.098179,0.125 +2025-12-11,0.20433,0.39438,0.093596,0.125 +2025-12-12,0.201,0.38225,0.09575,0.125 +2025-12-15,0.20106,0.38025,0.097927,0.125 +2025-12-16,0.19914,0.37349,0.098935,0.125 +2025-12-17,0.19392,0.35834,0.098425,0.125 +2025-12-18,0.20263,0.38458,0.098307,0.125 +2025-12-19,0.19198,0.3535,0.097437,0.125 +2025-12-22,0.20043,0.38196,0.094333,0.125 +2025-12-23,0.18347,0.33213,0.093268,0.125 +2025-12-24,0.20505,0.39712,0.093034,0.125 +2025-12-26,0.19452,0.36372,0.094837,0.125 +2025-12-29,0.19173,0.36265,0.087548,0.125 +2025-12-30,0.18655,0.36628,0.068364,0.125 diff --git a/dashboard/data/oos_btc.csv b/dashboard/data/oos_btc.csv new file mode 100644 index 0000000..1f3cbd0 --- /dev/null +++ b/dashboard/data/oos_btc.csv @@ -0,0 +1,3291 @@ +date,fold,actual_vol,har_vol,rf_vol,mean_vol +2016-12-23,0,0.0271426,0.0173581,0.0202396,0.0164598 +2016-12-24,0,0.0204834,0.018975,0.0163355,0.0164598 +2016-12-25,0,0.0230324,0.0191478,0.0170455,0.0164598 +2016-12-26,0,0.0236122,0.0189911,0.0170562,0.0164598 +2016-12-27,0,0.0250502,0.0186455,0.0167076,0.0164598 +2016-12-28,0,0.0195778,0.01832,0.0208995,0.0164598 +2016-12-29,0,0.0189221,0.0172957,0.0182294,0.0164598 +2016-12-30,0,0.0377854,0.0179454,0.018262,0.0164598 +2016-12-31,0,0.0851128,0.0180867,0.0173866,0.0164598 +2017-01-01,0,0.0996154,0.0185143,0.0222554,0.0164598 +2017-01-02,0,0.0981057,0.0176743,0.015743,0.0164598 +2017-01-03,0,0.096322,0.0175687,0.0124803,0.0164598 +2017-01-04,0,0.0681645,0.0226141,0.0226941,0.0164598 +2017-01-05,0,0.0530321,0.0313876,0.045914,0.0164598 +2017-01-06,0,0.0700518,0.0345438,0.0436169,0.0164598 +2017-01-07,0,0.074525,0.0344277,0.0364941,0.0164598 +2017-01-08,0,0.0769359,0.034296,0.0366801,0.0164598 +2017-01-09,0,0.0770301,0.0318055,0.0386907,0.0164598 +2017-01-10,0,0.0769323,0.0300926,0.0347315,0.0164598 +2017-01-11,0,0.0160616,0.0341432,0.034789,0.0164598 +2017-01-12,0,0.0373359,0.034545,0.0339852,0.0164598 +2017-01-13,0,0.0430698,0.0347073,0.029894,0.0164598 +2017-01-14,0,0.0414576,0.0342602,0.0303206,0.0164598 +2017-01-15,0,0.0423916,0.0342482,0.031212,0.0164598 +2017-01-16,0,0.0425769,0.0242666,0.0196253,0.0164598 +2017-01-17,0,0.019942,0.0297617,0.0255227,0.0164598 +2017-01-18,0,0.0143079,0.0306762,0.0213628,0.0164598 +2017-01-19,0,0.0216768,0.0302681,0.0250493,0.0164598 +2017-01-20,0,0.0221148,0.030417,0.0237418,0.0164598 +2017-01-21,0,0.0187461,0.0305172,0.0238765,0.0164598 +2017-01-22,0,0.0187078,0.0258222,0.0218028,0.0164598 +2017-01-23,0,0.0186669,0.0239062,0.0196112,0.0164598 +2017-01-24,0,0.00787711,0.026176,0.0244301,0.0164598 +2017-01-25,0,0.00776617,0.0262559,0.0232521,0.0164598 +2017-01-26,0,0.0233989,0.0244691,0.017454,0.0164598 +2017-01-27,0,0.0230083,0.0231278,0.0185574,0.0164598 +2017-01-28,0,0.0220362,0.0216722,0.0191599,0.0164598 +2017-01-29,0,0.0188689,0.0179172,0.0179433,0.0164598 +2017-01-30,0,0.0160365,0.0178618,0.0181148,0.0164598 +2017-01-31,0,0.0152255,0.0230732,0.0231106,0.0164598 +2017-02-01,0,0.0146266,0.0230161,0.0218285,0.0164598 +2017-02-02,0,0.0144798,0.0181006,0.0209716,0.0164598 +2017-02-03,0,0.01399,0.0173613,0.0156645,0.0164598 +2017-02-04,0,0.034764,0.0167064,0.0168589,0.0164598 +2017-02-05,0,0.0346441,0.0166101,0.0152137,0.0164598 +2017-02-06,0,0.0354205,0.0164528,0.0127697,0.0164598 +2017-02-07,0,0.0318071,0.0164476,0.0123695,0.0164598 +2017-02-08,0,0.0310269,0.0142683,0.0168701,0.0164598 +2017-02-09,0,0.0118191,0.0193183,0.0220608,0.0164598 +2017-02-10,0,0.0109975,0.019313,0.0210955,0.0164598 +2017-02-11,0,0.0121102,0.0194193,0.0209255,0.0164598 +2017-02-12,0,0.011896,0.0187733,0.0218032,0.0164598 +2017-02-13,0,0.00703561,0.0187219,0.0201732,0.0164598 +2017-02-14,0,0.0107765,0.0151494,0.01496,0.0164598 +2017-02-15,0,0.0137639,0.0145253,0.0156354,0.0164598 +2017-02-16,0,0.0160294,0.0148917,0.0124731,0.0164598 +2017-02-17,0,0.0171942,0.0148355,0.0126367,0.0164598 +2017-02-18,0,0.0212313,0.0132112,0.0144227,0.0164598 +2017-02-19,0,0.0178669,0.0145618,0.0149081,0.0164598 +2017-02-20,0,0.0271121,0.0155222,0.0208511,0.0164598 +2017-02-21,0,0.0251191,0.0162418,0.021633,0.0164598 +2017-02-22,0,0.024845,0.0158133,0.0182093,0.0164598 +2017-02-23,0,0.0171324,0.0169824,0.0237452,0.0164598 +2017-02-24,0,0.0228354,0.0162665,0.0163578,0.0164598 +2017-02-25,0,0.0130578,0.0181399,0.0183521,0.0164598 +2017-02-26,0,0.013065,0.0178934,0.0204781,0.0164598 +2017-02-27,0,0.0201786,0.017717,0.0212672,0.0164598 +2017-02-28,0,0.019146,0.0163311,0.0167985,0.0164598 +2017-03-01,0,0.0151879,0.0175948,0.0239565,0.0164598 +2017-03-02,0,0.0233345,0.0156279,0.0121451,0.0164598 +2017-03-03,0,0.0301219,0.0135092,0.0121603,0.0164598 +2017-03-04,0,0.0387319,0.0150971,0.0231525,0.0164598 +2017-03-05,0,0.0424059,0.0149818,0.0183481,0.0164598 +2017-03-06,0,0.0542433,0.0142749,0.0160236,0.0164598 +2017-03-07,0,0.0568115,0.0168941,0.0216493,0.0164598 +2017-03-08,0,0.0452639,0.0196756,0.0220418,0.0164598 +2017-03-09,0,0.043992,0.0210062,0.0248027,0.0164598 +2017-03-10,0,0.0209326,0.0226796,0.0262683,0.0164598 +2017-03-11,0,0.0322982,0.024454,0.0338613,0.0164598 +2017-03-12,0,0.0401017,0.0254822,0.0381659,0.0164598 +2017-03-13,0,0.0556385,0.0242139,0.0273861,0.0164598 +2017-03-14,0,0.0722921,0.0239347,0.0265123,0.0164598 +2017-03-15,0,0.0737459,0.0201758,0.0229679,0.0164598 +2017-03-16,0,0.0836719,0.022797,0.0296058,0.0164598 +2017-03-17,0,0.0817008,0.0245985,0.032841,0.0164598 +2017-03-18,0,0.0536863,0.028632,0.0435017,0.0164598 +2017-03-19,0,0.064992,0.0309409,0.0439375,0.0164598 +2017-03-20,0,0.068392,0.0310638,0.0408843,0.0164598 +2017-03-21,0,0.0546825,0.0324405,0.042454,0.0164598 +2017-03-22,0,0.0673815,0.0327094,0.041591,0.0164598 +2017-03-23,0,0.0671738,0.0296031,0.0365161,0.0164598 +2017-03-24,0,0.0370036,0.0315824,0.0358381,0.0164598 +2017-03-25,0,0.038277,0.0321035,0.0355648,0.0164598 +2017-03-26,0,0.0391761,0.0305618,0.0300872,0.0164598 +2017-03-27,0,0.0220389,0.0327215,0.0340892,0.0164598 +2017-03-28,0,0.0224967,0.0326915,0.0301583,0.0164598 +2017-03-29,0,0.0227221,0.0285749,0.0229237,0.0164598 +2017-03-30,0,0.0213935,0.0284969,0.0252716,0.0164598 +2017-03-31,0,0.0194395,0.028704,0.0253593,0.0164598 +2017-04-01,0,0.0264503,0.025028,0.0202399,0.0164598 +2017-04-02,0,0.0282859,0.0249248,0.0200582,0.0164598 +2017-04-03,0,0.0251644,0.0249625,0.023726,0.0164598 +2017-04-04,0,0.023765,0.0246251,0.0224919,0.0164598 +2017-04-05,0,0.0227168,0.0241022,0.0190173,0.0164598 +2017-04-06,0,0.00837057,0.0260245,0.0235061,0.0164598 +2017-04-07,0,0.00811082,0.0261846,0.022157,0.0164598 +2017-04-08,0,0.0159892,0.0249317,0.0209426,0.0164598 +2017-04-09,0,0.0147478,0.0227112,0.0239852,0.0164598 +2017-04-10,0,0.0151381,0.0221287,0.0212598,0.0164598 +2017-04-11,0,0.0135442,0.017754,0.0180224,0.0164598 +2017-04-12,0,0.0147192,0.017259,0.0193763,0.0164598 +2017-04-13,0,0.00608727,0.0194264,0.0159729,0.0164598 +2017-04-14,0,0.00596439,0.0190544,0.0191456,0.0164598 +2017-04-15,0,0.00663848,0.0166678,0.0184944,0.0164598 +2017-04-16,0,0.00952867,0.01606,0.013968,0.0164598 +2017-04-17,0,0.00945063,0.0162908,0.014118,0.0164598 +2017-04-18,0,0.0135507,0.0119908,0.0184499,0.0164598 +2017-04-19,0,0.0209017,0.0119486,0.0194487,0.0164598 +2017-04-20,0,0.0206063,0.012187,0.0182139,0.0164598 +2017-04-21,0,0.0196269,0.0130992,0.0185723,0.0164598 +2017-04-22,0,0.0212611,0.0124969,0.0159006,0.0164598 +2017-04-23,0,0.0142757,0.0138594,0.01277,0.0164598 +2017-04-24,0,0.0110723,0.015593,0.024204,0.0164598 +2017-04-25,0,0.0117171,0.0150399,0.0218746,0.0164598 +2017-04-26,0,0.0215832,0.0147988,0.0199626,0.0164598 +2017-04-27,0,0.0212199,0.0152166,0.0213673,0.0164598 +2017-04-28,0,0.0178734,0.0128345,0.0129451,0.0164598 +2017-04-29,0,0.0136141,0.0120715,0.0155797,0.0164598 +2017-04-30,0,0.0155384,0.0123255,0.0115662,0.0164598 +2017-05-01,0,0.00799399,0.0153974,0.0223607,0.0164598 +2017-05-02,0,0.0090452,0.0153831,0.0192713,0.0164598 +2017-05-03,0,0.0276798,0.0149211,0.0151114,0.0164598 +2017-05-04,0,0.028015,0.0141534,0.0226756,0.0164598 +2017-05-05,0,0.0272925,0.0138257,0.0142287,0.0164598 +2017-05-06,0,0.0263574,0.011846,0.0165487,0.0164598 +2017-05-07,0,0.0531397,0.0121581,0.0161061,0.0164598 +2017-05-08,0,0.0455901,0.0174534,0.0212723,0.0164598 +2017-05-09,0,0.0453516,0.0175171,0.0172383,0.0164598 +2017-05-10,0,0.0487665,0.0174318,0.0169709,0.0164598 +2017-05-11,0,0.0439203,0.0172363,0.0212421,0.0164598 +2017-05-12,0,0.0396243,0.0229832,0.0271715,0.0164598 +2017-05-13,0,0.0364589,0.0223047,0.0231156,0.0164598 +2017-05-14,0,0.0404965,0.0223199,0.0224557,0.0164598 +2017-05-15,0,0.0246406,0.0232116,0.0256274,0.0164598 +2017-05-16,0,0.032267,0.0227593,0.0247683,0.0164598 +2017-05-17,0,0.0331502,0.0229205,0.0278083,0.0164598 +2017-05-18,0,0.0356178,0.02256,0.022531,0.0164598 +2017-05-19,0,0.0356621,0.0232951,0.0289422,0.0164598 +2017-05-20,0,0.0564361,0.0209701,0.0253885,0.0164598 +2017-05-21,0,0.061701,0.0226524,0.0239283,0.0164598 +2017-05-22,0,0.0663003,0.0231091,0.0297124,0.0164598 +2017-05-23,0,0.0635254,0.0238878,0.0320397,0.0164598 +2017-05-24,0,0.0618749,0.0240358,0.0324964,0.0164598 +2017-05-25,0,0.0587868,0.0277222,0.0431296,0.0164598 +2017-05-26,0,0.0604451,0.0289678,0.0444792,0.0164598 +2017-05-27,0,0.0390056,0.0305412,0.0442592,0.0164598 +2017-05-28,0,0.0369989,0.0304707,0.0428122,0.0164598 +2017-05-29,0,0.0363556,0.0304086,0.0427357,0.0164598 +2017-05-30,0,0.0235728,0.0298255,0.0435703,0.0164598 +2017-05-31,0,0.0283291,0.0301726,0.0424178,0.0164598 +2017-06-01,0,0.0307519,0.0275475,0.0323186,0.0164598 +2017-06-02,0,0.0478179,0.0272282,0.0329667,0.0164598 +2017-06-03,0,0.0476822,0.0262359,0.0310334,0.0164598 +2017-06-04,0,0.0468453,0.0237811,0.0230671,0.0164598 +2017-06-05,0,0.0421597,0.0250329,0.0278866,0.0164598 +2017-06-06,0,0.0338529,0.0252359,0.0284288,0.0164598 +2017-06-07,0,0.058674,0.0283072,0.0326164,0.0164598 +2017-06-08,0,0.0580112,0.0280959,0.0268627,0.0164598 +2017-06-09,0,0.0657528,0.0280012,0.0299041,0.0164598 +2017-06-10,0,0.0551541,0.027283,0.0310315,0.0164598 +2017-06-11,0,0.0588605,0.0259026,0.0268575,0.0164598 +2017-06-12,0,0.0513284,0.0307058,0.0340406,0.0164598 +2017-06-13,0,0.0523714,0.0303332,0.029878,0.0164598 +2017-06-14,0,0.036489,0.0315419,0.0335758,0.0164598 +2017-06-15,0,0.0379617,0.0300936,0.0303108,0.0164598 +2017-06-16,0,0.040476,0.0301388,0.0288926,0.0164598 +2017-06-17,0,0.03377,0.0291631,0.0287813,0.0164598 +2017-06-18,0,0.0225004,0.0286527,0.0306133,0.0164598 +2017-06-19,0,0.0369126,0.0262052,0.0243406,0.0164598 +2017-06-20,0,0.0252008,0.026466,0.0252947,0.0164598 +2017-06-21,0,0.0294908,0.0266337,0.0256643,0.0164598 +2017-06-22,0,0.0352179,0.025394,0.0228659,0.0164598 +2017-06-23,0,0.0342264,0.0229939,0.0240605,0.0164598 +2017-06-24,0,0.0272115,0.0258842,0.0249534,0.0164598 +2017-06-25,0,0.0284077,0.0237926,0.0206466,0.0164598 +2017-06-26,0,0.0221791,0.0248358,0.0242394,0.0164598 +2017-06-27,0,0.0220651,0.0253445,0.0238287,0.0164598 +2017-06-28,0,0.0247497,0.0245913,0.0229233,0.0164598 +2017-06-29,0,0.0242662,0.0231344,0.0234877,0.0164598 +2017-06-30,0,0.0192059,0.0232756,0.0204346,0.0164598 +2017-07-01,0,0.0125351,0.0220345,0.0226856,0.0164598 +2017-07-02,0,0.0221327,0.0218434,0.0235145,0.0164598 +2017-07-03,0,0.0216505,0.0225159,0.0201948,0.0164598 +2017-07-04,0,0.0217124,0.0207733,0.0228247,0.0164598 +2017-07-05,0,0.031438,0.0196367,0.0197047,0.0164598 +2017-07-06,0,0.0294407,0.0166627,0.0149763,0.0164598 +2017-07-07,0,0.0347438,0.0191473,0.0253713,0.0164598 +2017-07-08,0,0.0302888,0.0190451,0.0209654,0.0164598 +2017-07-09,0,0.0346343,0.018441,0.021914,0.0164598 +2017-07-10,0,0.0513636,0.0204517,0.0220915,0.0164598 +2017-07-11,0,0.0502237,0.0201293,0.0227098,0.0164598 +2017-07-12,0,0.0953819,0.0203043,0.0195629,0.0164598 +2017-07-13,0,0.0983728,0.0197215,0.0239747,0.0164598 +2017-07-14,0,0.0950624,0.0208697,0.0220699,0.0164598 +2017-07-15,0,0.107688,0.0248677,0.0289146,0.0164598 +2017-07-16,0,0.112626,0.0245747,0.0253185,0.0164598 +2017-07-17,0,0.10363,0.0324028,0.034521,0.0164598 +2017-07-18,0,0.109113,0.032704,0.0332887,0.0164598 +2017-07-19,0,0.106383,0.0323515,0.0308866,0.0164598 +2017-07-20,0,0.048676,0.0378506,0.0332217,0.0164598 +2017-07-21,0,0.0443407,0.0384842,0.0321237,0.0164598 +2017-07-22,0,0.0453199,0.0379268,0.0321119,0.0164598 +2017-07-23,0,0.0506079,0.0384222,0.0307288,0.0164598 +2017-07-24,0,0.0529024,0.0381979,0.0296168,0.0164598 +2017-07-25,0,0.0385406,0.032426,0.0242968,0.0164598 +2017-07-26,0,0.0353429,0.0318228,0.0233543,0.0164598 +2017-07-27,0,0.0457759,0.0321715,0.0238144,0.0164598 +2017-07-28,0,0.0377038,0.0331082,0.0249657,0.0164598 +2017-07-29,0,0.0389028,0.033413,0.0293565,0.0164598 +2017-07-30,0,0.040711,0.0311635,0.024623,0.0164598 +2017-07-31,0,0.0628925,0.0306264,0.023994,0.0164598 +2017-08-01,0,0.0506061,0.0323728,0.0237435,0.0164598 +2017-08-02,0,0.0464809,0.0309965,0.0224304,0.0164598 +2017-08-03,0,0.0486575,0.0312256,0.0243638,0.0164598 +2017-08-04,0,0.0564009,0.031564,0.0242865,0.0164598 +2017-08-05,0,0.0280884,0.0350541,0.0322736,0.0164598 +2017-08-06,0,0.0385298,0.032386,0.0266401,0.0164598 +2017-08-07,0,0.0407717,0.0315817,0.0245309,0.0164598 +2017-08-08,0,0.0404012,0.0308003,0.0257143,0.0164598 +2017-08-09,0,0.0246532,0.0319268,0.0269281,0.0164598 +2017-08-10,0,0.0438287,0.0272841,0.0232401,0.0164598 +2017-08-11,0,0.0397915,0.025865,0.0250653,0.0164598 +2017-08-12,0,0.0411851,0.0258534,0.0245807,0.0164598 +2017-08-13,0,0.0459464,0.0258055,0.0252878,0.0164598 +2017-08-14,0,0.0346655,0.0230631,0.0232362,0.0164598 +2017-08-15,0,0.0332249,0.0265275,0.025411,0.0164598 +2017-08-16,0,0.0180013,0.0250066,0.0254215,0.0164598 +2017-08-17,0,0.0263937,0.025121,0.0257408,0.0164598 +2017-08-18,0,0.021888,0.0261338,0.0252563,0.0164598 +2017-08-19,0,0.0295799,0.0244618,0.0225494,0.0164598 +2017-08-20,0,0.0236249,0.0241772,0.0201751,0.0164598 +2017-08-21,0,0.0179687,0.0212889,0.0160658,0.0164598 +2017-08-22,0,0.0178173,0.0230874,0.0197225,0.0164598 +2017-08-23,0,0.0188203,0.0214803,0.0251245,0.0164598 +2017-08-24,0,0.0191022,0.0229465,0.0241467,0.0164598 +2017-08-25,0,0.0201379,0.0218507,0.0207849,0.0164598 +2017-08-26,0,0.0203943,0.0206256,0.018944,0.0164598 +2017-08-27,0,0.0220712,0.0191213,0.0171323,0.0164598 +2017-08-28,0,0.0457155,0.0192733,0.0183418,0.0164598 +2017-08-29,0,0.0412994,0.0192635,0.0221031,0.0164598 +2017-08-30,0,0.0545004,0.0195409,0.0235633,0.0164598 +2017-08-31,0,0.0550788,0.0193863,0.0258512,0.0164598 +2017-09-01,0,0.0576004,0.0198196,0.023677,0.0164598 +2017-09-02,0,0.0491468,0.0237279,0.0236658,0.0164598 +2017-09-03,0,0.0621445,0.0226322,0.0231403,0.0164598 +2017-09-04,0,0.0513684,0.0250861,0.0307724,0.0164598 +2017-09-05,0,0.0484596,0.0246526,0.0308734,0.0164598 +2017-09-06,0,0.0380429,0.0250723,0.0315306,0.0164598 +2017-09-07,0,0.0371261,0.0238521,0.0228935,0.0164598 +2017-09-08,0,0.0279818,0.0265016,0.0329686,0.0164598 +2017-09-09,0,0.0874233,0.0251307,0.0266791,0.0164598 +2017-09-10,0,0.126657,0.024901,0.0210859,0.0164598 +2017-09-11,0,0.125923,0.0235158,0.0238414,0.0164598 +2017-09-12,0,0.125763,0.0233402,0.0222861,0.0164598 +2017-09-13,0,0.140538,0.0224737,0.0232345,0.0164598 +2017-09-14,0,0.0837419,0.0338689,0.0332217,0.0164598 +2017-09-15,0,0.0639167,0.038757,0.0332217,0.0164598 +2017-09-16,0,0.0752816,0.0386921,0.0295456,0.0164598 +2017-09-17,0,0.0749963,0.0386837,0.0318672,0.0164598 +2017-09-18,0,0.0433471,0.0414034,0.0332217,0.0164598 +2017-09-19,0,0.0427115,0.0370248,0.03273,0.0164598 +2017-09-20,0,0.0551573,0.0347343,0.0287767,0.0164598 +2017-09-21,0,0.03859,0.0362484,0.0326591,0.0164598 +2017-09-22,0,0.0460466,0.0361111,0.0288989,0.0164598 +2017-09-23,0,0.0475088,0.0320608,0.0243021,0.0164598 +2017-09-24,0,0.0418848,0.0317828,0.0230946,0.0164598 +2017-09-25,0,0.0375564,0.0339505,0.0300187,0.0164598 +2017-09-26,0,0.0344196,0.0310743,0.0221335,0.0164598 +2017-09-27,0,0.019409,0.0325896,0.0245389,0.0164598 +2017-09-28,0,0.0232132,0.032644,0.0235182,0.0164598 +2017-09-29,0,0.0262154,0.0317582,0.0225193,0.0164598 +2017-09-30,0,0.0201618,0.0307257,0.0241031,0.0164598 +2017-10-01,0,0.0192973,0.0301519,0.0232284,0.0164598 +2017-10-02,0,0.0203628,0.0265407,0.0196367,0.0164598 +2017-10-03,0,0.0224033,0.0276352,0.0196837,0.0164598 +2017-10-04,0,0.0133789,0.0284983,0.0195681,0.0164598 +2017-10-05,0,0.0166791,0.0266866,0.020077,0.0164598 +2017-10-06,0,0.0167547,0.0231634,0.0205786,0.0164598 +2017-10-07,0,0.0473093,0.0216469,0.0251569,0.0164598 +2017-10-08,0,0.0473724,0.0221991,0.0239203,0.0164598 +2017-10-09,0,0.0474569,0.0198045,0.0213219,0.0164598 +2017-10-10,0,0.0544512,0.0189887,0.0179841,0.0164598 +2017-10-11,0,0.0545619,0.018707,0.0158134,0.0164598 +2017-10-12,0,0.0291745,0.0255624,0.0258817,0.0164598 +2017-10-13,0,0.0237275,0.0242097,0.0248027,0.0164598 +2017-10-14,0,0.0198843,0.0241641,0.0244052,0.0164598 +2017-10-15,0,0.02731,0.0252314,0.0256632,0.0164598 +2017-10-16,0,0.0275401,0.0247981,0.0263861,0.0164598 +2017-10-17,0,0.0233344,0.02151,0.0196632,0.0164598 +2017-10-18,0,0.0255448,0.020506,0.0210036,0.0164598 +2017-10-19,0,0.0436779,0.0190598,0.0215783,0.0164598 +2017-10-20,0,0.0398591,0.0206092,0.0231284,0.0164598 +2017-10-21,0,0.0428519,0.0206085,0.023588,0.0164598 +2017-10-22,0,0.0435099,0.0198176,0.0238035,0.0164598 +2017-10-23,0,0.0434121,0.0203698,0.0233992,0.0164598 +2017-10-24,0,0.0352711,0.0242065,0.0237446,0.0164598 +2017-10-25,0,0.0350118,0.0236668,0.0237521,0.0164598 +2017-10-26,0,0.039492,0.0238532,0.0195853,0.0164598 +2017-10-27,0,0.0336424,0.0241419,0.0207686,0.0164598 +2017-10-28,0,0.0268913,0.0241934,0.0236352,0.0164598 +2017-10-29,0,0.0238961,0.0235547,0.0240667,0.0164598 +2017-10-30,0,0.0153618,0.0234576,0.0232571,0.0164598 +2017-10-31,0,0.0179289,0.0242692,0.0242261,0.0164598 +2017-11-01,0,0.0370433,0.0235644,0.024614,0.0164598 +2017-11-02,0,0.0317009,0.0225269,0.0236453,0.0164598 +2017-11-03,0,0.0365329,0.0202134,0.0222685,0.0164598 +2017-11-04,0,0.0408663,0.0182653,0.0138775,0.0164598 +2017-11-05,0,0.0504394,0.0188413,0.0194297,0.0164598 +2017-11-06,0,0.0487458,0.022628,0.0231001,0.0164598 +2017-11-07,0,0.0471347,0.0219269,0.0228247,0.0164598 +2017-11-08,0,0.0705589,0.022603,0.0237186,0.0164598 +2017-11-09,0,0.0714021,0.0236983,0.0238151,0.0164598 +2017-11-10,0,0.0760726,0.0260102,0.0260422,0.0164598 +2017-11-11,0,0.0703286,0.0257676,0.025298,0.0164598 +2017-11-12,0,0.0537218,0.0262473,0.0251779,0.0164598 +2017-11-13,0,0.0491097,0.0303687,0.0344163,0.0164598 +2017-11-14,0,0.0475914,0.0306171,0.0334204,0.0164598 +2017-11-15,0,0.0342194,0.0311642,0.0343107,0.0164598 +2017-11-16,0,0.0226466,0.0309618,0.0333701,0.0164598 +2017-11-17,0,0.0180807,0.029435,0.0263276,0.0164598 +2017-11-18,0,0.02563,0.0287514,0.0267626,0.0164598 +2017-11-19,0,0.0245441,0.0285416,0.0250232,0.0164598 +2017-11-20,0,0.035893,0.0263187,0.021319,0.0164598 +2017-11-21,0,0.0360958,0.024079,0.0229519,0.0164598 +2017-11-22,0,0.0370327,0.0227604,0.0160981,0.0164598 +2017-11-23,0,0.0183937,0.024583,0.0192134,0.0164598 +2017-11-24,0,0.033417,0.0242644,0.0193806,0.0164598 +2017-11-25,0,0.029918,0.0266972,0.0246082,0.0164598 +2017-11-26,0,0.0326942,0.0270072,0.024612,0.0164598 +2017-11-27,0,0.0321468,0.0273075,0.0249994,0.0164598 +2017-11-28,0,0.0321574,0.0229769,0.0160595,0.0164598 +2017-11-29,0,0.0228011,0.0263233,0.0243246,0.0164598 +2017-11-30,0,0.0232709,0.0256378,0.0246014,0.0164598 +2017-12-01,0,0.0724375,0.0260182,0.0238685,0.0164598 +2017-12-02,0,0.0992723,0.024794,0.0236808,0.0164598 +2017-12-03,0,0.124508,0.0242283,0.0214208,0.0164598 +2017-12-04,0,0.144835,0.0211177,0.022433,0.0164598 +2017-12-05,0,0.145054,0.0203616,0.0203184,0.0164598 +2017-12-06,0,0.129683,0.030019,0.0345329,0.0164598 +2017-12-07,0,0.0758059,0.0355958,0.0332217,0.0164598 +2017-12-08,0,0.071942,0.0384846,0.0328755,0.0164598 +2017-12-09,0,0.0538365,0.0407333,0.0330369,0.0164598 +2017-12-10,0,0.0581928,0.0407256,0.0310519,0.0164598 +2017-12-11,0,0.0595423,0.0400752,0.0330696,0.0164598 +2017-12-12,0,0.0630972,0.0355938,0.0279935,0.0164598 +2017-12-13,0,0.0487399,0.0355763,0.0322881,0.0164598 +2017-12-14,0,0.0677079,0.0334168,0.028656,0.0164598 +2017-12-15,0,0.0681507,0.0338073,0.0310701,0.0164598 +2017-12-16,0,0.0309715,0.0341677,0.0319902,0.0164598 +2017-12-17,0,0.0473451,0.0347603,0.0298974,0.0164598 +2017-12-18,0,0.0706641,0.0328711,0.0233449,0.0164598 +2017-12-19,0,0.0698337,0.0359235,0.0326232,0.0164598 +2017-12-20,0,0.0728279,0.0364299,0.0323703,0.0164598 +2017-12-21,0,0.104109,0.0307748,0.0236892,0.0164598 +2017-12-22,0,0.0746206,0.0347605,0.0251144,0.0164598 +2017-12-23,0,0.0848431,0.0379581,0.0323572,0.0164598 +2017-12-24,0,0.0796381,0.0380473,0.0320033,0.0164598 +2017-12-25,0,0.0998072,0.0383945,0.0287961,0.0164598 +2017-12-26,0,0.081711,0.0422504,0.0332217,0.0164598 +2017-12-27,0,0.0816183,0.0392958,0.0311229,0.0164598 +2017-12-28,0,0.0907249,0.0392122,0.0328755,0.0164598 +2017-12-29,0,0.0908094,0.035409,0.029465,0.0164598 +2017-12-30,0,0.0541486,0.037733,0.0332217,0.0164598 +2017-12-31,0,0.0599932,0.0362658,0.0330369,0.0164598 +2018-01-01,0,0.0483322,0.036283,0.0327705,0.0164598 +2018-01-02,0,0.0616852,0.0371139,0.0330696,0.0164598 +2018-01-03,0,0.0769006,0.0370721,0.0312231,0.0164598 +2018-01-04,0,0.0768011,0.0329443,0.0246683,0.0164598 +2018-01-05,0,0.045301,0.034426,0.0319902,0.0164598 +2018-01-06,0,0.0515984,0.0325771,0.0236253,0.0164598 +2018-01-07,0,0.0662759,0.0339263,0.0312668,0.0164598 +2018-01-08,0,0.0637404,0.0359353,0.0327969,0.0164598 +2018-01-09,0,0.0641028,0.0359957,0.0316147,0.0164598 +2018-01-10,0,0.0616123,0.0319026,0.0199584,0.0164598 +2018-01-11,0,0.0915947,0.0331964,0.0298453,0.0164598 +2018-01-12,0,0.0826626,0.0351502,0.0317108,0.0164598 +2018-01-13,0,0.0823361,0.0338044,0.0266223,0.0164598 +2018-01-14,0,0.0861883,0.0337288,0.0309628,0.0164598 +2018-01-15,0,0.106928,0.0332696,0.0285451,0.0164598 +2018-01-16,0,0.0772403,0.0382833,0.0332217,0.0164598 +2018-01-17,0,0.081533,0.0359891,0.0275638,0.0164598 +2018-01-18,0,0.0798497,0.0360727,0.0279178,0.0164598 +2018-01-19,0,0.0833981,0.036154,0.0318341,0.0164598 +2018-01-20,0,0.0573593,0.038767,0.0332217,0.0164598 +2018-01-21,0,0.0366308,0.0357828,0.0331335,0.0164598 +2018-01-22,0,0.0238654,0.0357392,0.0324097,0.0164598 +2018-01-23,0,0.0236142,0.0355368,0.0291625,0.0164598 +2018-01-24,0,0.0291075,0.0353392,0.0320154,0.0164598 +2018-01-25,0,0.0578264,0.0325037,0.028322,0.0164598 +2018-01-26,0,0.0595725,0.0293565,0.0214931,0.0164598 +2018-01-27,0,0.0655511,0.0258269,0.0192955,0.0164598 +2018-01-28,0,0.0520638,0.0258766,0.0231725,0.0164598 +2018-01-29,0,0.0680395,0.0270056,0.0233178,0.0164598 +2018-01-30,0,0.0659752,0.0317292,0.0319902,0.0164598 +2018-01-31,0,0.0804508,0.031965,0.0304628,0.0164598 +2018-02-01,0,0.111749,0.0330432,0.0330298,0.0164598 +2018-02-02,0,0.111932,0.0308534,0.0289777,0.0164598 +2018-02-03,0,0.119791,0.0326885,0.031763,0.0164598 +2018-02-04,0,0.113427,0.032896,0.0330298,0.0164598 +2018-02-05,0,0.0564034,0.0360467,0.033131,0.0164598 +2018-02-06,0,0.0573127,0.0399031,0.0332217,0.0164598 +2018-02-07,0,0.0652471,0.0381115,0.0312057,0.0164598 +2018-02-08,0,0.0642908,0.0393469,0.0328755,0.0164598 +2018-02-09,0,0.0745288,0.0391396,0.0321237,0.0164598 +2018-02-10,0,0.0752798,0.0335261,0.0295915,0.0164598 +2018-02-11,0,0.0593667,0.0327953,0.0306821,0.0164598 +2018-02-12,0,0.0573226,0.0339679,0.0327599,0.0164598 +2018-02-13,0,0.0625228,0.033775,0.0315864,0.0164598 +2018-02-14,0,0.0556942,0.0356621,0.0331335,0.0164598 +2018-02-15,0,0.052326,0.035899,0.0323919,0.0164598 +2018-02-16,0,0.065836,0.0340742,0.0278369,0.0164598 +2018-02-17,0,0.0572645,0.0342039,0.0314865,0.0164598 +2018-02-18,0,0.0578243,0.0349765,0.0309433,0.0164598 +2018-02-19,0,0.0458311,0.0342555,0.0306294,0.0164598 +2018-02-20,0,0.0403916,0.0337867,0.0285146,0.0164598 +2018-02-21,0,0.0560268,0.0350538,0.032176,0.0164598 +2018-02-22,0,0.0462209,0.0342384,0.0309887,0.0164598 +2018-02-23,0,0.0490091,0.033628,0.0292936,0.0164598 +2018-02-24,0,0.0434393,0.0321004,0.024591,0.0164598 +2018-02-25,0,0.0390758,0.0311712,0.0238479,0.0164598 +2018-02-26,0,0.0320907,0.0330067,0.0308329,0.0164598 +2018-02-27,0,0.0319289,0.0290991,0.0242084,0.0164598 +2018-02-28,0,0.0215143,0.0289875,0.024493,0.0164598 +2018-03-01,0,0.0401661,0.0282814,0.0238968,0.0164598 +2018-03-02,0,0.0506199,0.0272417,0.0244333,0.0164598 +2018-03-03,0,0.0406774,0.026004,0.0244261,0.0164598 +2018-03-04,0,0.038681,0.0259261,0.0219797,0.0164598 +2018-03-05,0,0.0283288,0.0233173,0.0221828,0.0164598 +2018-03-06,0,0.0623573,0.0268372,0.0242132,0.0164598 +2018-03-07,0,0.0558968,0.0287713,0.025141,0.0164598 +2018-03-08,0,0.0504739,0.0268937,0.0237608,0.0164598 +2018-03-09,0,0.0680793,0.0261063,0.0226668,0.0164598 +2018-03-10,0,0.0669878,0.0245722,0.0231368,0.0164598 +2018-03-11,0,0.0474726,0.0291049,0.0325777,0.0164598 +2018-03-12,0,0.0485356,0.0283504,0.0309613,0.0164598 +2018-03-13,0,0.0568352,0.0271632,0.0253435,0.0164598 +2018-03-14,0,0.0391743,0.0299726,0.0333334,0.0164598 +2018-03-15,0,0.0403575,0.0295917,0.0302436,0.0164598 +2018-03-16,0,0.0405405,0.0270918,0.0244916,0.0164598 +2018-03-17,0,0.0293,0.0273971,0.0243806,0.0164598 +2018-03-18,0,0.0274326,0.0284575,0.030998,0.0164598 +2018-03-19,0,0.0246593,0.0265233,0.0247907,0.0164598 +2018-03-20,0,0.0182964,0.0262177,0.0250145,0.0164598 +2018-03-21,0,0.0197438,0.0261183,0.0229505,0.0164598 +2018-03-22,0,0.024053,0.024331,0.0204779,0.0164598 +2018-03-23,0,0.0233357,0.0236618,0.02355,0.0164598 +2018-03-24,0,0.0438101,0.0230744,0.0197235,0.0164598 +2018-03-25,0,0.0426679,0.0213736,0.0162848,0.0164598 +2018-03-26,0,0.0492374,0.0217441,0.0245224,0.0164598 +2018-03-27,0,0.048804,0.022754,0.0235441,0.0164598 +2018-03-28,0,0.0534523,0.0223631,0.0237148,0.0164598 +2018-03-29,0,0.0371448,0.0261712,0.025847,0.0164598 +2018-03-30,0,0.0533603,0.0258469,0.0244758,0.0164598 +2018-03-31,0,0.0528665,0.0268151,0.0277639,0.0164598 +2018-04-01,0,0.0534511,0.0265633,0.0245053,0.0164598 +2018-04-02,0,0.0546781,0.0262944,0.0316789,0.0164598 +2018-04-03,0,0.0474414,0.0246964,0.0247594,0.0164598 +2018-04-04,0,0.0313738,0.0274373,0.031755,0.0164598 +2018-04-05,0,0.0316814,0.0261499,0.0283675,0.0164598 +2018-04-06,0,0.028445,0.0264229,0.0263942,0.0164598 +2018-04-07,0,0.0590976,0.0269932,0.0312451,0.0164598 +2018-04-08,0,0.0601521,0.0259393,0.0263597,0.0164598 +2018-04-09,0,0.0513523,0.0235565,0.0252198,0.0164598 +2018-04-10,0,0.0496468,0.0231859,0.024184,0.0164598 +2018-04-11,0,0.0595133,0.0224946,0.0214722,0.0164598 +2018-04-12,0,0.0290304,0.028944,0.0332893,0.0164598 +2018-04-13,0,0.0324326,0.0290991,0.0293909,0.0164598 +2018-04-14,0,0.0326599,0.0280847,0.0299252,0.0164598 +2018-04-15,0,0.0393888,0.0281475,0.0251809,0.0164598 +2018-04-16,0,0.0313044,0.0294143,0.0321466,0.0164598 +2018-04-17,0,0.0285897,0.0250316,0.0209777,0.0164598 +2018-04-18,0,0.027994,0.0255769,0.0246732,0.0164598 +2018-04-19,0,0.0399766,0.0256345,0.0242589,0.0164598 +2018-04-20,0,0.062421,0.0256117,0.0247791,0.0164598 +2018-04-21,0,0.0661548,0.0240228,0.0232105,0.0164598 +2018-04-22,0,0.0683905,0.0236412,0.0241473,0.0164598 +2018-04-23,0,0.0702183,0.0234453,0.0238357,0.0164598 +2018-04-24,0,0.0575433,0.0259081,0.0250426,0.0164598 +2018-04-25,0,0.035171,0.0297415,0.0331174,0.0164598 +2018-04-26,0,0.0279721,0.029065,0.0335577,0.0164598 +2018-04-27,0,0.0232691,0.0295644,0.0341959,0.0164598 +2018-04-28,0,0.0286506,0.0295928,0.0331991,0.0164598 +2018-04-29,0,0.0292233,0.0282448,0.0290833,0.0164598 +2018-04-30,0,0.0257165,0.025495,0.0225285,0.0164598 +2018-05-01,0,0.0277925,0.0240284,0.0237176,0.0164598 +2018-05-02,0,0.0332165,0.0230818,0.0238097,0.0164598 +2018-05-03,0,0.0175737,0.0243185,0.0235005,0.0164598 +2018-05-04,0,0.0198398,0.0227673,0.0225094,0.0164598 +2018-05-05,0,0.0164229,0.0221641,0.0229323,0.0164598 +2018-05-06,0,0.0286168,0.0227328,0.0202996,0.0164598 +2018-05-07,0,0.0322958,0.0236852,0.0247373,0.0164598 +2018-05-08,0,0.0382089,0.0204345,0.0190498,0.0164598 +2018-05-09,0,0.0370234,0.0209095,0.0240333,0.0164598 +2018-05-10,0,0.0363672,0.0201887,0.0225513,0.0164598 +2018-05-11,0,0.0196469,0.0235176,0.0238096,0.0164598 +2018-05-12,0,0.0230524,0.023532,0.0222146,0.0164598 +2018-05-13,0,0.0207041,0.0246399,0.0203418,0.0164598 +2018-05-14,0,0.0207496,0.0244539,0.0228119,0.0164598 +2018-05-15,0,0.0263129,0.0243931,0.0203924,0.0164598 +2018-05-16,0,0.0255196,0.0201915,0.0219129,0.0164598 +2018-05-17,0,0.0299691,0.0195884,0.0240188,0.0164598 +2018-05-18,0,0.0372361,0.018636,0.0221555,0.0164598 +2018-05-19,0,0.0377831,0.0184702,0.0236802,0.0164598 +2018-05-20,0,0.0271471,0.0192883,0.0244957,0.0164598 +2018-05-21,0,0.0264929,0.0191327,0.0229675,0.0164598 +2018-05-22,0,0.0265666,0.0201984,0.0232607,0.0164598 +2018-05-23,0,0.0147227,0.0219212,0.0234098,0.0164598 +2018-05-24,0,0.0299558,0.0219208,0.0239946,0.0164598 +2018-05-25,0,0.0295495,0.0193617,0.0235,0.0164598 +2018-05-26,0,0.0287257,0.0192627,0.023723,0.0164598 +2018-05-27,0,0.0287175,0.0190997,0.0223628,0.0164598 +2018-05-28,0,0.0201108,0.0169241,0.0220316,0.0164598 +2018-05-29,0,0.00900909,0.0206135,0.0238703,0.0164598 +2018-05-30,0,0.0169293,0.0205466,0.0213722,0.0164598 +2018-05-31,0,0.0175344,0.0204429,0.0222899,0.0164598 +2018-06-01,0,0.017475,0.0203968,0.021467,0.0164598 +2018-06-02,0,0.0165135,0.0179925,0.0241169,0.0164598 +2018-06-03,0,0.015911,0.0151518,0.0150702,0.0164598 +2018-06-04,0,0.0107582,0.0172676,0.0150765,0.0164598 +2018-06-05,0,0.0456116,0.0175333,0.0182463,0.0164598 +2018-06-06,0,0.0481881,0.0174602,0.016211,0.0164598 +2018-06-07,0,0.0473324,0.0172197,0.016861,0.0164598 +2018-06-08,0,0.0454204,0.0168476,0.0152108,0.0164598 +2018-06-09,0,0.0599604,0.0153396,0.0148238,0.0164598 +2018-06-10,0,0.0419357,0.023703,0.0259194,0.0164598 +2018-06-11,0,0.0414198,0.0239824,0.0256608,0.0164598 +2018-06-12,0,0.0358362,0.0241955,0.0280738,0.0164598 +2018-06-13,0,0.0333588,0.0238264,0.0284403,0.0164598 +2018-06-14,0,0.0256571,0.0254365,0.0350886,0.0164598 +2018-06-15,0,0.0165488,0.0236459,0.0271588,0.0164598 +2018-06-16,0,0.0177343,0.0236657,0.0238052,0.0164598 +2018-06-17,0,0.0516142,0.0229166,0.0228634,0.0164598 +2018-06-18,0,0.0470372,0.022865,0.027185,0.0164598 +2018-06-19,0,0.0466389,0.0215006,0.020795,0.0164598 +2018-06-20,0,0.0480606,0.0190788,0.0181849,0.0164598 +2018-06-21,0,0.0478736,0.0193697,0.0179207,0.0164598 +2018-06-22,0,0.0160601,0.0261734,0.0374621,0.0164598 +2018-06-23,0,0.0239606,0.025811,0.0315938,0.0164598 +2018-06-24,0,0.0365774,0.0258194,0.0310681,0.0164598 +2018-06-25,0,0.0385967,0.0260596,0.0351371,0.0164598 +2018-06-26,0,0.0354014,0.0260324,0.0295381,0.0164598 +2018-06-27,0,0.0372605,0.0204574,0.0196242,0.0164598 +2018-06-28,0,0.0271187,0.0224525,0.0277762,0.0164598 +2018-06-29,0,0.0204966,0.0251972,0.032856,0.0164598 +2018-06-30,0,0.0179926,0.0257018,0.0329336,0.0164598 +2018-07-01,0,0.0172136,0.0252237,0.0288742,0.0164598 +2018-07-02,0,0.0142692,0.0241143,0.0332845,0.0164598 +2018-07-03,0,0.0140291,0.022437,0.0248893,0.0164598 +2018-07-04,0,0.0148238,0.0207413,0.0241023,0.0164598 +2018-07-05,0,0.0333562,0.0199169,0.0187602,0.0164598 +2018-07-06,0,0.0339786,0.0192843,0.0199643,0.0164598 +2018-07-07,0,0.0278029,0.0183877,0.0154956,0.0164598 +2018-07-08,0,0.0292985,0.0183319,0.018694,0.0164598 +2018-07-09,0,0.0307482,0.0185558,0.0200038,0.0164598 +2018-07-10,0,0.0158442,0.0227696,0.02761,0.0164598 +2018-07-11,0,0.0306218,0.022883,0.0263552,0.0164598 +2018-07-12,0,0.0360307,0.0220045,0.0204412,0.0164598 +2018-07-13,0,0.034961,0.0222627,0.0234617,0.0164598 +2018-07-14,0,0.0337345,0.0200452,0.0224304,0.0164598 +2018-07-15,0,0.0400711,0.01732,0.0177118,0.0164598 +2018-07-16,0,0.0370265,0.0208637,0.022113,0.0164598 +2018-07-17,0,0.0110437,0.0229336,0.0264565,0.0164598 +2018-07-18,0,0.0197872,0.0225424,0.0239491,0.0164598 +2018-07-19,0,0.0409854,0.0223828,0.0239204,0.0164598 +2018-07-20,0,0.0446705,0.0227614,0.0247778,0.0164598 +2018-07-21,0,0.0500708,0.0219298,0.0222208,0.0164598 +2018-07-22,0,0.049627,0.0167549,0.0152028,0.0164598 +2018-07-23,0,0.0486621,0.0192283,0.0247206,0.0164598 +2018-07-24,0,0.0238124,0.023772,0.0270315,0.0164598 +2018-07-25,0,0.0197236,0.0244393,0.0271438,0.0164598 +2018-07-26,0,0.0281223,0.0253487,0.0290096,0.0164598 +2018-07-27,0,0.0225142,0.025369,0.0263242,0.0164598 +2018-07-28,0,0.0209255,0.025295,0.0292886,0.0164598 +2018-07-29,0,0.0180516,0.0215573,0.0215841,0.0164598 +2018-07-30,0,0.0212475,0.0206388,0.0220624,0.0164598 +2018-07-31,0,0.022613,0.0228334,0.0256027,0.0164598 +2018-08-01,0,0.0226295,0.0210292,0.0200219,0.0164598 +2018-08-02,0,0.0220737,0.0207357,0.0208229,0.0164598 +2018-08-03,0,0.0295873,0.0199891,0.0157788,0.0164598 +2018-08-04,0,0.0405236,0.0213333,0.0243371,0.0164598 +2018-08-05,0,0.0433855,0.0216277,0.0219969,0.0164598 +2018-08-06,0,0.0478835,0.0216902,0.0229978,0.0164598 +2018-08-07,0,0.0485969,0.0212018,0.0237605,0.0164598 +2018-08-08,0,0.0375254,0.0219727,0.0227715,0.0164598 +2018-08-09,0,0.0297861,0.0240921,0.0291727,0.0164598 +2018-08-10,0,0.0143183,0.024887,0.0289829,0.0164598 +2018-08-11,0,0.012162,0.0255777,0.0298735,0.0164598 +2018-08-12,0,0.0206857,0.0256575,0.0294904,0.0164598 +2018-08-13,0,0.0250943,0.0242691,0.027621,0.0164598 +2018-08-14,0,0.0226338,0.0226874,0.0251076,0.0164598 +2018-08-15,0,0.0281176,0.0176216,0.0131509,0.0164598 +2018-08-16,0,0.0309163,0.016997,0.0162754,0.0164598 +2018-08-17,0,0.0254637,0.0195571,0.0240149,0.0164598 +2018-08-18,0,0.0262259,0.020143,0.0186077,0.0164598 +2018-08-19,0,0.0283665,0.0197692,0.0218526,0.0164598 +2018-08-20,0,0.0196833,0.0207675,0.0251843,0.0164598 +2018-08-21,0,0.0198397,0.0217064,0.0244261,0.0164598 +2018-08-22,0,0.0157875,0.0204366,0.0225119,0.0164598 +2018-08-23,0,0.0168051,0.020773,0.0199858,0.0164598 +2018-08-24,0,0.0180579,0.0213898,0.0215556,0.0164598 +2018-08-25,0,0.0200995,0.019737,0.0220649,0.0164598 +2018-08-26,0,0.0183878,0.0191831,0.0204331,0.0164598 +2018-08-27,0,0.0175175,0.0184164,0.015741,0.0164598 +2018-08-28,0,0.0131848,0.0188344,0.0255699,0.0164598 +2018-08-29,0,0.012182,0.0189601,0.018501,0.0164598 +2018-08-30,0,0.00858861,0.0181393,0.0215659,0.0164598 +2018-08-31,0,0.0418689,0.0174038,0.015629,0.0164598 +2018-09-01,0,0.0402325,0.0157972,0.0143206,0.0164598 +2018-09-02,0,0.0372989,0.0147966,0.0158447,0.0164598 +2018-09-03,0,0.0354964,0.0145654,0.0167252,0.0164598 +2018-09-04,0,0.0348915,0.0134616,0.0175023,0.0164598 +2018-09-05,0,0.023814,0.0217424,0.0235101,0.0164598 +2018-09-06,0,0.0193052,0.0220021,0.0235604,0.0164598 +2018-09-07,0,0.0197967,0.0216674,0.0212241,0.0164598 +2018-09-08,0,0.0103965,0.0214361,0.0239361,0.0164598 +2018-09-09,0,0.0110619,0.021266,0.0217991,0.0164598 +2018-09-10,0,0.0110572,0.0195178,0.0218213,0.0164598 +2018-09-11,0,0.0115841,0.0184025,0.0186915,0.0164598 +2018-09-12,0,0.022556,0.018293,0.0222772,0.0164598 +2018-09-13,0,0.0193555,0.0159509,0.0129103,0.0164598 +2018-09-14,0,0.0197254,0.0160737,0.0152163,0.0164598 +2018-09-15,0,0.022058,0.0159681,0.0168434,0.0164598 +2018-09-16,0,0.0263261,0.0161194,0.0164456,0.0164598 +2018-09-17,0,0.0133407,0.0189913,0.0238669,0.0164598 +2018-09-18,0,0.0149446,0.0182054,0.0201599,0.0164598 +2018-09-19,0,0.0195572,0.0179575,0.020803,0.0164598 +2018-09-20,0,0.021553,0.0185553,0.0210222,0.0164598 +2018-09-21,0,0.0124626,0.019656,0.0236188,0.0164598 +2018-09-22,0,0.0202073,0.0170321,0.0158229,0.0164598 +2018-09-23,0,0.0202716,0.0173166,0.0153234,0.0164598 +2018-09-24,0,0.0187349,0.0183726,0.018274,0.0164598 +2018-09-25,0,0.0136475,0.0188717,0.0196557,0.0164598 +2018-09-26,0,0.0143762,0.0166708,0.0157225,0.0164598 +2018-09-27,0,0.00407268,0.0168132,0.0183086,0.0164598 +2018-09-28,0,0.00456331,0.0161361,0.0208785,0.0164598 +2018-09-29,0,0.00807683,0.01587,0.0174326,0.0164598 +2018-09-30,0,0.00864938,0.0140217,0.0140418,0.0164598 +2018-10-01,0,0.00860897,0.0141677,0.013541,0.0164598 +2018-10-02,0,0.00814316,0.0107497,0.0143785,0.0164598 +2018-10-03,0,0.00632418,0.0110967,0.0148029,0.0164598 +2018-10-04,0,0.00541492,0.012624,0.0155937,0.0164598 +2018-10-05,0,0.00627203,0.0125312,0.0143384,0.0164598 +2018-10-06,0,0.023628,0.0125475,0.0148315,0.0164598 +2018-10-07,0,0.023724,0.0124676,0.0147185,0.0164598 +2018-10-08,0,0.0227945,0.0118322,0.0156587,0.0164598 +2018-10-09,0,0.0230563,0.0106955,0.011701,0.0164598 +2018-10-10,0,0.0349762,0.0110279,0.0127884,0.0164598 +2018-10-11,0,0.0206337,0.0165359,0.0208587,0.0164598 +2018-10-12,1,0.0221438,0.0182944,0.0177515,0.0233986 +2018-10-13,1,0.023676,0.0174337,0.0151896,0.0233986 +2018-10-14,1,0.0238413,0.0174831,0.0157493,0.0233986 +2018-10-15,1,0.00576096,0.0213494,0.0250073,0.0233986 +2018-10-16,1,0.00563856,0.0179527,0.0181062,0.0233986 +2018-10-17,1,0.00526625,0.0181123,0.0183326,0.0233986 +2018-10-18,1,0.00230704,0.0185119,0.0189341,0.0233986 +2018-10-19,1,0.00242071,0.0181097,0.0153819,0.0233986 +2018-10-20,1,0.00238032,0.0116805,0.0129837,0.0233986 +2018-10-21,1,0.00235185,0.0115803,0.0125746,0.0233986 +2018-10-22,1,0.00236572,0.0113071,0.0127,0.0233986 +2018-10-23,1,0.00222599,0.00874354,0.0117046,0.0233986 +2018-10-24,1,0.0106864,0.00887056,0.0120701,0.0233986 +2018-10-25,1,0.0109425,0.00880948,0.0119154,0.0233986 +2018-10-26,1,0.0107638,0.00871523,0.011964,0.0233986 +2018-10-27,1,0.0124732,0.00867742,0.0112261,0.0233986 +2018-10-28,1,0.0125388,0.00851208,0.0111257,0.0233986 +2018-10-29,1,0.00533279,0.0139944,0.0132721,0.0233986 +2018-10-30,1,0.00535097,0.0140583,0.0116025,0.0233986 +2018-10-31,1,0.00527281,0.0139505,0.0104279,0.0233986 +2018-11-01,1,0.00448088,0.0146256,0.0144497,0.0233986 +2018-11-02,1,0.0056603,0.0133689,0.00875943,0.0233986 +2018-11-03,1,0.00870575,0.010282,0.0110111,0.0233986 +2018-11-04,1,0.0106236,0.00994169,0.00997387,0.0233986 +2018-11-05,1,0.0102308,0.00981207,0.0110596,0.0233986 +2018-11-06,1,0.00956738,0.00780416,0.00821088,0.0233986 +2018-11-07,1,0.00675762,0.00845004,0.0140848,0.0233986 +2018-11-08,1,0.0056029,0.00973816,0.0141054,0.0233986 +2018-11-09,1,0.0456475,0.0103656,0.0142826,0.0233986 +2018-11-10,1,0.043762,0.0102684,0.00841963,0.0233986 +2018-11-11,1,0.0421983,0.0100364,0.00877087,0.0233986 +2018-11-12,1,0.0425252,0.0090081,0.00919094,0.0233986 +2018-11-13,1,0.0450673,0.00850335,0.00870378,0.0233986 +2018-11-14,1,0.0629128,0.0241271,0.0224765,0.0233986 +2018-11-15,1,0.0665791,0.0238423,0.0172808,0.0233986 +2018-11-16,1,0.075219,0.0234663,0.017158,0.0233986 +2018-11-17,1,0.0727401,0.0234807,0.0174549,0.0233986 +2018-11-18,1,0.0695796,0.0240213,0.0171381,0.0233986 +2018-11-19,1,0.0603115,0.0327427,0.0477882,0.0233986 +2018-11-20,1,0.0625752,0.0346698,0.0494474,0.0233986 +2018-11-21,1,0.0558943,0.0364368,0.0527396,0.0233986 +2018-11-22,1,0.0592568,0.0363971,0.0516821,0.0233986 +2018-11-23,1,0.0854564,0.0358194,0.0501581,0.0233986 +2018-11-24,1,0.0602876,0.0360489,0.0443776,0.0233986 +2018-11-25,1,0.0695547,0.0368591,0.0406157,0.0233986 +2018-11-26,1,0.0627659,0.035758,0.0406826,0.0233986 +2018-11-27,1,0.0652905,0.0364576,0.0434607,0.0233986 +2018-11-28,1,0.0468508,0.0433954,0.0426967,0.0233986 +2018-11-29,1,0.0484192,0.0389643,0.0342087,0.0233986 +2018-11-30,1,0.0460278,0.0410356,0.0342615,0.0233986 +2018-12-01,1,0.0343822,0.0403144,0.0313928,0.0233986 +2018-12-02,1,0.0332552,0.0407647,0.0334888,0.0233986 +2018-12-03,1,0.0376324,0.0370131,0.0273402,0.0233986 +2018-12-04,1,0.0443436,0.0374985,0.0254975,0.0233986 +2018-12-05,1,0.0411047,0.0370354,0.026129,0.0233986 +2018-12-06,1,0.0315059,0.0336365,0.0273916,0.0233986 +2018-12-07,1,0.0296879,0.0332945,0.0238698,0.0233986 +2018-12-08,1,0.0369971,0.0347114,0.0244474,0.0233986 +2018-12-09,1,0.0251517,0.0368515,0.0249851,0.0233986 +2018-12-10,1,0.0257867,0.0358835,0.0232311,0.0233986 +2018-12-11,1,0.0268951,0.031891,0.0255548,0.0233986 +2018-12-12,1,0.0511879,0.0309197,0.0246642,0.0233986 +2018-12-13,1,0.0426462,0.0330675,0.0278925,0.0233986 +2018-12-14,1,0.0360612,0.0291457,0.0228047,0.0233986 +2018-12-15,1,0.0421866,0.0293731,0.0212806,0.0233986 +2018-12-16,1,0.0633821,0.0287494,0.0228213,0.0233986 +2018-12-17,1,0.0569141,0.0362564,0.0314855,0.0233986 +2018-12-18,1,0.0571992,0.0342417,0.0276709,0.0233986 +2018-12-19,1,0.057204,0.032542,0.0272962,0.0233986 +2018-12-20,1,0.0446024,0.0342757,0.0395211,0.0233986 +2018-12-21,1,0.0381864,0.0393271,0.0391862,0.0233986 +2018-12-22,1,0.0391041,0.0377573,0.0359539,0.0233986 +2018-12-23,1,0.0566482,0.0374945,0.0377113,0.0233986 +2018-12-24,1,0.0556295,0.0375435,0.0374942,0.0233986 +2018-12-25,1,0.0471514,0.034966,0.041596,0.0233986 +2018-12-26,1,0.0491851,0.0333294,0.0369239,0.0233986 +2018-12-27,1,0.042283,0.0336407,0.0380902,0.0233986 +2018-12-28,1,0.0285695,0.037933,0.0414113,0.0233986 +2018-12-29,1,0.0287378,0.0377092,0.0363018,0.0233986 +2018-12-30,1,0.0282642,0.0358437,0.037489,0.0233986 +2018-12-31,1,0.0224229,0.0363166,0.0363865,0.0233986 +2019-01-01,1,0.0323001,0.0346249,0.0340605,0.0233986 +2019-01-02,1,0.0327294,0.0306868,0.0317163,0.0233986 +2019-01-03,1,0.0279823,0.0308481,0.0318022,0.0233986 +2019-01-04,1,0.0282206,0.0303339,0.0335551,0.0233986 +2019-01-05,1,0.0541711,0.0281707,0.0326084,0.0233986 +2019-01-06,1,0.0409379,0.0318796,0.0414817,0.0233986 +2019-01-07,1,0.0412651,0.0320664,0.0360157,0.0233986 +2019-01-08,1,0.0397577,0.0298426,0.0330235,0.0233986 +2019-01-09,1,0.0495925,0.0297494,0.0327781,0.0233986 +2019-01-10,1,0.0279516,0.037782,0.0425465,0.0233986 +2019-01-11,1,0.0282128,0.0332732,0.0345789,0.0233986 +2019-01-12,1,0.0282219,0.0328678,0.0389662,0.0233986 +2019-01-13,1,0.0231873,0.0322217,0.0370992,0.0233986 +2019-01-14,1,0.0149958,0.0349187,0.0411127,0.0233986 +2019-01-15,1,0.020511,0.0292436,0.0306603,0.0233986 +2019-01-16,1,0.0200292,0.0287502,0.0353345,0.0233986 +2019-01-17,1,0.0202453,0.0287338,0.0353077,0.0233986 +2019-01-18,1,0.0202409,0.0262315,0.0336404,0.0233986 +2019-01-19,1,0.0167997,0.0220736,0.0276483,0.0233986 +2019-01-20,1,0.006329,0.0243764,0.0381548,0.0233986 +2019-01-21,1,0.00503746,0.0241096,0.0350632,0.0233986 +2019-01-22,1,0.00415488,0.0240474,0.0323126,0.0233986 +2019-01-23,1,0.0147555,0.0236043,0.0245549,0.0233986 +2019-01-24,1,0.0134997,0.0221181,0.020755,0.0233986 +2019-01-25,1,0.0159655,0.0162557,0.0176865,0.0233986 +2019-01-26,1,0.0154555,0.0151464,0.0173728,0.0233986 +2019-01-27,1,0.0172689,0.014082,0.016482,0.0233986 +2019-01-28,1,0.00937852,0.0201166,0.0214791,0.0233986 +2019-01-29,1,0.0123961,0.0194817,0.0176803,0.0233986 +2019-01-30,1,0.0110477,0.0205042,0.0212692,0.0233986 +2019-01-31,1,0.0104471,0.0202824,0.0186514,0.0233986 +2019-02-01,1,0.0112216,0.0185402,0.0202507,0.0233986 +2019-02-02,1,0.00832828,0.015412,0.0176557,0.0233986 +2019-02-03,1,0.0365376,0.0168019,0.0160359,0.0233986 +2019-02-04,1,0.0363275,0.0158122,0.0166899,0.0233986 +2019-02-05,1,0.0361451,0.0145833,0.0133615,0.0233986 +2019-02-06,1,0.0354289,0.0148109,0.0134392,0.0233986 +2019-02-07,1,0.0348216,0.0134309,0.0136828,0.0233986 +2019-02-08,1,0.00663562,0.0247012,0.0234662,0.0233986 +2019-02-09,1,0.00643974,0.0246256,0.0201895,0.0233986 +2019-02-10,1,0.00531176,0.0244402,0.0194632,0.0233986 +2019-02-11,1,0.00375078,0.0237374,0.0191217,0.0233986 +2019-02-12,1,0.00705205,0.0235652,0.0206125,0.0233986 +2019-02-13,1,0.0278614,0.014168,0.0182416,0.0233986 +2019-02-14,1,0.026246,0.0140356,0.0194449,0.0233986 +2019-02-15,1,0.0248739,0.013071,0.0201449,0.0233986 +2019-02-16,1,0.0279194,0.0117132,0.0202232,0.0233986 +2019-02-17,1,0.0278833,0.014251,0.0215296,0.0233986 +2019-02-18,1,0.0160907,0.0227559,0.0233888,0.0233986 +2019-02-19,1,0.0456638,0.0217757,0.0182884,0.0233986 +2019-02-20,1,0.0463394,0.0213518,0.0206476,0.0233986 +2019-02-21,1,0.0462521,0.0222216,0.019676,0.0233986 +2019-02-22,1,0.0453104,0.0221502,0.0203512,0.0233986 +2019-02-23,1,0.0398587,0.0187506,0.0216589,0.0233986 +2019-02-24,1,0.00970869,0.0284492,0.0345668,0.0233986 +2019-02-25,1,0.0036742,0.0283737,0.0346566,0.0233986 +2019-02-26,1,0.00245389,0.0280706,0.0346591,0.0233986 +2019-02-27,1,0.0102471,0.0278523,0.033589,0.0233986 +2019-02-28,1,0.0208962,0.0266828,0.0331606,0.0233986 +2019-03-01,1,0.020891,0.0172435,0.0189023,0.0233986 +2019-03-02,1,0.0208848,0.0121647,0.0147008,0.0233986 +2019-03-03,1,0.02075,0.0107356,0.0147575,0.0233986 +2019-03-04,1,0.0154809,0.0167378,0.0137796,0.0233986 +2019-03-05,1,0.00764422,0.0210973,0.022146,0.0233986 +2019-03-06,1,0.0101108,0.0210949,0.0193485,0.0233986 +2019-03-07,1,0.0100766,0.0208871,0.0192422,0.0233986 +2019-03-08,1,0.0099897,0.020833,0.0187925,0.0233986 +2019-03-09,1,0.00613046,0.0190824,0.0177747,0.0233986 +2019-03-10,1,0.00784009,0.0153748,0.0147726,0.0233986 +2019-03-11,1,0.00905578,0.0163438,0.0183128,0.0233986 +2019-03-12,1,0.0106078,0.0156084,0.0164103,0.0233986 +2019-03-13,1,0.0102877,0.0155492,0.0164082,0.0233986 +2019-03-14,1,0.0103104,0.0133082,0.0162272,0.0233986 +2019-03-15,1,0.0103344,0.0142588,0.0152399,0.0233986 +2019-03-16,1,0.00928595,0.0149624,0.0147758,0.0233986 +2019-03-17,1,0.0089079,0.01546,0.0159728,0.0233986 +2019-03-18,1,0.00898168,0.0127786,0.0115193,0.0233986 +2019-03-19,1,0.00731116,0.012646,0.0144405,0.0233986 +2019-03-20,1,0.00798835,0.0125773,0.011954,0.0233986 +2019-03-21,1,0.00786307,0.0122895,0.0132219,0.0233986 +2019-03-22,1,0.0146635,0.0121364,0.0117276,0.0233986 +2019-03-23,1,0.0150477,0.0121656,0.0120274,0.0233986 +2019-03-24,1,0.014905,0.0114357,0.012271,0.0233986 +2019-03-25,1,0.0110762,0.0118942,0.0129702,0.0233986 +2019-03-26,1,0.0115814,0.0114913,0.0117809,0.0233986 +2019-03-27,1,0.0066818,0.0134698,0.00929781,0.0233986 +2019-03-28,1,0.0693351,0.0136157,0.00925717,0.0233986 +2019-03-29,1,0.0682911,0.0135349,0.00947072,0.0233986 +2019-03-30,1,0.0701172,0.0123319,0.0091243,0.0233986 +2019-03-31,1,0.0678247,0.0123325,0.0100409,0.0233986 +2019-04-01,1,0.068766,0.0104875,0.0122084,0.0233986 +2019-04-02,1,0.0153118,0.0336387,0.0499526,0.0233986 +2019-04-03,1,0.0151665,0.0334896,0.0495083,0.0233986 +2019-04-04,1,0.0174613,0.0338065,0.0504156,0.0233986 +2019-04-05,1,0.0174357,0.0334993,0.04896,0.0233986 +2019-04-06,1,0.0328643,0.0336482,0.048169,0.0233986 +2019-04-07,1,0.029661,0.0212367,0.0249161,0.0233986 +2019-04-08,1,0.0275422,0.0211383,0.0248987,0.0233986 +2019-04-09,1,0.028424,0.0219547,0.025342,0.0233986 +2019-04-10,1,0.0255994,0.0219717,0.0245694,0.0233986 +2019-04-11,1,0.0190641,0.0274063,0.0456688,0.0233986 +2019-04-12,1,0.0191218,0.0264645,0.0333334,0.0233986 +2019-04-13,1,0.0189337,0.0258618,0.030269,0.0233986 +2019-04-14,1,0.0187703,0.0261017,0.0332126,0.0233986 +2019-04-15,1,0.0128142,0.0253999,0.0303215,0.0233986 +2019-04-16,1,0.00509271,0.0232085,0.0315646,0.0233986 +2019-04-17,1,0.00768647,0.0232345,0.0283599,0.0233986 +2019-04-18,1,0.0141274,0.023144,0.0281955,0.0233986 +2019-04-19,1,0.0194045,0.0228971,0.0243058,0.0233986 +2019-04-20,1,0.030818,0.020367,0.0215483,0.0233986 +2019-04-21,1,0.0318584,0.0153587,0.0212108,0.0233986 +2019-04-22,1,0.0304199,0.017408,0.0212175,0.0233986 +2019-04-23,1,0.0238628,0.021049,0.0272177,0.0233986 +2019-04-24,1,0.0233449,0.0190452,0.0174686,0.0233986 +2019-04-25,1,0.0109302,0.0225459,0.0250003,0.0233986 +2019-04-26,1,0.0104093,0.0227521,0.0192585,0.0233986 +2019-04-27,1,0.0112057,0.0222989,0.019126,0.0233986 +2019-04-28,1,0.0195367,0.0206947,0.0180385,0.0233986 +2019-04-29,1,0.0149786,0.0203737,0.0180479,0.0233986 +2019-04-30,1,0.0193875,0.0161692,0.0140295,0.0233986 +2019-05-01,1,0.0223365,0.0158717,0.0150125,0.0233986 +2019-05-02,1,0.0220998,0.0161981,0.0144186,0.0233986 +2019-05-03,1,0.0144539,0.0188997,0.0220466,0.0233986 +2019-05-04,1,0.0182198,0.017393,0.0174847,0.0233986 +2019-05-05,1,0.0170806,0.0188757,0.0166644,0.0233986 +2019-05-06,1,0.0433985,0.0197659,0.0186285,0.0233986 +2019-05-07,1,0.0552696,0.0194961,0.0201555,0.0233986 +2019-05-08,1,0.0645997,0.0170219,0.0163965,0.0233986 +2019-05-09,1,0.0654678,0.0185119,0.0218651,0.0233986 +2019-05-10,1,0.0660076,0.0183564,0.0222024,0.0233986 +2019-05-11,1,0.0617241,0.0286164,0.041548,0.0233986 +2019-05-12,1,0.0712485,0.031359,0.0431288,0.0233986 +2019-05-13,1,0.0415012,0.035279,0.0413176,0.0233986 +2019-05-14,1,0.073605,0.0354338,0.0391213,0.0233986 +2019-05-15,1,0.0736518,0.0355083,0.0379704,0.0233986 +2019-05-16,1,0.071159,0.0352085,0.0374397,0.0233986 +2019-05-17,1,0.0635071,0.0376894,0.0427938,0.0233986 +2019-05-18,1,0.0628616,0.0320256,0.031621,0.0233986 +2019-05-19,1,0.026294,0.0401442,0.0422974,0.0233986 +2019-05-20,1,0.0235248,0.0404241,0.0390233,0.0233986 +2019-05-21,1,0.0396302,0.0399702,0.0381439,0.0233986 +2019-05-22,1,0.0270052,0.0390233,0.0327175,0.0233986 +2019-05-23,1,0.03178,0.0389056,0.033221,0.0233986 +2019-05-24,1,0.034089,0.029754,0.0221549,0.0233986 +2019-05-25,1,0.0426602,0.0286823,0.021789,0.0233986 +2019-05-26,1,0.0267602,0.0341093,0.0280191,0.0233986 +2019-05-27,1,0.0250352,0.0302634,0.0221597,0.0233986 +2019-05-28,1,0.0273514,0.0318364,0.0279102,0.0233986 +2019-05-29,1,0.0398302,0.0325943,0.0278896,0.0233986 +2019-05-30,1,0.0450411,0.0352999,0.0255507,0.0233986 +2019-05-31,1,0.041586,0.0306005,0.02218,0.0233986 +2019-06-01,1,0.0416847,0.0292028,0.020219,0.0233986 +2019-06-02,1,0.0434725,0.0289723,0.0245705,0.0233986 +2019-06-03,1,0.0350144,0.0330679,0.029955,0.0233986 +2019-06-04,1,0.0239263,0.0336589,0.0304965,0.0233986 +2019-06-05,1,0.0298002,0.0328108,0.0283908,0.0233986 +2019-06-06,1,0.0304069,0.0327299,0.0268536,0.0233986 +2019-06-07,1,0.0302356,0.0330793,0.0265659,0.0233986 +2019-06-08,1,0.0293098,0.0303066,0.0276457,0.0233986 +2019-06-09,1,0.0249183,0.0271475,0.0244278,0.0233986 +2019-06-10,1,0.0234987,0.0271398,0.0254915,0.0233986 +2019-06-11,1,0.017531,0.0272058,0.025127,0.0233986 +2019-06-12,1,0.0181548,0.0272955,0.022677,0.0233986 +2019-06-13,1,0.0298996,0.0267875,0.0247748,0.0233986 +2019-06-14,1,0.0230258,0.0258777,0.0245826,0.0233986 +2019-06-15,1,0.0238955,0.0254113,0.0230412,0.0233986 +2019-06-16,1,0.0322131,0.0232493,0.0223532,0.0233986 +2019-06-17,1,0.0347073,0.0229087,0.0255907,0.0233986 +2019-06-18,1,0.0212391,0.0268571,0.0238962,0.0233986 +2019-06-19,1,0.0225634,0.0248293,0.0266672,0.0233986 +2019-06-20,1,0.0264573,0.0251933,0.0238897,0.0233986 +2019-06-21,1,0.0363847,0.0278781,0.029028,0.0233986 +2019-06-22,1,0.0968575,0.0288433,0.0282032,0.0233986 +2019-06-23,1,0.105989,0.0247644,0.0238487,0.0233986 +2019-06-24,1,0.109876,0.0251132,0.0235745,0.0233986 +2019-06-25,1,0.11572,0.0259698,0.0263925,0.0233986 +2019-06-26,1,0.0964225,0.0287026,0.0278326,0.0233986 +2019-06-27,1,0.0756335,0.0454469,0.0554567,0.0233986 +2019-06-28,1,0.0749252,0.0479344,0.0527999,0.0233986 +2019-06-29,1,0.0785672,0.0489489,0.0481293,0.0233986 +2019-06-30,1,0.0629522,0.0516733,0.0511955,0.0233986 +2019-07-01,1,0.0616204,0.0487902,0.0471838,0.0233986 +2019-07-02,1,0.0616562,0.0451906,0.0422472,0.0233986 +2019-07-03,1,0.0507459,0.045929,0.0469473,0.0233986 +2019-07-04,1,0.0324855,0.0473294,0.0473803,0.0233986 +2019-07-05,1,0.0368795,0.0443333,0.0424975,0.0233986 +2019-07-06,1,0.0539931,0.0439104,0.0395589,0.0233986 +2019-07-07,1,0.056125,0.0439207,0.0398877,0.0233986 +2019-07-08,1,0.0448173,0.0416924,0.0434974,0.0233986 +2019-07-09,1,0.053331,0.0363284,0.031484,0.0233986 +2019-07-10,1,0.0703444,0.0375627,0.0375732,0.0233986 +2019-07-11,1,0.0872579,0.0427738,0.0438542,0.0233986 +2019-07-12,1,0.0838504,0.0430324,0.0438682,0.0233986 +2019-07-13,1,0.103568,0.0401326,0.0394656,0.0233986 +2019-07-14,1,0.0904921,0.0432332,0.0444633,0.0233986 +2019-07-15,1,0.0861779,0.0473439,0.0450321,0.0233986 +2019-07-16,1,0.0448738,0.0522764,0.0599849,0.0233986 +2019-07-17,1,0.049509,0.0513304,0.0579682,0.0233986 +2019-07-18,1,0.0239929,0.0545607,0.0539164,0.0233986 +2019-07-19,1,0.0241351,0.0507802,0.0541043,0.0233986 +2019-07-20,1,0.0198074,0.049124,0.0530174,0.0233986 +2019-07-21,1,0.0205833,0.0401191,0.0360631,0.0233986 +2019-07-22,1,0.0236246,0.0406712,0.0361958,0.0233986 +2019-07-23,1,0.0203451,0.0326923,0.0358264,0.0233986 +2019-07-24,1,0.0203674,0.0327185,0.0299957,0.0233986 +2019-07-25,1,0.0201917,0.0299597,0.028843,0.0233986 +2019-07-26,1,0.0319148,0.0300787,0.0288054,0.0233986 +2019-07-27,1,0.0208341,0.0314811,0.0343556,0.0233986 +2019-07-28,1,0.0204481,0.0300299,0.0288332,0.0233986 +2019-07-29,1,0.0160715,0.029948,0.0290098,0.0233986 +2019-07-30,1,0.0150359,0.0293913,0.0289091,0.0233986 +2019-07-31,1,0.0249584,0.0340807,0.0365441,0.0233986 +2019-08-01,1,0.0365883,0.0299786,0.0308747,0.0233986 +2019-08-02,1,0.0371461,0.0294433,0.0292773,0.0233986 +2019-08-03,1,0.0384563,0.0272152,0.0284827,0.0233986 +2019-08-04,1,0.0406296,0.0266001,0.0251574,0.0233986 +2019-08-05,1,0.0318526,0.0305578,0.0371769,0.0233986 +2019-08-06,1,0.0307728,0.0341435,0.0328904,0.0233986 +2019-08-07,1,0.0218694,0.0313667,0.0395791,0.0233986 +2019-08-08,1,0.0251131,0.0316523,0.0378482,0.0233986 +2019-08-09,1,0.0361136,0.030445,0.0316458,0.0233986 +2019-08-10,1,0.0435326,0.0287723,0.0366686,0.0233986 +2019-08-11,1,0.0419672,0.0284123,0.033939,0.0233986 +2019-08-12,1,0.0418933,0.0255659,0.032641,0.0233986 +2019-08-13,1,0.041739,0.0269663,0.0368131,0.0233986 +2019-08-14,1,0.0251015,0.0312394,0.041914,0.0233986 +2019-08-15,1,0.0276637,0.0331818,0.0376829,0.0233986 +2019-08-16,1,0.0414324,0.0327805,0.0403658,0.0233986 +2019-08-17,1,0.041116,0.0327935,0.0393586,0.0233986 +2019-08-18,1,0.0429497,0.0323886,0.0405471,0.0233986 +2019-08-19,1,0.0318528,0.0281419,0.0368467,0.0233986 +2019-08-20,1,0.0323245,0.0289863,0.032545,0.0233986 +2019-08-21,1,0.0207598,0.0335408,0.0403334,0.0233986 +2019-08-22,1,0.0231615,0.0330754,0.0386116,0.0233986 +2019-08-23,1,0.0247658,0.0334938,0.0376876,0.0233986 +2019-08-24,1,0.024911,0.0305437,0.0340651,0.0233986 +2019-08-25,1,0.0266279,0.0303281,0.0350566,0.0233986 +2019-08-26,1,0.0214349,0.0261368,0.0335028,0.0233986 +2019-08-27,1,0.0245658,0.0258506,0.0368779,0.0233986 +2019-08-28,1,0.0302042,0.0265521,0.0384481,0.0233986 +2019-08-29,1,0.0220625,0.0260208,0.0343968,0.0233986 +2019-08-30,1,0.0243422,0.0265956,0.0352116,0.0233986 +2019-08-31,1,0.0253026,0.0249034,0.0366299,0.0233986 +2019-09-01,1,0.0311845,0.0255597,0.0278371,0.0233986 +2019-09-02,1,0.0183852,0.0279316,0.0281094,0.0233986 +2019-09-03,1,0.0132407,0.0255079,0.0244422,0.0233986 +2019-09-04,1,0.0135588,0.0259946,0.025877,0.0233986 +2019-09-05,1,0.0151587,0.0249982,0.0244767,0.0233986 +2019-09-06,1,0.0145138,0.0265038,0.0241026,0.0233986 +2019-09-07,1,0.01688,0.0225709,0.0224471,0.0233986 +2019-09-08,1,0.0167248,0.0203609,0.013809,0.0233986 +2019-09-09,1,0.0160099,0.0204173,0.0149228,0.0233986 +2019-09-10,1,0.0107928,0.0205412,0.0186732,0.0233986 +2019-09-11,1,0.0118269,0.0202355,0.0181482,0.0233986 +2019-09-12,1,0.00272237,0.0201897,0.0186001,0.0233986 +2019-09-13,1,0.00265536,0.0200463,0.0214917,0.0233986 +2019-09-14,1,0.00516222,0.0190066,0.0207964,0.0233986 +2019-09-15,1,0.00586913,0.0166754,0.0193073,0.0233986 +2019-09-16,1,0.00823854,0.016863,0.0167568,0.0233986 +2019-09-17,1,0.00944311,0.0106562,0.0177716,0.0233986 +2019-09-18,1,0.016879,0.0105104,0.0182002,0.0233986 +2019-09-19,1,0.0501795,0.0124107,0.0169072,0.0233986 +2019-09-20,1,0.0493062,0.012699,0.0162623,0.0233986 +2019-09-21,1,0.0479887,0.014139,0.0159717,0.0233986 +2019-09-22,1,0.0509072,0.0147439,0.0159047,0.0233986 +2019-09-23,1,0.0539432,0.0180832,0.0227025,0.0233986 +2019-09-24,1,0.0224204,0.029384,0.0270716,0.0233986 +2019-09-25,1,0.0271994,0.028839,0.0225536,0.0233986 +2019-09-26,1,0.0157054,0.0289512,0.0251341,0.0233986 +2019-09-27,1,0.0145726,0.029672,0.0281964,0.0233986 +2019-09-28,1,0.0170386,0.0301956,0.0318072,0.0233986 +2019-09-29,1,0.0147751,0.0228331,0.0225567,0.0233986 +2019-09-30,1,0.00939997,0.024449,0.0239402,0.0233986 +2019-10-01,1,0.0101178,0.0206961,0.021968,0.0233986 +2019-10-02,1,0.0205913,0.0202041,0.0210556,0.0233986 +2019-10-03,1,0.0193958,0.0211584,0.0241602,0.0233986 +2019-10-04,1,0.0270982,0.0198374,0.0198877,0.0233986 +2019-10-05,1,0.0263835,0.017247,0.0186411,0.0233986 +2019-10-06,1,0.0298369,0.0175641,0.0169977,0.0233986 +2019-10-07,1,0.0267792,0.0222236,0.0278892,0.0233986 +2019-10-08,1,0.0267723,0.0218295,0.0252738,0.0233986 +2019-10-09,1,0.0149501,0.0247296,0.0341124,0.0233986 +2019-10-10,1,0.0160745,0.0245147,0.0309751,0.0233986 +2019-10-11,1,0.0124287,0.025539,0.0351319,0.0233986 +2019-10-12,1,0.0134892,0.0246519,0.0314047,0.0233986 +2019-10-13,1,0.0140032,0.0243287,0.0299292,0.0233986 +2019-10-14,1,0.0129003,0.0203154,0.0226259,0.0233986 +2019-10-15,1,0.0195157,0.0207045,0.0253367,0.0233986 +2019-10-16,1,0.0161079,0.0166423,0.015144,0.0233986 +2019-10-17,1,0.0194583,0.0170382,0.0158979,0.0233986 +2019-10-18,1,0.0380117,0.0165626,0.0168386,0.0233986 +2019-10-19,1,0.0376393,0.0160449,0.0168592,0.0233986 +2019-10-20,1,0.0807323,0.0184628,0.0213718,0.0233986 +2019-10-21,1,0.0840212,0.0172995,0.0181471,0.0233986 +2019-10-22,1,0.080476,0.018243,0.0172818,0.0233986 +2019-10-23,1,0.0681736,0.0244738,0.0232058,0.0233986 +2019-10-24,1,0.0653141,0.0243639,0.0185163,0.0233986 +2019-10-25,1,0.0402348,0.0375791,0.0469367,0.0233986 +2019-10-26,1,0.0271747,0.0389211,0.049282,0.0233986 +2019-10-27,1,0.0208972,0.0384539,0.0458917,0.0233986 +2019-10-28,1,0.0156976,0.036673,0.0433824,0.0233986 +2019-10-29,1,0.0129144,0.0361357,0.043157,0.0233986 +2019-10-30,1,0.0105725,0.0312701,0.0303145,0.0233986 +2019-10-31,1,0.0117661,0.027542,0.0240621,0.0233986 +2019-11-01,1,0.0115949,0.0252688,0.0257803,0.0233986 +2019-11-02,1,0.0123156,0.0229954,0.0227248,0.0233986 +2019-11-03,1,0.0259265,0.0216794,0.0202607,0.0233986 +2019-11-04,1,0.0219041,0.0204156,0.0195617,0.0233986 +2019-11-05,1,0.0285779,0.0210994,0.0203853,0.0233986 +2019-11-06,1,0.0303658,0.020936,0.0217968,0.0233986 +2019-11-07,1,0.0316959,0.0212919,0.0203849,0.0233986 +2019-11-08,1,0.0217722,0.0272112,0.0277012,0.0233986 +2019-11-09,1,0.0223438,0.0257833,0.0255254,0.0233986 +2019-11-10,1,0.0165712,0.0280629,0.0259768,0.0233986 +2019-11-11,1,0.0135967,0.028698,0.0288781,0.0233986 +2019-11-12,1,0.0129543,0.0290833,0.0333613,0.0233986 +2019-11-13,1,0.0169748,0.0258622,0.0255511,0.0233986 +2019-11-14,1,0.0169778,0.0254383,0.0261005,0.0233986 +2019-11-15,1,0.0164218,0.0233221,0.0232577,0.0233986 +2019-11-16,1,0.0197075,0.0190818,0.0169875,0.0233986 +2019-11-17,1,0.0156299,0.0176577,0.0188043,0.0233986 +2019-11-18,1,0.02593,0.0189719,0.0228368,0.0233986 +2019-11-19,1,0.0271614,0.0187509,0.0220358,0.0233986 +2019-11-20,1,0.0338485,0.018424,0.0189695,0.0233986 +2019-11-21,1,0.032885,0.020096,0.0216432,0.0233986 +2019-11-22,1,0.0332938,0.0191398,0.0209764,0.0233986 +2019-11-23,1,0.0335909,0.0219748,0.0201557,0.0233986 +2019-11-24,1,0.0215452,0.0226969,0.0229158,0.0233986 +2019-11-25,1,0.0295222,0.0244352,0.020372,0.0233986 +2019-11-26,1,0.0326559,0.0240624,0.0194957,0.0233986 +2019-11-27,1,0.025748,0.0250711,0.0251503,0.0233986 +2019-11-28,1,0.0257532,0.0250925,0.0227172,0.0233986 +2019-11-29,1,0.00948338,0.022452,0.0216287,0.0233986 +2019-11-30,1,0.0181436,0.0243679,0.0225818,0.0233986 +2019-12-01,1,0.0166782,0.025164,0.024067,0.0233986 +2019-12-02,1,0.0139375,0.0230814,0.0210725,0.0233986 +2019-12-03,1,0.0137937,0.0229445,0.0198966,0.0233986 +2019-12-04,1,0.017914,0.0168432,0.0165914,0.0233986 +2019-12-05,1,0.0143708,0.0208411,0.0186862,0.0233986 +2019-12-06,1,0.010381,0.0203638,0.0230215,0.0233986 +2019-12-07,1,0.0109859,0.0192075,0.0198041,0.0233986 +2019-12-08,1,0.0115914,0.0190563,0.0204415,0.0233986 +2019-12-09,1,0.0110975,0.0206968,0.0204378,0.0233986 +2019-12-10,1,0.0106805,0.0192084,0.019818,0.0233986 +2019-12-11,1,0.0165601,0.0173775,0.018043,0.0233986 +2019-12-12,1,0.0209234,0.0176427,0.0198047,0.0233986 +2019-12-13,1,0.0538964,0.017492,0.0197179,0.0233986 +2019-12-14,1,0.0531367,0.0168516,0.0172512,0.0233986 +2019-12-15,1,0.0531287,0.0165942,0.0198571,0.0233986 +2019-12-16,1,0.0501987,0.0185774,0.0247031,0.0233986 +2019-12-17,1,0.0428913,0.0205051,0.0220198,0.0233986 +2019-12-18,1,0.0247057,0.0306112,0.0314972,0.0233986 +2019-12-19,1,0.0241162,0.0299622,0.0229953,0.0233986 +2019-12-20,1,0.0245246,0.0299499,0.0251828,0.0233986 +2019-12-21,1,0.024593,0.0289203,0.0244199,0.0233986 +2019-12-22,1,0.00997363,0.0278467,0.0232421,0.0233986 +2019-12-23,1,0.00604541,0.0235404,0.0209919,0.0233986 +2019-12-24,1,0.00860076,0.0223921,0.019658,0.0233986 +2019-12-25,1,0.0122473,0.022252,0.0181258,0.0233986 +2019-12-26,1,0.0137543,0.0221759,0.0190015,0.0233986 +2019-12-27,1,0.0130876,0.0166721,0.0143395,0.0233986 +2019-12-28,1,0.017214,0.0142545,0.0152532,0.0233986 +2019-12-29,1,0.0312696,0.0159161,0.0164117,0.0233986 +2019-12-30,1,0.030212,0.0177944,0.0139283,0.0233986 +2019-12-31,1,0.0288798,0.0183905,0.0174967,0.0233986 +2020-01-01,1,0.0338385,0.0180625,0.0163653,0.0233986 +2020-01-02,1,0.0245717,0.0198382,0.0204773,0.0233986 +2020-01-03,1,0.0275863,0.0245296,0.034533,0.0233986 +2020-01-04,1,0.0341527,0.0242934,0.0277174,0.0233986 +2020-01-05,1,0.0347056,0.023867,0.0264919,0.0233986 +2020-01-06,1,0.0335411,0.0256155,0.0419706,0.0233986 +2020-01-07,1,0.0256897,0.0233342,0.0346947,0.0233986 +2020-01-08,1,0.0252892,0.0237551,0.0261446,0.0233986 +2020-01-09,1,0.0382365,0.0237783,0.0186461,0.0233986 +2020-01-10,1,0.0387764,0.0241407,0.0247279,0.0233986 +2020-01-11,1,0.0375785,0.0240214,0.0205622,0.0233986 +2020-01-12,1,0.0376993,0.0221822,0.017605,0.0233986 +2020-01-13,1,0.0366898,0.0217043,0.0163646,0.0233986 +2020-01-14,1,0.0181602,0.0262946,0.0280826,0.0233986 +2020-01-15,1,0.0181995,0.0263941,0.0271787,0.0233986 +2020-01-16,1,0.0186737,0.0261693,0.0258043,0.0233986 +2020-01-17,1,0.0137121,0.0261677,0.0246608,0.0233986 +2020-01-18,1,0.0171399,0.0259533,0.0271823,0.0233986 +2020-01-19,1,0.0162604,0.0211516,0.0221252,0.0233986 +2020-01-20,1,0.0163143,0.0210714,0.0210624,0.0233986 +2020-01-21,1,0.0215831,0.0210121,0.0170703,0.0233986 +2020-01-22,1,0.0274318,0.0190724,0.0158822,0.0233986 +2020-01-23,1,0.0235947,0.02062,0.0242379,0.0233986 +2020-01-24,1,0.0254958,0.020041,0.0184013,0.0233986 +2020-01-25,1,0.0199476,0.0197812,0.0162646,0.0233986 +2020-01-26,1,0.0273923,0.0215867,0.0180377,0.0233986 +2020-01-27,1,0.0254852,0.0234476,0.0246039,0.0233986 +2020-01-28,1,0.0138477,0.022464,0.0250737,0.0233986 +2020-01-29,1,0.013927,0.0226146,0.0192565,0.0233986 +2020-01-30,1,0.00808401,0.0209401,0.0184104,0.0233986 +2020-01-31,1,0.0234005,0.0229771,0.021368,0.0233986 +2020-02-01,1,0.0235588,0.0222814,0.0191465,0.0233986 +2020-02-02,1,0.0225947,0.0183999,0.0158856,0.0233986 +2020-02-03,1,0.0211824,0.0184074,0.0154989,0.0233986 +2020-02-04,1,0.0166507,0.0156152,0.0160939,0.0233986 +2020-02-05,1,0.0188919,0.0206252,0.0231049,0.0233986 +2020-02-06,1,0.0233211,0.0206763,0.0194414,0.0233986 +2020-02-07,1,0.0232734,0.0203154,0.0179114,0.0233986 +2020-02-08,1,0.0252425,0.0197896,0.0171348,0.0233986 +2020-02-09,1,0.0233145,0.0185047,0.0161751,0.0233986 +2020-02-10,1,0.0288045,0.0192663,0.0161889,0.0233986 +2020-02-11,1,0.0221648,0.0208026,0.0227346,0.0233986 +2020-02-12,1,0.0211729,0.0207608,0.0189486,0.0233986 +2020-02-13,1,0.0337267,0.0213339,0.0170919,0.0233986 +2020-02-14,1,0.0393363,0.0202241,0.0189234,0.0233986 +2020-02-15,1,0.036074,0.0224025,0.0235136,0.0233986 +2020-02-16,1,0.0363605,0.0201984,0.0180055,0.0233986 +2020-02-17,1,0.0346428,0.0201098,0.0172147,0.0233986 +2020-02-18,1,0.0289094,0.023507,0.0243584,0.0233986 +2020-02-19,1,0.0198436,0.0251315,0.0247741,0.0233986 +2020-02-20,1,0.0248286,0.024374,0.0201642,0.0233986 +2020-02-21,1,0.0320188,0.0243011,0.0186452,0.0233986 +2020-02-22,1,0.0318118,0.0238529,0.0198366,0.0233986 +2020-02-23,1,0.0205009,0.0227457,0.0186717,0.0233986 +2020-02-24,1,0.0220593,0.0205106,0.0184855,0.0233986 +2020-02-25,1,0.0226374,0.0222931,0.0223017,0.0233986 +2020-02-26,1,0.0194162,0.0250084,0.0356632,0.0233986 +2020-02-27,1,0.0198958,0.0244268,0.0230747,0.0233986 +2020-02-28,1,0.0188039,0.021294,0.019586,0.0233986 +2020-02-29,1,0.022855,0.0217402,0.0194104,0.0233986 +2020-03-01,1,0.0216748,0.021879,0.0203045,0.0233986 +2020-03-02,1,0.0223127,0.0210149,0.0214234,0.0233986 +2020-03-03,1,0.0487512,0.0209905,0.0174334,0.0233986 +2020-03-04,1,0.0482868,0.0202765,0.0163045,0.0233986 +2020-03-05,1,0.0393854,0.0219212,0.0228488,0.0233986 +2020-03-06,1,0.0384841,0.0214825,0.0188432,0.0233986 +2020-03-07,1,0.198296,0.0216031,0.0199488,0.0233986 +2020-03-08,1,0.224076,0.0295139,0.0428173,0.0233986 +2020-03-09,1,0.222355,0.0294162,0.0426861,0.0233986 +2020-03-10,1,0.22649,0.0275254,0.0409435,0.0233986 +2020-03-11,1,0.222621,0.0267071,0.0345867,0.0233986 +2020-03-12,1,0.0791384,0.0759322,0.0647207,0.0233986 +2020-03-13,1,0.0550761,0.0802889,0.0645216,0.0233986 +2020-03-14,1,0.0868031,0.0799996,0.0623803,0.0233986 +2020-03-15,1,0.0880691,0.080689,0.0655756,0.0233986 +2020-03-16,1,0.0721692,0.0803258,0.062389,0.0233986 +2020-03-17,1,0.0851894,0.0586998,0.0642455,0.0233986 +2020-03-18,1,0.0899549,0.052549,0.0586402,0.0233986 +2020-03-19,1,0.0583121,0.0622803,0.0640111,0.0233986 +2020-03-20,1,0.0590715,0.0625639,0.0643109,0.0233986 +2020-03-21,1,0.0586192,0.0588569,0.0639653,0.0233986 +2020-03-22,1,0.0520731,0.0620455,0.0610038,0.0233986 +2020-03-23,1,0.0352489,0.063697,0.0620166,0.0233986 +2020-03-24,1,0.0236564,0.0558526,0.0587848,0.0233986 +2020-03-25,1,0.0546731,0.0560749,0.0620424,0.0233986 +2020-03-26,1,0.0544691,0.0559343,0.0608566,0.0233986 +2020-03-27,1,0.0533885,0.0538746,0.0593142,0.0233986 +2020-03-28,1,0.0488648,0.047761,0.0491773,0.0233986 +2020-03-29,1,0.0353356,0.0423135,0.0467984,0.0233986 +2020-03-30,1,0.016165,0.0549243,0.0569453,0.0233986 +2020-03-31,1,0.0191552,0.0548594,0.0580206,0.0233986 +2020-04-01,1,0.0324352,0.0545702,0.0591989,0.0233986 +2020-04-02,1,0.0347968,0.0531583,0.0531063,0.0233986 +2020-04-03,1,0.0330785,0.0393214,0.0409583,0.0233986 +2020-04-04,1,0.0343307,0.0302946,0.0307501,0.0233986 +2020-04-05,1,0.047748,0.0314723,0.0337578,0.0233986 +2020-04-06,1,0.0307611,0.0372744,0.0443184,0.0233986 +2020-04-07,1,0.0331183,0.0374459,0.0378676,0.0233986 +2020-04-08,1,0.0294276,0.036816,0.0365102,0.0233986 +2020-04-09,1,0.0297992,0.0372494,0.0377469,0.0233986 +2020-04-10,1,0.0177511,0.0387379,0.0453581,0.0233986 +2020-04-11,1,0.038637,0.0338342,0.0371068,0.0233986 +2020-04-12,1,0.0384908,0.0346216,0.0381668,0.0233986 +2020-04-13,1,0.037005,0.0328816,0.0350511,0.0233986 +2020-04-14,1,0.0379553,0.0316777,0.0369835,0.0233986 +2020-04-15,1,0.0419156,0.0268122,0.0359783,0.0233986 +2020-04-16,1,0.023906,0.0349661,0.0440657,0.0233986 +2020-04-17,1,0.0302077,0.0349259,0.0422184,0.0233986 +2020-04-18,1,0.0349371,0.0342433,0.040304,0.0233986 +2020-04-19,1,0.0342177,0.0342043,0.0442759,0.0233986 +2020-04-20,1,0.0190062,0.0350784,0.042354,0.0233986 +2020-04-21,1,0.0162114,0.028371,0.0370869,0.0233986 +2020-04-22,1,0.0149044,0.0307022,0.0397477,0.0233986 +2020-04-23,1,0.00726266,0.0323495,0.0419763,0.0233986 +2020-04-24,1,0.0502689,0.0320524,0.0396147,0.0233986 +2020-04-25,1,0.0535057,0.026719,0.0367226,0.0233986 +2020-04-26,1,0.0531291,0.0254029,0.0351318,0.0233986 +2020-04-27,1,0.0532014,0.0247226,0.0305064,0.0233986 +2020-04-28,1,0.0549093,0.0191889,0.0230367,0.0233986 +2020-04-29,1,0.016491,0.0379735,0.0496251,0.0233986 +2020-04-30,1,0.0127531,0.0387969,0.0487082,0.0233986 +2020-05-01,1,0.0145751,0.0387207,0.0478013,0.0233986 +2020-05-02,1,0.0317603,0.0376276,0.0479377,0.0233986 +2020-05-03,1,0.0319561,0.0380711,0.0484762,0.0233986 +2020-05-04,1,0.0377186,0.0263229,0.0328019,0.0233986 +2020-05-05,1,0.0609556,0.0241922,0.0262903,0.0233986 +2020-05-06,1,0.0578205,0.0252174,0.03228,0.0233986 +2020-05-07,1,0.0417714,0.0321662,0.043489,0.0233986 +2020-05-08,1,0.0542995,0.0318201,0.0404242,0.0233986 +2020-05-09,1,0.0595778,0.0337665,0.0408834,0.0233986 +2020-05-10,1,0.0415568,0.0413885,0.0488328,0.0233986 +2020-05-11,1,0.0384988,0.0369306,0.0392238,0.0233986 +2020-05-12,1,0.0389404,0.0327455,0.0320221,0.0233986 +2020-05-13,1,0.0344351,0.0355931,0.0391363,0.0233986 +2020-05-14,1,0.0265641,0.0367803,0.0388805,0.0233986 +2020-05-15,1,0.0186052,0.0331034,0.034845,0.0233986 +2020-05-16,1,0.0295322,0.0323068,0.0333152,0.0233986 +2020-05-17,1,0.024121,0.0324778,0.0317974,0.0233986 +2020-05-18,1,0.0236741,0.0304928,0.0287419,0.0233986 +2020-05-19,1,0.0271468,0.0281687,0.0214785,0.0233986 +2020-05-20,1,0.0309326,0.0253654,0.0231043,0.0233986 +2020-05-21,1,0.0244195,0.0278086,0.0252465,0.0233986 +2020-05-22,1,0.0311869,0.0258461,0.0223314,0.0233986 +2020-05-23,1,0.0353994,0.0255724,0.0220364,0.0233986 +2020-05-24,1,0.0231447,0.0270492,0.0243469,0.0233986 +2020-05-25,1,0.0238343,0.0281709,0.024604,0.0233986 +2020-05-26,1,0.02894,0.0261532,0.0217143,0.0233986 +2020-05-27,1,0.0384454,0.0283625,0.0268455,0.0233986 +2020-05-28,1,0.0520293,0.029453,0.0277167,0.0233986 +2020-05-29,1,0.0519998,0.0249737,0.0234354,0.0233986 +2020-05-30,1,0.0509213,0.0253225,0.0228764,0.0233986 +2020-05-31,1,0.0496741,0.0268955,0.0231949,0.0233986 +2020-06-01,1,0.0325699,0.0287523,0.0279778,0.0233986 +2020-06-02,1,0.0121723,0.0326255,0.0332576,0.0233986 +2020-06-03,1,0.0112273,0.0325626,0.032474,0.0233986 +2020-06-04,1,0.00893518,0.031927,0.0289575,0.0233986 +2020-06-05,1,0.00490499,0.0311187,0.0296041,0.0233986 +2020-06-06,1,0.0283039,0.0269702,0.0290817,0.0233986 +2020-06-07,1,0.0293727,0.0199439,0.0189152,0.0233986 +2020-06-08,1,0.0292713,0.0193247,0.0201766,0.0233986 +2020-06-09,1,0.0288749,0.0179007,0.01956,0.0233986 +2020-06-10,1,0.0287681,0.0148969,0.01804,0.0233986 +2020-06-11,1,0.0100014,0.0261648,0.0271329,0.0233986 +2020-06-12,1,0.00799889,0.0260736,0.0264681,0.0233986 +2020-06-13,1,0.00864603,0.0260301,0.0258337,0.0233986 +2020-06-14,1,0.00965673,0.0259053,0.0258599,0.0233986 +2020-06-15,1,0.00922274,0.0252556,0.02329,0.0233986 +2020-06-16,1,0.00657812,0.018252,0.016387,0.0233986 +2020-06-17,1,0.0195218,0.0170317,0.0174285,0.0233986 +2020-06-18,1,0.0189289,0.0172568,0.0154265,0.0233986 +2020-06-19,1,0.0248728,0.0176017,0.0174889,0.0233986 +2020-06-20,1,0.0248521,0.0173481,0.0179041,0.0233986 +2020-06-21,1,0.025236,0.0154949,0.0188444,0.0233986 +2020-06-22,1,0.0122498,0.0217841,0.0217176,0.0233986 +2020-06-23,1,0.0158917,0.0202559,0.0192284,0.0233986 +2020-06-24,1,0.0103018,0.020958,0.0226041,0.0233986 +2020-06-25,1,0.0103368,0.020862,0.0189082,0.0233986 +2020-06-26,1,0.010365,0.0208598,0.0183072,0.0233986 +2020-06-27,1,0.00986384,0.0167095,0.0195855,0.0233986 +2020-06-28,1,0.00859448,0.0177403,0.0223331,0.0233986 +2020-06-29,1,0.00855828,0.0154819,0.0199627,0.0233986 +2020-06-30,1,0.00865,0.0154804,0.0196937,0.0233986 +2020-07-01,1,0.017543,0.0155356,0.0190841,0.0233986 +2020-07-02,1,0.0179302,0.0152867,0.0215469,0.0233986 +2020-07-03,1,0.0186644,0.0134549,0.0155622,0.0233986 +2020-07-04,1,0.0214989,0.0132784,0.0147772,0.0233986 +2020-07-05,1,0.0209625,0.0133111,0.0142071,0.0233986 +2020-07-06,1,0.0138189,0.0170406,0.0164769,0.0233986 +2020-07-07,1,0.0126976,0.0172158,0.0152866,0.0233986 +2020-07-08,1,0.00750474,0.017571,0.0128116,0.0233986 +2020-07-09,1,0.00325217,0.0180998,0.0151797,0.0233986 +2020-07-10,1,0.00379646,0.0179221,0.0147502,0.0233986 +2020-07-11,1,0.0042948,0.0156827,0.0111315,0.0233986 +2020-07-12,1,0.00366604,0.0151649,0.0117991,0.0233986 +2020-07-13,1,0.00393134,0.0128115,0.0135338,0.0233986 +2020-07-14,1,0.00445757,0.0093902,0.0126643,0.0233986 +2020-07-15,1,0.00390401,0.00985135,0.0124478,0.0233986 +2020-07-16,1,0.00997619,0.0097362,0.0115844,0.0233986 +2020-07-17,1,0.0107701,0.00926715,0.0110781,0.0233986 +2020-07-18,1,0.010152,0.00940713,0.011164,0.0233986 +2020-07-19,1,0.0117218,0.00966533,0.0112736,0.0233986 +2020-07-20,1,0.010552,0.00914688,0.0100308,0.0233986 +2020-07-21,1,0.0107126,0.0125572,0.0111318,0.0233986 +2020-07-22,1,0.043396,0.012974,0.0133718,0.0233986 +2020-07-23,1,0.0454362,0.0125992,0.0118299,0.0233986 +2020-07-24,1,0.0427347,0.013069,0.0111249,0.0233986 +2020-07-25,1,0.0443942,0.0127302,0.0130879,0.0233986 +2020-07-26,1,0.0445439,0.0129908,0.010588,0.0233986 +2020-07-27,1,0.0174257,0.0252726,0.0227117,0.0233986 +2020-07-28,1,0.0383344,0.0255058,0.0173177,0.0233986 +2020-07-29,1,0.038357,0.0248925,0.0171021,0.0233986 +2020-07-30,1,0.0384603,0.0251031,0.0180964,0.0233986 +2020-07-31,2,0.0433805,0.024017,0.0214837,0.0235239 +2020-08-01,2,0.0399253,0.0185453,0.0217116,0.0235239 +2020-08-02,2,0.0240219,0.0245441,0.0244368,0.0235239 +2020-08-03,2,0.0237604,0.0245662,0.0211385,0.0235239 +2020-08-04,2,0.0241993,0.0245649,0.0227906,0.0235239 +2020-08-05,2,0.0134761,0.0258294,0.0240732,0.0235239 +2020-08-06,2,0.0232022,0.025207,0.0236012,0.0235239 +2020-08-07,2,0.0242554,0.0220532,0.0221579,0.0235239 +2020-08-08,2,0.0248614,0.0219812,0.0219103,0.0235239 +2020-08-09,2,0.0245868,0.0221336,0.0181196,0.0235239 +2020-08-10,2,0.0234643,0.0186546,0.0173768,0.0235239 +2020-08-11,2,0.00793802,0.0221523,0.0280407,0.0235239 +2020-08-12,2,0.0125555,0.0224083,0.0260443,0.0235239 +2020-08-13,2,0.0185858,0.0225624,0.0254708,0.0235239 +2020-08-14,2,0.0213626,0.0225123,0.0222132,0.0235239 +2020-08-15,2,0.0215725,0.0221959,0.0243672,0.0235239 +2020-08-16,2,0.024079,0.0165396,0.0196947,0.0235239 +2020-08-17,2,0.0169846,0.0187951,0.0250441,0.0235239 +2020-08-18,2,0.015735,0.0193443,0.0170781,0.0235239 +2020-08-19,2,0.0145354,0.0202274,0.0194946,0.0235239 +2020-08-20,2,0.0200008,0.0202465,0.0185916,0.0235239 +2020-08-21,2,0.0193222,0.0210112,0.0217319,0.0235239 +2020-08-22,2,0.0191422,0.0190564,0.0168125,0.0235239 +2020-08-23,2,0.0223767,0.0182764,0.0149644,0.0235239 +2020-08-24,2,0.0214544,0.0168359,0.0201107,0.0235239 +2020-08-25,2,0.0144221,0.0188106,0.0265581,0.0235239 +2020-08-26,2,0.0145642,0.0186452,0.0205376,0.0235239 +2020-08-27,2,0.013008,0.0179181,0.0243584,0.0235239 +2020-08-28,2,0.028142,0.0188638,0.0235405,0.0235239 +2020-08-29,2,0.0551266,0.0185684,0.0190175,0.0235239 +2020-08-30,2,0.0567134,0.0167285,0.0243062,0.0235239 +2020-08-31,2,0.0557923,0.0167498,0.0217674,0.0235239 +2020-09-01,2,0.0528539,0.01636,0.0235711,0.0235239 +2020-09-02,2,0.0542553,0.0205894,0.0236595,0.0235239 +2020-09-03,2,0.0248072,0.0288545,0.0284794,0.0235239 +2020-09-04,2,0.021275,0.029158,0.03244,0.0235239 +2020-09-05,2,0.0151338,0.0292483,0.038163,0.0235239 +2020-09-06,2,0.0146278,0.0288271,0.0358485,0.0235239 +2020-09-07,2,0.0142684,0.0290481,0.038777,0.0235239 +2020-09-08,2,0.00927563,0.0233195,0.021192,0.0235239 +2020-09-09,2,0.0165924,0.0223983,0.0232221,0.0235239 +2020-09-10,2,0.0165514,0.0204499,0.0228684,0.0235239 +2020-09-11,2,0.016651,0.0202351,0.0224282,0.0235239 +2020-09-12,2,0.0175129,0.0200566,0.02053,0.0235239 +2020-09-13,2,0.0146978,0.0178319,0.0193775,0.0235239 +2020-09-14,2,0.0084565,0.0211578,0.0250955,0.0235239 +2020-09-15,2,0.0124961,0.0211528,0.0238682,0.0235239 +2020-09-16,2,0.0218699,0.0210866,0.0225291,0.0235239 +2020-09-17,2,0.0230534,0.021353,0.0221797,0.0235239 +2020-09-18,2,0.0241827,0.0203366,0.0204047,0.0235239 +2020-09-19,2,0.0361651,0.0174673,0.0222895,0.0235239 +2020-09-20,2,0.0358972,0.0194452,0.0234138,0.0235239 +2020-09-21,2,0.0281034,0.0229367,0.0261248,0.0235239 +2020-09-22,2,0.0281111,0.0232907,0.0253146,0.0235239 +2020-09-23,2,0.022992,0.0235538,0.0243113,0.0235239 +2020-09-24,2,0.00799746,0.0265636,0.0374866,0.0235239 +2020-09-25,2,0.00782623,0.0231024,0.0199474,0.0235239 +2020-09-26,2,0.010464,0.021428,0.0195201,0.0235239 +2020-09-27,2,0.0101253,0.0209747,0.0205783,0.0235239 +2020-09-28,2,0.0100418,0.0198613,0.020916,0.0235239 +2020-09-29,2,0.00958468,0.0149242,0.0231805,0.0235239 +2020-09-30,2,0.0114276,0.0146186,0.0196066,0.0235239 +2020-10-01,2,0.0122078,0.0157452,0.0244595,0.0235239 +2020-10-02,2,0.0122598,0.015568,0.0213753,0.0235239 +2020-10-03,2,0.0149978,0.0155336,0.0209576,0.0235239 +2020-10-04,2,0.0151943,0.0152724,0.0216611,0.0235239 +2020-10-05,2,0.0163545,0.0160059,0.0239354,0.0235239 +2020-10-06,2,0.00751736,0.0160538,0.0234912,0.0235239 +2020-10-07,2,0.00601965,0.0160364,0.0201412,0.0235239 +2020-10-08,2,0.0123067,0.0170581,0.0239973,0.0235239 +2020-10-09,2,0.0125429,0.0171731,0.0262065,0.0235239 +2020-10-10,2,0.00976962,0.0175962,0.0250012,0.0235239 +2020-10-11,2,0.0123224,0.0142133,0.0209067,0.0235239 +2020-10-12,2,0.00923805,0.013357,0.0241262,0.0235239 +2020-10-13,2,0.00986119,0.0154757,0.0106156,0.0235239 +2020-10-14,2,0.0136436,0.0155525,0.00813557,0.0235239 +2020-10-15,2,0.0142787,0.0140844,0.0132643,0.0235239 +2020-10-16,2,0.0279603,0.013964,0.0153491,0.0235239 +2020-10-17,2,0.0266224,0.0128451,0.0127393,0.0235239 +2020-10-18,2,0.0291803,0.0131066,0.0150141,0.0235239 +2020-10-19,2,0.0295488,0.0145851,0.00932235,0.0235239 +2020-10-20,2,0.0321427,0.0147465,0.0127715,0.0235239 +2020-10-21,2,0.00841149,0.0204847,0.0240778,0.0235239 +2020-10-22,2,0.0198685,0.0201485,0.0196698,0.0235239 +2020-10-23,2,0.0263713,0.0204621,0.0171724,0.0235239 +2020-10-24,2,0.0262896,0.0203895,0.0198128,0.0235239 +2020-10-25,2,0.0255805,0.0209022,0.0165135,0.0235239 +2020-10-26,2,0.0257327,0.0145278,0.019931,0.0235239 +2020-10-27,2,0.0182138,0.0188246,0.0269046,0.0235239 +2020-10-28,2,0.0125052,0.0206408,0.0274114,0.0235239 +2020-10-29,2,0.0167485,0.0206115,0.0241179,0.0235239 +2020-10-30,2,0.0169396,0.0204044,0.0205176,0.0235239 +2020-10-31,2,0.0438543,0.0204366,0.023647,0.0235239 +2020-11-01,2,0.0435025,0.0184899,0.0198339,0.0235239 +2020-11-02,2,0.0528922,0.0161202,0.0206301,0.0235239 +2020-11-03,2,0.0539311,0.0175707,0.0274267,0.0235239 +2020-11-04,2,0.0556638,0.0174013,0.0210141,0.0235239 +2020-11-05,2,0.0322739,0.0253832,0.0257755,0.0235239 +2020-11-06,2,0.0350796,0.025368,0.0224393,0.0235239 +2020-11-07,2,0.0233845,0.0276041,0.0330721,0.0235239 +2020-11-08,2,0.0196478,0.0280208,0.0365544,0.0235239 +2020-11-09,2,0.0212561,0.0283922,0.0395189,0.0235239 +2020-11-10,2,0.0219472,0.0245192,0.0351942,0.0235239 +2020-11-11,2,0.0272534,0.025144,0.0370552,0.0235239 +2020-11-12,2,0.0319545,0.0220041,0.0238938,0.0235239 +2020-11-13,2,0.0313962,0.0209579,0.0179174,0.0235239 +2020-11-14,2,0.0277952,0.021527,0.0219934,0.0235239 +2020-11-15,2,0.024244,0.0217643,0.0190953,0.0235239 +2020-11-16,2,0.0253939,0.0233752,0.0247864,0.0235239 +2020-11-17,2,0.0219287,0.0248428,0.0386811,0.0235239 +2020-11-18,2,0.0222234,0.0245613,0.03046,0.0235239 +2020-11-19,2,0.026285,0.0234571,0.0198289,0.0235239 +2020-11-20,2,0.0233391,0.0226615,0.0247981,0.0235239 +2020-11-21,2,0.0462975,0.0229766,0.0214173,0.0235239 +2020-11-22,2,0.0467494,0.0221583,0.0269572,0.0235239 +2020-11-23,2,0.0517706,0.0221297,0.0230813,0.0235239 +2020-11-24,2,0.0488943,0.023182,0.0263199,0.0235239 +2020-11-25,2,0.0614608,0.0226563,0.0266215,0.0235239 +2020-11-26,2,0.0444587,0.0295529,0.043846,0.0235239 +2020-11-27,2,0.0429185,0.0283143,0.0401954,0.0235239 +2020-11-28,2,0.042531,0.0293139,0.0434346,0.0235239 +2020-11-29,2,0.0491904,0.0283429,0.0425292,0.0235239 +2020-11-30,2,0.0332426,0.0310848,0.0425536,0.0235239 +2020-12-01,2,0.0256949,0.029018,0.0373974,0.0235239 +2020-12-02,2,0.0246322,0.028735,0.0351592,0.0235239 +2020-12-03,2,0.0304651,0.0286226,0.0366072,0.0235239 +2020-12-04,2,0.027569,0.0301425,0.0378675,0.0235239 +2020-12-05,2,0.0238234,0.0271158,0.0334734,0.0235239 +2020-12-06,2,0.0212478,0.025213,0.0229187,0.0235239 +2020-12-07,2,0.0325534,0.024936,0.0228689,0.0235239 +2020-12-08,2,0.0229229,0.0267219,0.0251292,0.0235239 +2020-12-09,2,0.0228461,0.0256541,0.0241152,0.0235239 +2020-12-10,2,0.0189713,0.0247165,0.0248608,0.0235239 +2020-12-11,2,0.0361779,0.0239938,0.0241681,0.0235239 +2020-12-12,2,0.0394785,0.0269233,0.03222,0.0235239 +2020-12-13,2,0.0399464,0.0245198,0.0248769,0.0235239 +2020-12-14,2,0.0361989,0.024463,0.0242414,0.0235239 +2020-12-15,2,0.0432917,0.0232418,0.0210542,0.0235239 +2020-12-16,2,0.0386706,0.0289519,0.0355217,0.0235239 +2020-12-17,2,0.0305021,0.0301725,0.0326843,0.0235239 +2020-12-18,2,0.0331323,0.0288634,0.0265462,0.0235239 +2020-12-19,2,0.0310739,0.0281172,0.0264521,0.0235239 +2020-12-20,2,0.0338388,0.0294584,0.0277572,0.0235239 +2020-12-21,2,0.0341318,0.0288607,0.0267736,0.0235239 +2020-12-22,2,0.0364689,0.0265786,0.0238959,0.0235239 +2020-12-23,2,0.0274513,0.0269449,0.0275361,0.0235239 +2020-12-24,2,0.0287926,0.026476,0.0254245,0.0235239 +2020-12-25,2,0.030666,0.0272591,0.0300211,0.0235239 +2020-12-26,2,0.0232192,0.0274828,0.032865,0.0235239 +2020-12-27,2,0.0193901,0.0279948,0.0276775,0.0235239 +2020-12-28,2,0.0362754,0.0259655,0.0236961,0.0235239 +2020-12-29,2,0.0348761,0.0262197,0.0226901,0.0235239 +2020-12-30,2,0.0422165,0.0262131,0.0259509,0.0235239 +2020-12-31,2,0.0445399,0.0243279,0.0256056,0.0235239 +2021-01-01,2,0.0474316,0.0229368,0.0242336,0.0235239 +2021-01-02,2,0.0429982,0.0279665,0.0315715,0.0235239 +2021-01-03,2,0.0416945,0.0276384,0.025874,0.0235239 +2021-01-04,2,0.0369569,0.0293126,0.0255504,0.0235239 +2021-01-05,2,0.0541682,0.0299982,0.028391,0.0235239 +2021-01-06,2,0.0585489,0.0309311,0.0286286,0.0235239 +2021-01-07,2,0.0426733,0.0297595,0.0297497,0.0235239 +2021-01-08,2,0.0669932,0.0292317,0.0281543,0.0235239 +2021-01-09,2,0.0735063,0.0285439,0.0255667,0.0235239 +2021-01-10,2,0.0757578,0.0326741,0.0331584,0.0235239 +2021-01-11,2,0.0667885,0.0348068,0.0357211,0.0235239 +2021-01-12,2,0.0616498,0.0323147,0.0301873,0.0235239 +2021-01-13,2,0.0422957,0.0374165,0.0373245,0.0235239 +2021-01-14,2,0.0303912,0.0382331,0.0360993,0.0235239 +2021-01-15,2,0.0170837,0.0395789,0.0371808,0.0235239 +2021-01-16,2,0.0638158,0.0383209,0.0351532,0.0235239 +2021-01-17,2,0.0785137,0.0372789,0.0371144,0.0235239 +2021-01-18,2,0.0753762,0.0336216,0.0278263,0.0235239 +2021-01-19,2,0.0768497,0.0307819,0.0272134,0.0235239 +2021-01-20,2,0.0776374,0.0263979,0.0259152,0.0235239 +2021-01-21,2,0.035311,0.0404524,0.0477268,0.0235239 +2021-01-22,2,0.0324542,0.0432592,0.04453,0.0235239 +2021-01-23,2,0.0578009,0.04289,0.0405078,0.0235239 +2021-01-24,2,0.0582427,0.0424257,0.043118,0.0235239 +2021-01-25,2,0.0584241,0.0421841,0.0421518,0.0235239 +2021-01-26,2,0.0620241,0.0340173,0.032512,0.0235239 +2021-01-27,2,0.0477223,0.0334162,0.03978,0.0235239 +2021-01-28,2,0.0336647,0.0395248,0.0424852,0.0235239 +2021-01-29,2,0.0385699,0.0391176,0.036458,0.0235239 +2021-01-30,2,0.0406114,0.0389137,0.0389858,0.0235239 +2021-01-31,2,0.0299603,0.0396636,0.0386858,0.0235239 +2021-02-01,2,0.0286997,0.0368353,0.035062,0.0235239 +2021-02-02,2,0.0292448,0.0333782,0.0370449,0.0235239 +2021-02-03,2,0.0757554,0.0346943,0.0367419,0.0235239 +2021-02-04,2,0.0723669,0.0344631,0.0336981,0.0235239 +2021-02-05,2,0.0811044,0.031617,0.0292232,0.0235239 +2021-02-06,2,0.0822431,0.0308931,0.0309346,0.0235239 +2021-02-07,2,0.0821248,0.0310371,0.0307721,0.0235239 +2021-02-08,2,0.0368472,0.0435545,0.0531534,0.0235239 +2021-02-09,2,0.039241,0.0429893,0.0437524,0.0235239 +2021-02-10,2,0.0347703,0.0445048,0.0447949,0.0235239 +2021-02-11,2,0.0226744,0.0449199,0.0472335,0.0235239 +2021-02-12,2,0.0307199,0.0425213,0.0448504,0.0235239 +2021-02-13,2,0.0308523,0.0340506,0.0357487,0.0235239 +2021-02-14,2,0.0410812,0.0343224,0.0351953,0.0235239 +2021-02-15,2,0.0365601,0.0332663,0.0341213,0.0235239 +2021-02-16,2,0.0365792,0.0296093,0.0310292,0.0235239 +2021-02-17,2,0.0503171,0.0323015,0.0370188,0.0235239 +2021-02-18,2,0.0718284,0.0316492,0.0324506,0.0235239 +2021-02-19,2,0.0564037,0.0340229,0.0401825,0.0235239 +2021-02-20,2,0.0553378,0.0329889,0.0345178,0.0235239 +2021-02-21,2,0.0464172,0.032901,0.0330063,0.0235239 +2021-02-22,2,0.0482605,0.0364152,0.0390819,0.0235239 +2021-02-23,2,0.0264595,0.0421409,0.0495226,0.0235239 +2021-02-24,2,0.0563899,0.0392296,0.0380388,0.0235239 +2021-02-25,2,0.0507815,0.0393745,0.0376129,0.0235239 +2021-02-26,2,0.0514822,0.0375516,0.0326822,0.0235239 +2021-02-27,2,0.0574151,0.0379218,0.0341938,0.0235239 +2021-02-28,2,0.054578,0.032232,0.0268977,0.0235239 +2021-03-01,2,0.0322727,0.0403715,0.0412307,0.0235239 +2021-03-02,2,0.0353961,0.0366895,0.0350112,0.0235239 +2021-03-03,2,0.0313584,0.0369082,0.0355378,0.0235239 +2021-03-04,2,0.0220112,0.0381166,0.0384241,0.0235239 +2021-03-05,2,0.02017,0.0371072,0.0380464,0.0235239 +2021-03-06,2,0.013203,0.0321126,0.0327379,0.0235239 +2021-03-07,2,0.0205614,0.0330443,0.0338204,0.0235239 +2021-03-08,2,0.0280474,0.0318402,0.0326683,0.0235239 +2021-03-09,2,0.0376827,0.0290805,0.0333291,0.0235239 +2021-03-10,2,0.0498277,0.0283836,0.029138,0.0235239 +2021-03-11,2,0.0477697,0.0250897,0.0331772,0.0235239 +2021-03-12,2,0.0506387,0.0281736,0.0285809,0.0235239 +2021-03-13,2,0.0377396,0.0304764,0.0392972,0.0235239 +2021-03-14,2,0.0364829,0.033037,0.0326656,0.0235239 +2021-03-15,2,0.0196608,0.0360465,0.0385026,0.0235239 +2021-03-16,2,0.0212262,0.0351314,0.0351997,0.0235239 +2021-03-17,2,0.0236715,0.0341461,0.037278,0.0235239 +2021-03-18,2,0.0250738,0.0316103,0.0340234,0.0235239 +2021-03-19,2,0.0243912,0.0307328,0.0347523,0.0235239 +2021-03-20,2,0.0219084,0.025901,0.0303012,0.0235239 +2021-03-21,2,0.0458315,0.0264979,0.0325197,0.0235239 +2021-03-22,2,0.0387082,0.0273052,0.0313763,0.0235239 +2021-03-23,2,0.0387928,0.0265121,0.0286921,0.0235239 +2021-03-24,2,0.0322401,0.0264539,0.0315708,0.0235239 +2021-03-25,2,0.0242431,0.0255255,0.0298286,0.0235239 +2021-03-26,2,0.0136868,0.0316141,0.0375255,0.0235239 +2021-03-27,2,0.0143396,0.0302129,0.0332261,0.0235239 +2021-03-28,2,0.0134713,0.030089,0.0326025,0.0235239 +2021-03-29,2,0.0184296,0.0282931,0.0273489,0.0235239 +2021-03-30,2,0.018383,0.0261837,0.0250695,0.0235239 +2021-03-31,2,0.0185601,0.0221519,0.0208336,0.0235239 +2021-04-01,2,0.0196247,0.0223459,0.0212537,0.0235239 +2021-04-02,2,0.0240021,0.021839,0.0220066,0.0235239 +2021-04-03,2,0.0299929,0.023906,0.0254056,0.0235239 +2021-04-04,2,0.02838,0.0231437,0.0203188,0.0235239 +2021-04-05,2,0.0311002,0.0230117,0.0181634,0.0235239 +2021-04-06,2,0.0295695,0.0226242,0.0253323,0.0235239 +2021-04-07,2,0.0191499,0.024227,0.0242917,0.0235239 +2021-04-08,2,0.0261807,0.0258353,0.0263098,0.0235239 +2021-04-09,2,0.0271082,0.0246636,0.0209666,0.0235239 +2021-04-10,2,0.0268974,0.0254437,0.0213507,0.0235239 +2021-04-11,2,0.0323195,0.0250592,0.0188624,0.0235239 +2021-04-12,2,0.0332767,0.0221361,0.0180611,0.0235239 +2021-04-13,2,0.0312846,0.0240832,0.0220774,0.0235239 +2021-04-14,2,0.0309309,0.0243479,0.0191836,0.0235239 +2021-04-15,2,0.0334578,0.0237939,0.0209602,0.0235239 +2021-04-16,2,0.0351513,0.0251596,0.0228492,0.0235239 +2021-04-17,2,0.0348469,0.024469,0.0215578,0.0235239 +2021-04-18,2,0.0245442,0.0257874,0.023717,0.0235239 +2021-04-19,2,0.0238613,0.0257252,0.0190922,0.0235239 +2021-04-20,2,0.0143803,0.0258935,0.0220036,0.0235239 +2021-04-21,2,0.0552021,0.0266463,0.0218772,0.0235239 +2021-04-22,2,0.0503395,0.0268832,0.0224116,0.0235239 +2021-04-23,2,0.0493432,0.0243371,0.0216494,0.0235239 +2021-04-24,2,0.0498507,0.0238123,0.018937,0.0235239 +2021-04-25,2,0.0517289,0.0207035,0.0168578,0.0235239 +2021-04-26,2,0.037648,0.0320878,0.0371341,0.0235239 +2021-04-27,2,0.0403926,0.0313582,0.0253033,0.0235239 +2021-04-28,2,0.0400495,0.0311665,0.027109,0.0235239 +2021-04-29,2,0.0527315,0.031124,0.0251217,0.0235239 +2021-04-30,2,0.0521843,0.0319584,0.0325431,0.0235239 +2021-05-01,2,0.0526728,0.0292856,0.0274513,0.0235239 +2021-05-02,2,0.0525318,0.0297471,0.028153,0.0235239 +2021-05-03,2,0.0534765,0.0296122,0.0314153,0.0235239 +2021-05-04,2,0.0362065,0.0327705,0.0365803,0.0235239 +2021-05-05,2,0.0269487,0.0331938,0.0356784,0.0235239 +2021-05-06,2,0.0271608,0.033235,0.0331145,0.0235239 +2021-05-07,2,0.0677198,0.0332579,0.0334407,0.0235239 +2021-05-08,2,0.0651632,0.0333707,0.0326123,0.0235239 +2021-05-09,2,0.0666028,0.0299964,0.0319696,0.0235239 +2021-05-10,2,0.0682939,0.0272658,0.0235043,0.0235239 +2021-05-11,2,0.064902,0.0273462,0.023586,0.0235239 +2021-05-12,2,0.0375043,0.0381187,0.037379,0.0235239 +2021-05-13,2,0.0328316,0.0375449,0.0362451,0.0235239 +2021-05-14,2,0.0564234,0.0374827,0.0368575,0.0235239 +2021-05-15,2,0.0896109,0.0382833,0.0341508,0.0235239 +2021-05-16,2,0.0923836,0.0376646,0.0356403,0.0235239 +2021-05-17,2,0.0938013,0.0328744,0.0313364,0.0235239 +2021-05-18,2,0.0953872,0.0307271,0.0301649,0.0235239 +2021-05-19,2,0.0927328,0.0379835,0.0385221,0.0235239 +2021-05-20,2,0.0785475,0.0446389,0.0510396,0.0235239 +2021-05-21,2,0.0660373,0.0456399,0.0523727,0.0235239 +2021-05-22,2,0.0676745,0.045122,0.0498082,0.0235239 +2021-05-23,2,0.0668965,0.0456952,0.0529408,0.0235239 +2021-05-24,2,0.0353362,0.0470924,0.057411,0.0235239 +2021-05-25,2,0.042595,0.0448174,0.0491172,0.0235239 +2021-05-26,2,0.0483318,0.0426711,0.0492117,0.0235239 +2021-05-27,2,0.0480959,0.0423695,0.0395514,0.0235239 +2021-05-28,2,0.0326767,0.0425472,0.0458784,0.0235239 +2021-05-29,2,0.0252832,0.035685,0.0345644,0.0235239 +2021-05-30,2,0.045345,0.0376132,0.0353803,0.0235239 +2021-05-31,2,0.0426909,0.0392883,0.0467069,0.0235239 +2021-06-01,2,0.0431105,0.0392029,0.0399063,0.0235239 +2021-06-02,2,0.0469276,0.035352,0.0385586,0.0235239 +2021-06-03,2,0.0337424,0.0322303,0.0327442,0.0235239 +2021-06-04,2,0.0667297,0.037969,0.0395711,0.0235239 +2021-06-05,2,0.0643533,0.037386,0.038815,0.0235239 +2021-06-06,2,0.0645376,0.0373194,0.0352243,0.0235239 +2021-06-07,2,0.0598138,0.038418,0.0413091,0.0235239 +2021-06-08,2,0.0692431,0.0349572,0.0331269,0.0235239 +2021-06-09,2,0.0541285,0.0434793,0.0553326,0.0235239 +2021-06-10,2,0.0516974,0.0414013,0.0400201,0.0235239 +2021-06-11,2,0.0609107,0.0405469,0.0398807,0.0235239 +2021-06-12,2,0.0541452,0.0391058,0.0378999,0.0235239 +2021-06-13,2,0.0381441,0.0418924,0.0429293,0.0235239 +2021-06-14,2,0.0302317,0.0386414,0.0353358,0.0235239 +2021-06-15,2,0.0296828,0.0370204,0.0381716,0.0235239 +2021-06-16,2,0.0520564,0.0390774,0.0383977,0.0235239 +2021-06-17,2,0.058705,0.0376876,0.0380466,0.0235239 +2021-06-18,2,0.0625041,0.0346412,0.0365479,0.0235239 +2021-06-19,2,0.0650338,0.0320129,0.0303505,0.0235239 +2021-06-20,2,0.0749665,0.0317284,0.0309828,0.0235239 +2021-06-21,2,0.0532801,0.038562,0.0446119,0.0235239 +2021-06-22,2,0.0619705,0.0396991,0.0403679,0.0235239 +2021-06-23,2,0.0607809,0.0405828,0.0423405,0.0235239 +2021-06-24,2,0.0623282,0.0410629,0.0416389,0.0235239 +2021-06-25,2,0.038383,0.0430795,0.0465238,0.0235239 +2021-06-26,2,0.0478617,0.0390652,0.0370451,0.0235239 +2021-06-27,2,0.0319221,0.0413095,0.0419255,0.0235239 +2021-06-28,2,0.0340255,0.04108,0.0434056,0.0235239 +2021-06-29,2,0.0284473,0.0409932,0.0419099,0.0235239 +2021-06-30,2,0.0333855,0.0359973,0.0336056,0.0235239 +2021-07-01,2,0.0275642,0.0372298,0.0350442,0.0235239 +2021-07-02,2,0.0280494,0.033357,0.0355624,0.0235239 +2021-07-03,2,0.0270982,0.0339108,0.0320592,0.0235239 +2021-07-04,2,0.029905,0.0320326,0.0318664,0.0235239 +2021-07-05,2,0.0224305,0.0326559,0.0333427,0.0235239 +2021-07-06,2,0.0237991,0.030917,0.0326194,0.0235239 +2021-07-07,2,0.0277918,0.0310293,0.0334746,0.0235239 +2021-07-08,2,0.0250088,0.0305826,0.0326054,0.0235239 +2021-07-09,2,0.0199163,0.0315424,0.0310935,0.0235239 +2021-07-10,2,0.0232496,0.0288251,0.0299718,0.0235239 +2021-07-11,2,0.0152667,0.0290541,0.0293942,0.0235239 +2021-07-12,2,0.0148455,0.030404,0.0316316,0.0235239 +2021-07-13,2,0.0166362,0.0277867,0.0309723,0.0235239 +2021-07-14,2,0.0189402,0.0259813,0.0315474,0.0235239 +2021-07-15,2,0.0192267,0.0270357,0.0333728,0.0235239 +2021-07-16,2,0.0436396,0.0239423,0.0339037,0.0235239 +2021-07-17,2,0.0436443,0.0224786,0.0244661,0.0235239 +2021-07-18,2,0.0462478,0.022813,0.0213371,0.0235239 +2021-07-19,2,0.0397812,0.0222761,0.0281086,0.0235239 +2021-07-20,2,0.0255284,0.0224498,0.0263617,0.0235239 +2021-07-21,2,0.0182112,0.0293979,0.0310399,0.0235239 +2021-07-22,2,0.0147281,0.0292044,0.0255159,0.0235239 +2021-07-23,2,0.0185214,0.0293891,0.0238281,0.0235239 +2021-07-24,2,0.0239327,0.028309,0.0229965,0.0235239 +2021-07-25,2,0.0260882,0.0251955,0.0258973,0.0235239 +2021-07-26,2,0.0312705,0.0235127,0.0252349,0.0235239 +2021-07-27,2,0.0352261,0.0221375,0.0238997,0.0235239 +2021-07-28,2,0.0356554,0.0235392,0.0256819,0.0235239 +2021-07-29,2,0.0369127,0.0251614,0.0223152,0.0235239 +2021-07-30,2,0.0312474,0.025871,0.0261664,0.0235239 +2021-07-31,2,0.0358446,0.0272366,0.0279855,0.0235239 +2021-08-01,2,0.0346079,0.0285788,0.028486,0.0235239 +2021-08-02,2,0.0302517,0.0287312,0.026117,0.0235239 +2021-08-03,2,0.0259266,0.0288547,0.0254339,0.0235239 +2021-08-04,2,0.0288168,0.0276977,0.0284011,0.0235239 +2021-08-05,2,0.0360337,0.0288207,0.0253616,0.0235239 +2021-08-06,2,0.0339953,0.0283372,0.0295476,0.0235239 +2021-08-07,2,0.0335254,0.0273443,0.0246151,0.0235239 +2021-08-08,2,0.0447482,0.0260924,0.0260543,0.0235239 +2021-08-09,2,0.0401726,0.027183,0.0266116,0.0235239 +2021-08-10,2,0.0387881,0.0286859,0.0266299,0.0235239 +2021-08-11,2,0.040937,0.0277332,0.0266189,0.0235239 +2021-08-12,2,0.0414588,0.0271205,0.0280991,0.0235239 +2021-08-13,2,0.0134328,0.0300978,0.0295273,0.0235239 +2021-08-14,2,0.0277652,0.0293295,0.0254346,0.0235239 +2021-08-15,2,0.0374964,0.0289914,0.0258572,0.0235239 +2021-08-16,2,0.0350159,0.0296076,0.0254916,0.0235239 +2021-08-17,2,0.0271593,0.0295185,0.0254334,0.0235239 +2021-08-18,2,0.0268274,0.0214463,0.0193587,0.0235239 +2021-08-19,2,0.0335255,0.0263575,0.0237391,0.0235239 +2021-08-20,2,0.0237943,0.0284686,0.0296432,0.0235239 +2021-08-21,2,0.0301473,0.0276386,0.0279312,0.0235239 +2021-08-22,2,0.0382048,0.0256898,0.0215406,0.0235239 +2021-08-23,2,0.0380772,0.0251848,0.0242214,0.0235239 +2021-08-24,2,0.0327691,0.026704,0.0303369,0.0235239 +2021-08-25,2,0.034588,0.0241566,0.0248876,0.0235239 +2021-08-26,2,0.0288489,0.0259502,0.023784,0.0235239 +2021-08-27,2,0.0255465,0.0278925,0.0297657,0.0235239 +2021-08-28,2,0.0259082,0.0275613,0.0300465,0.0235239 +2021-08-29,2,0.0263532,0.0262221,0.031153,0.0235239 +2021-08-30,2,0.0142861,0.0268052,0.0314352,0.0235239 +2021-08-31,2,0.0163118,0.0249839,0.0222447,0.0235239 +2021-09-01,2,0.0135176,0.0243278,0.0249092,0.0235239 +2021-09-02,2,0.0611246,0.0244212,0.0240965,0.0235239 +2021-09-03,2,0.0595703,0.0242807,0.0234302,0.0235239 +2021-09-04,2,0.0601796,0.0197345,0.0187387,0.0235239 +2021-09-05,2,0.0532568,0.0206218,0.0228224,0.0235239 +2021-09-06,2,0.0513133,0.0195753,0.0187154,0.0235239 +2021-09-07,2,0.0207849,0.0331225,0.0382522,0.0235239 +2021-09-08,2,0.0223683,0.0327989,0.034152,0.0235239 +2021-09-09,2,0.0323196,0.0328821,0.0363145,0.0235239 +2021-09-10,2,0.0257267,0.0317001,0.0312034,0.0235239 +2021-09-11,2,0.0276131,0.0308094,0.0285001,0.0235239 +2021-09-12,2,0.0287009,0.0241818,0.023051,0.0235239 +2021-09-13,2,0.0238709,0.0246905,0.0251932,0.0235239 +2021-09-14,2,0.0200138,0.0276947,0.0292185,0.0235239 +2021-09-15,2,0.0446092,0.0259294,0.0228536,0.0235239 +2021-09-16,2,0.0451035,0.0263489,0.0219835,0.0235239 +2021-09-17,2,0.0642907,0.0263376,0.0230866,0.0235239 +2021-09-18,2,0.0656595,0.0247726,0.0239714,0.0235239 +2021-09-19,2,0.0672931,0.0235487,0.0224061,0.0235239 +2021-09-20,2,0.0510478,0.0311321,0.0343256,0.0235239 +2021-09-21,2,0.0423857,0.031453,0.0293886,0.0235239 +2021-09-22,2,0.0297937,0.035558,0.036991,0.0235239 +2021-09-23,2,0.0227462,0.0357101,0.0340409,0.0235239 +2021-09-24,2,0.0191853,0.0361477,0.0354244,0.0235239 +2021-09-25,2,0.032582,0.0333759,0.0314524,0.0235239 +2021-09-26,2,0.0519578,0.031767,0.0318707,0.0235239 +2021-09-27,2,0.0492309,0.0287083,0.0236476,0.0235239 +2021-09-28,2,0.0411024,0.0265726,0.0252061,0.0235239 +2021-09-29,2,0.0404846,0.0240727,0.0235017,0.0235239 +2021-09-30,2,0.0400154,0.028267,0.0297212,0.0235239 +2021-10-01,2,0.0318565,0.0336641,0.035543,0.0235239 +2021-10-02,2,0.0382219,0.0329999,0.0302474,0.0235239 +2021-10-03,2,0.0389999,0.0313786,0.030478,0.0235239 +2021-10-04,2,0.0390101,0.0312362,0.0280982,0.0235239 +2021-10-05,2,0.037436,0.0312681,0.0300651,0.0235239 +2021-10-06,2,0.0283976,0.0298029,0.0321987,0.0235239 +2021-10-07,2,0.0274432,0.0314374,0.0276209,0.0235239 +2021-10-08,2,0.028058,0.0314866,0.0288766,0.0235239 +2021-10-09,2,0.0283852,0.0314675,0.0295,0.0235239 +2021-10-10,2,0.038643,0.0311055,0.0289186,0.0235239 +2021-10-11,2,0.0382747,0.0289836,0.0249311,0.0235239 +2021-10-12,2,0.0325275,0.027408,0.0224123,0.0235239 +2021-10-13,2,0.0326927,0.0270152,0.0230388,0.0235239 +2021-10-14,2,0.0320775,0.0266944,0.0211004,0.0235239 +2021-10-15,2,0.0181333,0.0296669,0.0292826,0.0235239 +2021-10-16,2,0.0371761,0.0290531,0.027171,0.0235239 +2021-10-17,2,0.038967,0.0277441,0.0281387,0.0235239 +2021-10-18,2,0.0392618,0.0277476,0.0275227,0.0235239 +2021-10-19,2,0.0332545,0.0273331,0.0294074,0.0235239 +2021-10-20,2,0.0354346,0.0230589,0.0227998,0.0235239 +2021-10-21,2,0.030238,0.0292284,0.0285649,0.0235239 +2021-10-22,2,0.031449,0.0296997,0.0258092,0.0235239 +2021-10-23,2,0.0366012,0.0285443,0.0296022,0.0235239 +2021-10-24,2,0.0384971,0.0272693,0.029212,0.0235239 +2021-10-25,2,0.0347165,0.0277975,0.027685,0.0235239 +2021-10-26,2,0.0275842,0.0271387,0.023537,0.0235239 +2021-10-27,2,0.0209773,0.0274539,0.0256324,0.0235239 +2021-10-28,2,0.0209254,0.0279918,0.0305561,0.0235239 +2021-10-29,2,0.0187763,0.0281953,0.0276161,0.0235239 +2021-10-30,2,0.0223256,0.0274442,0.0281727,0.0235239 +2021-10-31,2,0.0220487,0.0257721,0.0233917,0.0235239 +2021-11-01,2,0.0220707,0.023933,0.0247235,0.0235239 +2021-11-02,2,0.0194529,0.0237771,0.023206,0.0235239 +2021-11-03,2,0.0342949,0.0229414,0.0198399,0.0235239 +2021-11-04,2,0.0304168,0.0241172,0.023764,0.0235239 +2021-11-05,2,0.0363865,0.0240411,0.0222041,0.0235239 +2021-11-06,2,0.0368135,0.0226096,0.0189113,0.0235239 +2021-11-07,2,0.036378,0.021991,0.0219729,0.0235239 +2021-11-08,2,0.0133314,0.0266305,0.0237363,0.0235239 +2021-11-09,2,0.0173594,0.0257622,0.0188315,0.0235239 +2021-11-10,2,0.017226,0.0270725,0.022284,0.0235239 +2021-11-11,2,0.0279722,0.0269998,0.0226117,0.0235239 +2021-11-12,2,0.0292519,0.0260905,0.0212271,0.0235239 +2021-11-13,2,0.033429,0.0196832,0.0179006,0.0235239 +2021-11-14,2,0.0350074,0.021157,0.0208733,0.0235239 +2021-11-15,2,0.0412079,0.0213399,0.0223794,0.0235239 +2021-11-16,2,0.0343219,0.0248631,0.0223605,0.0235239 +2021-11-17,2,0.037549,0.02475,0.021526,0.0235239 +2021-11-18,2,0.0303585,0.026327,0.0241367,0.0235239 +2021-11-19,2,0.029989,0.0260957,0.0179771,0.0235239 +2021-11-20,2,0.0276147,0.0271741,0.0195787,0.0235239 +2021-11-21,2,0.0384293,0.0257679,0.0207864,0.0235239 +2021-11-22,2,0.039319,0.0268043,0.0219639,0.0235239 +2021-11-23,2,0.0438742,0.0253449,0.0194833,0.0235239 +2021-11-24,2,0.0422624,0.025039,0.0190768,0.0235239 +2021-11-25,2,0.0423417,0.0245896,0.0199644,0.0235239 +2021-11-26,2,0.0214795,0.0277697,0.0313658,0.0235239 +2021-11-27,2,0.0233844,0.028065,0.027239,0.0235239 +2021-11-28,2,0.024237,0.0293657,0.0286927,0.0235239 +2021-11-29,2,0.0362486,0.02882,0.029482,0.0235239 +2021-11-30,2,0.0391542,0.0275124,0.021949,0.0235239 +2021-12-01,2,0.044145,0.0229033,0.0206811,0.0235239 +2021-12-02,2,0.0456755,0.0233537,0.0216572,0.0235239 +2021-12-03,2,0.0425554,0.0240417,0.0265224,0.0235239 +2021-12-04,2,0.0306366,0.0280269,0.0318286,0.0235239 +2021-12-05,2,0.0301508,0.0283756,0.0293939,0.0235239 +2021-12-06,2,0.0361937,0.0294053,0.0278443,0.0235239 +2021-12-07,2,0.0372298,0.0296503,0.0289711,0.0235239 +2021-12-08,2,0.047901,0.0287188,0.0298463,0.0235239 +2021-12-09,2,0.0416962,0.0267369,0.025994,0.0235239 +2021-12-10,2,0.0475015,0.0261455,0.0217007,0.0235239 +2021-12-11,2,0.0439955,0.0278543,0.0299284,0.0235239 +2021-12-12,2,0.0430973,0.0279404,0.027311,0.0235239 +2021-12-13,2,0.0320562,0.0307177,0.0304938,0.0235239 +2021-12-14,2,0.0320653,0.0291623,0.0287517,0.0235239 +2021-12-15,2,0.0192615,0.0306814,0.0309118,0.0235239 +2021-12-16,2,0.0268915,0.0300753,0.028118,0.0235239 +2021-12-17,2,0.0198424,0.0299068,0.0275701,0.0235239 +2021-12-18,2,0.024931,0.027117,0.0282726,0.0235239 +2021-12-19,2,0.0242541,0.0269447,0.027608,0.0235239 +2021-12-20,2,0.0262677,0.0230088,0.0221023,0.0235239 +2021-12-21,2,0.0209561,0.0256144,0.0240092,0.0235239 +2021-12-22,2,0.0205016,0.0235724,0.0218496,0.0235239 +2021-12-23,2,0.0280444,0.0254947,0.0240099,0.0235239 +2021-12-24,2,0.0272026,0.0252459,0.0212278,0.0235239 +2021-12-25,2,0.0311422,0.0254029,0.0222754,0.0235239 +2021-12-26,2,0.0288832,0.0227459,0.018487,0.0235239 +2021-12-27,2,0.0360168,0.0225576,0.019355,0.0235239 +2021-12-28,2,0.0228842,0.0252334,0.0275629,0.0235239 +2021-12-29,2,0.0215958,0.0251099,0.0225167,0.0235239 +2021-12-30,2,0.0200995,0.0261284,0.0259919,0.0235239 +2021-12-31,2,0.0291028,0.02511,0.0220349,0.0235239 +2022-01-01,2,0.0184896,0.0267987,0.0295632,0.0235239 +2022-01-02,2,0.0182849,0.0233508,0.0187124,0.0235239 +2022-01-03,2,0.0228977,0.0229722,0.0192876,0.0235239 +2022-01-04,2,0.0255788,0.0216467,0.0203274,0.0235239 +2022-01-05,2,0.0175097,0.0245947,0.0224386,0.0235239 +2022-01-06,2,0.0219172,0.021149,0.0176196,0.0235239 +2022-01-07,2,0.0129062,0.0210741,0.021363,0.0235239 +2022-01-08,2,0.0233241,0.0222757,0.0216902,0.0235239 +2022-01-09,2,0.0235857,0.022876,0.0210695,0.0235239 +2022-01-10,2,0.0233255,0.0206409,0.019168,0.0235239 +2022-01-11,2,0.0217868,0.0221095,0.0199894,0.0235239 +2022-01-12,2,0.0175282,0.0189426,0.02033,0.0235239 +2022-01-13,2,0.0118194,0.0224083,0.0223874,0.0235239 +2022-01-14,2,0.0105405,0.0219184,0.0207229,0.0235239 +2022-01-15,2,0.0122692,0.0217708,0.0207719,0.0235239 +2022-01-16,2,0.0438692,0.0213779,0.0202692,0.0235239 +2022-01-17,2,0.043255,0.0200404,0.0185231,0.0235239 +2022-01-18,2,0.0521837,0.0180115,0.0189926,0.0235239 +2022-01-19,2,0.0552772,0.0167069,0.0223228,0.0235239 +2022-01-20,2,0.0573536,0.0174351,0.021047,0.0235239 +2022-01-21,2,0.0272717,0.0278581,0.0249612,0.0235239 +2022-01-22,2,0.01397,0.0279161,0.0263482,0.0235239 +2022-01-23,2,0.00719091,0.0295606,0.0286891,0.0235239 +2022-01-24,2,0.00712616,0.0301186,0.0311974,0.0235239 +2022-01-25,2,0.00939307,0.030325,0.0391299,0.0235239 +2022-01-26,2,0.00897077,0.0247604,0.0233942,0.0235239 +2022-01-27,2,0.00900752,0.0203208,0.0189692,0.0235239 +2022-01-28,2,0.0251217,0.0170536,0.0212586,0.0235239 +2022-01-29,2,0.0246454,0.0169025,0.0178311,0.0235239 +2022-01-30,2,0.0573149,0.0182044,0.0183733,0.0235239 +2022-01-31,2,0.0580019,0.0180325,0.0207931,0.0235239 +2022-02-01,2,0.0578954,0.018005,0.0188461,0.0235239 +2022-02-02,2,0.0448922,0.0237695,0.0241786,0.0235239 +2022-02-03,2,0.0447523,0.0234554,0.0201269,0.0235239 +2022-02-04,2,0.0143608,0.0324828,0.0435709,0.0235239 +2022-02-05,2,0.0194174,0.032559,0.0391893,0.0235239 +2022-02-06,2,0.0234298,0.0326681,0.0388203,0.0235239 +2022-02-07,2,0.0144861,0.0305555,0.0298754,0.0235239 +2022-02-08,2,0.0130313,0.0304683,0.0319419,0.0235239 +2022-02-09,2,0.0142314,0.0223113,0.0218847,0.0235239 +2022-02-10,2,0.0264686,0.0242231,0.0227929,0.0235239 +2022-02-11,2,0.0229981,0.0253277,0.0235846,0.0235239 +2022-02-12,2,0.046352,0.0206312,0.0225902,0.0235239 +2022-02-13,2,0.0461943,0.0196154,0.0188689,0.0235239 +2022-02-14,2,0.0455554,0.0199487,0.0182411,0.0235239 +2022-02-15,2,0.033109,0.0239443,0.0212426,0.0235239 +2022-02-16,2,0.031925,0.0231378,0.022625,0.0235239 +2022-02-17,2,0.0303607,0.0297381,0.0327366,0.0235239 +2022-02-18,2,0.0310903,0.0297565,0.0300357,0.0235239 +2022-02-19,2,0.0360443,0.0295098,0.0310471,0.0235239 +2022-02-20,2,0.0323851,0.027418,0.0302133,0.0235239 +2022-02-21,2,0.0246246,0.0272626,0.0302706,0.0235239 +2022-02-22,2,0.0284399,0.0270653,0.0222002,0.0235239 +2022-02-23,2,0.0646503,0.0273363,0.0251239,0.0235239 +2022-02-24,2,0.064658,0.0282882,0.0275547,0.0235239 +2022-02-25,2,0.067056,0.0275681,0.0288716,0.0235239 +2022-02-26,2,0.0713533,0.023531,0.0200881,0.0235239 +2022-02-27,2,0.0817383,0.024711,0.0217213,0.0235239 +2022-02-28,2,0.0416068,0.0351075,0.040619,0.0235239 +2022-03-01,2,0.0332357,0.035074,0.0348755,0.0235239 +2022-03-02,2,0.0332922,0.0353934,0.0396189,0.0235239 +2022-03-03,2,0.0387533,0.0361935,0.0380286,0.0235239 +2022-03-04,2,0.0405148,0.0386451,0.039507,0.0235239 +2022-03-05,2,0.0534273,0.0321309,0.0302297,0.0235239 +2022-03-06,2,0.052521,0.0302099,0.0282553,0.0235239 +2022-03-07,2,0.0521469,0.030225,0.0319966,0.0235239 +2022-03-08,2,0.053177,0.0314937,0.0299259,0.0235239 +2022-03-09,2,0.0403093,0.0326005,0.0316874,0.0235239 +2022-03-10,2,0.0287186,0.0356406,0.0336829,0.0235239 +2022-03-11,2,0.0329858,0.0348556,0.0320617,0.0235239 +2022-03-12,2,0.033658,0.034758,0.0325993,0.0235239 +2022-03-13,2,0.0262312,0.0350048,0.0302159,0.0235239 +2022-03-14,2,0.0215098,0.0325687,0.0301253,0.0235239 +2022-03-15,2,0.0255168,0.0295752,0.0243464,0.0235239 +2022-03-16,2,0.0162568,0.0308653,0.0307767,0.0235239 +2022-03-17,2,0.0209165,0.0309525,0.0295393,0.0235239 +2022-03-18,2,0.0198785,0.0289039,0.0259986,0.0235239 +2022-03-19,2,0.021763,0.0273611,0.0237906,0.0235239 +2022-03-20,2,0.0136741,0.0287255,0.0256195,0.0235239 +2022-03-21,2,0.0113174,0.025275,0.0223282,0.0235239 +2022-03-22,2,0.0188874,0.024842,0.0236246,0.0235239 +2022-03-23,2,0.0196554,0.0243721,0.0238479,0.0235239 +2022-03-24,2,0.0199242,0.0250398,0.0233447,0.0235239 +2022-03-25,2,0.0226644,0.0219285,0.0178875,0.0235239 +2022-03-26,2,0.0305199,0.0198389,0.0193262,0.0235239 +2022-03-27,2,0.0192696,0.0231924,0.024837,0.0235239 +2022-03-28,2,0.0187269,0.0232478,0.0196147,0.0235239 +2022-03-29,2,0.0197859,0.0232653,0.0175615,0.0235239 +2022-03-30,2,0.0198852,0.0241441,0.0214974,0.0235239 +2022-03-31,2,0.0162126,0.0253362,0.0223641,0.0235239 +2022-04-01,2,0.0257268,0.0212492,0.0202271,0.0235239 +2022-04-02,2,0.0273815,0.0210015,0.0163924,0.0235239 +2022-04-03,2,0.0246852,0.0212551,0.0213727,0.0235239 +2022-04-04,2,0.0266784,0.0208823,0.0191262,0.0235239 +2022-04-05,2,0.0264882,0.0193057,0.0173147,0.0235239 +2022-04-06,2,0.0312339,0.0230009,0.0213516,0.0235239 +2022-04-07,2,0.0330528,0.0228536,0.0176054,0.0235239 +2022-04-08,2,0.036679,0.0224809,0.0212115,0.0235239 +2022-04-09,2,0.036621,0.0228815,0.0199423,0.0235239 +2022-04-10,2,0.0388777,0.0228785,0.021559,0.0235239 +2022-04-11,2,0.0220857,0.0251064,0.02304,0.0235239 +2022-04-12,2,0.0229823,0.0255517,0.0230555,0.0235239 +2022-04-13,2,0.0235834,0.0262274,0.0203902,0.0235239 +2022-04-14,2,0.0179602,0.0263934,0.0221101,0.0235239 +2022-04-15,2,0.0178894,0.0267164,0.0222667,0.0235239 +2022-04-16,2,0.0210764,0.0228163,0.0213924,0.0235239 +2022-04-17,2,0.021511,0.0230909,0.0215225,0.0235239 +2022-04-18,2,0.0150878,0.0225656,0.0195635,0.0235239 +2022-04-19,2,0.00946662,0.0210443,0.018215,0.0235239 +2022-04-20,2,0.0184788,0.0209826,0.0182177,0.0235239 +2022-04-21,2,0.0309788,0.0219418,0.0176617,0.0235239 +2022-04-22,2,0.0354186,0.0219009,0.0181686,0.0235239 +2022-04-23,2,0.0359868,0.0197404,0.016322,0.0235239 +2022-04-24,2,0.0386516,0.0173857,0.0163801,0.0235239 +2022-04-25,2,0.0354405,0.0209937,0.0176434,0.0235239 +2022-04-26,2,0.0266144,0.0249298,0.0229593,0.0235239 +2022-04-27,2,0.0220315,0.0261614,0.0214672,0.0235239 +2022-04-28,2,0.0206071,0.0257505,0.020681,0.0235239 +2022-04-29,2,0.030571,0.0256414,0.023761,0.0235239 +2022-04-30,2,0.0496714,0.0249766,0.0216627,0.0235239 +2022-05-01,2,0.0475172,0.0232066,0.0207977,0.0235239 +2022-05-02,2,0.0468162,0.0219941,0.0212037,0.0235239 +2022-05-03,2,0.0481997,0.0204808,0.0193958,0.0235239 +2022-05-04,2,0.0446442,0.0235689,0.0226944,0.0235239 +2022-05-05,2,0.0524539,0.0285752,0.0290966,0.0235239 +2022-05-06,2,0.0534265,0.0281186,0.020758,0.0235239 +2022-05-07,2,0.0565563,0.0279222,0.0206024,0.0235239 +2022-05-08,2,0.0604662,0.0281137,0.033186,0.0235239 +2022-05-09,2,0.0394951,0.0300019,0.0387087,0.0235239 +2022-05-10,2,0.0424515,0.0313314,0.0356483,0.0235239 +2022-05-11,2,0.0331766,0.0320182,0.0401426,0.0235239 +2022-05-12,2,0.0335624,0.0325277,0.0416973,0.0235239 +2022-05-13,2,0.0450641,0.0330674,0.0449653,0.0235239 +2022-05-14,2,0.0508601,0.0297232,0.0297205,0.0235239 +2022-05-15,2,0.0480922,0.0306038,0.0330627,0.0235239 +2022-05-16,2,0.0447651,0.028834,0.0329849,0.0235239 +2022-05-17,2,0.0463607,0.0288735,0.0317705,0.0235239 +2022-05-18,2,0.0416443,0.0313753,0.0337826,0.0235239 +2022-05-19,2,0.032848,0.0329136,0.0332533,0.0235239 +2022-05-20,3,0.0273467,0.0335926,0.0338715,0.025101 +2022-05-21,3,0.02763,0.0329975,0.0360881,0.025101 +2022-05-22,3,0.0223341,0.0335318,0.0317905,0.025101 +2022-05-23,3,0.0156628,0.032679,0.0332162,0.025101 +2022-05-24,3,0.0165885,0.0309844,0.0348083,0.025101 +2022-05-25,3,0.0376386,0.0296451,0.0265135,0.025101 +2022-05-26,3,0.0360513,0.0290971,0.0283349,0.025101 +2022-05-27,3,0.0498764,0.0270227,0.0274931,0.025101 +2022-05-28,3,0.050249,0.0248494,0.0207592,0.025101 +2022-05-29,3,0.0521552,0.0253406,0.0238332,0.025101 +2022-05-30,3,0.0338867,0.0318337,0.0351693,0.025101 +2022-05-31,3,0.0339289,0.0293167,0.0286474,0.025101 +2022-06-01,3,0.0269999,0.0325313,0.032047,0.025101 +2022-06-02,3,0.0269253,0.0317329,0.0293051,0.025101 +2022-06-03,3,0.0284565,0.0321786,0.0292682,0.025101 +2022-06-04,3,0.0286032,0.0290006,0.0294967,0.025101 +2022-06-05,3,0.032921,0.0288027,0.0288258,0.025101 +2022-06-06,3,0.0141923,0.0274807,0.0270986,0.025101 +2022-06-07,3,0.019605,0.0270302,0.0256539,0.025101 +2022-06-08,3,0.067199,0.0275307,0.0267278,0.025101 +2022-06-09,3,0.0654019,0.0268765,0.0263009,0.025101 +2022-06-10,3,0.0739447,0.0273321,0.0278346,0.025101 +2022-06-11,3,0.0753011,0.0221871,0.0219005,0.025101 +2022-06-12,3,0.0818588,0.024612,0.0262845,0.025101 +2022-06-13,3,0.0516739,0.0388049,0.0405547,0.025101 +2022-06-14,3,0.0724098,0.0384198,0.0399014,0.025101 +2022-06-15,3,0.0711236,0.0395675,0.0408687,0.025101 +2022-06-16,3,0.0535226,0.0410556,0.0401227,0.025101 +2022-06-17,3,0.0562151,0.0419015,0.0402991,0.025101 +2022-06-18,3,0.0448928,0.0379693,0.0351748,0.025101 +2022-06-19,3,0.0316211,0.0424086,0.0416559,0.025101 +2022-06-20,3,0.0316147,0.0421077,0.0437549,0.025101 +2022-06-21,3,0.034605,0.0384378,0.0404063,0.025101 +2022-06-22,3,0.0295653,0.0388775,0.0395495,0.025101 +2022-06-23,3,0.0165157,0.0372695,0.0389814,0.025101 +2022-06-24,3,0.0143847,0.034144,0.0393233,0.025101 +2022-06-25,3,0.005766,0.0341692,0.0392399,0.025101 +2022-06-26,3,0.00693284,0.0348525,0.0373329,0.025101 +2022-06-27,3,0.0100774,0.0335116,0.0371848,0.025101 +2022-06-28,3,0.0116752,0.0287436,0.0306109,0.025101 +2022-06-29,3,0.0282401,0.0277982,0.0253579,0.025101 +2022-06-30,3,0.026756,0.022295,0.0286227,0.025101 +2022-07-01,3,0.0208116,0.0232884,0.0283175,0.025101 +2022-07-02,3,0.0248585,0.0254862,0.0261434,0.025101 +2022-07-03,3,0.0245609,0.0263695,0.0232474,0.025101 +2022-07-04,3,0.0234185,0.0327758,0.0283508,0.025101 +2022-07-05,3,0.0316725,0.0288746,0.0245129,0.025101 +2022-07-06,3,0.0375991,0.0272608,0.0268788,0.025101 +2022-07-07,3,0.0204613,0.0289122,0.0295761,0.025101 +2022-07-08,3,0.0359963,0.0267194,0.0261818,0.025101 +2022-07-09,3,0.0388251,0.0264135,0.025807,0.025101 +2022-07-10,3,0.0370023,0.0272561,0.0269751,0.025101 +2022-07-11,3,0.0280944,0.0273094,0.0263738,0.025101 +2022-07-12,3,0.0229436,0.0238608,0.024514,0.025101 +2022-07-13,3,0.0356952,0.0279907,0.0271819,0.025101 +2022-07-14,3,0.0364484,0.0281898,0.0260746,0.025101 +2022-07-15,3,0.0391338,0.0270026,0.0270372,0.025101 +2022-07-16,3,0.0407175,0.0253476,0.0286274,0.025101 +2022-07-17,3,0.0407214,0.0241437,0.0234725,0.025101 +2022-07-18,3,0.0229835,0.0285134,0.0291031,0.025101 +2022-07-19,3,0.00962767,0.0288988,0.0286004,0.025101 +2022-07-20,3,0.0243308,0.0292371,0.0256344,0.025101 +2022-07-21,3,0.0239566,0.0294533,0.0265452,0.025101 +2022-07-22,3,0.0481291,0.0294714,0.0280193,0.025101 +2022-07-23,3,0.0499445,0.0255012,0.0245206,0.025101 +2022-07-24,3,0.0502944,0.0206788,0.0191938,0.025101 +2022-07-25,3,0.0366917,0.0267442,0.0283137,0.025101 +2022-07-26,3,0.0382284,0.0262573,0.0266106,0.025101 +2022-07-27,3,0.0206029,0.0324232,0.0302685,0.025101 +2022-07-28,3,0.00641715,0.0329433,0.0287538,0.025101 +2022-07-29,3,0.00572363,0.0323947,0.0276367,0.025101 +2022-07-30,3,0.00562821,0.0300519,0.0280288,0.025101 +2022-07-31,3,0.0170008,0.0303037,0.0295797,0.025101 +2022-08-01,3,0.0181017,0.0258386,0.022835,0.025101 +2022-08-02,3,0.0174517,0.0192241,0.0239188,0.025101 +2022-08-03,3,0.0199155,0.0184867,0.0197038,0.025101 +2022-08-04,3,0.0249182,0.018217,0.0186508,0.025101 +2022-08-05,3,0.0260792,0.0238083,0.0239375,0.025101 +2022-08-06,3,0.0240523,0.0242359,0.0289895,0.025101 +2022-08-07,3,0.0244705,0.0239867,0.0220124,0.025101 +2022-08-08,3,0.0227533,0.0247515,0.0234829,0.025101 +2022-08-09,3,0.0157403,0.0249378,0.0219932,0.025101 +2022-08-10,3,0.0100349,0.0251065,0.0230669,0.025101 +2022-08-11,3,0.0114535,0.0245407,0.0223419,0.025101 +2022-08-12,3,0.00901764,0.0239625,0.0227297,0.025101 +2022-08-13,3,0.00765992,0.0234055,0.0217387,0.025101 +2022-08-14,3,0.0427733,0.0213792,0.0204507,0.025101 +2022-08-15,3,0.0465208,0.0189287,0.0199342,0.025101 +2022-08-16,3,0.05037,0.018652,0.0187649,0.025101 +2022-08-17,3,0.0507273,0.0176411,0.0206595,0.025101 +2022-08-18,3,0.0516425,0.015133,0.016761,0.025101 +2022-08-19,3,0.0109547,0.0270605,0.0259437,0.025101 +2022-08-20,3,0.0102538,0.0277302,0.0235487,0.025101 +2022-08-21,3,0.029871,0.0283696,0.0219923,0.025101 +2022-08-22,3,0.0297156,0.0282713,0.0207747,0.025101 +2022-08-23,3,0.0277713,0.0284195,0.0208033,0.025101 +2022-08-24,3,0.0366959,0.0195524,0.0197207,0.025101 +2022-08-25,3,0.0351872,0.0192618,0.0183426,0.025101 +2022-08-26,3,0.0250314,0.0259478,0.0279995,0.025101 +2022-08-27,3,0.0246066,0.0256264,0.0242798,0.025101 +2022-08-28,3,0.0221603,0.0252642,0.026174,0.025101 +2022-08-29,3,0.0141664,0.027393,0.0271993,0.025101 +2022-08-30,3,0.00904999,0.0269119,0.0271474,0.025101 +2022-08-31,3,0.00763247,0.0248044,0.0275924,0.025101 +2022-09-01,3,0.0218792,0.0243538,0.0256188,0.025101 +2022-09-02,3,0.0276321,0.0236557,0.0243048,0.025101 +2022-09-03,3,0.0279218,0.0210892,0.0222203,0.025101 +2022-09-04,3,0.0557962,0.0189653,0.0217747,0.025101 +2022-09-05,3,0.0544409,0.0181228,0.0209444,0.025101 +2022-09-06,3,0.0411298,0.0237935,0.0265222,0.025101 +2022-09-07,3,0.0410493,0.0254588,0.0252609,0.025101 +2022-09-08,3,0.0709089,0.0254644,0.0247469,0.025101 +2022-09-09,3,0.0495556,0.0329634,0.0386776,0.025101 +2022-09-10,3,0.0477703,0.0303829,0.026257,0.025101 +2022-09-11,3,0.0477139,0.028295,0.0303144,0.025101 +2022-09-12,3,0.045551,0.0283978,0.0290188,0.025101 +2022-09-13,3,0.0221376,0.034991,0.0350026,0.025101 +2022-09-14,3,0.023122,0.0320791,0.0297275,0.025101 +2022-09-15,3,0.0247807,0.0319132,0.0308691,0.025101 +2022-09-16,3,0.0240538,0.0316213,0.0308147,0.025101 +2022-09-17,3,0.0340525,0.0305654,0.02982,0.025101 +2022-09-18,3,0.0301852,0.0259222,0.0269443,0.025101 +2022-09-19,3,0.0306932,0.0261362,0.0265112,0.025101 +2022-09-20,3,0.0267307,0.0265583,0.0258723,0.025101 +2022-09-21,3,0.0262661,0.0263332,0.0273244,0.025101 +2022-09-22,3,0.0151407,0.0290817,0.0300139,0.025101 +2022-09-23,3,0.0172552,0.0281401,0.0269296,0.025101 +2022-09-24,3,0.0130578,0.0283051,0.0295733,0.025101 +2022-09-25,3,0.0130825,0.0271417,0.0255224,0.025101 +2022-09-26,3,0.0105609,0.0270588,0.027217,0.025101 +2022-09-27,3,0.0123395,0.0236998,0.0213704,0.025101 +2022-09-28,3,0.0174667,0.0241367,0.0254817,0.025101 +2022-09-29,3,0.0232698,0.0225054,0.02255,0.025101 +2022-09-30,3,0.0235106,0.0225242,0.0223491,0.025101 +2022-10-01,3,0.0241557,0.0196383,0.0216808,0.025101 +2022-10-02,3,0.0257182,0.0203282,0.0248705,0.025101 +2022-10-03,3,0.0218247,0.0223937,0.0241992,0.025101 +2022-10-04,3,0.00797772,0.0241506,0.0260237,0.025101 +2022-10-05,3,0.00853444,0.0215488,0.020849,0.025101 +2022-10-06,3,0.00890596,0.0217226,0.0200629,0.025101 +2022-10-07,3,0.00819989,0.0219139,0.0241836,0.025101 +2022-10-08,3,0.010506,0.0210558,0.0210827,0.025101 +2022-10-09,3,0.0112685,0.0163906,0.0207658,0.025101 +2022-10-10,3,0.00907808,0.0163287,0.0234563,0.025101 +2022-10-11,3,0.00992705,0.0164701,0.0218205,0.025101 +2022-10-12,3,0.0113848,0.0157372,0.019436,0.025101 +2022-10-13,3,0.0121113,0.01659,0.02025,0.025101 +2022-10-14,3,0.0120917,0.015921,0.0169453,0.025101 +2022-10-15,3,0.0119163,0.0151154,0.0165685,0.025101 +2022-10-16,3,0.0110946,0.0152944,0.0168503,0.025101 +2022-10-17,3,0.00751974,0.0158765,0.0201015,0.025101 +2022-10-18,3,0.010941,0.0156411,0.0162201,0.025101 +2022-10-19,3,0.011307,0.0156734,0.015477,0.025101 +2022-10-20,3,0.0186737,0.0154412,0.0148607,0.025101 +2022-10-21,3,0.020807,0.0151671,0.0143265,0.025101 +2022-10-22,3,0.0272555,0.0137922,0.0148952,0.025101 +2022-10-23,3,0.027062,0.0152907,0.0155381,0.025101 +2022-10-24,3,0.0243097,0.015369,0.0168157,0.025101 +2022-10-25,3,0.0219672,0.0176047,0.0156259,0.025101 +2022-10-26,3,0.0157431,0.0179859,0.0162279,0.025101 +2022-10-27,3,0.0106137,0.0195356,0.0145541,0.025101 +2022-10-28,3,0.0100737,0.0195185,0.0154078,0.025101 +2022-10-29,3,0.00727285,0.0187103,0.0134081,0.025101 +2022-10-30,3,0.0236894,0.0182878,0.0138938,0.025101 +2022-10-31,3,0.0227781,0.0169343,0.0108969,0.025101 +2022-11-01,3,0.0252639,0.0152169,0.0137385,0.025101 +2022-11-02,3,0.0251756,0.015198,0.0151324,0.025101 +2022-11-03,3,0.0553478,0.0140477,0.0123952,0.025101 +2022-11-04,3,0.0694077,0.0197249,0.0203904,0.025101 +2022-11-05,3,0.0984487,0.0193255,0.01523,0.025101 +2022-11-06,3,0.0978643,0.0199877,0.0206014,0.025101 +2022-11-07,3,0.0979776,0.0201469,0.0225784,0.025101 +2022-11-08,3,0.091083,0.0287598,0.0279925,0.025101 +2022-11-09,3,0.0552111,0.0363354,0.0438464,0.025101 +2022-11-10,3,0.0229912,0.0419275,0.0500356,0.025101 +2022-11-11,3,0.0193543,0.0419655,0.0456292,0.025101 +2022-11-12,3,0.0186496,0.0415399,0.0502825,0.025101 +2022-11-13,3,0.012147,0.0408929,0.045327,0.025101 +2022-11-14,3,0.0101661,0.0362349,0.0381321,0.025101 +2022-11-15,3,0.0118139,0.0294173,0.0274698,0.025101 +2022-11-16,3,0.0161835,0.0280192,0.0268256,0.025101 +2022-11-17,3,0.0228478,0.0275693,0.0224658,0.025101 +2022-11-18,3,0.0270393,0.0248595,0.0221799,0.025101 +2022-11-19,3,0.0270238,0.0237461,0.021712,0.025101 +2022-11-20,3,0.0238118,0.0246082,0.0228396,0.025101 +2022-11-21,3,0.0156302,0.026525,0.0237295,0.025101 +2022-11-22,3,0.0127346,0.0289828,0.0267012,0.025101 +2022-11-23,3,0.00541936,0.0303259,0.0269525,0.025101 +2022-11-24,3,0.0100987,0.0303241,0.0242097,0.025101 +2022-11-25,3,0.0221413,0.0293816,0.0259931,0.025101 +2022-11-26,3,0.0234623,0.0262691,0.0222271,0.025101 +2022-11-27,3,0.0231153,0.0249759,0.0226162,0.025101 +2022-11-28,3,0.0223788,0.02034,0.0249548,0.025101 +2022-11-29,3,0.0223271,0.0236806,0.0249827,0.025101 +2022-11-30,3,0.0115216,0.0278694,0.0264819,0.025101 +2022-12-01,3,0.0106356,0.0243331,0.023634,0.025101 +2022-12-02,3,0.0119793,0.0209013,0.0178794,0.025101 +2022-12-03,3,0.0153325,0.0202775,0.0168913,0.025101 +2022-12-04,3,0.0148028,0.020253,0.0201316,0.025101 +2022-12-05,3,0.0139369,0.0169638,0.0162773,0.025101 +2022-12-06,3,0.0136913,0.016548,0.0166871,0.025101 +2022-12-07,3,0.0111193,0.0170231,0.0201732,0.025101 +2022-12-08,3,0.0154592,0.0182295,0.0171411,0.025101 +2022-12-09,3,0.0142854,0.0180977,0.016483,0.025101 +2022-12-10,3,0.0208609,0.0178382,0.0166546,0.025101 +2022-12-11,3,0.029196,0.017764,0.0178732,0.025101 +2022-12-12,3,0.0295019,0.016545,0.016399,0.025101 +2022-12-13,3,0.0213346,0.0176971,0.0160772,0.025101 +2022-12-14,3,0.0199699,0.0171248,0.013255,0.025101 +2022-12-15,3,0.0267893,0.0189789,0.0136896,0.025101 +2022-12-16,3,0.0176138,0.0217497,0.0212047,0.025101 +2022-12-17,3,0.0172004,0.021828,0.0162726,0.025101 +2022-12-18,3,0.017192,0.0201864,0.0184301,0.025101 +2022-12-19,3,0.0132711,0.0200586,0.0214463,0.025101 +2022-12-20,3,0.00310522,0.0218002,0.0220983,0.025101 +2022-12-21,3,0.00262963,0.0196624,0.0191738,0.025101 +2022-12-22,3,0.00652856,0.0186436,0.0155677,0.025101 +2022-12-23,3,0.00759277,0.018573,0.0170727,0.025101 +2022-12-24,3,0.00811783,0.0173934,0.0175693,0.025101 +2022-12-25,3,0.00803592,0.0122108,0.0163664,0.025101 +2022-12-26,3,0.00689348,0.0116713,0.0142648,0.025101 +2022-12-27,3,0.0063188,0.0145421,0.0187819,0.025101 +2022-12-28,3,0.00415369,0.0150838,0.0167592,0.025101 +2022-12-29,3,0.0036188,0.0152655,0.0132861,0.025101 +2022-12-30,3,0.00544749,0.0149464,0.0150631,0.025101 +2022-12-31,3,0.004965,0.0143981,0.0157496,0.025101 +2023-01-01,3,0.00518349,0.0141163,0.0147289,0.025101 +2023-01-02,3,0.00544548,0.0127745,0.0138846,0.025101 +2023-01-03,3,0.00533402,0.0122967,0.0133183,0.025101 +2023-01-04,3,0.00430419,0.0130237,0.0161967,0.025101 +2023-01-05,3,0.00507874,0.0127233,0.0148182,0.025101 +2023-01-06,3,0.0104541,0.0125599,0.0147641,0.025101 +2023-01-07,3,0.0184685,0.0110531,0.0148166,0.025101 +2023-01-08,3,0.0212603,0.0103971,0.0142175,0.025101 +2023-01-09,3,0.0177411,0.00946963,0.00875692,0.025101 +2023-01-10,3,0.0250419,0.0095007,0.0133079,0.025101 +2023-01-11,3,0.026896,0.0113083,0.0125991,0.025101 +2023-01-12,3,0.0282128,0.0153309,0.015822,0.025101 +2023-01-13,3,0.0280598,0.0174754,0.0207971,0.025101 +2023-01-14,3,0.0164143,0.0177116,0.0267235,0.025101 +2023-01-15,3,0.0352993,0.0192984,0.0196084,0.025101 +2023-01-16,3,0.035723,0.019596,0.024867,0.025101 +2023-01-17,3,0.0359591,0.0198608,0.0188506,0.025101 +2023-01-18,3,0.0301512,0.0201464,0.0246925,0.025101 +2023-01-19,3,0.0337722,0.0175374,0.0220885,0.025101 +2023-01-20,3,0.0127821,0.0227976,0.0254142,0.025101 +2023-01-21,3,0.0131987,0.0227692,0.0233026,0.025101 +2023-01-22,3,0.0129453,0.0227674,0.023956,0.025101 +2023-01-23,3,0.012571,0.0217983,0.022281,0.025101 +2023-01-24,3,0.0157544,0.0226415,0.0254623,0.025101 +2023-01-25,3,0.0255431,0.01789,0.0181217,0.025101 +2023-01-26,3,0.0264125,0.0181178,0.0180346,0.025101 +2023-01-27,3,0.0285529,0.017983,0.0172959,0.025101 +2023-01-28,3,0.029372,0.017912,0.0173302,0.025101 +2023-01-29,3,0.0248812,0.0188845,0.0239797,0.025101 +2023-01-30,3,0.0144997,0.0221762,0.0237135,0.025101 +2023-01-31,3,0.0159209,0.0223461,0.0235528,0.025101 +2023-02-01,3,0.00577885,0.0228121,0.0235071,0.025101 +2023-02-02,3,0.014386,0.0230782,0.0203157,0.025101 +2023-02-03,3,0.0153606,0.0217827,0.0200144,0.025101 +2023-02-04,3,0.0256114,0.0186635,0.0186844,0.025101 +2023-02-05,3,0.0256584,0.0185939,0.020547,0.025101 +2023-02-06,3,0.0275184,0.0145899,0.0149207,0.025101 +2023-02-07,3,0.0224812,0.0182428,0.019949,0.025101 +2023-02-08,3,0.023305,0.0186454,0.0217903,0.025101 +2023-02-09,3,0.0107427,0.0219596,0.0222793,0.025101 +2023-02-10,3,0.0382365,0.0219166,0.0188301,0.025101 +2023-02-11,3,0.0448677,0.0203142,0.0177859,0.025101 +2023-02-12,3,0.0443758,0.0193383,0.0204988,0.025101 +2023-02-13,3,0.0441043,0.0194594,0.0183469,0.025101 +2023-02-14,3,0.0472651,0.0161595,0.0188901,0.025101 +2023-02-15,3,0.026668,0.0252019,0.0248741,0.025101 +2023-02-16,3,0.0231549,0.0264337,0.0233599,0.025101 +2023-02-17,3,0.0150006,0.0267664,0.0254978,0.025101 +2023-02-18,3,0.0147971,0.0266967,0.0265777,0.025101 +2023-02-19,3,0.0189311,0.0272192,0.0250444,0.025101 +2023-02-20,3,0.0114014,0.0236031,0.023577,0.025101 +2023-02-21,3,0.0174822,0.0224827,0.0227257,0.025101 +2023-02-22,3,0.0175475,0.0202803,0.0183166,0.025101 +2023-02-23,3,0.0181314,0.0201252,0.0185486,0.025101 +2023-02-24,3,0.0151424,0.0216371,0.0227367,0.025101 +2023-02-25,3,0.0158835,0.0191436,0.0178107,0.025101 +2023-02-26,3,0.0254105,0.0212648,0.0197646,0.025101 +2023-02-27,3,0.0255211,0.0212217,0.0193117,0.025101 +2023-02-28,3,0.0259075,0.0214557,0.0198746,0.025101 +2023-03-01,3,0.0216019,0.0205492,0.0191523,0.025101 +2023-03-02,3,0.0215411,0.0207594,0.0183756,0.025101 +2023-03-03,3,0.0106375,0.0233507,0.0231318,0.025101 +2023-03-04,3,0.0275442,0.023355,0.0213289,0.025101 +2023-03-05,3,0.0255232,0.0234192,0.022212,0.025101 +2023-03-06,3,0.0312897,0.0224121,0.0204757,0.025101 +2023-03-07,3,0.0508647,0.0224332,0.0208312,0.025101 +2023-03-08,3,0.0616384,0.0189973,0.0177978,0.025101 +2023-03-09,3,0.0396412,0.0224725,0.0235475,0.025101 +2023-03-10,3,0.0416187,0.0219121,0.0211873,0.025101 +2023-03-11,3,0.0411585,0.0224887,0.0214697,0.025101 +2023-03-12,3,0.0455355,0.0278012,0.0228776,0.025101 +2023-03-13,3,0.0435729,0.0316337,0.0354383,0.025101 +2023-03-14,3,0.044271,0.0283745,0.032943,0.025101 +2023-03-15,3,0.0431122,0.0286051,0.0326708,0.025101 +2023-03-16,3,0.0433911,0.0286818,0.0324858,0.025101 +2023-03-17,3,0.0277942,0.031163,0.0377436,0.025101 +2023-03-18,3,0.0303395,0.0306895,0.0323779,0.025101 +2023-03-19,3,0.029495,0.0309877,0.0317304,0.025101 +2023-03-20,3,0.0293381,0.0308341,0.0345781,0.025101 +2023-03-21,3,0.0298536,0.0306667,0.0340322,0.025101 +2023-03-22,3,0.0297765,0.0277524,0.0263044,0.025101 +2023-03-23,3,0.021912,0.0284912,0.0292608,0.025101 +2023-03-24,3,0.0256384,0.0285247,0.0283182,0.025101 +2023-03-25,3,0.0267693,0.0279908,0.0248368,0.025101 +2023-03-26,3,0.0264885,0.0280981,0.0284766,0.025101 +2023-03-27,3,0.0193074,0.0283783,0.0269784,0.025101 +2023-03-28,3,0.0207266,0.0263532,0.0259422,0.025101 +2023-03-29,3,0.011924,0.027483,0.0263023,0.025101 +2023-03-30,3,0.0132372,0.0276458,0.0272699,0.025101 +2023-03-31,3,0.01043,0.0265141,0.0274775,0.025101 +2023-04-01,3,0.0104989,0.0245285,0.0237587,0.025101 +2023-04-02,3,0.0102178,0.0250131,0.0252021,0.025101 +2023-04-03,3,0.00737022,0.0214751,0.0261777,0.025101 +2023-04-04,3,0.00744798,0.0208611,0.0247606,0.025101 +2023-04-05,3,0.0211025,0.0196542,0.0208272,0.025101 +2023-04-06,3,0.0195284,0.0196088,0.0218688,0.025101 +2023-04-07,3,0.0192743,0.0194018,0.0208263,0.025101 +2023-04-08,3,0.0180892,0.0160649,0.0191536,0.025101 +2023-04-09,3,0.019175,0.0160394,0.0233594,0.025101 +2023-04-10,3,0.0100202,0.0207718,0.0232167,0.025101 +2023-04-11,3,0.0054967,0.0204266,0.0236798,0.025101 +2023-04-12,3,0.0145953,0.0203332,0.0217992,0.025101 +2023-04-13,3,0.0217968,0.0195295,0.0212115,0.025101 +2023-04-14,3,0.0319889,0.0193108,0.0206945,0.025101 +2023-04-15,3,0.0320079,0.0160453,0.0172057,0.025101 +2023-04-16,3,0.0319712,0.013727,0.0165779,0.025101 +2023-04-17,3,0.0360885,0.0177691,0.0257295,0.025101 +2023-04-18,3,0.0275358,0.0193334,0.0206918,0.025101 +2023-04-19,3,0.0203748,0.0229309,0.0233676,0.025101 +2023-04-20,3,0.0248023,0.0225202,0.0220709,0.025101 +2023-04-21,3,0.0151709,0.0230186,0.0228985,0.025101 +2023-04-22,3,0.0195177,0.0237612,0.0220542,0.025101 +2023-04-23,3,0.0186506,0.0222832,0.0206075,0.025101 +2023-04-24,3,0.0187979,0.0207093,0.0202154,0.025101 +2023-04-25,3,0.0169043,0.0219132,0.0235045,0.025101 +2023-04-26,3,0.02742,0.0194203,0.0205309,0.025101 +2023-04-27,3,0.022349,0.0210805,0.0230726,0.025101 +2023-04-28,3,0.0235983,0.020852,0.021744,0.025101 +2023-04-29,3,0.0236427,0.0208757,0.0224381,0.025101 +2023-04-30,3,0.0265075,0.02034,0.0189727,0.025101 +2023-05-01,3,0.0189954,0.0234476,0.0240571,0.025101 +2023-05-02,3,0.0187679,0.021698,0.0244183,0.025101 +2023-05-03,3,0.0199975,0.0218884,0.0219745,0.025101 +2023-05-04,3,0.0202819,0.0219055,0.021603,0.025101 +2023-05-05,3,0.0117429,0.0227147,0.0240121,0.025101 +2023-05-06,3,0.0119586,0.0210987,0.0220524,0.025101 +2023-05-07,3,0.0121863,0.0210759,0.023491,0.025101 +2023-05-08,3,0.00936301,0.0214294,0.0216556,0.025101 +2023-05-09,3,0.0107215,0.0212967,0.0198041,0.025101 +2023-05-10,3,0.0126995,0.0183101,0.0184921,0.025101 +2023-05-11,3,0.00724394,0.0175799,0.0203834,0.025101 +2023-05-12,3,0.00771863,0.0172909,0.0172014,0.025101 +2023-05-13,3,0.013872,0.0158159,0.0176146,0.025101 +2023-05-14,3,0.0136455,0.0161736,0.0154481,0.025101 +2023-05-15,3,0.0134999,0.0168485,0.0185978,0.025101 +2023-05-16,3,0.0147425,0.0144074,0.0157076,0.025101 +2023-05-17,3,0.0127098,0.0143795,0.0190186,0.025101 +2023-05-18,3,0.0104928,0.0166358,0.0203454,0.025101 +2023-05-19,3,0.0193518,0.0158214,0.0094719,0.025101 +2023-05-20,3,0.0188167,0.0158586,0.011194,0.025101 +2023-05-21,3,0.0188666,0.0162092,0.0124038,0.025101 +2023-05-22,3,0.0189854,0.0155822,0.00770008,0.025101 +2023-05-23,3,0.0274773,0.0142133,0.0136978,0.025101 +2023-05-24,3,0.0206745,0.0167857,0.0155586,0.025101 +2023-05-25,3,0.0213221,0.0165608,0.0109439,0.025101 +2023-05-26,3,0.0244183,0.0166241,0.0119125,0.025101 +2023-05-27,3,0.0256957,0.0162115,0.0112014,0.025101 +2023-05-28,3,0.0136775,0.018976,0.0204004,0.025101 +2023-05-29,3,0.0132692,0.0176765,0.0185265,0.025101 +2023-05-30,3,0.013543,0.0173915,0.0102256,0.025101 +2023-05-31,3,0.0252527,0.0181657,0.0131379,0.025101 +2023-06-01,3,0.0387516,0.0185118,0.0137383,0.025101 +2023-06-02,3,0.0408821,0.0157971,0.0113565,0.025101 +2023-06-03,3,0.0412907,0.0156667,0.00856562,0.025101 +2023-06-04,3,0.0412132,0.0157438,0.00762848,0.025101 +2023-06-05,3,0.0347864,0.0197542,0.0236006,0.025101 +2023-06-06,3,0.017763,0.0234589,0.0244265,0.025101 +2023-06-07,3,0.011971,0.0242237,0.0240022,0.025101 +2023-06-08,3,0.0110954,0.0242131,0.0222427,0.025101 +2023-06-09,3,0.0158766,0.0239003,0.023083,0.025101 +2023-06-10,3,0.0178686,0.0231246,0.023917,0.025101 +2023-06-11,3,0.0228142,0.0196528,0.0172567,0.025101 +2023-06-12,3,0.0227164,0.0178284,0.0165709,0.025101 +2023-06-13,3,0.0232594,0.0174991,0.0155707,0.025101 +2023-06-14,3,0.0135873,0.0192717,0.0243231,0.025101 +2023-06-15,3,0.0228145,0.0196956,0.0179463,0.025101 +2023-06-16,3,0.0285898,0.0211625,0.0230023,0.025101 +2023-06-17,3,0.030739,0.0210621,0.018672,0.025101 +2023-06-18,3,0.0256246,0.0210039,0.019331,0.025101 +2023-06-19,3,0.030157,0.0180029,0.0195494,0.025101 +2023-06-20,3,0.0275391,0.0213487,0.0222385,0.025101 +2023-06-21,3,0.0136479,0.0235827,0.0233577,0.025101 +2023-06-22,3,0.0141375,0.0238891,0.0229008,0.025101 +2023-06-23,3,0.0119858,0.0229104,0.0220783,0.025101 +2023-06-24,3,0.0138791,0.0237815,0.0217886,0.025101 +2023-06-25,3,0.0138644,0.0232482,0.0213841,0.025101 +2023-06-26,3,0.0133526,0.0195993,0.0167765,0.025101 +2023-06-27,3,0.0117043,0.0190045,0.0203521,0.025101 +2023-06-28,3,0.00729656,0.017822,0.0167718,0.025101 +2023-06-29,3,0.0105195,0.0180209,0.0195033,0.025101 +2023-06-30,3,0.0116048,0.0179302,0.016659,0.025101 +2023-07-01,3,0.0143601,0.0177326,0.0184667,0.025101 +2023-07-02,3,0.0166955,0.0168755,0.0172184,0.025101 +2023-07-03,3,0.0129947,0.0150944,0.0184379,0.025101 +2023-07-04,3,0.0124582,0.0165662,0.0197564,0.025101 +2023-07-05,3,0.0131192,0.0170074,0.0162827,0.025101 +2023-07-06,3,0.00749977,0.0176574,0.0227451,0.025101 +2023-07-07,3,0.00680098,0.0182503,0.0247145,0.025101 +2023-07-08,3,0.01672,0.0170419,0.0203848,0.025101 +2023-07-09,3,0.0262479,0.0169076,0.0204365,0.025101 +2023-07-10,3,0.0259599,0.0170293,0.0196313,0.025101 +2023-07-11,3,0.0256197,0.0148304,0.0162517,0.025101 +2023-07-12,3,0.025482,0.0136866,0.0147674,0.025101 +2023-07-13,3,0.0151355,0.0158211,0.0149408,0.025101 +2023-07-14,3,0.00428492,0.0187297,0.0159232,0.025101 +2023-07-15,3,0.00421877,0.018242,0.0123971,0.025101 +2023-07-16,3,0.00535566,0.0181656,0.0122853,0.025101 +2023-07-17,3,0.00544363,0.0181187,0.0130119,0.025101 +2023-07-18,3,0.00621158,0.0160194,0.0130674,0.025101 +2023-07-19,3,0.0156219,0.0117351,0.0107353,0.025101 +2023-07-20,3,0.0159195,0.0115172,0.0113069,0.025101 +2023-07-21,3,0.0159748,0.0121253,0.0122392,0.025101 +2023-07-22,3,0.01598,0.0121737,0.0123682,0.025101 +2023-07-23,3,0.0147107,0.0125777,0.0153331,0.025101 +2023-07-24,3,0.00367697,0.0162777,0.0159152,0.025101 +2023-07-25,3,0.00405804,0.0161218,0.010945,0.025101 +2023-07-26,3,0.00339813,0.0161056,0.0120902,0.025101 +2023-07-27,3,0.00715146,0.0159886,0.0130095,0.025101 +2023-07-28,3,0.0117396,0.0154638,0.0121471,0.025101 +2023-07-29,3,0.0117217,0.0109697,0.0106778,0.025101 +2023-07-30,3,0.0117541,0.0112205,0.0107607,0.025101 +2023-07-31,3,0.0117542,0.0107397,0.00972063,0.025101 +2023-08-01,3,0.00772677,0.0129436,0.0148672,0.025101 +2023-08-02,3,0.00306018,0.0147119,0.0140811,0.025101 +2023-08-03,3,0.00937281,0.0146937,0.0125937,0.025101 +2023-08-04,3,0.0101219,0.0135544,0.0105853,0.025101 +2023-08-05,3,0.0105919,0.0122245,0.0102771,0.025101 +2023-08-06,3,0.0106699,0.0109931,0.0107165,0.025101 +2023-08-07,3,0.0106045,0.00883739,0.00846456,0.025101 +2023-08-08,3,0.00299868,0.0120364,0.010929,0.025101 +2023-08-09,3,0.00370871,0.0121823,0.01023,0.025101 +2023-08-10,3,0.00476534,0.0123272,0.00977801,0.025101 +2023-08-11,3,0.00794911,0.0123373,0.00997477,0.025101 +2023-08-12,3,0.0310601,0.0122995,0.0103298,0.025101 +2023-08-13,3,0.02989,0.00902978,0.00848945,0.025101 +2023-08-14,3,0.0293294,0.00940964,0.00845745,0.025101 +2023-08-15,3,0.0313026,0.00906368,0.0127156,0.025101 +2023-08-16,3,0.0324665,0.0106053,0.0126997,0.025101 +2023-08-17,3,0.0107689,0.0196835,0.0206453,0.025101 +2023-08-18,3,0.00749845,0.0196968,0.0207899,0.025101 +2023-08-19,3,0.00958745,0.0193411,0.0167858,0.025101 +2023-08-20,3,0.00961254,0.0192963,0.017842,0.025101 +2023-08-21,3,0.00958617,0.0194667,0.017362,0.025101 +2023-08-22,3,0.00958739,0.0148556,0.0165364,0.025101 +2023-08-23,3,0.00514392,0.0136466,0.020126,0.025101 +2023-08-24,3,0.0273252,0.0144301,0.0169349,0.025101 +2023-08-25,3,0.0293587,0.0144242,0.0167535,0.025101 +2023-08-26,3,0.0403656,0.0143952,0.0165762,0.025101 +2023-08-27,3,0.0403432,0.014391,0.0167526,0.025101 +2023-08-28,3,0.0403887,0.0123782,0.0148114,0.025101 +2023-08-29,3,0.022742,0.0205483,0.0270349,0.025101 +2023-08-30,3,0.0228773,0.0207911,0.0264508,0.025101 +2023-08-31,3,0.00444875,0.0234701,0.0257247,0.025101 +2023-09-01,3,0.00390124,0.023425,0.0224313,0.025101 +2023-09-02,3,0.00955073,0.0234425,0.024462,0.025101 +2023-09-03,3,0.0117666,0.020437,0.0209469,0.025101 +2023-09-04,3,0.0113607,0.0204393,0.0191703,0.025101 +2023-09-05,3,0.0114232,0.0137576,0.0146688,0.025101 +2023-09-06,3,0.0166113,0.0133338,0.014191,0.025101 +2023-09-07,3,0.0193882,0.016667,0.0152963,0.025101 +2023-09-08,3,0.0199212,0.0160856,0.0206558,0.025101 +2023-09-09,3,0.0202267,0.0157591,0.0168576,0.025101 +2023-09-10,3,0.0198902,0.0157782,0.0172704,0.025101 +2023-09-11,3,0.0109497,0.017431,0.0240916,0.025101 +2023-09-12,3,0.00769587,0.0183561,0.0276944,0.025101 +2023-09-13,3,0.00590253,0.0185848,0.0264151,0.025101 +2023-09-14,3,0.00775813,0.0186365,0.0228176,0.025101 +2023-09-15,3,0.00853624,0.0185224,0.0208385,0.025101 +2023-09-16,3,0.0142028,0.0160363,0.0170865,0.025101 +2023-09-17,3,0.014185,0.0147324,0.0167657,0.025101 +2023-09-18,3,0.0134963,0.0138423,0.016659,0.025101 +2023-09-19,3,0.0092835,0.0148728,0.0192757,0.025101 +2023-09-20,3,0.0099867,0.0139335,0.00874954,0.025101 +2023-09-21,3,0.00561518,0.0158542,0.0157977,0.025101 +2023-09-22,3,0.00657719,0.0141658,0.0101588,0.025101 +2023-09-23,3,0.0137972,0.0139665,0.0100602,0.025101 +2023-09-24,3,0.0118534,0.0128937,0.0143404,0.025101 +2023-09-25,3,0.0118201,0.0131151,0.0106595,0.025101 +2023-09-26,3,0.0172665,0.0113997,0.0110014,0.025101 +2023-09-27,3,0.0217952,0.0118525,0.0115064,0.025101 +2023-09-28,3,0.0201428,0.0146055,0.0110389,0.025101 +2023-09-29,3,0.0201227,0.0139065,0.0104043,0.025101 +2023-09-30,3,0.0221621,0.0137337,0.00989193,0.025101 +2023-10-01,3,0.0159601,0.015954,0.0151408,0.025101 +2023-10-02,3,0.0132639,0.0171163,0.0152894,0.025101 +2023-10-03,3,0.0129901,0.0162412,0.0117162,0.025101 +2023-10-04,3,0.0133297,0.0159346,0.0137879,0.025101 +2023-10-05,3,0.0120299,0.0164144,0.0156891,0.025101 +2023-10-06,3,0.00819826,0.0153325,0.00989492,0.025101 +2023-10-07,3,0.00709363,0.0146415,0.00929738,0.025101 +2023-10-08,3,0.00867778,0.0145647,0.00899264,0.025101 +2023-10-09,3,0.00875959,0.0147969,0.0119232,0.025101 +2023-10-10,3,0.0112447,0.0144537,0.0105623,0.025101 +2023-10-11,3,0.0214236,0.0132522,0.0111596,0.025101 +2023-10-12,3,0.0212925,0.012804,0.0106554,0.025101 +2023-10-13,3,0.0221726,0.0131896,0.0110504,0.025101 +2023-10-14,3,0.021359,0.0132172,0.0111065,0.025101 +2023-10-15,3,0.0229533,0.0140985,0.0132316,0.025101 +2023-10-16,3,0.0150248,0.0174487,0.0222433,0.025101 +2023-10-17,3,0.013878,0.0173989,0.0163587,0.025101 +2023-10-18,3,0.0392193,0.0175707,0.0165426,0.025101 +2023-10-19,3,0.0383237,0.0174774,0.0210723,0.025101 +2023-10-20,3,0.0389567,0.018068,0.023785,0.025101 +2023-10-21,3,0.0422124,0.0162902,0.0154572,0.025101 +2023-10-22,3,0.0437967,0.0159686,0.0151723,0.025101 +2023-10-23,3,0.0150451,0.0243706,0.0262057,0.025101 +2023-10-24,3,0.0121778,0.0241444,0.0240353,0.025101 +2023-10-25,3,0.00941403,0.0242086,0.0239301,0.025101 +2023-10-26,3,0.0076086,0.0248225,0.0217461,0.025101 +2023-10-27,3,0.00889888,0.0249649,0.0217974,0.025101 +2023-10-28,3,0.0137589,0.0190953,0.017869,0.025101 +2023-10-29,3,0.0135619,0.0181175,0.0184905,0.025101 +2023-10-30,3,0.0140158,0.0168363,0.0152363,0.025101 +2023-10-31,3,0.0141011,0.0158847,0.0151792,0.025101 +2023-11-01,3,0.00882833,0.0164644,0.0159605,0.025101 +2023-11-02,3,0.00755007,0.0182355,0.0196651,0.025101 +2023-11-03,3,0.00574925,0.0181861,0.0155505,0.025101 +2023-11-04,3,0.0121392,0.0183133,0.016438,0.025101 +2023-11-05,3,0.0110588,0.018346,0.0161896,0.025101 +2023-11-06,3,0.0124232,0.0164182,0.0151805,0.025101 +2023-11-07,3,0.0138969,0.0154513,0.0157853,0.025101 +2023-11-08,3,0.0176586,0.01443,0.0138664,0.025101 +2023-11-09,3,0.0161784,0.0173319,0.0234423,0.025101 +2023-11-10,3,0.0353593,0.0168901,0.0168845,0.025101 +2023-11-11,3,0.0419957,0.0172831,0.0162973,0.025101 +2023-11-12,3,0.0427497,0.0177957,0.0161757,0.025101 +2023-11-13,3,0.0421744,0.0190446,0.0201939,0.025101 +2023-11-14,3,0.0398521,0.0155771,0.0100582,0.025101 +2023-11-15,3,0.0263333,0.0210658,0.0220684,0.025101 +2023-11-16,3,0.0258114,0.0232684,0.0234826,0.025101 +2023-11-17,3,0.0331176,0.0233398,0.022509,0.025101 +2023-11-18,3,0.0332825,0.023213,0.019907,0.025101 +2023-11-19,3,0.0322131,0.023049,0.0228396,0.025101 +2023-11-20,3,0.0322117,0.0207899,0.0196385,0.025101 +2023-11-21,3,0.0209905,0.0216569,0.0223961,0.025101 +2023-11-22,3,0.00796057,0.0236504,0.0235234,0.025101 +2023-11-23,3,0.0104646,0.0235647,0.0245098,0.025101 +2023-11-24,3,0.00929502,0.0233126,0.0218768,0.025101 +2023-11-25,3,0.00946105,0.0232799,0.0238526,0.025101 +2023-11-26,3,0.0135908,0.0210432,0.0206322,0.025101 +2023-11-27,3,0.0126409,0.0166741,0.0158836,0.025101 +2023-11-28,3,0.0124949,0.0178397,0.0181519,0.025101 +2023-11-29,3,0.0192657,0.017325,0.0168547,0.025101 +2023-11-30,3,0.0167401,0.017363,0.0176296,0.025101 +2023-12-01,3,0.0243702,0.0188991,0.0206295,0.025101 +2023-12-02,3,0.0291292,0.0186058,0.0191421,0.025101 +2023-12-03,3,0.028947,0.0185621,0.0211934,0.025101 +2023-12-04,3,0.0260693,0.0211779,0.0219942,0.025101 +2023-12-05,3,0.0128328,0.0208503,0.0229264,0.025101 +2023-12-06,3,0.0294809,0.0225745,0.0208205,0.025101 +2023-12-07,3,0.0304485,0.0227464,0.0215269,0.025101 +2023-12-08,3,0.0342146,0.021712,0.0237176,0.025101 +2023-12-09,3,0.0343187,0.0213041,0.020839,0.025101 +2023-12-10,3,0.0355416,0.0179299,0.0188625,0.025101 +2023-12-11,3,0.021247,0.0235114,0.024384,0.025101 +2023-12-12,3,0.0241482,0.023693,0.0221108,0.025101 +2023-12-13,3,0.0226785,0.0237846,0.0249784,0.025101 +2023-12-14,3,0.0227057,0.0233179,0.0238374,0.025101 +2023-12-15,3,0.023299,0.0238125,0.0246623,0.025101 +2023-12-16,3,0.0233416,0.0210279,0.0196738,0.025101 +2023-12-17,3,0.017846,0.0219228,0.0225974,0.025101 +2023-12-18,3,0.0161088,0.0217534,0.0239183,0.025101 +2023-12-19,3,0.0181619,0.0217533,0.0212003,0.025101 +2023-12-20,3,0.0115738,0.0220955,0.0228795,0.025101 +2023-12-21,3,0.0154939,0.0220954,0.02089,0.025101 +2023-12-22,3,0.0198437,0.0202553,0.0195482,0.025101 +2023-12-23,3,0.0212058,0.0196885,0.0181295,0.025101 +2023-12-24,3,0.0207121,0.0203379,0.018846,0.025101 +2023-12-25,3,0.0186412,0.0182513,0.0189251,0.025101 +2023-12-26,3,0.0156213,0.0192361,0.0205248,0.025101 +2023-12-27,3,0.0245251,0.0198107,0.0223576,0.025101 +2023-12-28,3,0.0215075,0.0202502,0.0227321,0.025101 +2023-12-29,3,0.0335754,0.0201629,0.0228042,0.025101 +2023-12-30,3,0.0355912,0.0195026,0.0187511,0.025101 +2023-12-31,3,0.0357567,0.0186581,0.0207625,0.025101 +2024-01-01,3,0.0298924,0.0215521,0.0223669,0.025101 +2024-01-02,3,0.0281049,0.0196079,0.0229575,0.025101 +2024-01-03,3,0.0304336,0.0230371,0.023967,0.025101 +2024-01-04,3,0.0331558,0.0233169,0.0246781,0.025101 +2024-01-05,3,0.0327663,0.0233427,0.0221596,0.025101 +2024-01-06,3,0.0329588,0.0220842,0.0210981,0.025101 +2024-01-07,3,0.0524143,0.0217526,0.0203408,0.025101 +2024-01-08,3,0.0352986,0.0235125,0.0241498,0.025101 +2024-01-09,3,0.0354054,0.0239745,0.0244294,0.025101 +2024-01-10,3,0.0368739,0.0238696,0.0217298,0.025101 +2024-01-11,3,0.0397152,0.0236623,0.0216794,0.025101 +2024-01-12,3,0.0174328,0.0288339,0.0261855,0.025101 +2024-01-13,3,0.0233303,0.0261754,0.0273128,0.025101 +2024-01-14,3,0.0219027,0.0261686,0.0269658,0.025101 +2024-01-15,3,0.0197147,0.0263329,0.0273199,0.025101 +2024-01-16,3,0.0168055,0.0268194,0.0284386,0.025101 +2024-01-17,3,0.0255846,0.0218995,0.0217139,0.025101 +2024-01-18,3,0.0247139,0.0236828,0.0253089,0.025101 +2024-01-19,3,0.0242999,0.0232876,0.0241866,0.025101 +2024-01-20,3,0.0239681,0.0225714,0.0221443,0.025101 +2024-01-21,3,0.0345131,0.021639,0.0219648,0.025101 +2024-01-22,3,0.0191973,0.0245743,0.0273804,0.025101 +2024-01-23,3,0.0203291,0.0239154,0.0236629,0.025101 +2024-01-24,3,0.0215998,0.023731,0.0231458,0.025101 +2024-01-25,3,0.0225832,0.0232016,0.0220038,0.025101 +2024-01-26,3,0.0157168,0.0257567,0.0263862,0.025101 +2024-01-27,3,0.0160752,0.022383,0.020484,0.025101 +2024-01-28,3,0.0157405,0.0226931,0.02102,0.025101 +2024-01-29,3,0.00844567,0.0232663,0.0243418,0.025101 +2024-01-30,3,0.0088102,0.0223457,0.0213717,0.025101 +2024-01-31,3,0.00795277,0.0204284,0.0186327,0.025101 +2024-02-01,3,0.00741219,0.0205458,0.0203573,0.025101 +2024-02-02,3,0.0147997,0.0203527,0.0201179,0.025101 +2024-02-03,3,0.0151989,0.0158571,0.01767,0.025101 +2024-02-04,3,0.0150173,0.0160501,0.0166639,0.025101 +2024-02-05,3,0.0120644,0.0154473,0.0181855,0.025101 +2024-02-06,3,0.0118207,0.0151163,0.0160113,0.025101 +2024-02-07,3,0.0127038,0.0180946,0.0246141,0.025101 +2024-02-08,3,0.0180525,0.0183327,0.0207999,0.025101 +2024-02-09,3,0.0183838,0.0180701,0.0258063,0.025101 +2024-02-10,3,0.0198466,0.0171644,0.0198985,0.025101 +2024-02-11,3,0.0205431,0.0170383,0.0167823,0.025101 +2024-02-12,3,0.0199557,0.0175887,0.0259888,0.025101 +2024-02-13,3,0.0189795,0.0175503,0.00910332,0.025101 +2024-02-14,3,0.00768884,0.018158,0.0220109,0.025101 +2024-02-15,3,0.00891112,0.0184985,0.0163887,0.025101 +2024-02-16,3,0.00966951,0.0185272,0.0154402,0.025101 +2024-02-17,3,0.00984262,0.0179484,0.0111927,0.025101 +2024-02-18,3,0.00864085,0.0176956,0.0110436,0.025101 +2024-02-19,3,0.0129143,0.014304,0.00916255,0.025101 +2024-02-20,3,0.0118663,0.0146212,0.0126936,0.025101 +2024-02-21,3,0.0262703,0.0149262,0.0123774,0.025101 +2024-02-22,3,0.0273549,0.0150136,0.0125019,0.025101 +2024-02-23,3,0.0341398,0.0147235,0.011549,0.025101 +2024-02-24,3,0.0438466,0.0162156,0.0121826,0.025101 +2024-02-25,3,0.0414297,0.0158073,0.00944867,0.025101 +2024-02-26,3,0.0444435,0.0200328,0.0205558,0.025101 +2024-02-27,3,0.0430102,0.020797,0.0224275,0.025101 +2024-02-28,3,0.0381064,0.0245014,0.0263329,0.025101 +2024-02-29,3,0.0531674,0.0264518,0.0233228,0.025101 +2024-03-01,3,0.0544504,0.0260246,0.0244157,0.025101 +2024-03-02,3,0.0535356,0.026374,0.02279,0.025101 +2024-03-03,3,0.0535744,0.0260328,0.0241565,0.025101 +2024-03-04,3,0.0404226,0.0266709,0.0277559,0.025101 +2024-03-05,3,0.0127932,0.0307281,0.0370464,0.025101 +2024-03-06,3,0.0161883,0.031004,0.0343268,0.025101 +2024-03-07,3,0.0201694,0.0306938,0.0316635,0.025101 +2024-03-08,4,0.0203483,0.0292849,0.0357369,0.0236746 +2024-03-09,4,0.0262973,0.0275467,0.0367695,0.0236746 +2024-03-10,4,0.0310136,0.0214635,0.0223081,0.0236746 +2024-03-11,4,0.0301588,0.0227707,0.0224033,0.0236746 +2024-03-12,4,0.0425768,0.0235266,0.021987,0.0236746 +2024-03-13,4,0.0389342,0.0235806,0.0234941,0.0236746 +2024-03-14,4,0.0507101,0.0250654,0.0239919,0.0236746 +2024-03-15,4,0.074181,0.0262525,0.0293086,0.0236746 +2024-03-16,4,0.0702433,0.0271303,0.0336738,0.0236746 +2024-03-17,4,0.0658561,0.0294582,0.0386447,0.0236746 +2024-03-18,4,0.0663843,0.0289003,0.0404991,0.0236746 +2024-03-19,4,0.0537933,0.0322023,0.0403267,0.0236746 +2024-03-20,4,0.0380079,0.0361797,0.0428087,0.0236746 +2024-03-21,4,0.0306338,0.0350382,0.0343033,0.0236746 +2024-03-22,4,0.0251881,0.0344895,0.0369419,0.0236746 +2024-03-23,4,0.0241938,0.0344985,0.042219,0.0236746 +2024-03-24,4,0.0213371,0.0333459,0.0338356,0.0236746 +2024-03-25,4,0.0117512,0.0311305,0.030597,0.0236746 +2024-03-26,4,0.0162589,0.0289409,0.0257617,0.0236746 +2024-03-27,4,0.0200277,0.0270865,0.0236964,0.0236746 +2024-03-28,4,0.0317195,0.026737,0.0245403,0.0236746 +2024-03-29,4,0.0335111,0.0260443,0.0242594,0.0236746 +2024-03-30,4,0.0403189,0.0228798,0.0228384,0.0236746 +2024-03-31,4,0.0373321,0.0245915,0.0229453,0.0236746 +2024-04-01,4,0.0379378,0.0258252,0.0237833,0.0236746 +2024-04-02,4,0.0172232,0.0289307,0.032684,0.0236746 +2024-04-03,4,0.0192446,0.0292859,0.0322755,0.0236746 +2024-04-04,4,0.0257656,0.0306491,0.0310458,0.0236746 +2024-04-05,4,0.0259304,0.0301032,0.0343705,0.0236746 +2024-04-06,4,0.0262951,0.0301415,0.0329977,0.0236746 +2024-04-07,4,0.0328555,0.0249312,0.0230049,0.0236746 +2024-04-08,4,0.0294641,0.0253945,0.0237136,0.0236746 +2024-04-09,4,0.0362327,0.0272379,0.0254205,0.0236746 +2024-04-10,4,0.0328756,0.0259151,0.0270705,0.0236746 +2024-04-11,4,0.034811,0.0242295,0.0206258,0.0236746 +2024-04-12,4,0.0346143,0.0255809,0.0230131,0.0236746 +2024-04-13,4,0.0357722,0.0256006,0.0260778,0.0236746 +2024-04-14,4,0.0320276,0.0269443,0.0250642,0.0236746 +2024-04-15,4,0.0282474,0.0261443,0.0251903,0.0236746 +2024-04-16,4,0.0283519,0.025985,0.021723,0.0236746 +2024-04-17,4,0.0155257,0.0263448,0.0250193,0.0236746 +2024-04-18,4,0.0144335,0.026996,0.0253965,0.0236746 +2024-04-19,4,0.0237568,0.0262569,0.0248125,0.0236746 +2024-04-20,4,0.0220516,0.0256649,0.0261675,0.0236746 +2024-04-21,4,0.0224644,0.0256826,0.0250225,0.0236746 +2024-04-22,4,0.0134169,0.0226527,0.0224915,0.0236746 +2024-04-23,4,0.0135581,0.022215,0.0213792,0.0236746 +2024-04-24,4,0.00883226,0.0240538,0.0209901,0.0236746 +2024-04-25,4,0.023489,0.0236569,0.0231948,0.0236746 +2024-04-26,4,0.0265193,0.023285,0.0210237,0.0236746 +2024-04-27,4,0.030205,0.020799,0.0182464,0.0236746 +2024-04-28,4,0.0458838,0.0205436,0.0190467,0.0236746 +2024-04-29,4,0.0462111,0.0187644,0.0174709,0.0236746 +2024-04-30,4,0.0364066,0.0233861,0.0225565,0.0236746 +2024-05-01,4,0.0281339,0.0241268,0.0219989,0.0236746 +2024-05-02,4,0.0311024,0.0247158,0.0247901,0.0236746 +2024-05-03,4,0.0142243,0.0282654,0.0257204,0.0236746 +2024-05-04,4,0.0198347,0.0278601,0.0238661,0.0236746 +2024-05-05,4,0.0244664,0.0257485,0.0216161,0.0236746 +2024-05-06,4,0.0247701,0.0241586,0.0226556,0.0236746 +2024-05-07,4,0.0257209,0.0243623,0.0223814,0.0236746 +2024-05-08,4,0.0261539,0.0206788,0.0190823,0.0236746 +2024-05-09,4,0.0242089,0.0220372,0.0216139,0.0236746 +2024-05-10,4,0.0356747,0.0230154,0.0201515,0.0236746 +2024-05-11,4,0.0381877,0.0230607,0.0191146,0.0236746 +2024-05-12,4,0.038554,0.0231604,0.018806,0.0236746 +2024-05-13,4,0.0392128,0.0234433,0.019971,0.0236746 +2024-05-14,4,0.0369466,0.0228624,0.0196749,0.0236746 +2024-05-15,4,0.0374685,0.0265181,0.0258747,0.0236746 +2024-05-16,4,0.0380546,0.0266253,0.0258418,0.0236746 +2024-05-17,4,0.0390946,0.0268792,0.0244431,0.0236746 +2024-05-18,4,0.0404838,0.0266192,0.0262063,0.0236746 +2024-05-19,4,0.0398555,0.0259169,0.0253975,0.0236746 +2024-05-20,4,0.0146441,0.0273104,0.0343296,0.0236746 +2024-05-21,4,0.0133768,0.027485,0.0323357,0.0236746 +2024-05-22,4,0.013884,0.0270616,0.0315476,0.0236746 +2024-05-23,4,0.0134155,0.026802,0.0285536,0.0236746 +2024-05-24,4,0.0134366,0.0266231,0.0279074,0.0236746 +2024-05-25,4,0.0136511,0.0208581,0.0214608,0.0236746 +2024-05-26,4,0.0139791,0.0204755,0.0220552,0.0236746 +2024-05-27,4,0.0117752,0.0206503,0.0227207,0.0236746 +2024-05-28,4,0.0101111,0.0205212,0.0227346,0.0236746 +2024-05-29,4,0.0109913,0.0205146,0.0222389,0.0236746 +2024-05-30,4,0.0146021,0.020464,0.0209489,0.0236746 +2024-05-31,4,0.0100491,0.0204687,0.0213576,0.0236746 +2024-06-01,4,0.0118753,0.0192095,0.0202417,0.0236746 +2024-06-02,4,0.0176923,0.0185901,0.018199,0.0236746 +2024-06-03,4,0.0166707,0.0188952,0.0198944,0.0236746 +2024-06-04,4,0.0108617,0.0201188,0.0213143,0.0236746 +2024-06-05,4,0.00945276,0.0183939,0.0182161,0.0236746 +2024-06-06,4,0.0154864,0.0177389,0.0185756,0.0236746 +2024-06-07,4,0.0171209,0.0193577,0.0211472,0.0236746 +2024-06-08,4,0.0188844,0.0188293,0.0180826,0.0236746 +2024-06-09,4,0.0175637,0.0171652,0.0177368,0.0236746 +2024-06-10,4,0.0182579,0.0166187,0.0181528,0.0236746 +2024-06-11,4,0.0143298,0.0161329,0.0158116,0.0236746 +2024-06-12,4,0.0115408,0.0163565,0.0132859,0.0236746 +2024-06-13,4,0.0110046,0.0168641,0.0123947,0.0236746 +2024-06-14,4,0.0104235,0.0164475,0.0128758,0.0236746 +2024-06-15,4,0.00995365,0.016523,0.0111325,0.0236746 +2024-06-16,4,0.00811897,0.015563,0.012198,0.0236746 +2024-06-17,4,0.00912344,0.0147544,0.0144098,0.0236746 +2024-06-18,4,0.0077968,0.014698,0.014117,0.0236746 +2024-06-19,4,0.0194653,0.014402,0.0146313,0.0236746 +2024-06-20,4,0.0264609,0.0142142,0.0149564,0.0236746 +2024-06-21,4,0.0266316,0.0135068,0.0153629,0.0236746 +2024-06-22,4,0.0282776,0.0137938,0.0144579,0.0236746 +2024-06-23,4,0.028655,0.0134128,0.0147386,0.0236746 +2024-06-24,4,0.0197997,0.0175777,0.0174899,0.0236746 +2024-06-25,4,0.0209959,0.0190778,0.0183039,0.0236746 +2024-06-26,4,0.0182341,0.0186069,0.0141589,0.0236746 +2024-06-27,4,0.0196472,0.0189752,0.015897,0.0236746 +2024-06-28,4,0.0225284,0.0191629,0.0165029,0.0236746 +2024-06-29,4,0.031787,0.0176225,0.0146087,0.0236746 +2024-06-30,4,0.0227849,0.0183913,0.0236736,0.0236746 +2024-07-01,4,0.0307894,0.0178183,0.0211252,0.0236746 +2024-07-02,4,0.0331428,0.0179303,0.0192332,0.0236746 +2024-07-03,4,0.0360589,0.0184627,0.0220339,0.0236746 +2024-07-04,4,0.0290681,0.0209448,0.0212775,0.0236746 +2024-07-05,4,0.0289971,0.0194192,0.0210822,0.0236746 +2024-07-06,4,0.0255547,0.021256,0.0230304,0.0236746 +2024-07-07,4,0.0127474,0.0221494,0.0235324,0.0236746 +2024-07-08,4,0.0142844,0.0226209,0.0227985,0.0236746 +2024-07-09,4,0.0151141,0.0218436,0.0198172,0.0236746 +2024-07-10,4,0.0266721,0.0217637,0.0199023,0.0236746 +2024-07-11,4,0.0240006,0.0211752,0.0206617,0.0236746 +2024-07-12,4,0.0298927,0.0182813,0.0191008,0.0236746 +2024-07-13,4,0.0314539,0.0189252,0.019298,0.0236746 +2024-07-14,4,0.0335288,0.0190668,0.0171903,0.0236746 +2024-07-15,4,0.0212425,0.0228596,0.0232278,0.0236746 +2024-07-16,4,0.021374,0.0217118,0.0207117,0.0236746 +2024-07-17,4,0.0195913,0.0227191,0.0203411,0.0236746 +2024-07-18,4,0.0251011,0.0228755,0.0191289,0.0236746 +2024-07-19,4,0.015304,0.023269,0.0192925,0.0236746 +2024-07-20,4,0.0152003,0.0209354,0.0177434,0.0236746 +2024-07-21,4,0.0212976,0.0209832,0.0190566,0.0236746 +2024-07-22,4,0.0208949,0.0204711,0.0176479,0.0236746 +2024-07-23,4,0.0152764,0.0218167,0.0186065,0.0236746 +2024-07-24,4,0.0190976,0.0195937,0.0170137,0.0236746 +2024-07-25,4,0.0199688,0.0193053,0.016815,0.0236746 +2024-07-26,4,0.0129797,0.0199762,0.019824,0.0236746 +2024-07-27,4,0.0159902,0.0198489,0.0180562,0.0236746 +2024-07-28,4,0.0268928,0.0184315,0.0174704,0.0236746 +2024-07-29,4,0.0271954,0.0187764,0.0204344,0.0236746 +2024-07-30,4,0.0282843,0.0190328,0.0176674,0.0236746 +2024-07-31,4,0.0352554,0.0175883,0.0190522,0.0236746 +2024-08-01,4,0.0445587,0.01838,0.017138,0.0236746 +2024-08-02,4,0.0410032,0.0221203,0.0209937,0.0236746 +2024-08-03,4,0.074284,0.0221744,0.0200599,0.0236746 +2024-08-04,4,0.0707432,0.02284,0.0202828,0.0236746 +2024-08-05,4,0.0549851,0.0252723,0.0290163,0.0236746 +2024-08-06,4,0.0604085,0.0258581,0.0223361,0.0236746 +2024-08-07,4,0.058472,0.0254165,0.0242213,0.0236746 +2024-08-08,4,0.0226835,0.0330855,0.0390649,0.0236746 +2024-08-09,4,0.0258233,0.0327745,0.0353466,0.0236746 +2024-08-10,4,0.0258819,0.0306385,0.0307501,0.0236746 +2024-08-11,4,0.0248554,0.031485,0.0337222,0.0236746 +2024-08-12,4,0.0247689,0.0312268,0.0329176,0.0236746 +2024-08-13,4,0.0226205,0.0256273,0.0242692,0.0236746 +2024-08-14,4,0.019857,0.0264334,0.0221143,0.0236746 +2024-08-15,4,0.016894,0.0264891,0.0230196,0.0236746 +2024-08-16,4,0.0208999,0.0263893,0.0231854,0.0236746 +2024-08-17,4,0.022712,0.0261843,0.0235386,0.0236746 +2024-08-18,4,0.0304385,0.0257042,0.0241009,0.0236746 +2024-08-19,4,0.0313994,0.025069,0.022833,0.0236746 +2024-08-20,4,0.02976,0.0241832,0.021509,0.0236746 +2024-08-21,4,0.032049,0.0256007,0.0221811,0.0236746 +2024-08-22,4,0.0421093,0.0260063,0.0239943,0.0236746 +2024-08-23,4,0.023895,0.0282815,0.0325083,0.0236746 +2024-08-24,4,0.0248586,0.0278554,0.0265689,0.0236746 +2024-08-25,4,0.023778,0.027493,0.0250934,0.0236746 +2024-08-26,4,0.0242402,0.0277138,0.0288598,0.0236746 +2024-08-27,4,0.0127505,0.0290446,0.0310696,0.0236746 +2024-08-28,4,0.0212474,0.0255587,0.0249346,0.0236746 +2024-08-29,4,0.0243787,0.0256667,0.02472,0.0236746 +2024-08-30,4,0.0254567,0.0225191,0.0201707,0.0236746 +2024-08-31,4,0.0282553,0.0225643,0.0204009,0.0236746 +2024-09-01,4,0.0306077,0.0198403,0.0206247,0.0236746 +2024-09-02,4,0.0224181,0.0219789,0.0214667,0.0236746 +2024-09-03,4,0.0248099,0.0228605,0.0225312,0.0236746 +2024-09-04,4,0.032642,0.0229316,0.020454,0.0236746 +2024-09-05,4,0.0286928,0.0234226,0.022974,0.0236746 +2024-09-06,4,0.0165767,0.0242081,0.0227316,0.0236746 +2024-09-07,4,0.0158562,0.022452,0.0221075,0.0236746 +2024-09-08,4,0.0198207,0.0229766,0.0216717,0.0236746 +2024-09-09,4,0.0199808,0.0248602,0.0221175,0.0236746 +2024-09-10,4,0.0226378,0.0241338,0.0207945,0.0236746 +2024-09-11,4,0.0245006,0.0214376,0.019086,0.0236746 +2024-09-12,4,0.0285668,0.0209209,0.0205864,0.0236746 +2024-09-13,4,0.0237725,0.0222726,0.0205955,0.0236746 +2024-09-14,4,0.0234936,0.0213108,0.019563,0.0236746 +2024-09-15,4,0.0201864,0.0219134,0.0223501,0.0236746 +2024-09-16,4,0.0136809,0.0223338,0.0223552,0.0236746 +2024-09-17,4,0.00967127,0.0234135,0.0231319,0.0236746 +2024-09-18,4,0.00938323,0.02173,0.021152,0.0236746 +2024-09-19,4,0.00720917,0.0217632,0.0211742,0.0236746 +2024-09-20,4,0.0123901,0.0210647,0.0203092,0.0236746 +2024-09-21,4,0.0190955,0.0193482,0.0210569,0.0236746 +2024-09-22,4,0.0191348,0.0179544,0.0201605,0.0236746 +2024-09-23,4,0.0183511,0.0175614,0.0190652,0.0236746 +2024-09-24,4,0.0184323,0.0164084,0.0187738,0.0236746 +2024-09-25,4,0.0244425,0.018232,0.020323,0.0236746 +2024-09-26,4,0.022602,0.0202954,0.0224851,0.0236746 +2024-09-27,4,0.0199144,0.0197423,0.0193018,0.0236746 +2024-09-28,4,0.0200528,0.0185154,0.0162541,0.0236746 +2024-09-29,4,0.0261524,0.0185838,0.0184346,0.0236746 +2024-09-30,4,0.0223808,0.0206892,0.0224817,0.0236746 +2024-10-01,4,0.0100024,0.020621,0.0222008,0.0236746 +2024-10-02,4,0.0116708,0.0200523,0.0196791,0.0236746 +2024-10-03,4,0.0120399,0.0199903,0.0187144,0.0236746 +2024-10-04,4,0.0136631,0.0210371,0.021776,0.0236746 +2024-10-05,4,0.0133578,0.0196556,0.0205594,0.0236746 +2024-10-06,4,0.0223501,0.0165279,0.0181905,0.0236746 +2024-10-07,4,0.0224375,0.0164982,0.0182615,0.0236746 +2024-10-08,4,0.0226954,0.0164558,0.0206414,0.0236746 +2024-10-09,4,0.024574,0.0167501,0.0217377,0.0236746 +2024-10-10,4,0.0214507,0.0163861,0.0175493,0.0236746 +2024-10-11,4,0.020376,0.0187667,0.0235893,0.0236746 +2024-10-12,4,0.0221501,0.018826,0.0216019,0.0236746 +2024-10-13,4,0.0196739,0.0188216,0.0212253,0.0236746 +2024-10-14,4,0.00856926,0.0202417,0.0228135,0.0236746 +2024-10-15,4,0.00755346,0.0196871,0.0231813,0.0236746 +2024-10-16,4,0.0149493,0.0194255,0.0197077,0.0236746 +2024-10-17,4,0.0148875,0.0196077,0.0234146,0.0236746 +2024-10-18,4,0.0130458,0.0188493,0.0217445,0.0236746 +2024-10-19,4,0.0194426,0.0157605,0.0181038,0.0236746 +2024-10-20,4,0.0205723,0.0153073,0.0167838,0.0236746 +2024-10-21,4,0.0186159,0.017961,0.0210963,0.0236746 +2024-10-22,4,0.0197572,0.0172258,0.0186485,0.0236746 +2024-10-23,4,0.0205345,0.0160886,0.0183911,0.0236746 +2024-10-24,4,0.0237919,0.0177439,0.0191169,0.0236746 +2024-10-25,4,0.0178665,0.0183014,0.0198809,0.0236746 +2024-10-26,4,0.0275894,0.0175793,0.0180451,0.0236746 +2024-10-27,4,0.0287406,0.0178437,0.0209119,0.0236746 +2024-10-28,4,0.0253675,0.018272,0.0225991,0.0236746 +2024-10-29,4,0.0107644,0.0193172,0.0222612,0.0236746 +2024-10-30,4,0.0102352,0.0182005,0.0172349,0.0236746 +2024-10-31,4,0.0145405,0.020107,0.0230746,0.0236746 +2024-11-01,4,0.0413391,0.0203043,0.018952,0.0236746 +2024-11-02,4,0.0406775,0.0193702,0.021222,0.0236746 +2024-11-03,4,0.0386538,0.0161624,0.017674,0.0236746 +2024-11-04,4,0.035455,0.0160058,0.0180711,0.0236746 +2024-11-05,4,0.0367256,0.016442,0.019133,0.0236746 +2024-11-06,4,0.0409312,0.0238243,0.0201535,0.0236746 +2024-11-07,4,0.0432819,0.0237364,0.0187049,0.0236746 +2024-11-08,4,0.0417162,0.0233723,0.017296,0.0236746 +2024-11-09,4,0.0518647,0.0229162,0.0181612,0.0236746 +2024-11-10,4,0.0514627,0.0236873,0.0194537,0.0236746 +2024-11-11,4,0.0321002,0.0267208,0.0412612,0.0236746 +2024-11-12,4,0.032048,0.0267892,0.0344905,0.0236746 +2024-11-13,4,0.0291176,0.0266211,0.0337141,0.0236746 +2024-11-14,4,0.020794,0.028398,0.0354637,0.0236746 +2024-11-15,4,0.0136845,0.0285544,0.0361012,0.0236746 +2024-11-16,4,0.0188351,0.0255936,0.0311427,0.0236746 +2024-11-17,4,0.0151209,0.02566,0.0303888,0.0236746 +2024-11-18,4,0.0206684,0.0251322,0.0270104,0.0236746 +2024-11-19,4,0.0212028,0.0233605,0.0246578,0.0236746 +2024-11-20,4,0.0341297,0.021265,0.0236754,0.0236746 +2024-11-21,4,0.0225581,0.0229405,0.0229351,0.0236746 +2024-11-22,4,0.0337125,0.021556,0.0221202,0.0236746 +2024-11-23,4,0.0335415,0.0230823,0.0242581,0.0236746 +2024-11-24,4,0.0351265,0.0231442,0.024176,0.0236746 +2024-11-25,4,0.02323,0.0265495,0.0369019,0.0236746 +2024-11-26,4,0.020673,0.0243018,0.0250407,0.0236746 +2024-11-27,4,0.01377,0.0266877,0.035082,0.0236746 +2024-11-28,4,0.0136707,0.0256197,0.0330697,0.0236746 +2024-11-29,4,0.0171079,0.0257831,0.033355,0.0236746 +2024-11-30,4,0.0199532,0.0235888,0.0252782,0.0236746 +2024-12-01,4,0.0251135,0.0229911,0.0231147,0.0236746 +2024-12-02,4,0.0229561,0.0209494,0.0237276,0.0236746 +2024-12-03,4,0.0226739,0.0190453,0.0195489,0.0236746 +2024-12-04,4,0.0284702,0.0201165,0.0216013,0.0236746 +2024-12-05,4,0.0266656,0.0208447,0.0200234,0.0236746 +2024-12-06,4,0.0305545,0.0216261,0.0220769,0.0236746 +2024-12-07,4,0.0311897,0.020743,0.0208487,0.0236746 +2024-12-08,4,0.0312961,0.020626,0.022871,0.0236746 +2024-12-09,4,0.0231237,0.0223385,0.0235786,0.0236746 +2024-12-10,4,0.0226366,0.022037,0.0212975,0.0236746 +2024-12-11,4,0.0155346,0.023235,0.024085,0.0236746 +2024-12-12,4,0.0120397,0.0233132,0.0216232,0.0236746 +2024-12-13,4,0.0337078,0.0227427,0.0243214,0.0236746 +2024-12-14,4,0.0351632,0.0213143,0.0208818,0.0236746 +2024-12-15,4,0.0300381,0.0213921,0.0225321,0.0236746 +2024-12-16,4,0.0260006,0.0197851,0.0200122,0.0236746 +2024-12-17,4,0.0238833,0.0178002,0.0178505,0.0236746 +2024-12-18,4,0.012289,0.0237756,0.0252685,0.0236746 +2024-12-19,4,0.0235415,0.0237673,0.0233182,0.0236746 +2024-12-20,4,0.0236072,0.0229364,0.0232121,0.0236746 +2024-12-21,4,0.0295596,0.0221466,0.0208803,0.0236746 +2024-12-22,4,0.0288445,0.0218809,0.0210775,0.0236746 +2024-12-23,4,0.0293028,0.0189507,0.0209051,0.0236746 +2024-12-24,4,0.01912,0.0222383,0.0213602,0.0236746 +2024-12-25,4,0.0167661,0.0222583,0.0208003,0.0236746 +2024-12-26,4,0.0136296,0.0235762,0.0233283,0.0236746 +2024-12-27,4,0.0130689,0.0233964,0.0250132,0.0236746 +2024-12-28,4,0.0171332,0.0230855,0.0222921,0.0236746 +2024-12-29,4,0.0126381,0.021146,0.0207026,0.0236746 +2024-12-30,4,0.00893192,0.0204559,0.0195325,0.0236746 +2024-12-31,4,0.010198,0.0192525,0.0194582,0.0236746 +2025-01-01,4,0.01596,0.0191089,0.0191153,0.0236746 +2025-01-02,4,0.0326179,0.0197964,0.0213544,0.0236746 +2025-01-03,4,0.0327147,0.0185677,0.0208461,0.0236746 +2025-01-04,4,0.0335324,0.0171658,0.0182103,0.0236746 +2025-01-05,4,0.0371016,0.0174161,0.0171759,0.0236746 +2025-01-06,4,0.0283253,0.0194116,0.0227579,0.0236746 +2025-01-07,4,0.0197689,0.0234735,0.0254525,0.0236746 +2025-01-08,4,0.0180501,0.023576,0.0249076,0.0236746 +2025-01-09,4,0.0126776,0.0228004,0.0231171,0.0236746 +2025-01-10,4,0.0184805,0.0228877,0.0240315,0.0236746 +2025-01-11,4,0.0197246,0.0215935,0.0229877,0.0236746 +2025-01-12,4,0.0236471,0.0199476,0.019425,0.0236746 +2025-01-13,4,0.0238194,0.0193402,0.0191838,0.0236746 +2025-01-14,4,0.0332517,0.0179876,0.0200865,0.0236746 +2025-01-15,4,0.0285572,0.0195535,0.0213258,0.0236746 +2025-01-16,4,0.0318384,0.0198372,0.0198702,0.0236746 +2025-01-17,4,0.0285236,0.0208915,0.0220916,0.0236746 +2025-01-18,4,0.0285974,0.0207621,0.0219954,0.0236746 +2025-01-19,4,0.0225659,0.0227757,0.0229964,0.0236746 +2025-01-20,4,0.0228081,0.0218185,0.0222671,0.0236746 +2025-01-21,4,0.0141984,0.0227425,0.0225173,0.0236746 +2025-01-22,4,0.0105949,0.022494,0.0223905,0.0236746 +2025-01-23,4,0.0101319,0.0224967,0.0226332,0.0236746 +2025-01-24,4,0.015699,0.0211002,0.021115,0.0236746 +2025-01-25,4,0.0166269,0.0211178,0.0213339,0.0236746 +2025-01-26,4,0.0175113,0.0191414,0.0194247,0.0236746 +2025-01-27,4,0.0190473,0.017995,0.0171767,0.0236746 +2025-01-28,4,0.0227098,0.017497,0.0175972,0.0236746 +2025-01-29,4,0.0277939,0.0185223,0.0209406,0.0236746 +2025-01-30,4,0.0292897,0.0185796,0.0197329,0.0236746 +2025-01-31,4,0.0288686,0.0187024,0.0207373,0.0236746 +2025-02-01,4,0.0290463,0.0190737,0.0219699,0.0236746 +2025-02-02,4,0.0264148,0.0201823,0.02391,0.0236746 +2025-02-03,4,0.0152505,0.0215492,0.0229641,0.0236746 +2025-02-04,4,0.00565342,0.0222622,0.0224665,0.0236746 +2025-02-05,4,0.00446844,0.0221335,0.0233528,0.0236746 +2025-02-06,4,0.00980917,0.0215909,0.0242648,0.0236746 +2025-02-07,4,0.0145674,0.0210613,0.0223648,0.0236746 +2025-02-08,4,0.0162444,0.0179312,0.0197685,0.0236746 +2025-02-09,4,0.016714,0.0144145,0.0170489,0.0236746 +2025-02-10,4,0.0161687,0.0134927,0.0163894,0.0236746 +2025-02-11,4,0.015382,0.0160025,0.018697,0.0236746 +2025-02-12,4,0.0098084,0.0169427,0.0209631,0.0236746 +2025-02-13,4,0.008546,0.0171551,0.0217711,0.0236746 +2025-02-14,4,0.00933262,0.0173017,0.0200074,0.0236746 +2025-02-15,4,0.0128036,0.0171262,0.0197614,0.0236746 +2025-02-16,4,0.0155966,0.0168197,0.0192861,0.0236746 +2025-02-17,4,0.0155208,0.0151349,0.0169745,0.0236746 +2025-02-18,4,0.0155708,0.0146924,0.0172352,0.0236746 +2025-02-19,4,0.0269893,0.0150493,0.0172793,0.0236746 +2025-02-20,4,0.0223797,0.0159751,0.0184659,0.0236746 +2025-02-21,4,0.0262346,0.0167933,0.0171125,0.0236746 +2025-02-22,4,0.0260978,0.0165302,0.0179732,0.0236746 +2025-02-23,4,0.0259299,0.0164317,0.0176117,0.0236746 +2025-02-24,4,0.0279946,0.0194174,0.0218216,0.0236746 +2025-02-25,4,0.0514282,0.0181697,0.0217039,0.0236746 +2025-02-26,4,0.0649998,0.0194871,0.0219344,0.0236746 +2025-02-27,4,0.0651344,0.0194842,0.0210178,0.0236746 +2025-02-28,4,0.0662726,0.0194404,0.0211811,0.0236746 +2025-03-01,4,0.0668306,0.0200553,0.0224877,0.0236746 +2025-03-02,4,0.0497356,0.0266497,0.0255343,0.0236746 +2025-03-03,4,0.0277002,0.0304409,0.0407752,0.0236746 +2025-03-04,4,0.0390016,0.0304828,0.0352181,0.0236746 +2025-03-05,4,0.0247089,0.0310337,0.0369463,0.0236746 +2025-03-06,4,0.0447754,0.0309595,0.035475,0.0236746 +2025-03-07,4,0.044437,0.0292304,0.0370916,0.0236746 +2025-03-08,4,0.0458297,0.0256278,0.0260632,0.0236746 +2025-03-09,4,0.0374331,0.0284065,0.0390067,0.0236746 +2025-03-10,4,0.0326511,0.0258017,0.0225208,0.0236746 +2025-03-11,4,0.0266783,0.0300625,0.0388338,0.0236746 +2025-03-12,4,0.0276649,0.0300634,0.0396241,0.0236746 +2025-03-13,4,0.0235021,0.030359,0.0346813,0.0236746 +2025-03-14,4,0.0283081,0.0293247,0.0341348,0.0236746 +2025-03-15,4,0.0331685,0.028435,0.0334397,0.0236746 +2025-03-16,4,0.0312069,0.02717,0.0238319,0.0236746 +2025-03-17,4,0.0301641,0.0274837,0.0275243,0.0236746 +2025-03-18,4,0.0306104,0.0261585,0.024251,0.0236746 +2025-03-19,4,0.0220598,0.0276268,0.027524,0.0236746 +2025-03-20,4,0.0129747,0.0283515,0.0328663,0.0236746 +2025-03-21,4,0.0140274,0.0279742,0.0281767,0.0236746 +2025-03-22,4,0.0133074,0.0276747,0.0274515,0.0236746 +2025-03-23,4,0.0182673,0.0278301,0.0285308,0.0236746 +2025-03-24,4,0.0151254,0.0247372,0.0250368,0.0236746 +2025-03-25,4,0.0146386,0.0207153,0.0241265,0.0236746 +2025-03-26,4,0.0160139,0.021039,0.0235727,0.0236746 +2025-03-27,4,0.0245535,0.0204793,0.0234638,0.0236746 +2025-03-28,4,0.0242921,0.0221554,0.0218375,0.0236746 +2025-03-29,4,0.0227291,0.0211169,0.0214795,0.0236746 +2025-03-30,4,0.0227844,0.0209377,0.0231884,0.0236746 +2025-03-31,4,0.0230524,0.0202485,0.0210374,0.0236746 +2025-04-01,4,0.0316544,0.0222291,0.0218926,0.0236746 +2025-04-02,4,0.0327081,0.0216972,0.0218102,0.0236746 +2025-04-03,4,0.0336469,0.0213492,0.021239,0.0236746 +2025-04-04,4,0.055175,0.0209472,0.0213266,0.0236746 +2025-04-05,4,0.0571759,0.0205082,0.0205011,0.0236746 +2025-04-06,4,0.0514031,0.0235939,0.0240252,0.0236746 +2025-04-07,4,0.0515781,0.0237388,0.0238911,0.0236746 +2025-04-08,4,0.0471982,0.0241824,0.0234631,0.0236746 +2025-04-09,4,0.0328696,0.0291216,0.0283982,0.0236746 +2025-04-10,4,0.0261174,0.0290178,0.0247028,0.0236746 +2025-04-11,4,0.0164094,0.0288539,0.0247046,0.0236746 +2025-04-12,4,0.0131359,0.029014,0.0282938,0.0236746 +2025-04-13,4,0.0092982,0.028544,0.0290099,0.0236746 +2025-04-14,4,0.0087064,0.0262863,0.0264313,0.0236746 +2025-04-15,4,0.00593761,0.0249687,0.0242714,0.0236746 +2025-04-16,4,0.0121741,0.0226152,0.0236441,0.0236746 +2025-04-17,4,0.02858,0.0215854,0.0238159,0.0236746 +2025-04-18,4,0.0270523,0.0200477,0.0242966,0.0236746 +2025-04-19,4,0.0277022,0.0195956,0.0231926,0.0236746 +2025-04-20,4,0.0266966,0.0179709,0.0231566,0.0236746 +2025-04-21,4,0.0280397,0.0210843,0.0230433,0.0236746 +2025-04-22,4,0.00652311,0.0262573,0.0302685,0.0236746 +2025-04-23,4,0.0086067,0.0258121,0.0248053,0.0236746 +2025-04-24,4,0.00971404,0.0256547,0.0266985,0.0236746 +2025-04-25,4,0.00876148,0.0253614,0.0249648,0.0236746 +2025-04-26,4,0.014249,0.025602,0.0251689,0.0236746 +2025-04-27,4,0.0122124,0.0186934,0.0228357,0.0236746 +2025-04-28,4,0.0136083,0.0188727,0.0192136,0.0236746 +2025-04-29,4,0.015651,0.0194168,0.0190014,0.0236746 +2025-04-30,4,0.0157599,0.0185254,0.0179936,0.0236746 +2025-05-01,4,0.0148643,0.0188833,0.0207883,0.0236746 +2025-05-02,4,0.014769,0.0172686,0.0193349,0.0236746 +2025-05-03,4,0.0296553,0.017157,0.0173696,0.0236746 +2025-05-04,4,0.0264539,0.017736,0.022358,0.0236746 +2025-05-05,4,0.0255068,0.0174747,0.0172254,0.0236746 +2025-05-06,4,0.0278821,0.0173316,0.0185983,0.0236746 +2025-05-07,4,0.0302028,0.0171722,0.017006,0.0236746 +2025-05-08,4,0.0125215,0.0213142,0.0239778,0.0236746 +2025-05-09,4,0.0129138,0.0208156,0.0203589,0.0236746 +2025-05-10,4,0.0098007,0.020481,0.0245722,0.0236746 +2025-05-11,4,0.00959118,0.0209696,0.0198016,0.0236746 +2025-05-12,4,0.00748949,0.0214416,0.0224645,0.0236746 +2025-05-13,4,0.0152164,0.01761,0.0201033,0.0236746 +2025-05-14,4,0.0155513,0.0163549,0.015994,0.0236746 +2025-05-15,4,0.0157999,0.0153962,0.0166871,0.0236746 +2025-05-16,4,0.0172979,0.0153397,0.0167844,0.0236746 +2025-05-17,4,0.0153313,0.0145507,0.0153805,0.0236746 +2025-05-18,4,0.0265349,0.0171997,0.024248,0.0236746 +2025-05-19,4,0.0260005,0.0172086,0.0196994,0.0236746 +2025-05-20,4,0.0260225,0.0172567,0.0194379,0.0236746 +2025-05-21,4,0.0228935,0.0177312,0.0200635,0.0236746 +2025-05-22,4,0.0204398,0.0172881,0.0207949,0.0236746 +2025-05-23,4,0.00866657,0.0203789,0.022294,0.0236746 +2025-05-24,4,0.0123678,0.0202896,0.0209042,0.0236746 +2025-05-25,4,0.00948227,0.0202002,0.0206416,0.0236746 +2025-05-26,4,0.010346,0.0194342,0.0220422,0.0236746 +2025-05-27,4,0.0133528,0.0189497,0.0196132,0.0236746 +2025-05-28,4,0.0134749,0.015765,0.0170551,0.0236746 +2025-05-29,4,0.00997907,0.0172563,0.019231,0.0236746 +2025-05-30,4,0.00685417,0.014996,0.0167753,0.0236746 +2025-05-31,4,0.0151658,0.0152578,0.0128462,0.0236746 +2025-06-01,4,0.0207455,0.015964,0.0132133,0.0236746 +2025-06-02,4,0.0216828,0.0159749,0.0115299,0.0236746 +2025-06-03,4,0.0215886,0.0149032,0.0127676,0.0236746 +2025-06-04,4,0.0274873,0.013706,0.0123546,0.0236746 +2025-06-05,4,0.0178642,0.0165441,0.0203223,0.0236746 +2025-06-06,4,0.0209475,0.0181053,0.0195207,0.0236746 +2025-06-07,4,0.02551,0.0182256,0.0179226,0.0236746 +2025-06-08,4,0.0255084,0.0178286,0.0183494,0.0236746 +2025-06-09,4,0.0112171,0.0191026,0.0230958,0.0236746 +2025-06-10,4,0.0114344,0.0172549,0.0180212,0.0236746 +2025-06-11,4,0.0139055,0.01792,0.0211753,0.0236746 +2025-06-12,4,0.0119817,0.0186802,0.0217075,0.0236746 +2025-06-13,4,0.0120912,0.0184988,0.0181443,0.0236746 +2025-06-14,4,0.0119285,0.0148769,0.0109058,0.0236746 +2025-06-15,4,0.0128681,0.0149252,0.0098354,0.0236746 +2025-06-16,4,0.00928202,0.0155675,0.0122441,0.0236746 +2025-06-17,4,0.00706031,0.0152782,0.0155625,0.0236746 +2025-06-18,4,0.0245301,0.0153147,0.01674,0.0236746 +2025-06-19,4,0.0244855,0.0152305,0.015872,0.0236746 +2025-06-20,4,0.022983,0.0153525,0.013267,0.0236746 +2025-06-21,4,0.0218733,0.0139849,0.0134303,0.0236746 +2025-06-22,4,0.019203,0.013236,0.0127188,0.0236746 +2025-06-23,4,0.00587306,0.0184016,0.0235504,0.0236746 +2025-06-24,4,0.00658404,0.0183979,0.0196448,0.0236746 +2025-06-25,4,0.00791144,0.0182106,0.02222,0.0236746 +2025-06-26,4,0.00989233,0.0179949,0.0209732,0.0236746 +2025-06-27,4,0.0175549,0.0170344,0.017167,0.0236746 +2025-06-28,4,0.017622,0.0129717,0.0152872,0.0236746 +2025-06-29,4,0.0190731,0.0132814,0.0153819,0.0236746 +2025-06-30,4,0.018064,0.0138574,0.0158296,0.0236746 +2025-07-01,4,0.0159061,0.0137536,0.0142131,0.0236746 +2025-07-02,4,0.0103455,0.0161474,0.0149088,0.0236746 +2025-07-03,4,0.0101121,0.0160523,0.0114848,0.0236746 +2025-07-04,4,0.0109849,0.0160832,0.0152582,0.0236746 +2025-07-05,4,0.0185981,0.0158682,0.0104409,0.0236746 +2025-07-06,4,0.0184361,0.015454,0.0124397,0.0236746 +2025-07-07,4,0.0161547,0.0138729,0.0157476,0.0236746 +2025-07-08,4,0.0152487,0.0137605,0.0135273,0.0236746 +2025-07-09,4,0.0158541,0.0139552,0.013088,0.0236746 +2025-07-10,4,0.0129347,0.0165137,0.0229058,0.0236746 +2025-07-11,4,0.0121361,0.0164849,0.0187891,0.0236746 +2025-07-12,4,0.0120665,0.0158639,0.0114465,0.0236746 +2025-07-13,4,0.0115055,0.0155692,0.0136382,0.0236746 +2025-07-14,4,0.0107018,0.0154942,0.0115124,0.0236746 +2025-07-15,4,0.00761041,0.0143698,0.0127663,0.0236746 +2025-07-16,4,0.00604306,0.0141813,0.0139729,0.0236746 +2025-07-17,4,0.0123024,0.0140665,0.0122153,0.0236746 +2025-07-18,4,0.0121929,0.0140281,0.0142663,0.0236746 +2025-07-19,4,0.0123539,0.0138141,0.0123107,0.0236746 +2025-07-20,4,0.0124542,0.0128452,0.0129644,0.0236746 +2025-07-21,4,0.0124893,0.012192,0.0117229,0.0236746 +2025-07-22,4,0.00894266,0.0140982,0.0125592,0.0236746 +2025-07-23,4,0.0096322,0.0140233,0.015164,0.0236746 +2025-07-24,4,0.00958471,0.0137153,0.0125181,0.0236746 +2025-07-25,4,0.0091086,0.0137949,0.0131583,0.0236746 +2025-07-26,4,0.0119401,0.0135783,0.0111359,0.0236746 +2025-07-27,4,0.00973225,0.0126805,0.0151808,0.0236746 +2025-07-28,4,0.00973518,0.0130183,0.0152769,0.0236746 +2025-07-29,4,0.0144635,0.0128947,0.0132328,0.0236746 +2025-07-30,4,0.0156776,0.0127633,0.0127528,0.0236746 +2025-07-31,4,0.0142017,0.0135911,0.0137433,0.0236746 +2025-08-01,4,0.0101031,0.0122144,0.0117833,0.0236746 +2025-08-02,4,0.0109671,0.0120617,0.0117084,0.0236746 +2025-08-03,4,0.0121273,0.0133874,0.014519,0.0236746 +2025-08-04,4,0.0122123,0.0133781,0.0127223,0.0236746 +2025-08-05,4,0.013564,0.0130238,0.0142263,0.0236746 +2025-08-06,4,0.0149196,0.0119618,0.0142646,0.0236746 +2025-08-07,4,0.0130807,0.0125562,0.012553,0.0236746 +2025-08-08,4,0.0141534,0.0126888,0.0132208,0.0236746 +2025-08-09,4,0.0276833,0.0126252,0.0116979,0.0236746 +2025-08-10,4,0.0253154,0.0133905,0.012636,0.0236746 +2025-08-11,4,0.025351,0.0135838,0.0118918,0.0236746 +2025-08-12,4,0.0241992,0.013309,0.0145324,0.0236746 +2025-08-13,4,0.0171256,0.0137328,0.012442,0.0236746 +2025-08-14,4,0.012323,0.0171868,0.0180621,0.0236746 +2025-08-15,4,0.0159274,0.0168919,0.0146545,0.0236746 +2025-08-16,4,0.0161096,0.0168183,0.0120592,0.0236746 +2025-08-17,4,0.0270787,0.016648,0.0125889,0.0236746 +2025-08-18,4,0.0273295,0.0154293,0.0132487,0.0236746 +2025-08-19,4,0.0243985,0.0147784,0.0232603,0.0236746 +2025-08-20,4,0.0266531,0.0157075,0.0196973,0.0236746 +2025-08-21,4,0.0277036,0.015857,0.0209933,0.0236746 +2025-08-22,4,0.0165929,0.0182758,0.0248247,0.0236746 +2025-08-23,4,0.0189892,0.0182042,0.0223861,0.0236746 +2025-08-24,4,0.0238305,0.0178967,0.0244868,0.0236746 +2025-08-25,4,0.0210987,0.0186041,0.0255004,0.0236746 +2025-08-26,4,0.0186972,0.0188636,0.0229927,0.0236746 +2025-08-27,4,0.0200271,0.016897,0.0173296,0.0236746 +2025-08-28,4,0.0212876,0.0174293,0.0180556,0.0236746 +2025-08-29,4,0.00839402,0.0186934,0.0251936,0.0236746 +2025-08-30,4,0.0108338,0.0182084,0.0194753,0.0236746 +2025-08-31,4,0.0100719,0.0176603,0.0170286,0.0236746 +2025-09-01,4,0.0101896,0.0177109,0.0177676,0.0236746 +2025-09-02,4,0.00690346,0.0181188,0.0217259,0.0236746 +2025-09-03,4,0.00762058,0.0147995,0.0177611,0.0236746 +2025-09-04,4,0.00644816,0.0153328,0.0172756,0.0236746 +2025-09-05,4,0.0107919,0.0145744,0.018441,0.0236746 +2025-09-06,4,0.00960267,0.0145988,0.0190317,0.0236746 +2025-09-07,4,0.00979484,0.0134435,0.0192369,0.0236746 +2025-09-08,4,0.0107876,0.0136268,0.0199186,0.0236746 +2025-09-09,4,0.0107485,0.0131116,0.0200067,0.0236746 +2025-09-10,4,0.00706116,0.014541,0.0184745,0.0236746 +2025-09-11,4,0.00649329,0.014189,0.0188895,0.0236746 +2025-09-12,4,0.00665391,0.01413,0.0175548,0.0236746 +2025-09-13,4,0.00688174,0.013689,0.0121207,0.0236746 +2025-09-14,4,0.00924333,0.0135953,0.0131015,0.0236746 +2025-09-15,4,0.0092435,0.0122708,0.0128586,0.0236746 +2025-09-16,4,0.00663051,0.0115356,0.0149314,0.0236746 +2025-09-17,4,0.0111017,0.0115071,0.0126201,0.0236746 +2025-09-18,4,0.00885567,0.0115631,0.0133009,0.0236746 +2025-09-19,4,0.012348,0.0124026,0.0151334,0.0236746 +2025-09-20,4,0.0191766,0.0109175,0.012591,0.0236746 +2025-09-21,4,0.0206504,0.0102091,0.0114585,0.0236746 +2025-09-22,4,0.019654,0.0120596,0.0127151,0.0236746 +2025-09-23,4,0.0231232,0.0114939,0.0119962,0.0236746 +2025-09-24,4,0.0244419,0.0121775,0.0147583,0.0236746 +2025-09-25,4,0.0115301,0.0148732,0.018581,0.0236746 +2025-09-26,4,0.0175378,0.0150868,0.0139989,0.0236746 +2025-09-27,4,0.0151516,0.014928,0.0121384,0.0236746 +2025-09-28,4,0.015253,0.0158608,0.0147073,0.0236746 +2025-09-29,4,0.0166493,0.016284,0.0142611,0.0236746 +2025-09-30,4,0.0143889,0.0138107,0.0124714,0.0236746 +2025-10-01,4,0.00581191,0.0160381,0.0169916,0.0236746 +2025-10-02,4,0.0162868,0.0154732,0.012716,0.0236746 +2025-10-03,4,0.0167701,0.0154988,0.0132048,0.0236746 +2025-10-04,4,0.018119,0.0157816,0.0097344,0.0236746 +2025-10-05,4,0.0352,0.0153099,0.0129961,0.0236746 +2025-10-06,4,0.0317184,0.0125823,0.0142357,0.0236746 +2025-10-07,4,0.0419574,0.0161786,0.0191309,0.0236746 +2025-10-08,4,0.0401432,0.0163359,0.0192152,0.0236746 +2025-10-09,4,0.0402123,0.0166789,0.0196674,0.0236746 +2025-10-10,4,0.0257359,0.0218937,0.020524,0.0236746 +2025-10-11,4,0.026125,0.0215222,0.0191605,0.0236746 +2025-10-12,4,0.00969404,0.0234381,0.0190174,0.0236746 +2025-10-13,4,0.0122681,0.0230591,0.0187446,0.0236746 +2025-10-14,4,0.0170568,0.0230493,0.0193302,0.0236746 +2025-10-15,4,0.018424,0.0210936,0.0193241,0.0236746 +2025-10-16,4,0.0170735,0.0212963,0.0190836,0.0236746 +2025-10-17,4,0.0153162,0.0169769,0.0163181,0.0236746 +2025-10-18,4,0.0177211,0.0178012,0.0170036,0.0236746 +2025-10-19,4,0.017277,0.0191565,0.0186603,0.0236746 +2025-10-20,4,0.0157421,0.0194329,0.0185512,0.0236746 +2025-10-21,4,0.0130913,0.0189797,0.0173191,0.0236746 +2025-10-22,4,0.0117033,0.0185417,0.0162755,0.0236746 +2025-10-23,4,0.013354,0.0188228,0.018405,0.0236746 +2025-10-24,4,0.018924,0.0185766,0.0168937,0.0236746 +2025-10-25,4,0.0193074,0.0181368,0.0170987,0.0236746 +2025-10-26,4,0.0140948,0.017697,0.0179888,0.0236746 +2025-10-27,4,0.0152484,0.0172306,0.0179298,0.0236746 +2025-10-28,4,0.0160333,0.017574,0.0162961,0.0236746 +2025-10-29,4,0.0202962,0.0189849,0.0189632,0.0236746 +2025-10-30,4,0.0276181,0.0189941,0.0202327,0.0236746 +2025-10-31,4,0.0303179,0.017822,0.0163651,0.0236746 +2025-11-01,4,0.0294957,0.0164758,0.0190368,0.0236746 +2025-11-02,4,0.0328474,0.016477,0.0170734,0.0236746 +2025-11-03,4,0.0299885,0.0172606,0.0205443,0.0236746 +2025-11-04,4,0.0225392,0.0194864,0.022756,0.0236746 +2025-11-05,4,0.0210998,0.0201585,0.0211684,0.0236746 +2025-11-06,4,0.0223177,0.0201471,0.0205278,0.0236746 +2025-11-07,4,0.0209301,0.0206947,0.020699,0.0236746 +2025-11-08,4,0.0220547,0.0202499,0.0184098,0.0236746 +2025-11-09,4,0.0242489,0.0192712,0.0225943,0.0236746 +2025-11-10,4,0.0242498,0.018983,0.0207397,0.0236746 +2025-11-11,4,0.0239167,0.0193765,0.0238488,0.0236746 +2025-11-12,4,0.0238058,0.019061,0.0206059,0.0236746 +2025-11-13,4,0.0271248,0.0193868,0.0226559,0.0236746 +2025-11-14,4,0.0158231,0.0205562,0.0215072,0.0236746 +2025-11-15,4,0.0228159,0.0205949,0.020989,0.0236746 +2025-11-16,4,0.0226727,0.0205061,0.0221101,0.0236746 +2025-11-17,4,0.0235607,0.0201771,0.0223258,0.0236746 +2025-11-18,4,0.0285222,0.0208659,0.0213249,0.0236746 +2025-11-19,4,0.0314568,0.0186159,0.0214741,0.0236746 +2025-11-20,4,0.0184471,0.0208249,0.0218221,0.0236746 +2025-11-21,4,0.0197716,0.0207957,0.0214413,0.0236746 +2025-11-22,4,0.0175558,0.0208179,0.0201629,0.0236746 +2025-11-23,4,0.0182122,0.0220638,0.0205698,0.0236746 +2025-11-24,4,0.018095,0.0226333,0.0208559,0.0236746 +2025-11-25,4,0.0169815,0.0199732,0.0191618,0.0236746 +2025-11-26,4,0.0211425,0.020416,0.0204498,0.0236746 +2025-11-27,4,0.0366517,0.0197105,0.0193665,0.0236746 +2025-11-28,4,0.037922,0.0197191,0.020687,0.0236746 +2025-11-29,4,0.0390353,0.0194997,0.0195067,0.0236746 +2025-11-30,4,0.0418476,0.0191218,0.0198917,0.0236746 +2025-12-01,4,0.0342064,0.0202895,0.020479,0.0236746 +2025-12-02,4,0.0214351,0.024213,0.0234203,0.0236746 +2025-12-03,4,0.0166919,0.0245261,0.0227985,0.0236746 +2025-12-04,4,0.0198875,0.0246834,0.0233068,0.0236746 +2025-12-05,4,0.0117537,0.0252015,0.0227393,0.0236746 +2025-12-06,4,0.01111,0.0233784,0.0224764,0.0236746 +2025-12-07,4,0.0172444,0.0211528,0.021404,0.0236746 +2025-12-08,4,0.0171789,0.0200166,0.0202053,0.0236746 +2025-12-09,4,0.0136899,0.0205733,0.0196411,0.0236746 +2025-12-10,4,0.0142442,0.0183594,0.0179044,0.0236746 +2025-12-11,4,0.0180505,0.0179917,0.0177608,0.0236746 +2025-12-12,4,0.0171907,0.0190992,0.0215345,0.0236746 +2025-12-13,4,0.0164082,0.018944,0.0196044,0.0236746 +2025-12-14,4,0.0225978,0.0182379,0.0207242,0.0236746 +2025-12-15,4,0.0196777,0.0183406,0.0205027,0.0236746 +2025-12-16,4,0.0185268,0.0193032,0.0217248,0.0236746 +2025-12-17,4,0.0146995,0.0191922,0.0208436,0.0236746 +2025-12-18,4,0.0157592,0.0185576,0.0201866,0.0236746 +2025-12-19,4,0.00648155,0.020242,0.0233467,0.0236746 +2025-12-20,4,0.00619571,0.0196431,0.0212343,0.0236746 +2025-12-21,4,0.00572596,0.0193991,0.0215175,0.0236746 +2025-12-22,4,0.00697364,0.0184217,0.021055,0.0236746 +2025-12-23,4,0.00362424,0.0180434,0.0209434,0.0236746 +2025-12-24,4,0.0052387,0.0137589,0.0123099,0.0236746 +2025-12-25,4,0.00831587,0.0132871,0.0120122,0.0236746 diff --git a/dashboard/data/oos_nifty.csv b/dashboard/data/oos_nifty.csv new file mode 100644 index 0000000..d7b3edc --- /dev/null +++ b/dashboard/data/oos_nifty.csv @@ -0,0 +1,3216 @@ +date,fold,actual_vol,har_vol,rf_vol,mean_vol +2012-11-22,0,0.00792803,0.0071189,0.00773741,0.00967035 +2012-11-23,0,0.00831105,0.00658906,0.00737078,0.00967035 +2012-11-26,0,0.00803099,0.00649326,0.00737524,0.00967035 +2012-11-27,0,0.00727108,0.00732753,0.00733356,0.00967035 +2012-11-29,0,0.0040295,0.00796169,0.00825091,0.00967035 +2012-11-30,0,0.00365452,0.00810512,0.0080429,0.00967035 +2012-12-03,0,0.00343727,0.0079836,0.00801086,0.00967035 +2012-12-04,0,0.00347413,0.00753485,0.0075313,0.00967035 +2012-12-05,0,0.00345036,0.00749472,0.00788227,0.00967035 +2012-12-06,0,0.00247227,0.0072962,0.0066218,0.00967035 +2012-12-07,0,0.00398491,0.00723193,0.006656,0.00967035 +2012-12-10,0,0.00407882,0.0072146,0.00738123,0.00967035 +2012-12-11,0,0.00553246,0.00728804,0.0074452,0.00967035 +2012-12-12,0,0.00591508,0.00724417,0.00744303,0.00967035 +2012-12-13,0,0.00479146,0.00719455,0.00670412,0.00967035 +2012-12-14,0,0.00747847,0.00712189,0.0067097,0.00967035 +2012-12-17,0,0.00737941,0.00718458,0.00679787,0.00967035 +2012-12-18,0,0.00783354,0.00713811,0.00759134,0.00967035 +2012-12-19,0,0.00760173,0.00670862,0.00748498,0.00967035 +2012-12-20,0,0.00849019,0.00668754,0.00765699,0.00967035 +2012-12-21,0,0.00577732,0.00738975,0.00678,0.00967035 +2012-12-24,0,0.0081012,0.00743159,0.00820855,0.00967035 +2012-12-26,0,0.00782455,0.00755791,0.00760883,0.00967035 +2012-12-27,0,0.00611972,0.00770025,0.00765592,0.00967035 +2012-12-28,0,0.00730696,0.00778565,0.0078298,0.00967035 +2012-12-31,0,0.00710191,0.007088,0.00809498,0.00967035 +2013-01-02,0,0.00379658,0.00698533,0.00763052,0.00967035 +2013-01-03,0,0.00331252,0.00676056,0.00791866,0.00967035 +2013-01-04,0,0.00303955,0.00666122,0.00819931,0.00967035 +2013-01-07,0,0.00670171,0.0068167,0.00754891,0.00967035 +2013-01-08,0,0.00696837,0.00682347,0.0081215,0.00967035 +2013-01-09,0,0.00810383,0.00669059,0.0068676,0.00967035 +2013-01-10,0,0.00834374,0.00659331,0.00760255,0.00967035 +2013-01-11,0,0.00781136,0.00662307,0.00745215,0.00967035 +2013-01-14,0,0.00627481,0.00726067,0.00675683,0.00967035 +2013-01-15,0,0.00666464,0.00730905,0.00768106,0.00967035 +2013-01-16,0,0.00450953,0.00748255,0.00731591,0.00967035 +2013-01-17,0,0.00472619,0.00753764,0.00759979,0.00967035 +2013-01-18,0,0.00626973,0.00745962,0.00747398,0.00967035 +2013-01-21,0,0.00609955,0.00733549,0.00795643,0.00967035 +2013-01-22,0,0.00580793,0.00743334,0.00766264,0.00967035 +2013-01-23,0,0.00580825,0.00727515,0.00774104,0.00967035 +2013-01-24,0,0.00529619,0.00693985,0.00698803,0.00967035 +2013-01-25,0,0.00291041,0.00719566,0.00724012,0.00967035 +2013-01-28,0,0.00259828,0.00706017,0.00811846,0.00967035 +2013-01-29,0,0.00274368,0.00700693,0.0073528,0.00967035 +2013-01-30,0,0.00253289,0.00692016,0.00816625,0.00967035 +2013-01-31,0,0.00253182,0.00694501,0.00747301,0.00967035 +2013-02-01,0,0.00253273,0.00621173,0.00694485,0.00967035 +2013-02-04,0,0.00268921,0.00616176,0.00758447,0.00967035 +2013-02-05,0,0.00384232,0.00624573,0.00686457,0.00967035 +2013-02-06,0,0.00402564,0.00616625,0.00760255,0.00967035 +2013-02-07,0,0.00458264,0.00617709,0.00726076,0.00967035 +2013-02-08,0,0.00386,0.00622357,0.00694485,0.00967035 +2013-02-11,0,0.00398534,0.00624145,0.00765535,0.00967035 +2013-02-12,0,0.00483774,0.00642323,0.00692351,0.00967035 +2013-02-13,0,0.00479396,0.00586241,0.00760066,0.00967035 +2013-02-14,0,0.00838046,0.00582435,0.00699429,0.00967035 +2013-02-15,0,0.00839642,0.00547887,0.00760526,0.00967035 +2013-02-18,0,0.00831079,0.00527789,0.00759523,0.00967035 +2013-02-19,0,0.00881441,0.00551002,0.00729566,0.00967035 +2013-02-20,0,0.0101266,0.00544214,0.00771739,0.00967035 +2013-02-21,0,0.0108604,0.00634254,0.00768739,0.00967035 +2013-02-22,0,0.0116586,0.00638927,0.00808182,0.00967035 +2013-02-25,0,0.0113192,0.00641119,0.0081066,0.00967035 +2013-02-26,0,0.0124514,0.00670557,0.00772289,0.00967035 +2013-02-27,0,0.0124271,0.00697991,0.00792855,0.00967035 +2013-02-28,0,0.00668294,0.0076889,0.00820699,0.00967035 +2013-03-01,0,0.00749851,0.00782588,0.00778656,0.00967035 +2013-03-04,0,0.006337,0.0078236,0.00801761,0.00967035 +2013-03-05,0,0.00729451,0.00851348,0.00877448,0.00967035 +2013-03-06,0,0.0098036,0.00863049,0.00845374,0.00967035 +2013-03-07,0,0.0102048,0.00849537,0.00942839,0.00967035 +2013-03-08,0,0.0077667,0.00892015,0.0088086,0.00967035 +2013-03-11,0,0.00784423,0.00883919,0.0084475,0.00967035 +2013-03-12,0,0.00950018,0.00887069,0.00859432,0.00967035 +2013-03-13,0,0.00931026,0.00918801,0.0089455,0.00967035 +2013-03-14,0,0.00396556,0.00934828,0.00911467,0.00967035 +2013-03-15,0,0.0051467,0.00928422,0.00885388,0.00967035 +2013-03-18,0,0.00554712,0.00928488,0.00888176,0.00967035 +2013-03-19,0,0.00408348,0.00972499,0.00900884,0.00967035 +2013-03-20,0,0.00510147,0.00977842,0.008797,0.00967035 +2013-03-21,0,0.00410317,0.00930731,0.00823351,0.00967035 +2013-03-22,0,0.00444845,0.00941845,0.00843563,0.00967035 +2013-03-25,0,0.00853001,0.0091516,0.00844916,0.00967035 +2013-03-26,0,0.0119884,0.00903275,0.00821141,0.00967035 +2013-03-28,0,0.0107235,0.00930777,0.00886438,0.00967035 +2013-04-01,0,0.00987146,0.00883209,0.00811829,0.00967035 +2013-04-02,0,0.00644881,0.00888722,0.00891979,0.00967035 +2013-04-03,0,0.0105814,0.00882542,0.00812549,0.00967035 +2013-04-04,0,0.00811891,0.00939817,0.00900942,0.00967035 +2013-04-05,0,0.00981896,0.00935243,0.00912597,0.00967035 +2013-04-08,0,0.0104111,0.00878519,0.00872809,0.00967035 +2013-04-09,0,0.0120513,0.00854533,0.0088414,0.00967035 +2013-04-10,0,0.0120625,0.00894211,0.00904224,0.00967035 +2013-04-11,0,0.013216,0.00842601,0.00862756,0.00967035 +2013-04-12,0,0.00835622,0.00864101,0.00855461,0.00967035 +2013-04-15,0,0.00954264,0.00886941,0.0096801,0.00967035 +2013-04-16,0,0.0074918,0.00969298,0.00870213,0.00967035 +2013-04-17,0,0.0098685,0.00947869,0.00821274,0.00967035 +2013-04-18,0,0.00811845,0.00994199,0.00896648,0.00967035 +2013-04-22,0,0.00771045,0.00978565,0.0092636,0.00967035 +2013-04-23,0,0.00828187,0.00944928,0.00844318,0.00967035 +2013-04-25,0,0.00900087,0.00939727,0.00805279,0.00967035 +2013-04-26,0,0.00765746,0.00954773,0.00927978,0.00967035 +2013-04-29,0,0.00861754,0.00946203,0.00862611,0.00967035 +2013-04-30,0,0.00861902,0.00939804,0.00857683,0.00967035 +2013-05-02,0,0.00815517,0.00953383,0.00840699,0.00967035 +2013-05-03,0,0.00554132,0.00974007,0.00885094,0.00967035 +2013-05-06,0,0.0120994,0.00966723,0.00942903,0.00967035 +2013-05-07,0,0.0104147,0.00980226,0.0089892,0.00967035 +2013-05-08,0,0.0159529,0.00941053,0.00867865,0.00967035 +2013-05-09,0,0.0156321,0.00870846,0.00790251,0.00967035 +2013-05-10,0,0.0155148,0.00845802,0.00895166,0.00967035 +2013-05-13,0,0.0112362,0.00956623,0.00902204,0.00967035 +2013-05-14,0,0.0126458,0.00925135,0.00854672,0.00967035 +2013-05-15,0,0.00476228,0.00994261,0.00906823,0.00967035 +2013-05-16,0,0.00886423,0.00993486,0.00932627,0.00967035 +2013-05-17,0,0.00884957,0.00950495,0.00864855,0.00967035 +2013-05-20,0,0.0137544,0.00950033,0.00923017,0.00967035 +2013-05-21,0,0.0137688,0.00924537,0.00861503,0.00967035 +2013-05-22,0,0.0136824,0.00887666,0.00821581,0.00967035 +2013-05-23,0,0.00667516,0.00964507,0.00991127,0.00967035 +2013-05-24,0,0.0143675,0.0095625,0.0097479,0.00967035 +2013-05-27,0,0.0111789,0.0100536,0.00929085,0.00967035 +2013-05-28,0,0.0100126,0.00990456,0.00925281,0.00967035 +2013-05-29,0,0.0102902,0.00978887,0.00911176,0.00967035 +2013-05-30,0,0.00957728,0.0095012,0.00961987,0.00967035 +2013-05-31,0,0.00378934,0.0105519,0.0106288,0.00967035 +2013-06-03,0,0.00306319,0.0103224,0.00982853,0.00967035 +2013-06-04,0,0.0067465,0.0102049,0.0104743,0.00967035 +2013-06-05,0,0.00609717,0.0101931,0.0100313,0.00967035 +2013-06-06,0,0.00562084,0.00994477,0.00966417,0.00967035 +2013-06-07,0,0.0132511,0.00954617,0.00956413,0.00967035 +2013-06-10,0,0.0139595,0.00944775,0.00913,0.00967035 +2013-06-11,0,0.0120995,0.0099061,0.0101574,0.00967035 +2013-06-12,0,0.0116615,0.009486,0.00992251,0.00967035 +2013-06-13,0,0.0179019,0.00952803,0.0089293,0.00967035 +2013-06-14,0,0.0142878,0.00942442,0.00870552,0.00967035 +2013-06-17,0,0.0128669,0.00953131,0.00920842,0.00967035 +2013-06-18,0,0.01406,0.00947067,0.00858105,0.00967035 +2013-06-19,0,0.0134448,0.00948639,0.00850312,0.00967035 +2013-06-20,0,0.0110657,0.0105174,0.0104378,0.00967035 +2013-06-21,0,0.0163973,0.0104455,0.0108904,0.00967035 +2013-06-24,0,0.0121046,0.010087,0.0100568,0.00967035 +2013-06-25,0,0.0143691,0.0101379,0.0100884,0.00967035 +2013-06-26,0,0.0173535,0.009552,0.00875293,0.00967035 +2013-06-27,0,0.0167306,0.00991936,0.0100956,0.00967035 +2013-06-28,0,0.0113823,0.0111654,0.0114648,0.00967035 +2013-07-01,0,0.0109271,0.0111384,0.0122616,0.00967035 +2013-07-02,0,0.0116062,0.0107709,0.0102887,0.00967035 +2013-07-03,0,0.00944353,0.0110099,0.0115165,0.00967035 +2013-07-04,0,0.0121465,0.0111471,0.0125527,0.00967035 +2013-07-05,0,0.0128257,0.0109927,0.0108384,0.00967035 +2013-07-08,0,0.0102059,0.0110613,0.0105831,0.00967035 +2013-07-09,0,0.013515,0.0111275,0.0100009,0.00967035 +2013-07-10,0,0.0122395,0.0110842,0.010262,0.00967035 +2013-07-11,0,0.00989212,0.0113314,0.0119143,0.00967035 +2013-07-12,0,0.00862172,0.0114795,0.0120178,0.00967035 +2013-07-15,0,0.00846545,0.0111824,0.0113093,0.00967035 +2013-07-16,0,0.00506146,0.0112484,0.0121109,0.00967035 +2013-07-17,0,0.00979751,0.0111682,0.0124402,0.00967035 +2013-07-18,0,0.00959793,0.0110768,0.0113192,0.00967035 +2013-07-19,0,0.00948286,0.0110385,0.0110804,0.00967035 +2013-07-22,0,0.00913353,0.00988517,0.00967484,0.00967035 +2013-07-23,0,0.00455734,0.0096708,0.00874081,0.00967035 +2013-07-24,0,0.00537082,0.00998381,0.0107227,0.00967035 +2013-07-25,0,0.00487494,0.0103188,0.0104573,0.00967035 +2013-07-26,0,0.00473958,0.0103214,0.0107026,0.00967035 +2013-07-29,0,0.00582049,0.0101751,0.00980081,0.00967035 +2013-07-30,0,0.0106781,0.00910367,0.00915952,0.00967035 +2013-07-31,0,0.0104743,0.00901914,0.00883578,0.00967035 +2013-08-01,0,0.012765,0.00893045,0.00864493,0.00967035 +2013-08-02,0,0.0139923,0.00871989,0.00829742,0.00967035 +2013-08-05,0,0.0161494,0.00860762,0.00853944,0.00967035 +2013-08-06,0,0.00705578,0.00956445,0.0103801,0.00967035 +2013-08-07,0,0.0232913,0.00956843,0.00985423,0.00967035 +2013-08-08,0,0.0236629,0.00965719,0.00923009,0.00967035 +2013-08-12,0,0.0225465,0.00980355,0.00955389,0.00967035 +2013-08-13,0,0.0186484,0.00956243,0.00987886,0.00967035 +2013-08-14,0,0.0226349,0.00902146,0.00989924,0.00967035 +2013-08-16,0,0.0169997,0.0112616,0.0112395,0.00967035 +2013-08-19,0,0.014569,0.0113908,0.0112434,0.00967035 +2013-08-20,0,0.0224266,0.0113098,0.0121095,0.00967035 +2013-08-21,0,0.0209722,0.0111272,0.0114295,0.00967035 +2013-08-22,0,0.0218447,0.0118384,0.011375,0.00967035 +2013-08-23,0,0.0218312,0.0118937,0.0121592,0.00967035 +2013-08-26,0,0.0227739,0.0116956,0.0117541,0.00967035 +2013-08-27,0,0.0241527,0.0126137,0.0122741,0.00967035 +2013-08-28,0,0.0252979,0.0125339,0.0125658,0.00967035 +2013-08-29,0,0.0258428,0.013131,0.0127289,0.00967035 +2013-08-30,0,0.0260895,0.0132606,0.0137793,0.00967035 +2013-09-02,0,0.0294252,0.0133814,0.01347,0.00967035 +2013-09-03,0,0.0128181,0.0142092,0.0130647,0.00967035 +2013-09-04,0,0.01891,0.0145306,0.0135942,0.00967035 +2013-09-05,0,0.0183897,0.0149411,0.0130755,0.00967035 +2013-09-06,0,0.01848,0.015075,0.0136389,0.00967035 +2013-09-10,0,0.00532823,0.0153724,0.0116178,0.00967035 +2013-09-11,0,0.00684859,0.0147854,0.0129066,0.00967035 +2013-09-12,0,0.0156379,0.0151339,0.0125029,0.00967035 +2013-09-13,0,0.0194484,0.0150982,0.0118028,0.00967035 +2013-09-16,0,0.022732,0.0149988,0.0117407,0.00967035 +2013-09-17,0,0.0227386,0.014202,0.0109749,0.00967035 +2013-09-18,0,0.0224414,0.0132703,0.0120083,0.00967035 +2013-09-19,0,0.0102893,0.0140552,0.0119142,0.00967035 +2013-09-20,0,0.00898043,0.0144409,0.0119857,0.00967035 +2013-09-23,0,0.00754346,0.0145701,0.012025,0.00967035 +2013-09-24,0,0.00941882,0.0144557,0.011463,0.00967035 +2013-09-25,0,0.015031,0.0145005,0.0121305,0.00967035 +2013-09-26,0,0.0150469,0.0139843,0.0120084,0.00967035 +2013-09-27,0,0.0142151,0.0130303,0.0121227,0.00967035 +2013-09-30,0,0.00932088,0.0131921,0.0118315,0.00967035 +2013-10-01,0,0.00979883,0.0130915,0.0122987,0.00967035 +2013-10-03,0,0.00559629,0.0135381,0.0122032,0.00967035 +2013-10-04,0,0.00613975,0.0134725,0.0116828,0.00967035 +2013-10-07,0,0.00547475,0.0121581,0.0116612,0.00967035 +2013-10-08,0,0.00731642,0.011729,0.0117253,0.00967035 +2013-10-09,0,0.00748693,0.0114221,0.0107427,0.00967035 +2013-10-10,0,0.0125039,0.0110019,0.00996412,0.00967035 +2013-10-11,0,0.0119071,0.00997065,0.0100781,0.00967035 +2013-10-14,0,0.0120378,0.009927,0.0100698,0.00967035 +2013-10-15,0,0.0120482,0.0099361,0.0104942,0.00967035 +2013-10-17,0,0.0112041,0.0100294,0.0105726,0.00967035 +2013-10-18,0,0.00258839,0.0106977,0.0115305,0.00967035 +2013-10-21,0,0.00250237,0.0106718,0.0108663,0.00967035 +2013-10-22,0,0.0107043,0.010654,0.011197,0.00967035 +2013-10-23,0,0.0104996,0.00936082,0.010332,0.00967035 +2013-10-24,0,0.0103351,0.00893413,0.0101474,0.00967035 +2013-10-25,0,0.00970271,0.0076994,0.00822324,0.00967035 +2013-10-28,0,0.010176,0.00780215,0.00896362,0.00967035 +2013-10-29,0,0.00696872,0.00874996,0.0106408,0.00967035 +2013-10-30,0,0.00649607,0.00874692,0.0103973,0.00967035 +2013-10-31,0,0.00388228,0.00857793,0.0100715,0.00967035 +2013-11-01,0,0.00218496,0.00789197,0.00921655,0.00967035 +2013-11-05,0,0.00246396,0.00813902,0.00961013,0.00967035 +2013-11-06,0,0.00273929,0.00754915,0.00831057,0.00967035 +2013-11-07,0,0.00885182,0.00759044,0.00853897,0.00967035 +2013-11-08,0,0.0142025,0.0075482,0.00861962,0.00967035 +2013-11-11,0,0.012643,0.00754231,0.00829374,0.00967035 +2013-11-12,0,0.0135231,0.0075182,0.00826543,0.00967035 +2013-11-13,0,0.0172177,0.00758181,0.00836686,0.00967035 +2013-11-14,0,0.0161575,0.00805701,0.00865414,0.00967035 +2013-11-18,0,0.0154687,0.00896169,0.00990988,0.00967035 +2013-11-19,0,0.0154523,0.00888731,0.00920122,0.00967035 +2013-11-20,0,0.0147663,0.00911441,0.0101964,0.00967035 +2013-11-21,0,0.010765,0.00895544,0.00959948,0.00967035 +2013-11-22,0,0.0114315,0.00891211,0.00910984,0.00967035 +2013-11-25,0,0.00861702,0.00948918,0.00986911,0.00967035 +2013-11-26,0,0.00642394,0.0096648,0.00919018,0.00967035 +2013-11-27,0,0.0080528,0.00964186,0.0091455,0.00967035 +2013-11-28,0,0.00914273,0.00957732,0.009159,0.00967035 +2013-11-29,0,0.00767455,0.00977215,0.00917128,0.00967035 +2013-12-02,0,0.00987702,0.00923183,0.00948095,0.00967035 +2013-12-03,0,0.0103432,0.00921671,0.0102995,0.00967035 +2013-12-04,0,0.00969524,0.00929171,0.0100275,0.00967035 +2013-12-05,0,0.0105777,0.00964481,0.00990257,0.00967035 +2013-12-06,0,0.0113768,0.0095052,0.00987367,0.00967035 +2013-12-09,0,0.00421555,0.0100241,0.0106053,0.00967035 +2013-12-10,0,0.00457975,0.0100474,0.00980985,0.00967035 +2013-12-11,0,0.0097381,0.00996598,0.0100798,0.00967035 +2013-12-12,0,0.00914439,0.0100238,0.0105496,0.00967035 +2013-12-13,0,0.010944,0.0100724,0.010297,0.00967035 +2013-12-16,0,0.0105782,0.00958169,0.00887054,0.00967035 +2013-12-17,0,0.0105812,0.00950879,0.0087645,0.00967035 +2013-12-18,0,0.00946384,0.00957116,0.00917812,0.00967035 +2013-12-19,0,0.00759566,0.0096646,0.00986737,0.00967035 +2013-12-20,0,0.00368454,0.00992375,0.00955499,0.00967035 +2013-12-23,0,0.00372,0.00916342,0.00889126,0.00967035 +2013-12-24,0,0.0073189,0.00918781,0.00868756,0.00967035 +2013-12-26,0,0.00710569,0.00856798,0.00875309,0.00967035 +2013-12-27,0,0.00566317,0.00830391,0.00866057,0.00967035 +2013-12-30,0,0.00567004,0.0081117,0.00787848,0.00967035 +2013-12-31,0,0.00565744,0.00809056,0.00759692,0.00967035 +2014-01-02,0,0.00252647,0.00845679,0.00772157,0.00967035 +2014-01-03,0,0.00271583,0.0083681,0.00782427,0.00967035 +2014-01-06,0,0.00804159,0.00828333,0.00782072,0.00967035 +2014-01-07,0,0.00809009,0.00824068,0.007732,0.00967035 +2014-01-08,0,0.00921196,0.00793165,0.00769631,0.00967035 +2014-01-09,0,0.00910901,0.00761133,0.00724218,0.00967035 +2014-01-10,0,0.0110529,0.00700143,0.00732951,0.00967035 +2014-01-13,0,0.00874799,0.00797201,0.00840381,0.00967035 +2014-01-14,0,0.00810576,0.00798949,0.00768519,0.00967035 +2014-01-15,0,0.00601833,0.0080848,0.00778156,0.00967035 +2014-01-16,0,0.00599905,0.00785154,0.00795849,0.00967035 +2014-01-17,0,0.00743465,0.00811289,0.00859903,0.00967035 +2014-01-20,0,0.0109018,0.00806124,0.00856572,0.00967035 +2014-01-21,0,0.0104839,0.00773604,0.0077414,0.00967035 +2014-01-22,0,0.00948846,0.00745748,0.00720634,0.00967035 +2014-01-23,0,0.00836856,0.00677404,0.00777505,0.00967035 +2014-01-24,0,0.00934624,0.00725097,0.00655996,0.00967035 +2014-01-27,0,0.00673253,0.00832578,0.00924608,0.00967035 +2014-01-28,0,0.00690991,0.00829977,0.00854872,0.00967035 +2014-01-29,0,0.00768673,0.00817483,0.00820411,0.00967035 +2014-01-30,0,0.00754466,0.00818787,0.00877763,0.00967035 +2014-01-31,0,0.00781975,0.0082478,0.00812537,0.00967035 +2014-02-03,0,0.00253988,0.00815967,0.00848911,0.00967035 +2014-02-04,0,0.00233468,0.00817611,0.00772537,0.00967035 +2014-02-05,0,0.00232353,0.00826569,0.00777295,0.00967035 +2014-02-06,0,0.00738882,0.00826917,0.00761862,0.00967035 +2014-02-07,0,0.00815097,0.00833538,0.00773179,0.00967035 +2014-02-10,0,0.0100307,0.00790958,0.0071553,0.00967035 +2014-02-11,0,0.0100418,0.00790301,0.00716775,0.00967035 +2014-02-12,0,0.0115595,0.00741197,0.0070559,0.00967035 +2014-02-13,0,0.00903904,0.00809633,0.00796078,0.00967035 +2014-02-14,0,0.00890979,0.00789835,0.00842113,0.00967035 +2014-02-18,0,0.00756104,0.00848061,0.00856636,0.00967035 +2014-02-19,0,0.0077376,0.00840325,0.00861813,0.00967035 +2014-02-20,0,0.00295768,0.00854629,0.00864981,0.00967035 +2014-02-21,0,0.00636113,0.00870924,0.00829886,0.00967035 +2014-02-24,0,0.00782737,0.00872082,0.00856541,0.00967035 +2014-02-25,0,0.00780338,0.00867154,0.0081415,0.00967035 +2014-02-26,0,0.00846759,0.00852427,0.00851542,0.00967035 +2014-02-28,0,0.0106567,0.00721952,0.00664781,0.00967035 +2014-03-03,0,0.00692916,0.00768834,0.00747947,0.00967035 +2014-03-04,0,0.00901255,0.00802808,0.00734027,0.00967035 +2014-03-05,0,0.00939702,0.00788329,0.00781306,0.00967035 +2014-03-06,0,0.00959176,0.00808991,0.00738921,0.00967035 +2014-03-07,0,0.00283934,0.00806802,0.00882396,0.00967035 +2014-03-10,0,0.00290056,0.00788612,0.00821171,0.00967035 +2014-03-11,0,0.00229905,0.00811542,0.00796373,0.00967035 +2014-03-12,0,0.00372446,0.00817228,0.00830051,0.00967035 +2014-03-13,0,0.00353311,0.0083087,0.00823151,0.00967035 +2014-03-14,0,0.00721781,0.00780414,0.00737553,0.00967035 +2014-03-18,0,0.00724767,0.00781168,0.00737604,0.00967035 +2014-03-19,0,0.00722928,0.00776258,0.00748652,0.00967035 +2014-03-20,0,0.00541801,0.00750349,0.00682534,0.00967035 +2014-03-21,0,0.00521639,0.0075007,0.00751266,0.00967035 +2014-03-24,0,0.00326376,0.00776442,0.00718362,0.00967035 +2014-03-25,0,0.00300731,0.00777819,0.00814225,0.00967035 +2014-03-26,0,0.00275071,0.00732258,0.00798922,0.00967035 +2014-03-27,0,0.00393022,0.00711096,0.00701898,0.00967035 +2014-03-28,0,0.00430961,0.00714438,0.00712841,0.00967035 +2014-03-31,0,0.00425455,0.00699837,0.0075369,0.00967035 +2014-04-01,0,0.00816405,0.00699281,0.00751595,0.00967035 +2014-04-02,0,0.00807918,0.00694766,0.00684012,0.00967035 +2014-04-03,0,0.00814271,0.00673394,0.00751447,0.00967035 +2014-04-04,0,0.00818355,0.00678027,0.00688031,0.00967035 +2014-04-07,0,0.00931557,0.00678107,0.00756233,0.00967035 +2014-04-09,0,0.00951632,0.00718232,0.00749592,0.00967035 +2014-04-10,0,0.00991427,0.00624989,0.00787406,0.00967035 +2014-04-11,0,0.00974497,0.00636717,0.00780032,0.00967035 +2014-04-15,0,0.00879042,0.0064846,0.00767748,0.00967035 +2014-04-16,0,0.00875708,0.00686098,0.0076128,0.00967035 +2014-04-17,0,0.00563311,0.00733067,0.00783876,0.00967035 +2014-04-21,0,0.00493732,0.00739819,0.00781484,0.00967035 +2014-04-22,0,0.00471961,0.00741381,0.00827194,0.00967035 +2014-04-23,0,0.00332354,0.00738154,0.00750565,0.00967035 +2014-04-25,0,0.00293643,0.00747794,0.00739013,0.00967035 +2014-04-28,0,0.00358395,0.00738853,0.00758416,0.00967035 +2014-04-29,0,0.00459931,0.00713496,0.0071979,0.00967035 +2014-04-30,0,0.00473088,0.00725988,0.00754182,0.00967035 +2014-05-02,0,0.0145324,0.00714156,0.00762602,0.00967035 +2014-05-05,0,0.016138,0.00701702,0.00762326,0.00967035 +2014-05-06,0,0.0157223,0.00694066,0.00755235,0.00967035 +2014-05-07,0,0.0129343,0.00723365,0.00687648,0.00967035 +2014-05-08,0,0.0127212,0.00728926,0.00774355,0.00967035 +2014-05-09,0,0.00908582,0.00943081,0.00886104,0.00967035 +2014-05-12,0,0.00577891,0.0101382,0.0087732,0.00967035 +2014-05-13,0,0.0048379,0.0101797,0.00893979,0.00967035 +2014-05-14,0,0.00570568,0.0100864,0.00822681,0.00967035 +2014-05-15,0,0.00562513,0.00982634,0.00806639,0.00967035 +2014-05-16,0,0.00601856,0.00977135,0.00880792,0.00967035 +2014-05-19,0,0.00598703,0.00955181,0.00966472,0.00967035 +2014-05-20,0,0.00705877,0.00939081,0.00832272,0.00967035 +2014-05-21,0,0.00664793,0.00928712,0.0085483,0.00967035 +2014-05-22,0,0.00933775,0.00905726,0.00839485,0.00967035 +2014-05-23,0,0.00573616,0.00919886,0.0077476,0.00967035 +2014-05-26,0,0.0115223,0.00924396,0.00880529,0.00967035 +2014-05-27,0,0.011365,0.00944586,0.00875365,0.00967035 +2014-05-28,0,0.0115472,0.00918389,0.00849745,0.00967035 +2014-05-29,0,0.00820407,0.00965465,0.00820214,0.00967035 +2014-05-30,0,0.00764873,0.00929681,0.00847987,0.00967035 +2014-06-02,0,0.00600325,0.0098239,0.00909065,0.00967035 +2014-06-03,0,0.00691068,0.00982026,0.00928333,0.00967035 +2014-06-04,0,0.00754531,0.00988594,0.00849659,0.00967035 +2014-06-05,0,0.00731633,0.00974858,0.00902455,0.00967035 +2014-06-06,0,0.00875917,0.00948177,0.00888971,0.00967035 +2014-06-09,0,0.00663309,0.00940262,0.0086965,0.00967035 +2014-06-10,0,0.00990231,0.00848447,0.00812884,0.00967035 +2014-06-11,0,0.0106848,0.00796683,0.00790232,0.00967035 +2014-06-12,0,0.0103433,0.00772978,0.00772066,0.00967035 +2014-06-13,0,0.0083615,0.00839603,0.00876002,0.00967035 +2014-06-16,0,0.0083932,0.00831271,0.00823367,0.00967035 +2014-06-17,0,0.0078035,0.00852055,0.00854942,0.00967035 +2014-06-18,0,0.00633948,0.00873177,0.0094837,0.00967035 +2014-06-19,0,0.00790242,0.00876084,0.00877183,0.00967035 +2014-06-20,0,0.00785771,0.00868121,0.00832332,0.00967035 +2014-06-23,0,0.00970001,0.0087272,0.00809729,0.00967035 +2014-06-24,0,0.00853683,0.00864549,0.00785697,0.00967035 +2014-06-25,0,0.00942427,0.00856213,0.00842243,0.00967035 +2014-06-26,0,0.00648733,0.00878003,0.00796656,0.00967035 +2014-06-27,0,0.00620474,0.00878622,0.0081201,0.00967035 +2014-06-30,0,0.00472206,0.00871059,0.00892601,0.00967035 +2014-07-01,0,0.0126137,0.00863968,0.00810688,0.00967035 +2014-07-02,0,0.0106813,0.0083415,0.00813926,0.00967035 +2014-07-03,0,0.0106385,0.00816443,0.00804462,0.00967035 +2014-07-04,0,0.0102036,0.00814569,0.00791718,0.00967035 +2014-07-07,0,0.008788,0.00793458,0.00715875,0.00967035 +2014-07-08,0,0.00865064,0.00888494,0.0088003,0.00967035 +2014-07-09,0,0.0108135,0.00868577,0.00886107,0.00967035 +2014-07-10,0,0.0106542,0.00869043,0.00856905,0.00967035 +2014-07-11,0,0.00566851,0.00896581,0.00931466,0.00967035 +2014-07-14,0,0.00490466,0.00889006,0.00805815,0.00967035 +2014-07-15,0,0.0051367,0.00876447,0.00847878,0.00967035 +2014-07-16,0,0.00360905,0.00912475,0.00846632,0.00967035 +2014-07-17,0,0.00337284,0.00883748,0.00868654,0.00967035 +2014-07-18,0,0.00569547,0.00840891,0.00786404,0.00967035 +2014-07-21,0,0.0069156,0.00835866,0.00768839,0.00967035 +2014-07-22,0,0.00539482,0.00849272,0.00763855,0.00967035 +2014-07-23,0,0.00649347,0.00834313,0.00777113,0.00967035 +2014-07-24,0,0.00762512,0.00815708,0.00763628,0.00967035 +2014-07-25,0,0.0106667,0.00841779,0.00823651,0.00967035 +2014-07-28,0,0.0115196,0.00831929,0.00811688,0.00967035 +2014-07-30,0,0.011687,0.0082499,0.00747192,0.00967035 +2014-07-31,0,0.0112206,0.00822625,0.0082287,0.00967035 +2014-08-01,0,0.00986949,0.00869201,0.00875148,0.00967035 +2014-08-04,0,0.00904055,0.00889645,0.00901371,0.00967035 +2014-08-05,0,0.0105357,0.00912527,0.00966757,0.00967035 +2014-08-06,0,0.00920806,0.00925719,0.00880621,0.00967035 +2014-08-07,0,0.00898122,0.00919667,0.0087836,0.00967035 +2014-08-08,0,0.0043515,0.00848393,0.00874797,0.00967035 +2014-08-11,0,0.0049009,0.0085269,0.00915931,0.00967035 +2014-08-12,0,0.00507849,0.00886541,0.00896015,0.00967035 +2014-08-13,0,0.00503959,0.00831785,0.0083853,0.00967035 +2014-08-14,0,0.00478642,0.00834141,0.00909375,0.00967035 +2014-08-18,0,0.00254543,0.0080752,0.00727351,0.00967035 +2014-08-19,0,0.002258,0.00789021,0.00735296,0.00967035 +2014-08-20,0,0.00202763,0.00794016,0.00742105,0.00967035 +2014-08-21,0,0.00204916,0.00793985,0.00756384,0.00967035 +2014-08-22,0,0.00402189,0.0079211,0.00737526,0.00967035 +2014-08-25,0,0.00369678,0.0075306,0.0074307,0.00967035 +2014-08-26,0,0.00275083,0.00747274,0.00737374,0.00967035 +2014-08-27,0,0.00440619,0.00747607,0.0069455,0.00967035 +2014-08-28,0,0.00496539,0.00741487,0.00735022,0.00967035 +2014-09-01,0,0.00544147,0.0076852,0.00711828,0.00967035 +2014-09-02,0,0.00565971,0.00769001,0.0075729,0.00967035 +2014-09-03,0,0.00668924,0.00734918,0.00669727,0.00967035 +2014-09-04,0,0.00662809,0.00672102,0.00742888,0.00967035 +2014-09-05,0,0.00670266,0.00660508,0.00762728,0.00967035 +2014-09-08,0,0.0043317,0.00673193,0.00656276,0.00967035 +2014-09-09,0,0.00628979,0.00634774,0.00772931,0.00967035 +2014-09-10,0,0.00775559,0.00664564,0.0077395,0.00967035 +2014-09-11,0,0.0120429,0.00606969,0.00800514,0.00967035 +2014-09-12,0,0.0120065,0.00601302,0.00803302,0.00967035 +2014-09-15,0,0.0110867,0.00583838,0.00708871,0.00967035 +2014-09-16,0,0.0119328,0.00670819,0.00689651,0.00967035 +2014-09-17,0,0.0118819,0.00673261,0.00742762,0.00967035 +2014-09-18,0,0.00819527,0.00735057,0.00808978,0.00967035 +2014-09-19,0,0.00969249,0.00736241,0.00815891,0.00967035 +2014-09-22,0,0.00910548,0.00729246,0.00807407,0.00967035 +2014-09-23,0,0.00667093,0.00804552,0.00869435,0.00967035 +2014-09-24,0,0.00668641,0.00804599,0.00816333,0.00967035 +2014-09-25,0,0.00684086,0.00821388,0.00740523,0.00967035 +2014-09-26,0,0.0049406,0.00837763,0.00907474,0.00967035 +2014-09-29,0,0.00961051,0.00835344,0.00830672,0.00967035 +2014-09-30,0,0.0111302,0.00822309,0.00822193,0.00967035 +2014-10-01,0,0.0114272,0.00804417,0.00812854,0.00967035 +2014-10-07,0,0.0100179,0.008156,0.00761913,0.00967035 +2014-10-08,0,0.0121554,0.00806816,0.00777438,0.00967035 +2014-10-09,0,0.00878633,0.00883076,0.00934447,0.00967035 +2014-10-10,0,0.0101687,0.00911935,0.0088846,0.00967035 +2014-10-13,0,0.0104483,0.00893417,0.00866303,0.00967035 +2014-10-14,0,0.0106541,0.00887672,0.00870316,0.00967035 +2014-10-16,0,0.00495198,0.00919426,0.00927097,0.00967035 +2014-10-17,0,0.00490973,0.00915306,0.00861018,0.00967035 +2014-10-20,0,0.00361041,0.00951818,0.00830564,0.00967035 +2014-10-21,0,0.00413107,0.00952893,0.00896089,0.00967035 +2014-10-22,0,0.00705983,0.00933387,0.00947459,0.00967035 +2014-10-27,0,0.00683509,0.0089817,0.00804558,0.00967035 +2014-10-28,0,0.00730586,0.00844677,0.00747494,0.00967035 +2014-10-29,0,0.00807586,0.00844132,0.00859866,0.00967035 +2014-10-30,0,0.0080332,0.00864303,0.00827379,0.00967035 +2014-10-31,0,0.00098351,0.00885781,0.00884839,0.00967035 +2014-11-03,0,0.00106904,0.00882784,0.00822729,0.00967035 +2014-11-05,0,0.00222831,0.00852701,0.0080401,0.00967035 +2014-11-07,0,0.00262593,0.00858991,0.00801934,0.00967035 +2014-11-10,0,0.00304744,0.00858673,0.00816409,0.00967035 +2014-11-11,0,0.00326126,0.00778398,0.00756634,0.00967035 +2014-11-12,0,0.0043223,0.00779798,0.00766753,0.00967035 +2014-11-13,0,0.00404401,0.00771089,0.00740729,0.00967035 +2014-11-14,0,0.00535517,0.00776637,0.00725756,0.00967035 +2014-11-17,0,0.00556103,0.00750221,0.00688136,0.00967035 +2014-11-18,0,0.00723259,0.0069594,0.00761209,0.00967035 +2014-11-19,0,0.00640028,0.00722613,0.00689436,0.00967035 +2014-11-20,0,0.00639994,0.00712963,0.0075841,0.00967035 +2014-11-21,0,0.00698667,0.00625937,0.00710103,0.00967035 +2014-11-24,0,0.00712233,0.00628176,0.00729176,0.00967035 +2014-11-25,0,0.00602659,0.00653611,0.00781603,0.00967035 +2014-11-26,0,0.00602664,0.00647766,0.00813767,0.00967035 +2014-11-27,0,0.00607003,0.00636743,0.00806932,0.00967035 +2014-11-28,0,0.00324769,0.00655553,0.00683065,0.00967035 +2014-12-01,0,0.00581683,0.00670642,0.00763817,0.00967035 +2014-12-02,0,0.00707664,0.00669202,0.00749925,0.00967035 +2014-12-03,0,0.00713416,0.0065102,0.00813716,0.00967035 +2014-12-04,0,0.00582951,0.00540652,0.00783404,0.00967035 +2014-12-05,0,0.00553236,0.00533092,0.00737495,0.00967035 +2014-12-08,0,0.00563677,0.006109,0.0066549,0.00967035 +2014-12-09,0,0.00800743,0.0066349,0.00658462,0.00967035 +2014-12-10,0,0.0067179,0.00664535,0.00800561,0.00967035 +2014-12-11,0,0.0126823,0.00674428,0.0075563,0.00967035 +2014-12-12,0,0.0131475,0.00686581,0.00719656,0.00967035 +2014-12-15,0,0.0141584,0.00686764,0.00787612,0.00967035 +2014-12-16,0,0.0101647,0.00767009,0.00736738,0.00967035 +2014-12-17,0,0.0119867,0.00750531,0.00712696,0.00967035 +2014-12-18,0,0.00984429,0.00844728,0.00887953,0.00967035 +2014-12-19,0,0.00945368,0.00863804,0.00944171,0.00967035 +2014-12-22,0,0.00706349,0.00895412,0.00902232,0.00967035 +2014-12-23,0,0.00681404,0.00874984,0.00930131,0.00967035 +2014-12-24,0,0.00496894,0.0088603,0.00868082,0.00967035 +2014-12-26,0,0.00598351,0.00875003,0.0086048,0.00967035 +2014-12-29,0,0.0164898,0.00886349,0.00892473,0.00967035 +2014-12-30,0,0.016398,0.00872505,0.00821943,0.00967035 +2014-12-31,0,0.018564,0.00849107,0.00836315,0.00967035 +2015-01-02,0,0.0173462,0.00874967,0.00794822,0.00967035 +2015-01-05,0,0.0176601,0.0088134,0.00845331,0.00967035 +2015-01-06,0,0.00792324,0.0104307,0.00891572,0.00967035 +2015-01-07,0,0.00781585,0.0103826,0.00928973,0.00967035 +2015-01-08,0,0.0117007,0.0109051,0.0106918,0.00967035 +2015-01-09,0,0.0118321,0.0107847,0.0100443,0.00967035 +2015-01-12,0,0.0118383,0.0106945,0.0103703,0.00967035 +2015-01-13,0,0.0116796,0.0103398,0.00990244,0.00967035 +2015-01-14,0,0.0102903,0.0102646,0.00964802,0.00967035 +2015-01-15,0,0.00597773,0.0110648,0.0100953,0.00967035 +2015-01-16,0,0.00559798,0.0111232,0.0105142,0.00967035 +2015-01-19,0,0.00532499,0.0105611,0.00985631,0.00967035 +2015-01-20,0,0.00344971,0.0107023,0.00999701,0.00967035 +2015-01-21,0,0.00342481,0.0104254,0.0101932,0.00967035 +2015-01-22,0,0.0101954,0.010137,0.00990326,0.00967035 +2015-01-23,0,0.00933361,0.0100268,0.00964611,0.00967035 +2015-01-27,0,0.00777617,0.00990009,0.00942703,0.00967035 +2015-01-28,0,0.00746899,0.00940783,0.00866428,0.00967035 +2015-01-29,0,0.00616077,0.00941496,0.00901453,0.00967035 +2015-01-30,0,0.00200552,0.0104613,0.0102433,0.00967035 +2015-02-02,0,0.00551143,0.0104317,0.0102544,0.00967035 +2015-02-03,0,0.00740749,0.0104068,0.0101891,0.00967035 +2015-02-04,0,0.00907956,0.0102552,0.00994488,0.00967035 +2015-02-05,0,0.0105678,0.0101555,0.00981072,0.00967035 +2015-02-06,0,0.010875,0.00813512,0.00783772,0.00967035 +2015-02-09,0,0.00415464,0.00900853,0.00857011,0.00967035 +2015-02-10,0,0.00401172,0.00880175,0.00839075,0.00967035 +2015-02-11,0,0.00438294,0.00890063,0.00887396,0.00967035 +2015-02-12,0,0.00669671,0.0090473,0.0089893,0.00967035 +2015-02-13,0,0.00664053,0.00911689,0.00859078,0.00967035 +2015-02-16,0,0.00666532,0.00867915,0.0076487,0.00967035 +2015-02-18,0,0.00527878,0.00768139,0.00739233,0.00967035 +2015-02-19,0,0.00512455,0.00772366,0.00704545,0.00967035 +2015-02-20,0,0.0112747,0.00801897,0.00872294,0.00967035 +2015-02-23,0,0.0109968,0.00768054,0.00781346,0.00967035 +2015-02-24,0,0.0108071,0.00765314,0.00790296,0.00967035 +2015-02-25,0,0.012366,0.00754261,0.0073999,0.00967035 +2015-02-26,0,0.0102323,0.00754878,0.00708445,0.00967035 +2015-02-27,0,0.0127193,0.00838105,0.00929246,0.00967035 +2015-03-02,0,0.0097597,0.00866197,0.00876782,0.00967035 +2015-03-03,0,0.00855444,0.00865528,0.00902969,0.00967035 +2015-03-04,0,0.0108441,0.00831029,0.00926161,0.00967035 +2015-03-05,0,0.011419,0.00823274,0.00860474,0.00967035 +2015-03-09,0,0.00841184,0.00904143,0.00852218,0.00967035 +2015-03-10,0,0.0100603,0.00896638,0.00878616,0.00967035 +2015-03-11,0,0.0102613,0.0089105,0.00863459,0.00967035 +2015-03-12,0,0.00905871,0.00906936,0.00902252,0.00967035 +2015-03-13,0,0.00712788,0.00901753,0.00906034,0.00967035 +2015-03-16,0,0.00713158,0.00886794,0.00854847,0.00967035 +2015-03-17,0,0.0026187,0.00907676,0.0082467,0.00967035 +2015-03-18,0,0.00288769,0.00896556,0.00903078,0.00967035 +2015-03-19,0,0.00902494,0.00876847,0.00844104,0.00967035 +2015-03-20,0,0.00950113,0.00873416,0.00893192,0.00967035 +2015-03-23,0,0.0142736,0.00863481,0.00783853,0.00967035 +2015-03-24,0,0.0142839,0.0082077,0.00769991,0.00967035 +2015-03-25,0,0.01531,0.00821782,0.00771521,0.00967035 +2015-03-26,0,0.00773591,0.00922747,0.0088265,0.00967035 +2015-03-27,0,0.00770281,0.00924652,0.00843988,0.00967035 +2015-03-30,0,0.00507188,0.00997455,0.00928767,0.00967035 +2015-03-31,0,0.00412595,0.00987633,0.0088134,0.00967035 +2015-04-01,0,0.00403807,0.00956308,0.0088728,0.00967035 +2015-04-06,0,0.0035385,0.0090988,0.00920417,0.00967035 +2015-04-07,0,0.0091419,0.00919298,0.00808805,0.00967035 +2015-04-08,0,0.0100651,0.00903143,0.00811311,0.00967035 +2015-04-09,0,0.0103934,0.00907218,0.00837983,0.00967035 +2015-04-10,0,0.00942549,0.0083923,0.00752485,0.00967035 +2015-04-13,0,0.00946252,0.00834262,0.00776151,0.00967035 +2015-04-16,0,0.00922231,0.00907524,0.00886469,0.00967035 +2015-04-17,0,0.00916582,0.00916518,0.00822828,0.00967035 +2015-04-20,0,0.00725568,0.00942821,0.00921158,0.00967035 +2015-04-21,0,0.00935615,0.0094565,0.00910798,0.00967035 +2015-04-22,0,0.00811334,0.0093214,0.00842523,0.00967035 +2015-04-23,0,0.00816691,0.00935642,0.00867463,0.00967035 +2015-04-24,0,0.0123435,0.00945509,0.00807567,0.00967035 +2015-04-27,0,0.0106491,0.00942262,0.00856716,0.00967035 +2015-04-28,0,0.016414,0.00970301,0.00923697,0.00967035 +2015-04-29,0,0.0164073,0.00967569,0.00961641,0.00967035 +2015-04-30,0,0.0187037,0.00971595,0.0100611,0.00967035 +2015-05-04,0,0.0182328,0.0097054,0.00917384,0.00967035 +2015-05-05,0,0.0211813,0.0096793,0.00900333,0.00967035 +2015-05-06,0,0.0177405,0.0102761,0.00935321,0.00967035 +2015-05-07,0,0.0173927,0.0102792,0.0102536,0.00967035 +2015-05-08,0,0.0160298,0.0105347,0.00995945,0.00967035 +2015-05-11,0,0.0154327,0.0107682,0.01132,0.00967035 +2015-05-12,0,0.00727214,0.0113455,0.0118803,0.00967035 +2015-05-13,0,0.00609614,0.0114572,0.0122674,0.00967035 +2015-05-14,0,0.00584579,0.0113368,0.0125639,0.00967035 +2015-05-15,0,0.00584665,0.011352,0.0128813,0.00967035 +2015-05-18,0,0.0066965,0.0115191,0.0117758,0.00967035 +2015-05-19,0,0.00689543,0.010974,0.0104999,0.00967035 +2015-05-20,0,0.00554582,0.0108346,0.0104621,0.00967035 +2015-05-21,0,0.00545777,0.0104589,0.0100298,0.00967035 +2015-05-22,0,0.0088627,0.0103944,0.0102164,0.00967035 +2015-05-25,0,0.00695642,0.0105406,0.0098125,0.00967035 +2015-05-26,0,0.0134049,0.0105633,0.0106716,0.00967035 +2015-05-27,0,0.0140105,0.0103132,0.00981594,0.00967035 +2015-05-28,0,0.0140931,0.0101548,0.00997246,0.00967035 +2015-05-29,0,0.0102299,0.0104994,0.0104934,0.00967035 +2015-06-01,0,0.00929387,0.0103834,0.010059,0.00967035 +2015-06-02,0,0.00505871,0.0112887,0.012035,0.00967035 +2015-06-03,0,0.00786088,0.011067,0.0122046,0.00967035 +2015-06-04,0,0.0117683,0.0110768,0.0118559,0.00967035 +2015-06-05,0,0.0121007,0.00998921,0.0099318,0.00967035 +2015-06-08,0,0.0119924,0.0100573,0.00954272,0.00967035 +2015-06-09,0,0.0121054,0.00939113,0.0090582,0.00967035 +2015-06-10,0,0.0106663,0.00940323,0.00935385,0.00967035 +2015-06-11,0,0.00304248,0.00927521,0.0088512,0.00967035 +2015-06-12,0,0.00254564,0.00898776,0.00846901,0.00967035 +2015-06-15,0,0.00460076,0.00902538,0.00870466,0.00967035 +2015-06-16,0,0.00478018,0.00903404,0.00854288,0.00967035 +2015-06-17,0,0.0067879,0.00868389,0.00912802,0.00967035 +2015-06-18,0,0.00649374,0.00838869,0.00754389,0.00967035 +2015-06-19,0,0.00724009,0.00830089,0.00796722,0.00967035 +2015-06-22,0,0.00485571,0.00891122,0.00935834,0.00967035 +2015-06-23,0,0.00551785,0.00891151,0.00884345,0.00967035 +2015-06-24,0,0.00694905,0.00890375,0.0090216,0.00967035 +2015-06-25,0,0.00693333,0.00894895,0.00915723,0.00967035 +2015-06-26,0,0.00682745,0.00900154,0.00876209,0.00967035 +2015-06-29,0,0.00395111,0.00895194,0.00889078,0.00967035 +2015-06-30,0,0.00470161,0.00875881,0.00873244,0.00967035 +2015-07-01,0,0.00905547,0.00902337,0.00816481,0.00967035 +2015-07-02,0,0.00906347,0.00800714,0.00830047,0.00967035 +2015-07-03,0,0.00888625,0.00762346,0.00791705,0.00967035 +2015-07-06,0,0.01082,0.00742967,0.00689332,0.00967035 +2015-07-07,0,0.0108264,0.00748729,0.00734314,0.00967035 +2015-07-08,0,0.00644203,0.00822942,0.00873188,0.00967035 +2015-07-09,0,0.00500586,0.00826243,0.00827014,0.00967035 +2015-07-10,0,0.00571873,0.00804248,0.00824465,0.00967035 +2015-07-13,0,0.00520482,0.0072658,0.0071538,0.00967035 +2015-07-14,0,0.00747706,0.00733024,0.00818382,0.00967035 +2015-07-15,1,0.00845974,0.00722494,0.0077595,0.00862394 +2015-07-16,1,0.00785949,0.00717158,0.00675957,0.00862394 +2015-07-17,1,0.00851947,0.00724148,0.00731048,0.00862394 +2015-07-20,1,0.0112846,0.00710412,0.00809314,0.00862394 +2015-07-21,1,0.0112057,0.00744196,0.00748347,0.00862394 +2015-07-22,1,0.0085937,0.00738526,0.0068174,0.00862394 +2015-07-23,1,0.0100916,0.00740411,0.00754117,0.00862394 +2015-07-24,1,0.0121759,0.00755699,0.00784973,0.00862394 +2015-07-27,1,0.00592078,0.00822801,0.00795314,0.00862394 +2015-07-28,1,0.00597904,0.00822958,0.0075268,0.00862394 +2015-07-29,1,0.00602954,0.00793768,0.00783031,0.00862394 +2015-07-30,1,0.00606203,0.00802416,0.00782256,0.00862394 +2015-07-31,1,0.00379032,0.00821046,0.00790929,0.00862394 +2015-08-03,1,0.00443824,0.00775787,0.00843506,0.00862394 +2015-08-04,1,0.00541809,0.00767394,0.00775936,0.00862394 +2015-08-05,1,0.00585014,0.00767857,0.00821606,0.00862394 +2015-08-06,1,0.00534088,0.00768325,0.00792261,0.00862394 +2015-08-07,1,0.0124833,0.00702792,0.00521191,0.00862394 +2015-08-10,1,0.0125042,0.00709581,0.00571665,0.00862394 +2015-08-11,1,0.0120207,0.00728772,0.00693764,0.00862394 +2015-08-12,1,0.0093429,0.00740117,0.00691589,0.00862394 +2015-08-13,1,0.0124322,0.00735461,0.00678031,0.00862394 +2015-08-14,1,0.00686064,0.00827494,0.00813524,0.00862394 +2015-08-17,1,0.025831,0.00816085,0.0088296,0.00862394 +2015-08-18,1,0.0277088,0.00813477,0.0077916,0.00862394 +2015-08-19,1,0.0260915,0.00800773,0.00815329,0.00862394 +2015-08-20,1,0.0310841,0.00835996,0.00792125,0.00862394 +2015-08-21,1,0.0320351,0.00784542,0.00845901,0.00862394 +2015-08-24,1,0.0120915,0.0119043,0.0130074,0.00862394 +2015-08-25,1,0.0166636,0.0120057,0.0140168,0.00862394 +2015-08-26,1,0.0163686,0.0118457,0.0141749,0.00862394 +2015-08-27,1,0.0143787,0.0123429,0.013608,0.00862394 +2015-08-28,1,0.0150997,0.0123934,0.0140483,0.00862394 +2015-08-31,1,0.0148792,0.0115064,0.0125042,0.00862394 +2015-09-01,1,0.0169752,0.0119118,0.0121939,0.00862394 +2015-09-02,1,0.0183984,0.0118783,0.0132128,0.00862394 +2015-09-03,1,0.0174168,0.011909,0.0125283,0.00862394 +2015-09-04,1,0.0130953,0.012093,0.0126189,0.00862394 +2015-09-07,1,0.00959594,0.0120878,0.0132748,0.00862394 +2015-09-08,1,0.00967547,0.0124721,0.0135815,0.00862394 +2015-09-09,1,0.0073494,0.0127806,0.0138917,0.00862394 +2015-09-10,1,0.00723813,0.0127122,0.0137804,0.00862394 +2015-09-11,1,0.0073691,0.0124078,0.0126438,0.00862394 +2015-09-14,1,0.0126896,0.0121875,0.0129261,0.00862394 +2015-09-15,1,0.0126845,0.0119764,0.0128805,0.00862394 +2015-09-16,1,0.0119413,0.0118149,0.0129279,0.00862394 +2015-09-18,1,0.0104853,0.0118866,0.0129972,0.00862394 +2015-09-21,1,0.0115181,0.0118881,0.0126003,0.00862394 +2015-09-22,1,0.00820056,0.0124878,0.0135159,0.00862394 +2015-09-23,1,0.00829614,0.0124927,0.0138194,0.00862394 +2015-09-24,1,0.01167,0.0104652,0.0105496,0.00862394 +2015-09-28,1,0.00822912,0.0103722,0.0102472,0.00862394 +2015-09-29,1,0.00860571,0.0103801,0.0102763,0.00862394 +2015-09-30,1,0.00999182,0.00997927,0.0095429,0.00862394 +2015-10-01,1,0.009742,0.00995254,0.010105,0.00862394 +2015-10-05,1,0.00603269,0.0105304,0.0093547,0.00862394 +2015-10-06,1,0.00572466,0.00979849,0.00981219,0.00862394 +2015-10-07,1,0.00541897,0.0097253,0.0099807,0.00862394 +2015-10-08,1,0.00646216,0.00976546,0.00978124,0.00862394 +2015-10-09,1,0.00640287,0.00922798,0.0104072,0.00862394 +2015-10-12,1,0.00519068,0.00872968,0.0088552,0.00862394 +2015-10-13,1,0.00522659,0.00849598,0.00881477,0.00862394 +2015-10-14,1,0.00475888,0.00823865,0.00785646,0.00862394 +2015-10-15,1,0.00398228,0.00836715,0.00841532,0.00862394 +2015-10-16,1,0.00413261,0.00838304,0.0087199,0.00862394 +2015-10-19,1,0.00373636,0.00817027,0.0080918,0.00862394 +2015-10-20,1,0.00476398,0.00811593,0.00748275,0.00862394 +2015-10-21,1,0.00520501,0.00801529,0.00701205,0.00862394 +2015-10-23,1,0.00184149,0.00781267,0.00694993,0.00862394 +2015-10-26,1,0.00247927,0.00787232,0.00693476,0.00862394 +2015-10-27,1,0.00380114,0.00708781,0.00654507,0.00862394 +2015-10-28,1,0.00334707,0.00736398,0.0069058,0.00862394 +2015-10-29,1,0.00448083,0.00752737,0.00697448,0.00862394 +2015-10-30,1,0.00461023,0.00688374,0.00667408,0.00862394 +2015-11-02,1,0.00466048,0.00701593,0.00681924,0.00862394 +2015-11-03,1,0.00670942,0.00697125,0.00690595,0.00862394 +2015-11-04,1,0.00668186,0.00692343,0.00677115,0.00862394 +2015-11-05,1,0.00829095,0.00635519,0.00659244,0.00862394 +2015-11-06,1,0.0089193,0.00630148,0.00680446,0.00862394 +2015-11-09,1,0.0101524,0.00629103,0.00669871,0.00862394 +2015-11-10,1,0.0103859,0.00696942,0.00710509,0.00862394 +2015-11-13,1,0.0101191,0.00676057,0.00691308,0.00862394 +2015-11-16,1,0.0100152,0.00696149,0.00656745,0.00862394 +2015-11-17,1,0.00995552,0.00707361,0.00655312,0.00862394 +2015-11-18,1,0.00671477,0.00743318,0.00690031,0.00862394 +2015-11-19,1,0.00437271,0.00773677,0.0070114,0.00862394 +2015-11-20,1,0.00464965,0.00758439,0.0067012,0.00862394 +2015-11-23,1,0.00435452,0.00749224,0.0069344,0.00862394 +2015-11-24,1,0.00456302,0.00718926,0.00737471,0.00862394 +2015-11-26,1,0.00596542,0.00711738,0.00785029,0.00862394 +2015-11-27,1,0.00536347,0.0069486,0.00728323,0.00862394 +2015-11-30,1,0.00521354,0.00693107,0.00772814,0.00862394 +2015-12-01,1,0.00370198,0.00691683,0.00735073,0.00862394 +2015-12-02,1,0.00368392,0.00688482,0.00697161,0.00862394 +2015-12-03,1,0.00860305,0.0069894,0.00744972,0.00862394 +2015-12-04,1,0.0084448,0.00703896,0.00653016,0.00862394 +2015-12-07,1,0.0095152,0.00700194,0.00680058,0.00862394 +2015-12-08,1,0.00978512,0.00682243,0.00589516,0.00862394 +2015-12-09,1,0.00748741,0.00693983,0.00556663,0.00862394 +2015-12-10,1,0.00807826,0.00742864,0.00656516,0.00862394 +2015-12-11,1,0.00851681,0.00746374,0.00742298,0.00862394 +2015-12-14,1,0.00885845,0.00758409,0.00806906,0.00862394 +2015-12-15,1,0.00996961,0.0073384,0.00734063,0.00862394 +2015-12-16,1,0.0104951,0.00724221,0.00762851,0.00862394 +2015-12-17,1,0.00921766,0.00745487,0.00743114,0.00862394 +2015-12-18,1,0.00722174,0.00761046,0.00708799,0.00862394 +2015-12-21,1,0.00671282,0.00749345,0.00710693,0.00862394 +2015-12-22,1,0.00608865,0.00733395,0.00717961,0.00862394 +2015-12-23,1,0.00507367,0.00745894,0.00686296,0.00862394 +2015-12-24,1,0.0111318,0.00738489,0.00730689,0.00862394 +2015-12-28,1,0.00977671,0.00733865,0.00841223,0.00862394 +2015-12-29,1,0.00952121,0.00723174,0.00765181,0.00862394 +2015-12-30,1,0.0123472,0.00712535,0.00712744,0.00862394 +2015-12-31,1,0.0117755,0.00706183,0.00705523,0.00862394 +2016-01-04,1,0.0101156,0.00801282,0.00766649,0.00862394 +2016-01-05,1,0.00971023,0.00784489,0.0075583,0.00862394 +2016-01-06,1,0.0116384,0.0077875,0.00820114,0.00862394 +2016-01-07,1,0.00611836,0.00843921,0.00752126,0.00862394 +2016-01-08,1,0.007322,0.00844141,0.00775482,0.00862394 +2016-01-11,1,0.00805378,0.00829907,0.00767145,0.00862394 +2016-01-12,1,0.0109667,0.00819597,0.00766206,0.00862394 +2016-01-13,1,0.0113245,0.00827353,0.00786345,0.00862394 +2016-01-14,1,0.0112539,0.00781955,0.00847861,0.00862394 +2016-01-15,1,0.0155737,0.00805112,0.00683617,0.00862394 +2016-01-18,1,0.0142311,0.00814348,0.00701627,0.00862394 +2016-01-19,1,0.0132969,0.00846324,0.0072384,0.00862394 +2016-01-20,1,0.00961942,0.00852271,0.00694021,0.00862394 +2016-01-21,1,0.0105369,0.00846423,0.00764391,0.00862394 +2016-01-22,1,0.0084788,0.00910063,0.00755513,0.00862394 +2016-01-25,1,0.0114596,0.00904374,0.00807619,0.00862394 +2016-01-27,1,0.0129002,0.00885592,0.00743512,0.00862394 +2016-01-28,1,0.0133674,0.00864095,0.00775222,0.00862394 +2016-01-29,1,0.0109975,0.0090538,0.00738248,0.00862394 +2016-02-01,1,0.0121231,0.00890357,0.00857529,0.00862394 +2016-02-02,1,0.0119058,0.00922548,0.00864498,0.00862394 +2016-02-03,1,0.0116913,0.00932761,0.0100565,0.00862394 +2016-02-04,1,0.0160035,0.00917411,0.0105582,0.00862394 +2016-02-05,1,0.0123977,0.00921312,0.00988853,0.00862394 +2016-02-08,1,0.0217195,0.00940727,0.00996966,0.00862394 +2016-02-09,1,0.0220664,0.00912709,0.00975469,0.00862394 +2016-02-10,1,0.0228518,0.00913868,0.00944713,0.00862394 +2016-02-11,1,0.0153829,0.0102631,0.00955175,0.00862394 +2016-02-12,1,0.0152332,0.0100704,0.0101261,0.00862394 +2016-02-15,1,0.0108014,0.0110917,0.0115972,0.00862394 +2016-02-16,1,0.0113431,0.0112286,0.0122124,0.00862394 +2016-02-17,1,0.0121495,0.0112432,0.0124611,0.00862394 +2016-02-18,1,0.0092085,0.0109868,0.0108806,0.00862394 +2016-02-19,1,0.0108337,0.0108925,0.0109219,0.00862394 +2016-02-22,1,0.00978068,0.0104742,0.00974036,0.00862394 +2016-02-23,1,0.0184953,0.0106991,0.00935158,0.00862394 +2016-02-24,1,0.0171896,0.0105379,0.0100643,0.00862394 +2016-02-25,1,0.0144665,0.0103271,0.00966678,0.00862394 +2016-02-26,1,0.0154689,0.0105356,0.00937015,0.00862394 +2016-02-29,1,0.0137817,0.010466,0.00937503,0.00862394 +2016-03-01,1,0.00863587,0.0116068,0.0124085,0.00862394 +2016-03-02,1,0.00764837,0.0118475,0.0130633,0.00862394 +2016-03-03,1,0.00455615,0.0117532,0.0133792,0.00862394 +2016-03-04,1,0.00474051,0.0117128,0.0129452,0.00862394 +2016-03-08,1,0.00718329,0.0115876,0.0124671,0.00862394 +2016-03-09,1,0.00693502,0.0111479,0.0126066,0.00862394 +2016-03-10,1,0.00632829,0.0109607,0.0125798,0.00862394 +2016-03-11,1,0.00819834,0.0104656,0.0105535,0.00862394 +2016-03-14,1,0.00950695,0.0104037,0.0102326,0.00862394 +2016-03-15,1,0.00557846,0.0100084,0.00986661,0.00862394 +2016-03-16,1,0.00631107,0.00996949,0.0103444,0.00862394 +2016-03-17,1,0.0107007,0.00950416,0.0103969,0.00862394 +2016-03-18,1,0.00939078,0.009465,0.00973976,0.00862394 +2016-03-21,1,0.0112292,0.00963722,0.00915807,0.00862394 +2016-03-22,1,0.0112251,0.00920818,0.0101253,0.00862394 +2016-03-23,1,0.0113638,0.00929842,0.0095532,0.00862394 +2016-03-28,1,0.00875621,0.00988597,0.00948894,0.00862394 +2016-03-29,1,0.0139749,0.00946897,0.0100972,0.00862394 +2016-03-30,1,0.0101103,0.0095569,0.00985579,0.00862394 +2016-03-31,1,0.0101532,0.00944456,0.00999805,0.00862394 +2016-04-01,1,0.0105308,0.00946452,0.0101248,0.00862394 +2016-04-04,1,0.0132422,0.00918489,0.0105832,0.00862394 +2016-04-05,1,0.00869437,0.00920961,0.00936963,0.00862394 +2016-04-06,1,0.0109855,0.00857048,0.00727693,0.00862394 +2016-04-07,1,0.00709608,0.00847402,0.00733916,0.00862394 +2016-04-08,1,0.00744603,0.00849456,0.00727881,0.00862394 +2016-04-11,1,0.00758981,0.00891553,0.00882204,0.00862394 +2016-04-12,1,0.00838145,0.00863083,0.0076225,0.00862394 +2016-04-13,1,0.00501605,0.00904992,0.00840346,0.00862394 +2016-04-18,1,0.00728148,0.00879049,0.00850062,0.00862394 +2016-04-20,1,0.00725635,0.0088115,0.00776294,0.00862394 +2016-04-21,1,0.0110838,0.00864477,0.00774724,0.00862394 +2016-04-22,1,0.011119,0.00869269,0.00847969,0.00862394 +2016-04-25,1,0.0111181,0.00843934,0.00837455,0.00862394 +2016-04-26,1,0.00748045,0.00868946,0.00793358,0.00862394 +2016-04-27,1,0.00621172,0.00855052,0.00811478,0.00862394 +2016-04-28,1,0.0047235,0.00919567,0.0100528,0.00862394 +2016-04-29,1,0.00463024,0.00919708,0.0100362,0.00862394 +2016-05-02,1,0.00969729,0.00900651,0.00851794,0.00862394 +2016-05-03,1,0.008266,0.00882003,0.00898912,0.00862394 +2016-05-04,1,0.0081905,0.00838774,0.00912152,0.00862394 +2016-05-05,1,0.00829306,0.00822418,0.00864713,0.00862394 +2016-05-06,1,0.0107292,0.00819821,0.00824205,0.00862394 +2016-05-09,1,0.00754179,0.00893763,0.00863272,0.00862394 +2016-05-10,1,0.00765609,0.00829443,0.00783168,0.00862394 +2016-05-11,1,0.00733742,0.00832928,0.00821926,0.00862394 +2016-05-12,1,0.0079419,0.00821048,0.00772371,0.00862394 +2016-05-13,1,0.00676767,0.0084631,0.00717643,0.00862394 +2016-05-16,1,0.00532607,0.0080378,0.00729033,0.00862394 +2016-05-17,1,0.00484115,0.00797952,0.00716543,0.00862394 +2016-05-18,1,0.0132503,0.00751407,0.0075591,0.00862394 +2016-05-19,1,0.012405,0.00763453,0.00686887,0.00862394 +2016-05-20,1,0.0105915,0.00755465,0.00785815,0.00862394 +2016-05-23,1,0.0092305,0.00742717,0.00741216,0.00862394 +2016-05-24,1,0.0104749,0.00738951,0.0071416,0.00862394 +2016-05-25,1,0.00761036,0.00867384,0.0080717,0.00862394 +2016-05-26,1,0.0047046,0.0087379,0.0082758,0.00862394 +2016-05-27,1,0.00267081,0.0087384,0.00719751,0.00862394 +2016-05-30,1,0.00307895,0.00828294,0.00786127,0.00862394 +2016-05-31,1,0.00399751,0.00837075,0.00743814,0.00862394 +2016-06-01,1,0.0040796,0.00799612,0.00782394,0.00862394 +2016-06-02,1,0.00591468,0.00757029,0.00844958,0.00862394 +2016-06-03,1,0.00611773,0.00717743,0.00664374,0.00862394 +2016-06-06,1,0.0067143,0.00728461,0.00738197,0.00862394 +2016-06-07,1,0.0041163,0.00744881,0.00790087,0.00862394 +2016-06-08,1,0.00824347,0.00720847,0.00744119,0.00862394 +2016-06-09,1,0.00816753,0.00755309,0.00848588,0.00862394 +2016-06-10,1,0.0082902,0.00756184,0.00803274,0.00862394 +2016-06-13,1,0.00777681,0.00768847,0.00876492,0.00862394 +2016-06-14,1,0.00804575,0.00721549,0.00664588,0.00862394 +2016-06-15,1,0.00624948,0.00771967,0.00745035,0.00862394 +2016-06-16,1,0.00517308,0.007842,0.00841441,0.00862394 +2016-06-17,1,0.0124312,0.0078184,0.00760049,0.00862394 +2016-06-20,1,0.0112644,0.00759301,0.00807189,0.00862394 +2016-06-21,1,0.0117876,0.0075801,0.00723304,0.00862394 +2016-06-22,1,0.0128862,0.00743723,0.00766474,0.00862394 +2016-06-23,1,0.0132367,0.0073497,0.00716026,0.00862394 +2016-06-24,1,0.00389334,0.00805551,0.00804232,0.00862394 +2016-06-27,1,0.002811,0.00758392,0.00772919,0.00862394 +2016-06-28,1,0.0056835,0.00745656,0.00749609,0.00862394 +2016-06-29,1,0.00542463,0.00763889,0.00807746,0.00862394 +2016-06-30,1,0.0040755,0.0077939,0.00772489,0.00862394 +2016-07-01,1,0.00848597,0.00708909,0.00567865,0.00862394 +2016-07-04,1,0.0085632,0.00692777,0.00553398,0.00862394 +2016-07-05,1,0.00781902,0.00731334,0.0066651,0.00862394 +2016-07-07,1,0.0074718,0.00727624,0.00548844,0.00862394 +2016-07-08,1,0.00771853,0.00703493,0.00534716,0.00862394 +2016-07-11,1,0.0046168,0.00781873,0.00711531,0.00862394 +2016-07-12,1,0.00374184,0.00769322,0.00727035,0.00862394 +2016-07-13,1,0.00416185,0.00759595,0.00598108,0.00862394 +2016-07-14,1,0.00450462,0.00746827,0.00771263,0.00862394 +2016-07-15,1,0.00487675,0.00751456,0.00674936,0.00862394 +2016-07-18,1,0.00627488,0.0071558,0.00514123,0.00862394 +2016-07-19,1,0.00729215,0.00690821,0.00599703,0.00862394 +2016-07-20,1,0.00717581,0.00694499,0.00628212,0.00862394 +2016-07-21,1,0.0058755,0.00703136,0.00660186,0.00862394 +2016-07-22,1,0.00662575,0.00700769,0.00600688,0.00862394 +2016-07-25,1,0.00448242,0.00724073,0.00673939,0.00862394 +2016-07-26,1,0.00363208,0.00734101,0.00740641,0.00862394 +2016-07-27,1,0.00538596,0.00630969,0.00690142,0.00862394 +2016-07-28,1,0.0038818,0.00622013,0.00723956,0.00862394 +2016-07-29,1,0.00887822,0.00635407,0.00681397,0.00862394 +2016-08-01,1,0.00889095,0.00609839,0.00717889,0.00862394 +2016-08-02,1,0.00914974,0.00586518,0.00685084,0.00862394 +2016-08-03,1,0.0100034,0.00626197,0.00670639,0.00862394 +2016-08-04,1,0.0100191,0.00607733,0.00796687,0.00862394 +2016-08-05,1,0.00709032,0.00679687,0.00696192,0.00862394 +2016-08-08,1,0.00669466,0.00677061,0.00671306,0.00862394 +2016-08-09,1,0.00737168,0.00682174,0.00639337,0.00862394 +2016-08-10,1,0.00363907,0.00674063,0.00674485,0.00862394 +2016-08-11,1,0.00466526,0.00667778,0.00680821,0.00862394 +2016-08-16,1,0.00375631,0.00654308,0.00732505,0.00862394 +2016-08-17,1,0.00368989,0.00648102,0.00731528,0.00862394 +2016-08-18,1,0.00359627,0.00655701,0.00740648,0.00862394 +2016-08-19,1,0.00353925,0.00619493,0.00809835,0.00862394 +2016-08-22,1,0.00419085,0.00627618,0.00679183,0.00862394 +2016-08-23,1,0.00847453,0.00610737,0.00759871,0.00862394 +2016-08-24,1,0.00851996,0.00599522,0.00642944,0.00862394 +2016-08-25,1,0.00719324,0.00607182,0.00673435,0.00862394 +2016-08-26,1,0.00626518,0.00584528,0.00662292,0.00862394 +2016-08-29,1,0.00745932,0.00590185,0.00630137,0.00862394 +2016-08-30,1,0.00701164,0.00669695,0.00675249,0.00862394 +2016-08-31,1,0.00699609,0.00668455,0.00696518,0.00862394 +2016-09-01,1,0.00915594,0.00658193,0.00683779,0.00862394 +2016-09-02,1,0.012386,0.00652439,0.00640621,0.00862394 +2016-09-06,1,0.00855249,0.0069391,0.00684719,0.00862394 +2016-09-07,1,0.00907102,0.00673955,0.00654568,0.00862394 +2016-09-08,1,0.00915671,0.00673668,0.00625429,0.00862394 +2016-09-09,1,0.00894878,0.00676576,0.00645849,0.00862394 +2016-09-12,1,0.00307194,0.00747166,0.00760607,0.00862394 +2016-09-14,1,0.00312298,0.00723077,0.00679,0.00862394 +2016-09-15,1,0.0051689,0.00701313,0.00656542,0.00862394 +2016-09-16,1,0.00588543,0.00703442,0.00666021,0.00862394 +2016-09-19,1,0.00819686,0.00698409,0.00633808,0.00862394 +2016-09-20,1,0.00814031,0.00647959,0.00605217,0.00862394 +2016-09-21,1,0.00858392,0.00644909,0.00696558,0.00862394 +2016-09-22,1,0.0087696,0.00682677,0.00639945,0.00862394 +2016-09-23,1,0.00960514,0.00678338,0.00611831,0.00862394 +2016-09-26,1,0.0118062,0.00723317,0.00706617,0.00862394 +2016-09-27,1,0.0117979,0.00723315,0.00648893,0.00862394 +2016-09-28,1,0.0117859,0.00719735,0.00707934,0.00862394 +2016-09-29,1,0.00739136,0.00767443,0.00753139,0.00862394 +2016-09-30,1,0.00762414,0.00770927,0.00800135,0.00862394 +2016-10-03,1,0.00306956,0.00782079,0.00770795,0.00862394 +2016-10-04,1,0.00654024,0.00780422,0.00750011,0.00862394 +2016-10-05,1,0.00702651,0.00781396,0.0077652,0.00862394 +2016-10-06,1,0.0072195,0.007549,0.00766361,0.00862394 +2016-10-07,1,0.0126242,0.00718939,0.00673614,0.00862394 +2016-10-10,1,0.0125996,0.00672597,0.00670626,0.00862394 +2016-10-13,1,0.00967971,0.00737712,0.00774488,0.00862394 +2016-10-14,1,0.00980214,0.00734282,0.00768803,0.00862394 +2016-10-17,1,0.0082129,0.00707321,0.00782336,0.00862394 +2016-10-18,1,0.00290591,0.00791272,0.00820346,0.00862394 +2016-10-19,1,0.00504069,0.00791022,0.00804352,0.00862394 +2016-10-20,1,0.00407222,0.00776469,0.00839709,0.00862394 +2016-10-21,1,0.00457106,0.00774612,0.00764389,0.00862394 +2016-10-24,1,0.00424133,0.00763909,0.00758877,0.00862394 +2016-10-25,1,0.00656973,0.00706531,0.00725494,0.00862394 +2016-10-26,1,0.00603317,0.00729153,0.00813466,0.00862394 +2016-10-27,1,0.00587382,0.00716973,0.00709227,0.00862394 +2016-10-28,1,0.00747503,0.00707391,0.00736724,0.00862394 +2016-11-01,1,0.00847069,0.00703227,0.00756111,0.00862394 +2016-11-02,1,0.0084854,0.00744732,0.00800294,0.00862394 +2016-11-03,1,0.0101577,0.00703328,0.00664843,0.00862394 +2016-11-04,1,0.0163627,0.00703872,0.0075909,0.00862394 +2016-11-07,1,0.0169949,0.00690641,0.00729814,0.00862394 +2016-11-08,1,0.0160126,0.00696982,0.00700767,0.00862394 +2016-11-09,1,0.0161457,0.00720481,0.00711365,0.00862394 +2016-11-10,1,0.0131554,0.00752986,0.00762632,0.00862394 +2016-11-11,1,0.0107125,0.00870818,0.00756342,0.00862394 +2016-11-15,1,0.00992568,0.00920564,0.00779831,0.00862394 +2016-11-16,1,0.0103052,0.00901185,0.00788917,0.00862394 +2016-11-17,1,0.0107174,0.00900576,0.00849466,0.00862394 +2016-11-18,1,0.0144677,0.00884612,0.00780577,0.00862394 +2016-11-21,1,0.00993437,0.00850916,0.00736972,0.00862394 +2016-11-22,1,0.00968541,0.00864738,0.00796117,0.00862394 +2016-11-23,1,0.0101356,0.00866226,0.00821531,0.00862394 +2016-11-24,1,0.00874783,0.00870537,0.00974534,0.00862394 +2016-11-25,1,0.00850902,0.00938518,0.00987208,0.00862394 +2016-11-28,1,0.00889201,0.0091499,0.0104498,0.00862394 +2016-11-29,1,0.00888674,0.00911879,0.0104111,0.00862394 +2016-11-30,1,0.00698627,0.00925106,0.00946938,0.00862394 +2016-12-01,1,0.0115173,0.00913091,0.010648,0.00862394 +2016-12-02,1,0.00838059,0.00921774,0.0101524,0.00862394 +2016-12-05,1,0.0107587,0.00920701,0.0109481,0.00862394 +2016-12-06,1,0.0110162,0.00917826,0.0107882,0.00862394 +2016-12-07,1,0.0109752,0.00901443,0.0107495,0.00862394 +2016-12-08,1,0.00659813,0.00962991,0.00919606,0.00862394 +2016-12-09,1,0.00623054,0.00937279,0.0109573,0.00862394 +2016-12-12,1,0.00454331,0.00948735,0.00986086,0.00862394 +2016-12-13,1,0.00123054,0.0094334,0.0103812,0.00862394 +2016-12-14,1,0.000981801,0.00884365,0.0104919,0.00862394 +2016-12-15,1,0.00343958,0.0079988,0.00820279,0.00862394 +2016-12-16,1,0.00405951,0.00796713,0.00831545,0.00862394 +2016-12-19,1,0.00487437,0.00779013,0.00818436,0.00862394 +2016-12-20,1,0.0105416,0.00709003,0.00825147,0.00862394 +2016-12-21,1,0.0105254,0.00660441,0.00742709,0.00862394 +2016-12-22,1,0.00955113,0.00728503,0.00676518,0.00862394 +2016-12-23,1,0.00989405,0.00734084,0.00779167,0.00862394 +2016-12-26,1,0.00692863,0.00747629,0.00724018,0.00862394 +2016-12-27,1,0.00500782,0.00780176,0.00764526,0.00862394 +2016-12-28,1,0.00509631,0.0077626,0.00678948,0.00862394 +2016-12-29,1,0.00549792,0.00782022,0.00787442,0.00862394 +2016-12-30,1,0.00521253,0.00782575,0.00733832,0.00862394 +2017-01-02,1,0.00523092,0.00760474,0.0074455,0.00862394 +2017-01-03,1,0.0056927,0.00718815,0.00750171,0.00862394 +2017-01-04,1,0.0065871,0.00716495,0.0071067,0.00862394 +2017-01-05,1,0.00581703,0.00734826,0.0069458,0.00862394 +2017-01-06,1,0.00507958,0.00729982,0.00699683,0.00862394 +2017-01-09,1,0.00461311,0.0068146,0.00759674,0.00862394 +2017-01-10,1,0.00508811,0.00692434,0.00768789,0.00862394 +2017-01-11,1,0.00208107,0.00695787,0.00665969,0.00862394 +2017-01-12,1,0.00183604,0.00681787,0.00712138,0.00862394 +2017-01-13,1,0.00529158,0.00669638,0.00778074,0.00862394 +2017-01-16,1,0.00594346,0.00660558,0.00745815,0.00862394 +2017-01-17,1,0.0074564,0.00665337,0.00719385,0.00862394 +2017-01-18,1,0.0094871,0.00617552,0.00716032,0.00862394 +2017-01-19,1,0.00940795,0.0060844,0.00711977,0.00862394 +2017-01-20,1,0.00600764,0.00679822,0.00641585,0.00862394 +2017-01-23,1,0.00909202,0.00660668,0.00771583,0.00862394 +2017-01-24,1,0.0109163,0.00683071,0.00698186,0.00862394 +2017-01-25,1,0.00962416,0.00690984,0.00720122,0.00862394 +2017-01-27,1,0.00962878,0.00658305,0.00781607,0.00862394 +2017-01-30,1,0.00959945,0.00638969,0.00782715,0.00862394 +2017-01-31,1,0.00827384,0.00678884,0.00786433,0.00862394 +2017-02-01,1,0.00382025,0.00725221,0.00751395,0.00862394 +2017-02-02,1,0.00379132,0.00716045,0.00720827,0.00862394 +2017-02-03,1,0.00380024,0.00714426,0.00766152,0.00862394 +2017-02-06,1,0.0022182,0.0071396,0.00788238,0.00862394 +2017-02-07,1,0.00126786,0.00695325,0.00562474,0.00862394 +2017-02-08,1,0.00394797,0.0064368,0.00691932,0.00862394 +2017-02-09,1,0.0050854,0.0064144,0.00715712,0.00862394 +2017-02-10,1,0.00554732,0.00639183,0.0067168,0.00862394 +2017-02-13,1,0.00615569,0.00602389,0.00615587,0.00862394 +2017-02-14,1,0.00591223,0.00574871,0.00616286,0.00862394 +2017-02-15,1,0.00186562,0.0063946,0.00665211,0.00862394 +2017-02-16,1,0.00208129,0.00654652,0.00649183,0.00862394 +2017-02-17,1,0.0041182,0.00656177,0.00680382,0.00862394 +2017-02-20,1,0.00330395,0.00659251,0.00700623,0.00862394 +2017-02-21,1,0.00460551,0.00657452,0.00618025,0.00862394 +2017-02-22,1,0.00521232,0.00577162,0.0059696,0.00862394 +2017-02-23,1,0.00510333,0.00580174,0.00602721,0.00862394 +2017-02-27,1,0.00567555,0.00609632,0.00662335,0.00862394 +2017-02-28,1,0.00566421,0.00565586,0.00595524,0.00862394 +2017-03-01,1,0.00473827,0.00585508,0.0064875,0.00862394 +2017-03-02,1,0.00395442,0.0059964,0.00632722,0.00862394 +2017-03-03,1,0.00392519,0.00577553,0.00657211,0.00862394 +2017-03-06,1,0.00805283,0.00513526,0.00673388,0.00862394 +2017-03-07,1,0.00785376,0.00516382,0.00593222,0.00862394 +2017-03-08,1,0.0073378,0.00511086,0.00615934,0.00862394 +2017-03-09,1,0.00727605,0.00492432,0.00665937,0.00862394 +2017-03-10,1,0.00816043,0.00484741,0.00669713,0.00862394 +2017-03-14,1,0.00413164,0.00586483,0.00666933,0.00862394 +2017-03-15,1,0.00641358,0.00585987,0.00662483,0.00862394 +2017-03-16,1,0.00595275,0.00591013,0.006892,0.00862394 +2017-03-17,1,0.00615182,0.00590445,0.00684409,0.00862394 +2017-03-20,1,0.00664097,0.00599904,0.00597945,0.00862394 +2017-03-21,1,0.00756204,0.00548491,0.00691595,0.00862394 +2017-03-22,1,0.00548243,0.00596274,0.00598521,0.00862394 +2017-03-23,1,0.00513999,0.00592496,0.0063333,0.00862394 +2017-03-24,1,0.00519589,0.00584222,0.00607009,0.00862394 +2017-03-27,1,0.00274404,0.00601133,0.00673821,0.00862394 +2017-03-28,1,0.00255138,0.00611666,0.006635,0.00862394 +2017-03-29,1,0.00295966,0.00598783,0.00584981,0.00862394 +2017-03-30,1,0.00508519,0.00589645,0.00540136,0.00862394 +2017-03-31,1,0.00519822,0.00588356,0.00618277,0.00862394 +2017-04-03,1,0.00490221,0.00561052,0.00554919,0.00862394 +2017-04-05,1,0.00478883,0.00547874,0.00507486,0.00862394 +2017-04-06,1,0.00510644,0.00553324,0.00634614,0.00862394 +2017-04-07,1,0.00444976,0.0058466,0.00612567,0.00862394 +2017-04-10,1,0.00458825,0.00585388,0.00564569,0.00862394 +2017-04-11,1,0.002202,0.00582534,0.00585811,0.00862394 +2017-04-12,1,0.00356597,0.0058703,0.00548863,0.00862394 +2017-04-13,1,0.0027271,0.00600199,0.00574058,0.00862394 +2017-04-17,1,0.00573101,0.00538681,0.00628308,0.00862394 +2017-04-18,1,0.00565413,0.00544031,0.00579317,0.00862394 +2017-04-19,1,0.00505624,0.00501544,0.00564719,0.00862394 +2017-04-20,1,0.00583138,0.0052312,0.00578482,0.00862394 +2017-04-21,1,0.00648222,0.00507963,0.00545722,0.00862394 +2017-04-24,1,0.00530578,0.00565401,0.00604854,0.00862394 +2017-04-25,1,0.00325477,0.00553894,0.00626297,0.00862394 +2017-04-26,1,0.00335953,0.00542753,0.00609127,0.00862394 +2017-04-27,1,0.00501996,0.00549269,0.00636705,0.00862394 +2017-04-28,1,0.00502188,0.00544369,0.00617972,0.00862394 +2017-05-02,1,0.005002,0.0052773,0.00625329,0.00862394 +2017-05-03,1,0.00656978,0.00498736,0.00639416,0.00862394 +2017-05-04,1,0.00633915,0.0050353,0.00592619,0.00862394 +2017-05-05,1,0.00447671,0.00539764,0.00647413,0.00862394 +2017-05-08,1,0.00459085,0.0053034,0.00575481,0.00862394 +2017-05-09,1,0.00466402,0.00527829,0.00663619,0.00862394 +2017-05-10,1,0.00355417,0.00560777,0.00634597,0.00862394 +2017-05-11,1,0.00675279,0.00544974,0.00626015,0.00862394 +2017-05-12,1,0.00662715,0.00532328,0.00616093,0.00862394 +2017-05-15,1,0.00624718,0.00530894,0.00617935,0.00862394 +2017-05-16,1,0.00503752,0.00534571,0.0065696,0.00862394 +2017-05-17,1,0.00451002,0.00508365,0.0061691,0.00862394 +2017-05-18,1,0.00829183,0.00567913,0.00613321,0.00862394 +2017-05-19,1,0.00876641,0.0056111,0.0064968,0.00862394 +2017-05-22,1,0.00877174,0.00557187,0.00630094,0.00862394 +2017-05-23,1,0.00736138,0.00559294,0.00588022,0.00862394 +2017-05-24,1,0.00678815,0.00556409,0.00578993,0.00862394 +2017-05-25,1,0.00389615,0.00613263,0.00671255,0.00862394 +2017-05-26,1,0.00182534,0.00614435,0.00642508,0.00862394 +2017-05-29,1,0.00187341,0.00611663,0.00642606,0.00862394 +2017-05-30,1,0.00298207,0.00601949,0.00607102,0.00862394 +2017-05-31,1,0.00314508,0.0059183,0.00657868,0.00862394 +2017-06-01,1,0.00331941,0.00569153,0.0066146,0.00862394 +2017-06-02,1,0.00297319,0.00538262,0.00498789,0.00862394 +2017-06-05,1,0.00361729,0.00536773,0.00516045,0.00862394 +2017-06-06,1,0.00329016,0.00543172,0.00548588,0.00862394 +2017-06-07,1,0.00293514,0.00545145,0.00570002,0.00862394 +2017-06-08,1,0.0032818,0.00549503,0.00575471,0.00862394 +2017-06-09,1,0.00299705,0.00524216,0.0058875,0.00862394 +2017-06-12,1,0.00416559,0.00541961,0.00577395,0.00862394 +2017-06-13,1,0.00411008,0.00535649,0.0060476,0.00862394 +2017-06-14,1,0.00431936,0.00528107,0.00598695,0.00862394 +2017-06-15,1,0.00360468,0.0052826,0.00573483,0.00862394 +2017-06-16,1,0.00472309,0.0052457,0.00609702,0.00862394 +2017-06-19,1,0.00296984,0.00517007,0.00642622,0.00862394 +2017-06-20,1,0.00267605,0.0051599,0.00673378,0.00862394 +2017-06-21,1,0.00342953,0.00520422,0.00608432,0.00862394 +2017-06-22,1,0.00389535,0.00501404,0.00667521,0.00862394 +2017-06-23,1,0.00606289,0.005202,0.00616546,0.00862394 +2017-06-27,1,0.00456874,0.00451442,0.00619683,0.00862394 +2017-06-28,1,0.00391318,0.00417335,0.00534397,0.00862394 +2017-06-29,1,0.00379803,0.00425437,0.00617674,0.00862394 +2017-06-30,1,0.00427095,0.00427856,0.00602443,0.00862394 +2017-07-03,1,0.00467219,0.0048409,0.00624111,0.00862394 +2017-07-04,1,0.00441691,0.00474119,0.00647636,0.00862394 +2017-07-05,1,0.00439168,0.00464397,0.00613678,0.00862394 +2017-07-06,1,0.00474816,0.00466733,0.00578598,0.00862394 +2017-07-07,1,0.00464752,0.00464955,0.00647334,0.00862394 +2017-07-10,1,0.00302103,0.00503045,0.00616041,0.00862394 +2017-07-11,1,0.00622296,0.00498472,0.00619113,0.00862394 +2017-07-12,1,0.0068669,0.00499192,0.00589183,0.00862394 +2017-07-13,1,0.00613368,0.00503671,0.00659293,0.00862394 +2017-07-14,1,0.00646453,0.00502399,0.00694172,0.00862394 +2017-07-17,1,0.0067315,0.0048754,0.00583431,0.00862394 +2017-07-18,1,0.00409145,0.00537237,0.00642788,0.00862394 +2017-07-19,1,0.00365858,0.00548704,0.00717076,0.00862394 +2017-07-20,1,0.00283619,0.00537355,0.00621592,0.00862394 +2017-07-21,1,0.00310461,0.00541139,0.006336,0.00862394 +2017-07-24,1,0.00340393,0.00543702,0.00670501,0.00862394 +2017-07-25,1,0.00315603,0.00523408,0.00646255,0.00862394 +2017-07-26,1,0.00375754,0.00509368,0.00596367,0.00862394 +2017-07-27,1,0.00522764,0.00480567,0.006118,0.00862394 +2017-07-28,1,0.00572939,0.0048015,0.00681837,0.00862394 +2017-07-31,1,0.00494598,0.00485137,0.00613458,0.00862394 +2017-08-01,1,0.00524475,0.00482585,0.00572148,0.00862394 +2017-08-02,1,0.00561233,0.0048307,0.00579635,0.00862394 +2017-08-03,1,0.0059955,0.00515026,0.00644612,0.00862394 +2017-08-04,1,0.00384638,0.00521876,0.00635225,0.00862394 +2017-08-07,1,0.00789644,0.00517086,0.00643142,0.00862394 +2017-08-08,1,0.0103023,0.0054186,0.00651497,0.00862394 +2017-08-09,1,0.00985011,0.00538131,0.00675371,0.00862394 +2017-08-10,1,0.00940776,0.00563132,0.00622608,0.00862394 +2017-08-11,1,0.00861525,0.00568225,0.00576462,0.00862394 +2017-08-14,1,0.00754082,0.00603679,0.00642562,0.00862394 +2017-08-16,1,0.00696179,0.00640007,0.00622099,0.00862394 +2017-08-17,1,0.00694932,0.0063517,0.00706923,0.00862394 +2017-08-18,1,0.00656002,0.0062792,0.00674723,0.00862394 +2017-08-21,1,0.00788419,0.00620941,0.00656728,0.00862394 +2017-08-22,1,0.00869356,0.0061239,0.00627385,0.00862394 +2017-08-23,1,0.00799525,0.00622368,0.00620399,0.00862394 +2017-08-24,1,0.00819288,0.00617029,0.00673609,0.00862394 +2017-08-28,1,0.00870364,0.0062145,0.0063204,0.00862394 +2017-08-29,1,0.00566402,0.00648782,0.00623546,0.00862394 +2017-08-30,1,0.00521531,0.00670223,0.00623007,0.00862394 +2017-08-31,1,0.00502561,0.00668603,0.00581623,0.00862394 +2017-09-01,1,0.00406597,0.00668953,0.00644264,0.00862394 +2017-09-04,1,0.00401655,0.00674686,0.00650568,0.00862394 +2017-09-05,1,0.00504471,0.00656378,0.00554741,0.00862394 +2017-09-06,1,0.00438157,0.00648601,0.00535679,0.00862394 +2017-09-07,1,0.00446121,0.00641545,0.00587487,0.00862394 +2017-09-08,1,0.00455904,0.00631806,0.00662606,0.00862394 +2017-09-11,1,0.00445906,0.00631746,0.00592162,0.00862394 +2017-09-12,1,0.00322699,0.00644755,0.00590684,0.00862394 +2017-09-13,1,0.00310276,0.00624221,0.00600106,0.00862394 +2017-09-14,1,0.00341461,0.00597091,0.00681819,0.00862394 +2017-09-15,1,0.00815281,0.00589435,0.00624192,0.00862394 +2017-09-18,1,0.00668844,0.00578354,0.00618876,0.00862394 +2017-09-19,1,0.00677302,0.00565404,0.00656756,0.00862394 +2017-09-20,1,0.00696602,0.0055067,0.00662127,0.00862394 +2017-09-21,1,0.00841151,0.00533894,0.00599199,0.00862394 +2017-09-22,1,0.00757756,0.00636404,0.00664212,0.00862394 +2017-09-25,1,0.00804854,0.00634159,0.0060798,0.00862394 +2017-09-26,1,0.00847059,0.00634703,0.00640186,0.00862394 +2017-09-27,1,0.00379188,0.00663026,0.00610009,0.00862394 +2017-09-28,1,0.00467225,0.00653176,0.00590888,0.00862394 +2017-09-29,1,0.004829,0.00633596,0.0059893,0.00862394 +2017-10-03,1,0.0044966,0.00645188,0.00680829,0.00862394 +2017-10-04,1,0.00500367,0.00647996,0.00652185,0.00862394 +2017-10-05,1,0.00591918,0.00603773,0.0059213,0.00862394 +2017-10-06,1,0.0055305,0.00626541,0.00592184,0.00862394 +2017-10-09,1,0.0053605,0.00625444,0.00639967,0.00862394 +2017-10-10,1,0.00569064,0.00622007,0.00573329,0.00862394 +2017-10-11,1,0.00539859,0.00629222,0.00543768,0.00862394 +2017-10-12,1,0.00566272,0.00651068,0.00583812,0.00862394 +2017-10-13,1,0.00493989,0.0064286,0.00627789,0.00862394 +2017-10-16,1,0.00398592,0.00645817,0.00590029,0.00862394 +2017-10-17,1,0.00571215,0.00648422,0.0064553,0.00862394 +2017-10-18,1,0.00549538,0.00647094,0.00581791,0.00862394 +2017-10-19,1,0.00383771,0.0065018,0.00619246,0.00862394 +2017-10-23,1,0.00384163,0.00646088,0.00535765,0.00862394 +2017-10-24,1,0.00477554,0.00636047,0.00585022,0.00862394 +2017-10-25,1,0.00529971,0.0066345,0.00606745,0.00862394 +2017-10-26,1,0.00548172,0.00615662,0.00597647,0.00862394 +2017-10-27,1,0.00511215,0.00578066,0.00584243,0.00862394 +2017-10-30,1,0.00514407,0.00577782,0.00561605,0.00862394 +2017-10-31,1,0.00720748,0.00528411,0.00611671,0.00862394 +2017-11-01,1,0.00477708,0.00547815,0.00613591,0.00862394 +2017-11-02,1,0.004989,0.00554119,0.00611031,0.00862394 +2017-11-03,1,0.00464755,0.00546087,0.00601294,0.00862394 +2017-11-06,1,0.00525753,0.00544262,0.00638223,0.00862394 +2017-11-07,1,0.00432247,0.00589293,0.00626447,0.00862394 +2017-11-08,1,0.00459949,0.00567221,0.0059774,0.00862394 +2017-11-09,1,0.00747757,0.00566189,0.00673499,0.00862394 +2017-11-10,1,0.0083868,0.0056161,0.00615847,0.00862394 +2017-11-13,1,0.00683989,0.00587328,0.00591046,0.00862394 +2017-11-14,1,0.00619248,0.00560604,0.00566165,0.00862394 +2017-11-15,1,0.00358227,0.00562902,0.006348,0.00862394 +2017-11-16,1,0.00241774,0.00595192,0.00631588,0.00862394 +2017-11-17,1,0.00129916,0.00610579,0.00684521,0.00862394 +2017-11-20,1,0.00137666,0.00598985,0.00611369,0.00862394 +2017-11-21,1,0.00242662,0.00585486,0.0059515,0.00862394 +2017-11-22,1,0.00249574,0.00560276,0.00590154,0.00862394 +2017-11-23,1,0.00648729,0.00540502,0.00576112,0.00862394 +2017-11-24,1,0.00613349,0.00504674,0.00506955,0.00862394 +2017-11-27,1,0.00604442,0.00502686,0.00547174,0.00862394 +2017-11-28,1,0.00629082,0.00524577,0.00523321,0.00862394 +2017-11-29,1,0.00590218,0.00521537,0.00568946,0.00862394 +2017-11-30,1,0.0086838,0.00598701,0.0062922,0.00862394 +2017-12-01,1,0.00800788,0.00591255,0.00586861,0.00862394 +2017-12-04,1,0.00796632,0.00591389,0.00670028,0.00862394 +2017-12-05,1,0.00949242,0.00589538,0.00619809,0.00862394 +2017-12-06,1,0.00884686,0.00593336,0.00658213,0.00862394 +2017-12-07,1,0.00756047,0.0063394,0.00646279,0.00862394 +2017-12-08,1,0.00711285,0.00648163,0.0061602,0.00862394 +2017-12-11,1,0.00709225,0.00653831,0.00634887,0.00862394 +2017-12-12,1,0.00509433,0.00673966,0.00659072,0.00862394 +2017-12-13,1,0.00387435,0.0065899,0.00641513,0.00862394 +2017-12-14,1,0.0044472,0.00655267,0.00636878,0.00862394 +2017-12-15,1,0.00391816,0.00653326,0.00657462,0.00862394 +2017-12-18,1,0.00374,0.00644095,0.00645775,0.00862394 +2017-12-19,1,0.00373681,0.00624848,0.0061464,0.00862394 +2017-12-20,1,0.00365243,0.00611338,0.00590007,0.00862394 +2017-12-21,1,0.00405268,0.00616886,0.00661893,0.00862394 +2017-12-22,1,0.00551647,0.00609378,0.00571615,0.00862394 +2017-12-26,1,0.00497127,0.00608744,0.0055714,0.00862394 +2017-12-27,1,0.00574963,0.00610809,0.00556405,0.00862394 +2017-12-28,1,0.00603285,0.0060935,0.0061081,0.00862394 +2017-12-29,1,0.00620702,0.0061533,0.00566227,0.00862394 +2018-01-02,1,0.00280958,0.00643764,0.00609454,0.00862394 +2018-01-03,1,0.00298976,0.00605962,0.00630947,0.00862394 +2018-01-04,1,0.00275606,0.00591262,0.0060365,0.00862394 +2018-01-05,1,0.00243546,0.0059565,0.00613601,0.00862394 +2018-01-08,1,0.00224868,0.00598619,0.00631878,0.00862394 +2018-01-09,1,0.00355816,0.00543984,0.00562062,0.00862394 +2018-01-10,1,0.0045311,0.00525995,0.0066364,0.00862394 +2018-01-11,1,0.00449375,0.00507313,0.00563141,0.00862394 +2018-01-12,1,0.00483435,0.00499386,0.00525782,0.00862394 +2018-01-15,1,0.00492947,0.00474014,0.00531384,0.00862394 +2018-01-16,1,0.00292025,0.00486378,0.00577946,0.00862394 +2018-01-17,1,0.00408175,0.00503106,0.00653993,0.00862394 +2018-01-18,1,0.00507974,0.0049274,0.00613962,0.00862394 +2018-01-19,1,0.00492261,0.00499733,0.00657755,0.00862394 +2018-01-22,1,0.00684263,0.00499028,0.00643245,0.00862394 +2018-01-23,1,0.004583,0.00496766,0.00574269,0.00862394 +2018-01-24,1,0.00453445,0.00507954,0.00647095,0.00862394 +2018-01-25,1,0.0109729,0.00518985,0.00607195,0.00862394 +2018-01-29,1,0.00903732,0.00518593,0.00614123,0.00862394 +2018-01-30,1,0.00955151,0.00547853,0.00716447,0.00862394 +2018-01-31,1,0.00953722,0.00533755,0.00602339,0.00862394 +2018-02-01,1,0.0127133,0.00533907,0.00634477,0.00862394 +2018-02-02,1,0.00991269,0.00691028,0.00655062,0.00862394 +2018-02-05,1,0.0113876,0.00697819,0.00649264,0.00862394 +2018-02-06,1,0.00877487,0.00740063,0.00770568,0.00862394 +2018-02-07,1,0.00884842,0.00736796,0.00724436,0.00862394 +2018-02-08,1,0.00839604,0.00759449,0.00830797,0.00862394 +2018-02-09,1,0.00733492,0.00763684,0.00783158,0.00862394 +2018-02-12,1,0.00511974,0.00780607,0.00841145,0.00862394 +2018-02-14,1,0.00598462,0.00765116,0.00768566,0.00862394 +2018-02-15,1,0.00496254,0.0076639,0.00790528,0.00862394 +2018-02-16,1,0.00657935,0.00767673,0.00787859,0.00862394 +2018-02-19,1,0.00559266,0.00764184,0.00846641,0.00862394 +2018-02-20,1,0.0058402,0.00733706,0.00781513,0.00862394 +2018-02-21,1,0.0072434,0.0074341,0.00845962,0.00862394 +2018-02-22,1,0.00749736,0.00723422,0.00761685,0.00862394 +2018-02-23,1,0.00683423,0.00750189,0.00776422,0.00862394 +2018-02-26,2,0.00359695,0.0071527,0.00815845,0.00784094 +2018-02-27,2,0.00306484,0.00716744,0.00767084,0.00784094 +2018-02-28,2,0.00807637,0.00725111,0.00797519,0.00784094 +2018-03-01,2,0.00819642,0.00716247,0.00758946,0.00784094 +2018-03-05,2,0.0125043,0.0071739,0.00804991,0.00784094 +2018-03-06,2,0.010733,0.00697513,0.00700624,0.00784094 +2018-03-07,2,0.00881319,0.00694236,0.00737044,0.00784094 +2018-03-08,2,0.00946026,0.00699193,0.00828631,0.00784094 +2018-03-09,2,0.0126239,0.00691563,0.00720177,0.00784094 +2018-03-12,2,0.00670277,0.0074297,0.00683802,0.00784094 +2018-03-13,2,0.00738939,0.00734056,0.00706144,0.00784094 +2018-03-14,2,0.00829275,0.00710922,0.00703964,0.00784094 +2018-03-15,2,0.00830461,0.00699069,0.00775957,0.00784094 +2018-03-16,2,0.00691907,0.00737364,0.00697661,0.00784094 +2018-03-19,2,0.00921671,0.0071785,0.00816301,0.00784094 +2018-03-20,2,0.00941174,0.00719656,0.00770919,0.00784094 +2018-03-21,2,0.00995989,0.00720885,0.00748134,0.00784094 +2018-03-22,2,0.0107137,0.00717508,0.00778571,0.00784094 +2018-03-23,2,0.00765127,0.00724668,0.00818888,0.00784094 +2018-03-26,2,0.00881269,0.00765115,0.00802797,0.00784094 +2018-03-27,2,0.0124022,0.00771339,0.0079345,0.00784094 +2018-03-28,2,0.0113402,0.00762113,0.00795174,0.00784094 +2018-04-02,2,0.0109589,0.00769618,0.00783488,0.00784094 +2018-04-03,2,0.010969,0.00754898,0.00804681,0.00784094 +2018-04-04,2,0.00775682,0.0077361,0.00753712,0.00784094 +2018-04-05,2,0.00168511,0.00842841,0.0080959,0.00784094 +2018-04-06,2,0.001357,0.00828679,0.00763062,0.00784094 +2018-04-09,2,0.0013361,0.00815824,0.00785181,0.00784094 +2018-04-10,2,0.00137415,0.00804508,0.00751024,0.00784094 +2018-04-11,2,0.00262034,0.00780121,0.00738252,0.00784094 +2018-04-12,2,0.00257423,0.00708149,0.00760041,0.00784094 +2018-04-13,2,0.00274465,0.00661774,0.00647282,0.00784094 +2018-04-16,2,0.00224519,0.00663052,0.0068314,0.00784094 +2018-04-17,2,0.00235901,0.00663873,0.00649844,0.00784094 +2018-04-18,2,0.00312096,0.00687957,0.00639954,0.00784094 +2018-04-19,2,0.00330637,0.00647886,0.00607534,0.00784094 +2018-04-20,2,0.00413502,0.00628792,0.00590413,0.00784094 +2018-04-23,2,0.00421017,0.00620034,0.00569478,0.00784094 +2018-04-24,2,0.0047485,0.00620318,0.00581513,0.00784094 +2018-04-25,2,0.00457695,0.00631943,0.00588119,0.00784094 +2018-04-26,2,0.00543679,0.00600978,0.00662092,0.00784094 +2018-04-27,2,0.00615484,0.00591199,0.00639022,0.00784094 +2018-04-30,2,0.00575388,0.00590722,0.00655088,0.00784094 +2018-05-02,2,0.00577244,0.00579921,0.00660471,0.00784094 +2018-05-03,2,0.00557875,0.0057441,0.00637903,0.00784094 +2018-05-04,2,0.00504289,0.00586408,0.00644007,0.00784094 +2018-05-07,2,0.00406308,0.00559084,0.00700801,0.00784094 +2018-05-08,2,0.00413254,0.00458222,0.00723524,0.00784094 +2018-05-09,2,0.00518077,0.00457857,0.00685329,0.00784094 +2018-05-10,2,0.00569184,0.00458721,0.00689432,0.00784094 +2018-05-11,2,0.00355045,0.00472847,0.00671002,0.00784094 +2018-05-14,2,0.00302617,0.00466607,0.00728502,0.00784094 +2018-05-15,2,0.00401249,0.0046623,0.00754654,0.00784094 +2018-05-16,2,0.00465469,0.00490344,0.0063574,0.00784094 +2018-05-17,2,0.00778023,0.00501532,0.00656517,0.00784094 +2018-05-18,2,0.00868513,0.00507983,0.00666446,0.00784094 +2018-05-21,2,0.007965,0.00517991,0.00665866,0.00784094 +2018-05-22,2,0.00884672,0.00524528,0.00695508,0.00784094 +2018-05-23,2,0.00649662,0.00555416,0.00641714,0.00784094 +2018-05-24,2,0.00722897,0.0058866,0.0069127,0.00784094 +2018-05-25,2,0.00743489,0.00608101,0.00679724,0.00784094 +2018-05-28,2,0.00721396,0.00613773,0.00700731,0.00784094 +2018-05-29,2,0.0069967,0.00620364,0.00671534,0.00784094 +2018-05-30,2,0.00807387,0.00598241,0.00683192,0.00784094 +2018-05-31,2,0.00704232,0.00625428,0.00639848,0.00784094 +2018-06-01,2,0.00665979,0.00626444,0.00661833,0.00784094 +2018-06-04,2,0.00513252,0.00629236,0.00655925,0.00784094 +2018-06-05,2,0.00374911,0.00623142,0.00670733,0.00784094 +2018-06-06,2,0.00321751,0.00628229,0.00684436,0.00784094 +2018-06-07,2,0.00350069,0.00628284,0.00670264,0.00784094 +2018-06-08,2,0.00347199,0.00625303,0.00714826,0.00784094 +2018-06-11,2,0.00359704,0.00614219,0.00667406,0.00784094 +2018-06-12,2,0.00400718,0.005945,0.00633112,0.00784094 +2018-06-13,2,0.00532503,0.00583008,0.00496188,0.00784094 +2018-06-14,2,0.00514937,0.0058777,0.00483046,0.00784094 +2018-06-15,2,0.00650108,0.00581598,0.00525397,0.00784094 +2018-06-18,2,0.00696859,0.00577606,0.00481727,0.00784094 +2018-06-19,2,0.00552201,0.00583618,0.00501642,0.00784094 +2018-06-20,2,0.0063359,0.00582612,0.00410405,0.00784094 +2018-06-21,2,0.00687815,0.00580922,0.00445708,0.00784094 +2018-06-22,2,0.00854362,0.0057189,0.00473109,0.00784094 +2018-06-25,2,0.00852652,0.00574684,0.00392042,0.00784094 +2018-06-26,2,0.00890631,0.00551574,0.00559343,0.00784094 +2018-06-27,2,0.00818699,0.0056568,0.00488382,0.00784094 +2018-06-28,2,0.00676779,0.00573615,0.00460166,0.00784094 +2018-06-29,2,0.00471767,0.00601456,0.00626988,0.00784094 +2018-07-02,2,0.00372154,0.00583055,0.00434832,0.00784094 +2018-07-03,2,0.00436192,0.00585456,0.00451312,0.00784094 +2018-07-04,2,0.00458452,0.00582078,0.00428675,0.00784094 +2018-07-05,2,0.00370241,0.00573279,0.00413421,0.00784094 +2018-07-06,2,0.00431536,0.00547199,0.00470312,0.00784094 +2018-07-09,2,0.00643352,0.00538956,0.00501,0.00784094 +2018-07-10,2,0.00588394,0.00559009,0.00476611,0.00784094 +2018-07-11,2,0.00610719,0.00560601,0.00487382,0.00784094 +2018-07-12,2,0.00504288,0.00557108,0.00432537,0.00784094 +2018-07-13,2,0.00574572,0.00562576,0.00481645,0.00784094 +2018-07-16,2,0.00463047,0.00586498,0.00493748,0.00784094 +2018-07-17,2,0.00429035,0.00590371,0.00444662,0.00784094 +2018-07-18,2,0.00373493,0.00592816,0.00467407,0.00784094 +2018-07-19,2,0.00258129,0.0057089,0.00429109,0.00784094 +2018-07-20,2,0.00379492,0.0057422,0.00382959,0.00784094 +2018-07-23,2,0.00365016,0.00568994,0.00428724,0.00784094 +2018-07-24,2,0.00366761,0.00560766,0.0042836,0.00784094 +2018-07-25,2,0.00387385,0.00546568,0.00490891,0.00784094 +2018-07-26,2,0.00696166,0.00533836,0.00432455,0.00784094 +2018-07-27,2,0.00707794,0.0053428,0.00517329,0.00784094 +2018-07-30,2,0.00699947,0.00505704,0.00518625,0.00784094 +2018-07-31,2,0.0069064,0.0048466,0.00559792,0.00784094 +2018-08-01,2,0.00712698,0.00470822,0.00618452,0.00784094 +2018-08-02,2,0.00397123,0.0052908,0.00547629,0.00784094 +2018-08-03,2,0.00325742,0.00542051,0.00588308,0.00784094 +2018-08-06,2,0.00460305,0.00536823,0.00553548,0.00784094 +2018-08-07,2,0.00573405,0.00537713,0.0063041,0.00784094 +2018-08-08,2,0.00546289,0.0053401,0.00513785,0.00784094 +2018-08-09,2,0.0066862,0.00503082,0.0058875,0.00784094 +2018-08-10,2,0.00694171,0.00502529,0.00514996,0.00784094 +2018-08-13,2,0.00514221,0.00523163,0.00537947,0.00784094 +2018-08-14,2,0.00489557,0.00537603,0.00509777,0.00784094 +2018-08-16,2,0.00416731,0.00521974,0.00501273,0.00784094 +2018-08-17,2,0.00547338,0.00531248,0.00565141,0.00784094 +2018-08-20,2,0.0051873,0.00532852,0.00544051,0.00784094 +2018-08-21,2,0.006134,0.00516754,0.00552382,0.00784094 +2018-08-23,2,0.00631844,0.00513037,0.00572813,0.00784094 +2018-08-24,2,0.00602901,0.00507114,0.00490578,0.00784094 +2018-08-27,2,0.0046596,0.0053669,0.0057773,0.00784094 +2018-08-28,2,0.00343664,0.00533478,0.00450011,0.00784094 +2018-08-29,2,0.0034345,0.00546928,0.00450512,0.00784094 +2018-08-30,2,0.00530241,0.00534925,0.00559096,0.00784094 +2018-08-31,2,0.00611258,0.00531261,0.00576701,0.00784094 +2018-09-03,2,0.00760237,0.00543378,0.00525787,0.00784094 +2018-09-04,2,0.00902851,0.00541103,0.0041501,0.00784094 +2018-09-05,2,0.0103747,0.00526164,0.00435342,0.00784094 +2018-09-06,2,0.0120571,0.00524767,0.00478873,0.00784094 +2018-09-07,2,0.012632,0.00532705,0.00469157,0.00784094 +2018-09-10,2,0.0119464,0.00585385,0.00579332,0.00784094 +2018-09-11,2,0.0105558,0.00623521,0.0065709,0.00784094 +2018-09-12,2,0.00977967,0.00639894,0.00546848,0.00784094 +2018-09-14,2,0.00447155,0.00672338,0.00667158,0.00784094 +2018-09-17,2,0.00922577,0.00694355,0.0069712,0.00784094 +2018-09-18,2,0.00918529,0.00696677,0.00674429,0.00784094 +2018-09-19,2,0.00927454,0.00690152,0.00621574,0.00784094 +2018-09-21,2,0.00906551,0.00684813,0.00676106,0.00784094 +2018-09-24,2,0.00703542,0.00673534,0.00710931,0.00784094 +2018-09-25,2,0.00764553,0.00720258,0.00781509,0.00784094 +2018-09-26,2,0.0115684,0.0071734,0.00743029,0.00784094 +2018-09-27,2,0.0141404,0.00719019,0.00802546,0.00784094 +2018-09-28,2,0.0155133,0.00690072,0.00762135,0.00784094 +2018-10-01,2,0.0127547,0.00687168,0.00866459,0.00784094 +2018-10-03,2,0.0180272,0.00709442,0.00820435,0.00784094 +2018-10-04,2,0.0175064,0.00790977,0.0071689,0.00784094 +2018-10-05,2,0.0174808,0.00863855,0.00780115,0.00784094 +2018-10-08,2,0.0174847,0.00874153,0.00852192,0.00784094 +2018-10-09,2,0.0169642,0.00861817,0.00837927,0.00784094 +2018-10-10,2,0.017469,0.00923475,0.00923153,0.00784094 +2018-10-11,2,0.0153664,0.00944866,0.00909382,0.00784094 +2018-10-12,2,0.00950866,0.0100959,0.00981638,0.00784094 +2018-10-15,2,0.0084542,0.0100812,0.0108485,0.00784094 +2018-10-16,2,0.00878637,0.0100678,0.0109684,0.00784094 +2018-10-17,2,0.00843127,0.0100879,0.0108113,0.00784094 +2018-10-19,2,0.00748632,0.00988877,0.010516,0.00784094 +2018-10-22,2,0.0142399,0.00955028,0.00950359,0.00784094 +2018-10-23,2,0.0135931,0.00948547,0.00927407,0.00784094 +2018-10-24,2,0.015578,0.00962557,0.00948926,0.00784094 +2018-10-25,2,0.0141405,0.00962168,0.00929434,0.00784094 +2018-10-26,2,0.0121496,0.00947493,0.009276,0.00784094 +2018-10-29,2,0.0112035,0.0102919,0.0101118,0.00784094 +2018-10-30,2,0.0101197,0.0102568,0.0114794,0.00784094 +2018-10-31,2,0.00775333,0.0107009,0.0105034,0.00784094 +2018-11-01,2,0.00785581,0.0106348,0.0110189,0.00784094 +2018-11-02,2,0.00587205,0.0107331,0.0107937,0.00784094 +2018-11-05,2,0.00748261,0.0105701,0.00914716,0.00784094 +2018-11-06,2,0.00752118,0.0101481,0.00937883,0.00784094 +2018-11-07,2,0.0071088,0.00946227,0.009449,0.00784094 +2018-11-09,2,0.00745603,0.00946623,0.0098513,0.00784094 +2018-11-12,2,0.00389169,0.0093634,0.00910135,0.00784094 +2018-11-13,2,0.00708192,0.00941783,0.00888789,0.00784094 +2018-11-14,2,0.00769432,0.00898076,0.00961055,0.00784094 +2018-11-15,2,0.00801485,0.00848649,0.0101593,0.00784094 +2018-11-16,2,0.00896178,0.00853822,0.00998135,0.00784094 +2018-11-19,2,0.00847129,0.00819996,0.00943139,0.00784094 +2018-11-20,2,0.0071496,0.00845779,0.00886483,0.00784094 +2018-11-21,2,0.0073191,0.00828447,0.00788064,0.00784094 +2018-11-22,2,0.0042179,0.0083304,0.00787865,0.00784094 +2018-11-26,2,0.00447976,0.00832829,0.00733453,0.00784094 +2018-11-27,2,0.0051889,0.00826098,0.00779483,0.00784094 +2018-11-28,2,0.00722066,0.00799895,0.00752326,0.00784094 +2018-11-29,2,0.00778787,0.00793065,0.00755415,0.00784094 +2018-11-30,2,0.00965694,0.00719115,0.00700322,0.00784094 +2018-12-03,2,0.0115333,0.0071307,0.00711188,0.00784094 +2018-12-04,2,0.0128298,0.00680151,0.0063518,0.00784094 +2018-12-05,2,0.0164574,0.00711363,0.0069037,0.00784094 +2018-12-06,2,0.0137813,0.00730943,0.00704296,0.00784094 +2018-12-07,2,0.0134867,0.00751046,0.00718613,0.00784094 +2018-12-10,2,0.00616373,0.0081949,0.00768891,0.00784094 +2018-12-11,2,0.006662,0.00823086,0.00830687,0.00784094 +2018-12-12,2,0.00263492,0.00877645,0.00887768,0.00784094 +2018-12-13,2,0.00356654,0.00855205,0.00906911,0.00784094 +2018-12-14,2,0.0102461,0.00843301,0.00865174,0.00784094 +2018-12-17,2,0.00935961,0.00806392,0.00834642,0.00784094 +2018-12-18,2,0.0102204,0.008091,0.00820313,0.00784094 +2018-12-19,2,0.0100732,0.00761889,0.00846232,0.00784094 +2018-12-20,2,0.0112245,0.00771823,0.00832808,0.00784094 +2018-12-21,2,0.00644515,0.00855597,0.00775418,0.00784094 +2018-12-24,2,0.00565353,0.00855549,0.00835326,0.00784094 +2018-12-26,2,0.00771428,0.00858048,0.00796941,0.00784094 +2018-12-27,2,0.00781064,0.00849744,0.00825933,0.00784094 +2018-12-28,2,0.00703215,0.00858803,0.00829745,0.00784094 +2018-12-31,2,0.00729235,0.00827069,0.00836521,0.00784094 +2019-01-02,2,0.00697012,0.00807614,0.00805672,0.00784094 +2019-01-03,2,0.00340754,0.00831492,0.00741207,0.00784094 +2019-01-04,2,0.0037663,0.00827385,0.00799562,0.00784094 +2019-01-07,2,0.00429788,0.00824241,0.00801312,0.00784094 +2019-01-08,2,0.00784589,0.00820089,0.0079043,0.00784094 +2019-01-09,2,0.00762358,0.00781277,0.008188,0.00784094 +2019-01-10,2,0.00733158,0.00734839,0.00770641,0.00784094 +2019-01-11,2,0.00706208,0.00679843,0.00702937,0.00784094 +2019-01-14,2,0.00574863,0.00688645,0.00693727,0.00784094 +2019-01-15,2,0.00307415,0.00698633,0.00687908,0.00784094 +2019-01-16,2,0.00510854,0.00691818,0.00662746,0.00784094 +2019-01-17,2,0.00514886,0.00687086,0.00661066,0.00784094 +2019-01-18,2,0.00559082,0.00675598,0.00639327,0.00784094 +2019-01-21,2,0.00489607,0.00668914,0.00618192,0.00784094 +2019-01-22,2,0.00530066,0.00639898,0.00574575,0.00784094 +2019-01-23,2,0.00528792,0.00671069,0.00652563,0.00784094 +2019-01-24,2,0.0105185,0.00610402,0.00659033,0.00784094 +2019-01-25,2,0.0101698,0.00601833,0.00668172,0.00784094 +2019-01-28,2,0.0071963,0.00616194,0.00616227,0.00784094 +2019-01-29,2,0.00674207,0.00609837,0.00722495,0.00784094 +2019-01-30,2,0.00648042,0.00596257,0.00700412,0.00784094 +2019-01-31,2,0.00451475,0.00680806,0.00628377,0.00784094 +2019-02-01,2,0.00820843,0.00677515,0.00604308,0.00784094 +2019-02-04,2,0.00858871,0.00637244,0.00648965,0.00784094 +2019-02-05,2,0.00868812,0.00630924,0.00674011,0.00784094 +2019-02-06,2,0.00442563,0.00650117,0.00584422,0.00784094 +2019-02-07,2,0.0035327,0.00633133,0.0062243,0.00784094 +2019-02-08,2,0.00242428,0.00681396,0.00680835,0.00784094 +2019-02-11,2,0.00261469,0.00686611,0.00697901,0.00784094 +2019-02-12,2,0.00828684,0.00691187,0.00750453,0.00784094 +2019-02-14,2,0.00790845,0.00667762,0.00715973,0.00784094 +2019-02-15,2,0.0077722,0.00626275,0.00573089,0.00784094 +2019-02-18,2,0.00625008,0.00618419,0.00591868,0.00784094 +2019-02-19,2,0.00646848,0.00620987,0.00572303,0.00784094 +2019-02-20,2,0.0051841,0.00698652,0.00774872,0.00784094 +2019-02-21,2,0.00480615,0.00695567,0.0079286,0.00784094 +2019-02-22,2,0.00562515,0.00693127,0.00649869,0.00784094 +2019-02-25,2,0.0066742,0.00684625,0.00833938,0.00784094 +2019-02-26,2,0.00584536,0.00686342,0.00807091,0.00784094 +2019-02-27,2,0.00507766,0.00671637,0.0069677,0.00784094 +2019-02-28,2,0.00530322,0.00648292,0.00597371,0.00784094 +2019-03-01,2,0.00629401,0.00660688,0.00645888,0.00784094 +2019-03-05,2,0.006414,0.00685178,0.00771392,0.00784094 +2019-03-06,2,0.00647207,0.00639278,0.00572506,0.00784094 +2019-03-07,2,0.00653391,0.00628156,0.00700249,0.00784094 +2019-03-08,2,0.00517119,0.00624016,0.00650447,0.00784094 +2019-03-11,2,0.00451575,0.00653751,0.00668169,0.00784094 +2019-03-12,2,0.00280765,0.00652116,0.00669909,0.00784094 +2019-03-13,2,0.00362274,0.00653305,0.00673677,0.00784094 +2019-03-14,2,0.0053153,0.00626072,0.00731239,0.00784094 +2019-03-15,2,0.00616127,0.00613369,0.00662108,0.00784094 +2019-03-18,2,0.00832744,0.0059742,0.0065731,0.00784094 +2019-03-19,2,0.00775111,0.00559201,0.00622587,0.00784094 +2019-03-20,2,0.00955532,0.00566337,0.00733385,0.00784094 +2019-03-22,2,0.00926091,0.00564718,0.00489774,0.00784094 +2019-03-25,2,0.00612168,0.00592492,0.00562572,0.00784094 +2019-03-26,2,0.00728952,0.00602042,0.0065042,0.00784094 +2019-03-27,2,0.00742395,0.00606298,0.00646359,0.00784094 +2019-03-28,2,0.00629066,0.00626616,0.00633657,0.00784094 +2019-04-01,2,0.00549631,0.00627192,0.00671511,0.00784094 +2019-04-02,2,0.00599821,0.00598972,0.00639949,0.00784094 +2019-04-03,2,0.00637937,0.00613511,0.00592651,0.00784094 +2019-04-04,2,0.00619614,0.00620455,0.00660596,0.00784094 +2019-04-05,2,0.00580703,0.00613399,0.00634325,0.00784094 +2019-04-08,2,0.00531584,0.006079,0.00630587,0.00784094 +2019-04-09,2,0.00589531,0.00611264,0.00628322,0.00784094 +2019-04-10,2,0.00413226,0.00631566,0.00627497,0.00784094 +2019-04-11,2,0.00855665,0.00627208,0.00656483,0.00784094 +2019-04-12,2,0.00825341,0.00606976,0.00648296,0.00784094 +2019-04-15,2,0.0103369,0.00581636,0.00442849,0.00784094 +2019-04-16,2,0.00978008,0.00594461,0.006204,0.00784094 +2019-04-18,2,0.0111572,0.0058504,0.00637338,0.00784094 +2019-04-22,2,0.00835985,0.0065016,0.00650433,0.00784094 +2019-04-23,2,0.0084118,0.00648153,0.00608913,0.00784094 +2019-04-24,2,0.00613024,0.00680273,0.00701549,0.00784094 +2019-04-25,2,0.00691632,0.00686717,0.00791006,0.00784094 +2019-04-26,2,0.00444567,0.00699681,0.00748577,0.00784094 +2019-04-30,2,0.00491544,0.00669678,0.00710996,0.00784094 +2019-05-02,2,0.00433017,0.00652041,0.00627552,0.00784094 +2019-05-03,2,0.00398941,0.00636577,0.00674962,0.00784094 +2019-05-06,2,0.00432649,0.0064428,0.00639879,0.00784094 +2019-05-07,2,0.00771797,0.00622436,0.00603715,0.00784094 +2019-05-08,2,0.00668149,0.00645332,0.00650957,0.00784094 +2019-05-09,2,0.00857316,0.00639653,0.00631793,0.00784094 +2019-05-10,2,0.0105213,0.00635393,0.0066141,0.00784094 +2019-05-13,2,0.0153734,0.00645669,0.00670012,0.00784094 +2019-05-14,2,0.0183337,0.00679845,0.0084283,0.00784094 +2019-05-15,2,0.0170478,0.0066533,0.00833794,0.00784094 +2019-05-16,2,0.0187214,0.0068883,0.00789049,0.00784094 +2019-05-17,2,0.0189817,0.0072892,0.00773077,0.00784094 +2019-05-20,2,0.0105186,0.00911565,0.00802484,0.00784094 +2019-05-21,2,0.00843056,0.00932863,0.00969389,0.00784094 +2019-05-22,2,0.00945894,0.00921399,0.00955983,0.00784094 +2019-05-23,2,0.00810622,0.00931106,0.0103952,0.00784094 +2019-05-24,2,0.00557311,0.00938186,0.0101066,0.00784094 +2019-05-27,2,0.00775151,0.00905708,0.00773091,0.00784094 +2019-05-28,2,0.00860546,0.00881309,0.00833451,0.00784094 +2019-05-29,2,0.0111552,0.00886057,0.00818572,0.00784094 +2019-05-30,2,0.0105427,0.00874046,0.00902064,0.00784094 +2019-05-31,2,0.0108163,0.00853712,0.00876998,0.00784094 +2019-06-03,2,0.0082061,0.00887272,0.00827927,0.00784094 +2019-06-04,2,0.00814872,0.00897178,0.00865659,0.00784094 +2019-06-06,2,0.00372105,0.00926523,0.00711914,0.00784094 +2019-06-07,2,0.00530359,0.0091489,0.00780663,0.00784094 +2019-06-10,2,0.00655546,0.00900551,0.00719872,0.00784094 +2019-06-11,2,0.00601144,0.00879966,0.00900156,0.00784094 +2019-06-12,2,0.0063429,0.00881373,0.00861244,0.00784094 +2019-06-13,2,0.00947945,0.0081933,0.00895681,0.00784094 +2019-06-14,2,0.00974587,0.00847152,0.00883391,0.00784094 +2019-06-17,2,0.00761299,0.00875614,0.0082584,0.00784094 +2019-06-18,2,0.00839813,0.00865868,0.0086213,0.00784094 +2019-06-19,2,0.00839029,0.00856826,0.00842457,0.00784094 +2019-06-20,2,0.00660671,0.00753628,0.00758931,0.00784094 +2019-06-21,2,0.00512393,0.00753487,0.00742581,0.00784094 +2019-06-24,2,0.00522408,0.00741,0.00734072,0.00784094 +2019-06-25,2,0.00437703,0.00747245,0.00812622,0.00784094 +2019-06-26,2,0.00418063,0.0071193,0.00781308,0.00784094 +2019-06-27,2,0.00409614,0.00693337,0.0074059,0.00784094 +2019-06-28,2,0.00693646,0.00683547,0.00730865,0.00784094 +2019-07-01,2,0.0109637,0.00686517,0.00749071,0.00784094 +2019-07-02,2,0.0102672,0.00673052,0.00637615,0.00784094 +2019-07-03,2,0.00966317,0.00670097,0.00690238,0.00784094 +2019-07-04,2,0.0109959,0.00637134,0.00640001,0.00784094 +2019-07-05,2,0.0106479,0.00676781,0.00606002,0.00784094 +2019-07-08,2,0.00481318,0.00741171,0.00686536,0.00784094 +2019-07-09,2,0.0054275,0.00735931,0.00612839,0.00784094 +2019-07-10,2,0.00393354,0.0072935,0.00735503,0.00784094 +2019-07-11,2,0.0055253,0.00744103,0.00741557,0.00784094 +2019-07-12,2,0.0090401,0.00740728,0.00678943,0.00784094 +2019-07-15,2,0.00860537,0.00706243,0.00657817,0.00784094 +2019-07-16,2,0.00670891,0.00712618,0.0077463,0.00784094 +2019-07-17,2,0.00516804,0.00675332,0.0069681,0.00784094 +2019-07-18,2,0.00570038,0.00697264,0.00798789,0.00784094 +2019-07-19,2,0.00366368,0.00754854,0.00727353,0.00784094 +2019-07-22,2,0.00428857,0.00727877,0.00781349,0.00784094 +2019-07-23,2,0.00503485,0.00707447,0.00752839,0.00784094 +2019-07-24,2,0.00592958,0.00696728,0.00732991,0.00784094 +2019-07-25,2,0.00726916,0.00684888,0.0066186,0.00784094 +2019-07-26,2,0.00694463,0.00663232,0.00623885,0.00784094 +2019-07-29,2,0.00759054,0.00675982,0.00668731,0.00784094 +2019-07-30,2,0.00935144,0.00689297,0.00721295,0.00784094 +2019-07-31,2,0.0090881,0.00687282,0.00663356,0.00784094 +2019-08-01,2,0.0116775,0.007019,0.00728406,0.00784094 +2019-08-02,2,0.0119946,0.00701218,0.0071056,0.00784094 +2019-08-05,2,0.0133763,0.00711289,0.00748448,0.00784094 +2019-08-06,2,0.0135907,0.00732822,0.0078099,0.00784094 +2019-08-07,2,0.0124345,0.00679043,0.00613579,0.00784094 +2019-08-08,2,0.0102255,0.00751344,0.00681188,0.00784094 +2019-08-09,2,0.00958551,0.00762426,0.0075534,0.00784094 +2019-08-13,2,0.00677288,0.00786589,0.00714795,0.00784094 +2019-08-14,2,0.00746167,0.00786837,0.00821796,0.00784094 +2019-08-16,2,0.00931124,0.00779442,0.00790212,0.00784094 +2019-08-19,2,0.0146819,0.00760994,0.00620375,0.00784094 +2019-08-20,2,0.0146346,0.00754572,0.00656051,0.00784094 +2019-08-21,2,0.0140608,0.00735737,0.00812552,0.00784094 +2019-08-22,2,0.0117879,0.00746055,0.00698175,0.00784094 +2019-08-23,2,0.0116794,0.00770397,0.00784658,0.00784094 +2019-08-26,2,0.0110235,0.00859417,0.00822048,0.00784094 +2019-08-27,2,0.0110305,0.00859343,0.00919719,0.00784094 +2019-08-28,2,0.0112411,0.00859524,0.00948602,0.00784094 +2019-08-29,2,0.0119718,0.00851313,0.00780455,0.00784094 +2019-08-30,2,0.0117571,0.00852403,0.00802031,0.00784094 +2019-09-03,2,0.00319514,0.00882818,0.00752812,0.00784094 +2019-09-04,2,0.00519903,0.00884401,0.00791031,0.00784094 +2019-09-05,2,0.00558576,0.00872516,0.00799634,0.00784094 +2019-09-06,2,0.00647136,0.00885413,0.00900341,0.00784094 +2019-09-09,2,0.00972976,0.00872527,0.00810731,0.00784094 +2019-09-11,2,0.00959964,0.00798709,0.00902848,0.00784094 +2019-09-12,2,0.0104486,0.00818609,0.008881,0.00784094 +2019-09-13,2,0.0279272,0.0080361,0.00863553,0.00784094 +2019-09-16,2,0.0291311,0.0081068,0.00882903,0.00784094 +2019-09-17,2,0.0260574,0.00837316,0.00761433,0.00784094 +2019-09-18,2,0.0284787,0.0082411,0.00799985,0.00784094 +2019-09-19,2,0.025411,0.00842811,0.00804425,0.00784094 +2019-09-20,2,0.0161788,0.0116045,0.0125228,0.00784094 +2019-09-23,2,0.00878957,0.0121589,0.012809,0.00784094 +2019-09-24,2,0.00939676,0.012001,0.0133274,0.00784094 +2019-09-25,2,0.00804582,0.0120167,0.013874,0.00784094 +2019-09-26,2,0.00400631,0.0119709,0.0143072,0.00784094 +2019-09-27,2,0.00410825,0.0114613,0.01204,0.00784094 +2019-09-30,2,0.0114751,0.0110315,0.0110873,0.00784094 +2019-10-01,2,0.0110706,0.0111371,0.0114731,0.00784094 +2019-10-03,2,0.0115917,0.010984,0.0110551,0.00784094 +2019-10-04,2,0.00936344,0.0105865,0.011039,0.00784094 +2019-10-07,2,0.00852703,0.0103155,0.00980123,0.00784094 +2019-10-09,2,0.00573142,0.0111804,0.010398,0.00784094 +2019-10-10,2,0.00316933,0.0112007,0.0111973,0.00784094 +2019-10-11,2,0.00317282,0.0112123,0.0107225,0.00784094 +2019-10-14,2,0.00652301,0.0110548,0.011155,0.00784094 +2019-10-15,2,0.00632108,0.0110153,0.0111051,0.00784094 +2019-10-16,2,0.00668876,0.0107122,0.0108432,0.00784094 +2019-10-17,2,0.00467571,0.0103436,0.0111168,0.00784094 +2019-10-18,2,0.00900267,0.010309,0.0106914,0.00784094 +2019-10-22,2,0.00766687,0.0105918,0.0100387,0.00784094 +2019-10-23,2,0.00755099,0.0105669,0.0102973,0.00784094 +2019-10-24,2,0.00700936,0.010468,0.0101758,0.00784094 +2019-10-25,2,0.00647489,0.00831764,0.008275,0.00784094 +2019-10-29,2,0.00276589,0.00809425,0.00702532,0.00784094 +2019-10-30,2,0.0026011,0.00802919,0.00726858,0.00784094 +2019-10-31,2,0.00271422,0.00773212,0.00709886,0.00784094 +2019-11-01,2,0.0056717,0.00753747,0.00727558,0.00784094 +2019-11-04,2,0.00524671,0.00744491,0.00743826,0.00784094 +2019-11-05,2,0.00584273,0.00702062,0.00702199,0.00784094 +2019-11-06,2,0.00554222,0.00677085,0.00648505,0.00784094 +2019-11-07,2,0.00513326,0.00670567,0.0062901,0.00784094 +2019-11-08,2,0.00350073,0.00685216,0.00647227,0.00784094 +2019-11-11,2,0.00419521,0.00671904,0.00727959,0.00784094 +2019-11-13,2,0.00237094,0.00649823,0.00684623,0.00784094 +2019-11-14,2,0.0033279,0.00627641,0.00695526,0.00784094 +2019-11-15,2,0.0042847,0.00618751,0.00691658,0.00784094 +2019-11-18,2,0.00706556,0.00605456,0.00711759,0.00784094 +2019-11-19,2,0.00747512,0.00606709,0.00669601,0.00784094 +2019-11-20,2,0.00750828,0.00586739,0.00677516,0.00784094 +2019-11-21,2,0.00715078,0.00584953,0.00697619,0.00784094 +2019-11-22,2,0.00812117,0.00595317,0.00669712,0.00784094 +2019-11-25,2,0.00535636,0.00633653,0.00670855,0.00784094 +2019-11-26,2,0.00557395,0.00641189,0.00699821,0.00784094 +2019-11-27,2,0.00528521,0.00637984,0.00705784,0.00784094 +2019-11-28,2,0.00444624,0.00636096,0.00699028,0.00784094 +2019-11-29,2,0.00452264,0.00600269,0.00727067,0.00784094 +2019-12-02,2,0.00477866,0.00580027,0.00760176,0.00784094 +2019-12-03,2,0.00518812,0.00587491,0.00691831,0.00784094 +2019-12-04,2,0.00531665,0.00584949,0.0069651,0.00784094 +2019-12-05,2,0.00626772,0.00576356,0.00717916,0.00784094 +2019-12-06,2,0.00608232,0.00594129,0.00689427,0.00784094 +2019-12-09,2,0.00656836,0.00591928,0.00723156,0.00784094 +2019-12-10,2,0.00494486,0.00601492,0.00677365,0.00784094 +2019-12-11,2,0.00494027,0.00590294,0.00700288,0.00784094 +2019-12-12,2,0.00502505,0.00603001,0.00726179,0.00784094 +2019-12-13,2,0.00440127,0.00610898,0.00708372,0.00784094 +2019-12-16,2,0.00380384,0.00615728,0.00731404,0.00784094 +2019-12-17,2,0.00335304,0.00617825,0.00687116,0.00784094 +2019-12-18,2,0.00408557,0.00619634,0.00694906,0.00784094 +2019-12-19,2,0.00641898,0.0061646,0.00672604,0.00784094 +2019-12-20,2,0.00641156,0.00578323,0.007149,0.00784094 +2019-12-23,2,0.00713315,0.00557979,0.00539149,0.00784094 +2019-12-24,2,0.00706906,0.00552575,0.0047863,0.00784094 +2019-12-26,2,0.00676175,0.00535565,0.00506422,0.00784094 +2019-12-27,2,0.00591005,0.00567867,0.00527018,0.00784094 +2019-12-30,2,0.0102188,0.0056242,0.00559884,0.00784094 +2019-12-31,2,0.010806,0.00576501,0.00465252,0.00784094 +2020-01-01,2,0.0106709,0.00558764,0.00524179,0.00784094 +2020-01-02,2,0.0128847,0.00569854,0.00522279,0.00784094 +2020-01-03,2,0.0128388,0.00561576,0.00449654,0.00784094 +2020-01-06,2,0.00652487,0.00661865,0.00655072,0.00784094 +2020-01-07,2,0.006656,0.00662211,0.00565983,0.00784094 +2020-01-08,2,0.00645286,0.00649833,0.00534757,0.00784094 +2020-01-09,2,0.00277261,0.00698213,0.00668717,0.00784094 +2020-01-10,2,0.00288986,0.00688875,0.00649752,0.00784094 +2020-01-13,2,0.00509843,0.00660774,0.005988,0.00784094 +2020-01-14,2,0.00453999,0.00659809,0.00612199,0.00784094 +2020-01-15,2,0.00451163,0.0064717,0.00542299,0.00784094 +2020-01-16,2,0.00614508,0.00610388,0.0050755,0.00784094 +2020-01-17,2,0.00721682,0.00600745,0.00505238,0.00784094 +2020-01-20,2,0.00728004,0.00641047,0.00579499,0.00784094 +2020-01-21,2,0.00735749,0.00637989,0.00565601,0.00784094 +2020-01-22,2,0.00780731,0.006415,0.00563733,0.00784094 +2020-01-23,2,0.00773892,0.00654228,0.00565484,0.00784094 +2020-01-24,2,0.00638601,0.00663638,0.005991,0.00784094 +2020-01-27,2,0.00981732,0.00675647,0.00678871,0.00784094 +2020-01-28,2,0.0166946,0.006655,0.00613634,0.00784094 +2020-01-29,2,0.0170756,0.00674684,0.0060512,0.00784094 +2020-01-30,2,0.0166608,0.00676958,0.0065341,0.00784094 +2020-01-31,2,0.01637,0.00672982,0.0060885,0.00784094 +2020-02-03,2,0.0113823,0.00742738,0.00700803,0.00784094 +2020-02-04,2,0.00628072,0.00846498,0.00782488,0.00784094 +2020-02-05,2,0.00590714,0.0081992,0.00865324,0.00784094 +2020-02-06,2,0.00598527,0.00817131,0.00853121,0.00784094 +2020-02-07,2,0.00631513,0.0081706,0.00848704,0.00784094 +2020-02-10,2,0.00632882,0.00772751,0.00825679,0.00784094 +2020-02-11,2,0.00551708,0.00748398,0.00832539,0.00784094 +2020-02-12,2,0.00699786,0.00749081,0.00854103,0.00784094 +2020-02-13,2,0.00708326,0.00748513,0.00796619,0.00784094 +2020-02-14,2,0.0113695,0.0075348,0.00833936,0.00784094 +2020-02-17,2,0.01139,0.0075575,0.00844079,0.00784094 +2020-02-18,2,0.0117093,0.00747184,0.00803836,0.00784094 +2020-02-19,2,0.00771194,0.00766575,0.00802141,0.00784094 +2020-02-20,2,0.0146235,0.00766288,0.00800538,0.00784094 +2020-02-24,2,0.0146282,0.00840127,0.0072106,0.00784094 +2020-02-25,2,0.0190392,0.00834066,0.00798325,0.00784094 +2020-02-26,2,0.0190833,0.00838948,0.00743208,0.00784094 +2020-02-27,2,0.0194929,0.00809686,0.0078195,0.00784094 +2020-02-28,2,0.0145874,0.00977703,0.00964903,0.00784094 +2020-03-02,2,0.0255351,0.00971252,0.0105662,0.00784094 +2020-03-03,2,0.0221807,0.0101659,0.0119559,0.00784094 +2020-03-04,2,0.0372925,0.010163,0.0124799,0.00784094 +2020-03-05,2,0.0473944,0.00989511,0.012046,0.00784094 +2020-03-06,2,0.0532866,0.0096576,0.00919133,0.00784094 +2020-03-09,2,0.0527409,0.011648,0.0125438,0.00784094 +2020-03-11,2,0.050452,0.011489,0.0132476,0.00784094 +2020-03-12,2,0.044001,0.0155515,0.0104939,0.00784094 +2020-03-13,2,0.0515734,0.0167141,0.0102041,0.00784094 +2020-03-16,2,0.0705036,0.0186541,0.0102041,0.00784094 +2020-03-17,2,0.076073,0.018585,0.0102783,0.00784094 +2020-03-18,2,0.0833832,0.0191517,0.0102041,0.00784094 +2020-03-19,2,0.0841572,0.0189821,0.0102655,0.00784094 +2020-03-20,2,0.0798459,0.0207116,0.0102041,0.00784094 +2020-03-23,2,0.0411279,0.0249628,0.0102041,0.00784094 +2020-03-24,2,0.0421222,0.0252981,0.010257,0.00784094 +2020-03-25,2,0.0403998,0.0267404,0.0102041,0.00784094 +2020-03-26,2,0.0340108,0.0272719,0.0102041,0.00784094 +2020-03-27,2,0.0559531,0.0272006,0.0110343,0.00784094 +2020-03-30,2,0.0499638,0.026246,0.0102041,0.00784094 +2020-03-31,2,0.0503994,0.0267198,0.0102041,0.00784094 +2020-04-01,2,0.0443386,0.0267107,0.0102041,0.00784094 +2020-04-03,2,0.0418402,0.0264185,0.0104573,0.00784094 +2020-04-07,2,0.0215766,0.0287047,0.0102041,0.00784094 +2020-04-08,2,0.0233356,0.0284805,0.0111154,0.00784094 +2020-04-09,2,0.016829,0.0288713,0.0102041,0.00784094 +2020-04-13,2,0.0221405,0.0286058,0.0111005,0.00784094 +2020-04-15,2,0.0237105,0.0282867,0.0110487,0.00784094 +2020-04-16,2,0.0239819,0.0271367,0.0109582,0.00784094 +2020-04-17,2,0.0218792,0.026637,0.0102121,0.00784094 +2020-04-20,2,0.0231074,0.0258912,0.00920633,0.00784094 +2020-04-21,2,0.0152039,0.0256975,0.0102149,0.00784094 +2020-04-22,2,0.014286,0.0258167,0.0103965,0.00784094 +2020-04-23,2,0.0179084,0.0253562,0.0110788,0.00784094 +2020-04-24,2,0.0356653,0.0251558,0.0107086,0.00784094 +2020-04-27,2,0.0354175,0.0248478,0.0110832,0.00784094 +2020-04-28,2,0.0351491,0.0202608,0.00974542,0.00784094 +2020-04-29,2,0.0332142,0.0201537,0.00941682,0.00784094 +2020-04-30,2,0.0270271,0.0198085,0.00929751,0.00784094 +2020-05-04,2,0.00755045,0.0216161,0.0102041,0.00784094 +2020-05-05,2,0.00643831,0.0216469,0.0111935,0.00784094 +2020-05-06,2,0.0110913,0.0210066,0.0110992,0.00784094 +2020-05-07,2,0.0168004,0.0206404,0.011062,0.00784094 +2020-05-08,2,0.0163825,0.0197773,0.011101,0.00784094 +2020-05-11,2,0.0217845,0.0180415,0.00995029,0.00784094 +2020-05-12,2,0.0228815,0.0157146,0.00996776,0.00784094 +2020-05-13,2,0.023109,0.016387,0.0095818,0.00784094 +2020-05-14,2,0.0206903,0.016502,0.00932319,0.00784094 +2020-05-15,2,0.0208963,0.0163907,0.00922548,0.00784094 +2020-05-18,2,0.0105457,0.0172309,0.0102034,0.00784094 +2020-05-19,2,0.015999,0.0172798,0.0110391,0.00784094 +2020-05-20,2,0.0156268,0.0170939,0.0104573,0.00784094 +2020-05-21,2,0.0154032,0.0169872,0.0110563,0.00784094 +2020-05-22,2,0.0128269,0.0165911,0.0109201,0.00784094 +2020-05-26,2,0.0084715,0.0156389,0.00985895,0.00784094 +2020-05-27,2,0.00699844,0.0164547,0.00930758,0.00784094 +2020-05-28,2,0.010463,0.0164344,0.00939977,0.00784094 +2020-05-29,2,0.0104258,0.0163806,0.0097643,0.00784094 +2020-06-01,2,0.0073382,0.0164172,0.0090196,0.00784094 +2020-06-02,2,0.0092702,0.015936,0.0100225,0.00784094 +2020-06-03,2,0.00903897,0.015367,0.0102351,0.00784094 +2020-06-04,2,0.0136703,0.0136708,0.00968727,0.00784094 +2020-06-05,2,0.0127344,0.0135812,0.010166,0.00784094 +2020-06-08,2,0.013297,0.0132767,0.00971129,0.00784094 +2020-06-09,2,0.0148598,0.0135507,0.010119,0.00784094 +2020-06-10,2,0.0138888,0.0134966,0.00990178,0.00784094 +2020-06-11,2,0.0141123,0.0142702,0.00953007,0.00784094 +2020-06-12,2,0.0149926,0.014047,0.00964999,0.00784094 +2020-06-15,2,0.00918695,0.0141051,0.00959355,0.00784094 +2020-06-16,2,0.00951601,0.0135627,0.00983558,0.00784094 +2020-06-17,2,0.0145768,0.013512,0.00938217,0.00784094 +2020-06-18,2,0.0131003,0.0124361,0.00910401,0.00784094 +2020-06-19,2,0.0120675,0.0125385,0.00893842,0.00784094 +2020-06-22,2,0.0124792,0.0119136,0.00908494,0.00784094 +2020-06-23,2,0.00914499,0.0115345,0.0089319,0.00784094 +2020-06-24,2,0.0080058,0.0121058,0.00913162,0.00784094 +2020-06-25,2,0.00851522,0.0119144,0.00915539,0.00784094 +2020-06-26,2,0.00822563,0.0112737,0.00954243,0.00784094 +2020-06-29,2,0.00637608,0.0112305,0.00928706,0.00784094 +2020-06-30,2,0.00486524,0.0109202,0.00933152,0.00784094 +2020-07-01,2,0.00904677,0.010413,0.00920425,0.00784094 +2020-07-02,2,0.00879141,0.0103043,0.00916897,0.00784094 +2020-07-03,2,0.00967028,0.0102333,0.00905729,0.00784094 +2020-07-06,2,0.00729737,0.00989989,0.00922884,0.00784094 +2020-07-07,2,0.0108737,0.00966606,0.00905163,0.00784094 +2020-07-08,2,0.0105925,0.0101114,0.00887241,0.00784094 +2020-07-09,2,0.010986,0.00992529,0.00890905,0.00784094 +2020-07-10,2,0.012917,0.0100197,0.0087953,0.00784094 +2020-07-13,2,0.0134853,0.00921158,0.00944143,0.00784094 +2020-07-14,2,0.00535563,0.0099194,0.00876284,0.00784094 +2020-07-15,2,0.00694897,0.00951529,0.00926894,0.00784094 +2020-07-16,2,0.00689935,0.00950065,0.00978662,0.00784094 +2020-07-17,2,0.00717222,0.00965655,0.0107138,0.00784094 +2020-07-20,2,0.00769255,0.0094091,0.00940088,0.00784094 +2020-07-21,2,0.00855722,0.00879889,0.00843375,0.00784094 +2020-07-22,2,0.00979336,0.0089794,0.00872856,0.00784094 +2020-07-23,2,0.00996855,0.00882287,0.00852961,0.00784094 +2020-07-24,2,0.00997105,0.00838691,0.0068767,0.00784094 +2020-07-27,2,0.011927,0.00846009,0.00722994,0.00784094 +2020-07-28,2,0.0133582,0.00840326,0.00716607,0.00784094 +2020-07-29,2,0.0131288,0.00852865,0.00691585,0.00784094 +2020-07-30,2,0.0131052,0.00871695,0.00715694,0.00784094 +2020-07-31,2,0.012898,0.00864525,0.00710797,0.00784094 +2020-08-03,2,0.00732337,0.00907514,0.00972065,0.00784094 +2020-08-04,2,0.00331908,0.00945,0.0102176,0.00784094 +2020-08-05,2,0.00385366,0.00926026,0.00970561,0.00784094 +2020-08-06,2,0.00291835,0.00929174,0.0109314,0.00784094 +2020-08-07,2,0.00640937,0.00908736,0.00976999,0.00784094 +2020-08-10,2,0.00667356,0.00870404,0.00958357,0.00784094 +2020-08-11,2,0.00866946,0.00810729,0.00840035,0.00784094 +2020-08-12,2,0.00857032,0.00819835,0.00925048,0.00784094 +2020-08-13,2,0.00975068,0.00757102,0.00835104,0.00784094 +2020-08-14,2,0.00760427,0.00819661,0.00791809,0.00784094 +2020-08-17,2,0.00785602,0.00812544,0.00812142,0.00784094 +2020-08-18,2,0.00634266,0.00818978,0.00794415,0.00784094 +2020-08-19,2,0.00676909,0.00799827,0.00771444,0.00784094 +2020-08-20,2,0.00350657,0.0079986,0.00782684,0.00784094 +2020-08-21,2,0.00380986,0.00787858,0.00824128,0.00784094 +2020-08-24,2,0.012294,0.00785638,0.00838055,0.00784094 +2020-08-25,2,0.0129062,0.00771962,0.00812382,0.00784094 +2020-08-26,2,0.012772,0.00772409,0.0080781,0.00784094 +2020-08-27,2,0.0127576,0.0071633,0.0076456,0.00784094 +2020-08-28,2,0.0135307,0.00710946,0.00704726,0.00784094 +2020-08-31,2,0.00966021,0.00836461,0.00772785,0.00784094 +2020-09-01,2,0.00862445,0.00839299,0.00853367,0.00784094 +2020-09-02,2,0.00728781,0.00795059,0.00768206,0.00784094 +2020-09-03,2,0.0115261,0.00749759,0.0072733,0.00784094 +2020-09-04,2,0.0075714,0.00805744,0.00727646,0.00784094 +2020-09-07,2,0.00783392,0.00775959,0.00674455,0.00784094 +2020-09-08,2,0.00761801,0.00771899,0.00689943,0.00784094 +2020-09-09,2,0.00656478,0.00762465,0.00681565,0.00784094 +2020-09-10,2,0.00632412,0.00808733,0.00731058,0.00784094 +2020-09-11,2,0.00639233,0.00784713,0.00728171,0.00784094 +2020-09-14,2,0.0123043,0.0078703,0.00701931,0.00784094 +2020-09-15,2,0.0108926,0.00770908,0.00850934,0.00784094 +2020-09-16,2,0.00854731,0.00760966,0.00892052,0.00784094 +2020-09-17,2,0.0127817,0.00753769,0.00816295,0.00784094 +2020-09-18,2,0.0202483,0.00753587,0.00756311,0.00784094 +2020-09-21,2,0.0207227,0.00845029,0.00773278,0.00784094 +2020-09-22,2,0.0202262,0.0084329,0.0075431,0.00784094 +2020-09-23,2,0.0201479,0.00819126,0.00768401,0.00784094 +2020-09-24,2,0.00971656,0.00928708,0.00919667,0.00784094 +2020-09-25,2,0.00734717,0.0100907,0.0107505,0.00784094 +2020-09-28,2,0.00680618,0.0103518,0.0117536,0.00784094 +2020-09-29,2,0.00528469,0.0102713,0.0118849,0.00784094 +2020-09-30,2,0.00386827,0.00988752,0.0116964,0.00784094 +2020-10-01,2,0.00298018,0.00959511,0.00914239,0.00784094 +2020-10-05,2,0.00440854,0.00944715,0.00923947,0.00784094 +2020-10-06,2,0.00351069,0.00955824,0.00933072,0.00784094 +2020-10-07,2,0.00337676,0.00913793,0.00924811,0.00784094 +2020-10-08,2,0.0125126,0.0089933,0.00898933,0.00784094 +2020-10-09,2,0.0125693,0.00882993,0.00925554,0.00784094 +2020-10-12,3,0.0136537,0.00896114,0.00936711,0.00788948 +2020-10-13,3,0.0137143,0.0086358,0.00883201,0.00788948 +2020-10-14,3,0.0137402,0.00860242,0.0094557,0.00788948 +2020-10-15,3,0.00492777,0.0103208,0.00939313,0.00788948 +2020-10-16,3,0.00456083,0.0103237,0.0101905,0.00788948 +2020-10-19,3,0.0072152,0.0104313,0.0102985,0.00788948 +2020-10-20,3,0.00902509,0.0103659,0.0105155,0.00788948 +2020-10-21,3,0.0104334,0.0103587,0.0108345,0.00788948 +2020-10-22,3,0.0104547,0.00895624,0.00906693,0.00788948 +2020-10-23,3,0.00986159,0.00877203,0.00918483,0.00788948 +2020-10-26,3,0.00882014,0.00938434,0.00877618,0.00788948 +2020-10-27,3,0.0095199,0.00845308,0.00742815,0.00788948 +2020-10-28,3,0.00717523,0.00848093,0.00713217,0.00788948 +2020-10-29,3,0.00793179,0.00830742,0.00717485,0.00788948 +2020-10-30,3,0.00568063,0.00827857,0.00746454,0.00788948 +2020-11-02,3,0.00378049,0.00819518,0.007504,0.00788948 +2020-11-03,3,0.0037526,0.00816991,0.00729605,0.00788948 +2020-11-04,3,0.0033078,0.00797137,0.00791967,0.00788948 +2020-11-05,3,0.00808517,0.00819408,0.0070671,0.00788948 +2020-11-06,3,0.00843756,0.00804484,0.00744033,0.00788948 +2020-11-09,3,0.0075676,0.00792996,0.00893129,0.00788948 +2020-11-10,3,0.00646754,0.00804103,0.00916455,0.00788948 +2020-11-11,3,0.0095324,0.0079899,0.00926316,0.00788948 +2020-11-12,3,0.00941825,0.00872232,0.00950048,0.00788948 +2020-11-13,3,0.00948294,0.00875353,0.0096497,0.00788948 +2020-11-17,3,0.00902039,0.00776364,0.00753709,0.00788948 +2020-11-18,3,0.011861,0.0076436,0.00775019,0.00788948 +2020-11-19,3,0.0105555,0.00827358,0.00731484,0.00788948 +2020-11-20,3,0.0105185,0.00827708,0.00773024,0.00788948 +2020-11-23,3,0.0112451,0.00828607,0.00763392,0.00788948 +2020-11-24,3,0.0105253,0.00822469,0.00735518,0.00788948 +2020-11-25,3,0.00567936,0.00888297,0.00880158,0.00788948 +2020-11-26,3,0.00555538,0.00844743,0.00692104,0.00788948 +2020-11-27,3,0.00468437,0.00843766,0.00749691,0.00788948 +2020-12-01,3,0.00390481,0.00809365,0.00721857,0.00788948 +2020-12-02,3,0.00388962,0.00791598,0.00696522,0.00788948 +2020-12-03,3,0.0057613,0.00741745,0.00731537,0.00788948 +2020-12-04,3,0.00528515,0.00740766,0.0070945,0.00788948 +2020-12-07,3,0.00491412,0.00723409,0.00708632,0.00788948 +2020-12-08,3,0.00502362,0.00711287,0.0067976,0.00788948 +2020-12-09,3,0.00441237,0.00691794,0.00698414,0.00788948 +2020-12-10,3,0.00286151,0.00720167,0.00726579,0.00788948 +2020-12-11,3,0.00303303,0.00691571,0.00724589,0.00788948 +2020-12-14,3,0.0162118,0.00669423,0.00688151,0.00788948 +2020-12-15,3,0.0173483,0.00664418,0.00690004,0.00788948 +2020-12-16,3,0.0175794,0.00650989,0.00624578,0.00788948 +2020-12-17,3,0.0183214,0.00624323,0.00650696,0.00788948 +2020-12-18,3,0.0187612,0.00613929,0.00658909,0.00788948 +2020-12-21,3,0.00265605,0.00904809,0.00953942,0.00788948 +2020-12-22,3,0.00337164,0.00887829,0.00771796,0.00788948 +2020-12-23,3,0.00436725,0.0089276,0.00801246,0.00788948 +2020-12-24,3,0.00327753,0.00903596,0.00865757,0.00788948 +2020-12-28,3,0.0029542,0.0090399,0.0091155,0.00788948 +2020-12-29,3,0.00298075,0.00717866,0.00787183,0.00788948 +2020-12-30,3,0.00452413,0.00727927,0.00780521,0.00788948 +2020-12-31,3,0.00461155,0.00743743,0.00733771,0.00788948 +2021-01-01,3,0.00728726,0.00716993,0.00808731,0.00788948 +2021-01-04,3,0.00748095,0.00712348,0.0084366,0.00788948 +2021-01-05,3,0.00748263,0.00712568,0.00820407,0.00788948 +2021-01-06,3,0.00647831,0.00741618,0.00782679,0.00788948 +2021-01-07,3,0.00588396,0.0074172,0.00802851,0.00788948 +2021-01-08,3,0.00777809,0.0079287,0.00724544,0.00788948 +2021-01-11,3,0.00759758,0.00793864,0.00750959,0.00788948 +2021-01-12,3,0.0113716,0.00785092,0.00776098,0.00788948 +2021-01-13,3,0.0120907,0.00776298,0.00664442,0.00788948 +2021-01-14,3,0.0122482,0.00769632,0.00720411,0.00788948 +2021-01-15,3,0.0132246,0.00815803,0.00775382,0.00788948 +2021-01-18,3,0.0129927,0.00830924,0.00866597,0.00788948 +2021-01-19,3,0.0108136,0.00886962,0.00787659,0.00788948 +2021-01-20,3,0.00588766,0.00895754,0.00946152,0.00788948 +2021-01-21,3,0.00388962,0.00719938,0.00692559,0.00788948 +2021-01-22,3,0.026878,0.00779719,0.00702815,0.00788948 +2021-01-25,3,0.0286947,0.00791646,0.00737089,0.00788948 +2021-01-27,3,0.02511,0.00828702,0.00721782,0.00788948 +2021-01-28,3,0.0222602,0.00790533,0.00732659,0.00788948 +2021-01-29,3,0.0180512,0.00778427,0.00761437,0.00788948 +2021-02-01,3,0.00877029,0.011576,0.0154028,0.00788948 +2021-02-02,3,0.00543179,0.0121118,0.0129825,0.00788948 +2021-02-03,3,0.00564712,0.0120017,0.0131584,0.00788948 +2021-02-04,3,0.00542666,0.0118615,0.0138264,0.00788948 +2021-02-05,3,0.00575025,0.0116286,0.0122787,0.00788948 +2021-02-08,3,0.00460026,0.0109316,0.00960004,0.00788948 +2021-02-09,3,0.00454491,0.0104642,0.00928521,0.00788948 +2021-02-10,3,0.00625341,0.0104097,0.00911047,0.00788948 +2021-02-11,3,0.0066838,0.0103398,0.00930231,0.00788948 +2021-02-12,3,0.00766355,0.0103889,0.00931816,0.00788948 +2021-02-15,3,0.00754874,0.0102198,0.00924392,0.00788948 +2021-02-16,3,0.0082206,0.0102051,0.00906209,0.00788948 +2021-02-17,3,0.0145351,0.0104422,0.00943773,0.00788948 +2021-02-18,3,0.015112,0.0104382,0.00945957,0.00788948 +2021-02-19,3,0.0229905,0.0105066,0.00950718,0.00788948 +2021-02-22,3,0.0230297,0.0107739,0.00974091,0.00788948 +2021-02-23,3,0.0234282,0.0108479,0.00979351,0.00788948 +2021-02-24,3,0.0239939,0.0114592,0.0110134,0.00788948 +2021-02-25,3,0.024611,0.0114233,0.010599,0.00788948 +2021-02-26,3,0.0148964,0.0127391,0.0152928,0.00788948 +2021-03-01,3,0.0137572,0.0127512,0.0134591,0.00788948 +2021-03-02,3,0.0135983,0.0126179,0.0135941,0.00788948 +2021-03-03,3,0.00895376,0.0115435,0.0133065,0.00788948 +2021-03-04,3,0.00859285,0.0112587,0.013164,0.00788948 +2021-03-05,3,0.00795308,0.0107841,0.0108441,0.00788948 +2021-03-08,3,0.00792715,0.0106677,0.0108834,0.00788948 +2021-03-09,3,0.00704864,0.0107248,0.0109868,0.00788948 +2021-03-10,3,0.00450891,0.0102191,0.00966675,0.00788948 +2021-03-12,3,0.0102747,0.0102562,0.0095875,0.00788948 +2021-03-15,3,0.0102114,0.010217,0.0096427,0.00788948 +2021-03-16,3,0.0108303,0.0101939,0.00960443,0.00788948 +2021-03-17,3,0.0123849,0.0101953,0.00934688,0.00788948 +2021-03-18,3,0.0132877,0.00973338,0.00961578,0.00788948 +2021-03-19,3,0.0132717,0.0106574,0.00984921,0.00788948 +2021-03-22,3,0.0178585,0.0106294,0.00980399,0.00788948 +2021-03-23,3,0.0183953,0.0106997,0.00967997,0.00788948 +2021-03-24,3,0.0165109,0.0110094,0.0107189,0.00788948 +2021-03-25,3,0.0165139,0.0109533,0.0101315,0.00788948 +2021-03-26,3,0.0158485,0.0110887,0.0103185,0.00788948 +2021-03-30,3,0.0121227,0.0115515,0.0114946,0.00788948 +2021-03-31,3,0.0107478,0.0116009,0.01259,0.00788948 +2021-04-01,3,0.00943128,0.0103795,0.0106387,0.00788948 +2021-04-05,3,0.0180693,0.010395,0.010462,0.00788948 +2021-04-06,3,0.0196831,0.0102494,0.0099717,0.00788948 +2021-04-07,3,0.0191753,0.00959773,0.00968158,0.00788948 +2021-04-08,3,0.0190747,0.00941017,0.00897316,0.00788948 +2021-04-09,3,0.0200915,0.00921703,0.00940603,0.00788948 +2021-04-12,3,0.0117533,0.0109833,0.0122511,0.00788948 +2021-04-13,3,0.0102545,0.0111648,0.0129566,0.00788948 +2021-04-15,3,0.00958312,0.0111414,0.0138627,0.00788948 +2021-04-16,3,0.0111683,0.0110932,0.0137626,0.00788948 +2021-04-19,3,0.00788395,0.011351,0.0129477,0.00788948 +2021-04-20,3,0.00729401,0.0108114,0.00970592,0.00788948 +2021-04-22,3,0.00773974,0.0106426,0.0100191,0.00788948 +2021-04-23,3,0.0130501,0.0105043,0.0100636,0.00788948 +2021-04-26,3,0.0126586,0.0105959,0.00981099,0.00788948 +2021-04-27,3,0.0121977,0.0103793,0.0100728,0.00788948 +2021-04-28,3,0.0103237,0.0104359,0.00960059,0.00788948 +2021-04-29,3,0.0112353,0.0102247,0.00994204,0.00788948 +2021-04-30,3,0.00745475,0.010792,0.0103903,0.00788948 +2021-05-03,3,0.00764095,0.0106031,0.0100119,0.00788948 +2021-05-04,3,0.00617108,0.0101557,0.0109989,0.00788948 +2021-05-05,3,0.00869874,0.00998876,0.00992168,0.00788948 +2021-05-06,3,0.00798228,0.00998155,0.00929495,0.00788948 +2021-05-07,3,0.0109358,0.00943564,0.00961013,0.00788948 +2021-05-10,3,0.0117329,0.00949875,0.0095068,0.00788948 +2021-05-11,3,0.011566,0.0092871,0.00948578,0.00788948 +2021-05-12,3,0.010995,0.00966595,0.00950391,0.00788948 +2021-05-14,3,0.0124528,0.00958674,0.00973285,0.00788948 +2021-05-17,3,0.0112183,0.0086899,0.00783756,0.00788948 +2021-05-18,3,0.0101229,0.00871435,0.00766035,0.00788948 +2021-05-19,3,0.00955323,0.00874512,0.00793879,0.00788948 +2021-05-20,3,0.00712166,0.00881341,0.00953776,0.00788948 +2021-05-21,3,0.00264648,0.00876848,0.00765816,0.00788948 +2021-05-24,3,0.003482,0.00862199,0.00771085,0.00788948 +2021-05-25,3,0.00387772,0.00850604,0.00775226,0.00788948 +2021-05-26,3,0.00427177,0.00840926,0.00763712,0.00788948 +2021-05-27,3,0.00449292,0.00811579,0.00749931,0.00788948 +2021-05-28,3,0.00499351,0.007337,0.00789448,0.00788948 +2021-05-31,3,0.00383536,0.00737742,0.00814862,0.00788948 +2021-06-01,3,0.00387525,0.00745435,0.00831998,0.00788948 +2021-06-02,3,0.00556895,0.00693406,0.00676164,0.00788948 +2021-06-03,3,0.00534801,0.00697494,0.00704366,0.00788948 +2021-06-04,3,0.00539394,0.00680332,0.00732732,0.00788948 +2021-06-07,3,0.0050178,0.00660521,0.0069007,0.00788948 +2021-06-08,3,0.00507101,0.00660969,0.00755891,0.00788948 +2021-06-09,3,0.00496961,0.00695688,0.00727426,0.00788948 +2021-06-10,3,0.00479712,0.00690719,0.00722862,0.00788948 +2021-06-11,3,0.00412102,0.00678092,0.00702098,0.00788948 +2021-06-14,3,0.00476667,0.00640325,0.00632505,0.00788948 +2021-06-15,3,0.00437373,0.00636498,0.00565104,0.00788948 +2021-06-16,3,0.00409644,0.00615314,0.00598591,0.00788948 +2021-06-17,3,0.00458982,0.00600737,0.00619068,0.00788948 +2021-06-18,3,0.0046433,0.00582304,0.00699033,0.00788948 +2021-06-21,3,0.00499637,0.00563384,0.00611201,0.00788948 +2021-06-22,3,0.00543054,0.00482449,0.00668408,0.00788948 +2021-06-23,3,0.00476055,0.00496522,0.00628951,0.00788948 +2021-06-24,3,0.00337289,0.00509317,0.00632917,0.00788948 +2021-06-25,3,0.00263473,0.00505655,0.00624588,0.00788948 +2021-06-28,3,0.00460923,0.00514283,0.00620808,0.00788948 +2021-06-29,3,0.00402458,0.00518475,0.00617631,0.00788948 +2021-06-30,3,0.00389675,0.00487272,0.00662628,0.00788948 +2021-07-01,3,0.00640568,0.004746,0.00680405,0.00788948 +2021-07-02,3,0.0063992,0.00465861,0.00672859,0.00788948 +2021-07-05,3,0.00494944,0.00489151,0.00651021,0.00788948 +2021-07-06,3,0.00653622,0.00482861,0.00689641,0.00788948 +2021-07-07,3,0.00636958,0.00477615,0.00652645,0.00788948 +2021-07-08,3,0.00385311,0.00528915,0.00596811,0.00788948 +2021-07-09,3,0.00318562,0.0051554,0.006471,0.00788948 +2021-07-12,3,0.00703431,0.00489088,0.00603335,0.00788948 +2021-07-13,3,0.00662406,0.0051677,0.0065,0.00788948 +2021-07-14,3,0.00926193,0.00516274,0.00631875,0.00788948 +2021-07-15,3,0.00900973,0.00495084,0.00633581,0.00788948 +2021-07-16,3,0.00900812,0.00471938,0.00622883,0.00788948 +2021-07-19,3,0.0077487,0.00539878,0.00575731,0.00788948 +2021-07-20,3,0.00674738,0.00554435,0.00645339,0.00788948 +2021-07-22,3,0.00372813,0.00607928,0.00647037,0.00788948 +2021-07-23,3,0.00343559,0.00605942,0.00628769,0.00788948 +2021-07-26,3,0.00516628,0.00598748,0.00638392,0.00788948 +2021-07-27,3,0.00714829,0.00585017,0.00567206,0.00788948 +2021-07-28,3,0.00594382,0.00573126,0.00551342,0.00788948 +2021-07-29,3,0.00624549,0.0054623,0.00522693,0.00788948 +2021-07-30,3,0.00703422,0.00537932,0.00559536,0.00788948 +2021-08-02,3,0.00721983,0.0057124,0.0058097,0.00788948 +2021-08-03,3,0.00405332,0.0063447,0.00632157,0.00788948 +2021-08-04,3,0.00222417,0.00632226,0.00557969,0.00788948 +2021-08-05,3,0.003043,0.00628255,0.00512457,0.00788948 +2021-08-06,3,0.00405897,0.00637977,0.00532564,0.00788948 +2021-08-09,3,0.00395744,0.00637879,0.00577531,0.00788948 +2021-08-10,3,0.00376717,0.00579302,0.00480384,0.00788948 +2021-08-11,3,0.00464191,0.00544954,0.00500325,0.00788948 +2021-08-12,3,0.00647367,0.00562206,0.00477958,0.00788948 +2021-08-13,3,0.00446811,0.00584066,0.00535715,0.00788948 +2021-08-16,3,0.00577836,0.00580824,0.00488297,0.00788948 +2021-08-17,3,0.00562867,0.0057725,0.00504852,0.00788948 +2021-08-18,3,0.00538687,0.00592216,0.00500727,0.00788948 +2021-08-20,3,0.0030667,0.00592915,0.00525684,0.00788948 +2021-08-23,3,0.00552612,0.00550195,0.00509291,0.00788948 +2021-08-24,3,0.00624667,0.00545245,0.00581661,0.00788948 +2021-08-25,3,0.00724635,0.00544183,0.00615757,0.00788948 +2021-08-26,3,0.00676837,0.00538305,0.00575294,0.00788948 +2021-08-27,3,0.00666688,0.00497202,0.0050167,0.00788948 +2021-08-30,3,0.0058267,0.00547512,0.00597584,0.00788948 +2021-08-31,3,0.00493093,0.00571972,0.00568443,0.00788948 +2021-09-01,3,0.00419706,0.0058656,0.00451715,0.00788948 +2021-09-02,3,0.00256168,0.00586811,0.00519593,0.00788948 +2021-09-03,3,0.00170448,0.00549275,0.00536637,0.00788948 +2021-09-06,3,0.00106657,0.00535967,0.00538267,0.00788948 +2021-09-07,3,0.00358196,0.00531949,0.00618419,0.00788948 +2021-09-08,3,0.00376729,0.00516,0.00550036,0.00788948 +2021-09-09,3,0.00451575,0.00493689,0.00546578,0.00788948 +2021-09-13,3,0.00751889,0.00478449,0.00531258,0.00788948 +2021-09-14,3,0.00855527,0.00456892,0.00499329,0.00788948 +2021-09-15,3,0.00791981,0.00515919,0.00552214,0.00788948 +2021-09-16,3,0.0103977,0.00507604,0.00513259,0.00788948 +2021-09-17,3,0.0100875,0.00524164,0.00538082,0.00788948 +2021-09-20,3,0.00710285,0.00595989,0.00529343,0.00788948 +2021-09-21,3,0.00808093,0.00609075,0.00515438,0.00788948 +2021-09-22,3,0.00821221,0.0058335,0.00618893,0.00788948 +2021-09-23,3,0.00332403,0.00637237,0.00674989,0.00788948 +2021-09-24,3,0.00255615,0.00631475,0.00542713,0.00788948 +2021-09-27,3,0.00625975,0.00612247,0.0054039,0.00788948 +2021-09-28,3,0.00687351,0.00636067,0.00511004,0.00788948 +2021-09-29,3,0.00842751,0.00641893,0.00515297,0.00788948 +2021-09-30,3,0.00875309,0.005775,0.00520233,0.00788948 +2021-10-01,3,0.00793495,0.00549973,0.00483593,0.00788948 +2021-10-04,3,0.0074391,0.00605635,0.00560782,0.00788948 +2021-10-05,3,0.00700641,0.00604589,0.00581707,0.00788948 +2021-10-06,3,0.00307109,0.00640915,0.00580161,0.00788948 +2021-10-07,3,0.00342692,0.00653329,0.00593579,0.00788948 +2021-10-08,3,0.00348243,0.00650965,0.00528631,0.00788948 +2021-10-11,3,0.00547697,0.00646779,0.0053565,0.00788948 +2021-10-12,3,0.00823995,0.00643349,0.00526709,0.00788948 +2021-10-13,3,0.00794798,0.0060641,0.00538298,0.00788948 +2021-10-14,3,0.00593733,0.00621605,0.00542671,0.00788948 +2021-10-18,3,0.00320161,0.00621143,0.00550724,0.00788948 +2021-10-19,3,0.00618827,0.00649128,0.00476781,0.00788948 +2021-10-20,3,0.00514461,0.00689924,0.00782826,0.00788948 +2021-10-21,3,0.0100673,0.00666638,0.00543083,0.00788948 +2021-10-22,3,0.0105252,0.00642804,0.00498239,0.00788948 +2021-10-25,3,0.0137115,0.00606774,0.00558413,0.00788948 +2021-10-26,3,0.0125588,0.00611,0.00576977,0.00788948 +2021-10-27,3,0.0125551,0.00604548,0.00508165,0.00788948 +2021-10-28,3,0.00945254,0.00724271,0.00793059,0.00788948 +2021-10-29,3,0.00746535,0.00739333,0.00843298,0.00788948 +2021-11-01,3,0.00512852,0.00790542,0.00765579,0.00788948 +2021-11-02,3,0.00500513,0.00780259,0.00741129,0.00788948 +2021-11-03,3,0.00636424,0.00777877,0.00753203,0.00788948 +2021-11-04,3,0.00836947,0.00750061,0.00869122,0.00788948 +2021-11-08,3,0.00757454,0.00736744,0.00929395,0.00788948 +2021-11-09,3,0.00813552,0.00695256,0.00792926,0.00788948 +2021-11-10,3,0.00846185,0.00686036,0.00788411,0.00788948 +2021-11-11,3,0.00836634,0.00707185,0.00914656,0.00788948 +2021-11-12,3,0.00739023,0.00749473,0.00852277,0.00788948 +2021-11-15,3,0.00880239,0.0074196,0.0075292,0.00788948 +2021-11-16,3,0.00883574,0.00738881,0.00869128,0.00788948 +2021-11-17,3,0.0107589,0.00727716,0.00865665,0.00788948 +2021-11-18,3,0.0158139,0.00720115,0.00893011,0.00788948 +2021-11-22,3,0.0148564,0.00761337,0.00783294,0.00788948 +2021-11-23,3,0.0139815,0.00775831,0.00813955,0.00788948 +2021-11-24,3,0.0159132,0.00776426,0.00818132,0.00788948 +2021-11-25,3,0.0171654,0.00800904,0.00827914,0.00788948 +2021-11-26,3,0.0104961,0.00928365,0.00935066,0.00788948 +2021-11-29,3,0.0134363,0.00911372,0.00885851,0.00788948 +2021-11-30,3,0.0152794,0.00906506,0.0095806,0.00788948 +2021-12-01,3,0.0163461,0.00903211,0.00867737,0.00788948 +2021-12-02,3,0.0153625,0.00926429,0.00936795,0.00788948 +2021-12-03,3,0.0136632,0.00870535,0.00921159,0.00788948 +2021-12-06,3,0.0107236,0.0091577,0.00891961,0.00788948 +2021-12-07,3,0.00938486,0.00961534,0.00952679,0.00788948 +2021-12-08,3,0.00435259,0.00998889,0.0106437,0.00788948 +2021-12-09,3,0.00400886,0.00985507,0.0107023,0.00788948 +2021-12-10,3,0.00636868,0.00975172,0.0101145,0.00788948 +2021-12-13,3,0.0096794,0.00958255,0.00864908,0.00788948 +2021-12-14,3,0.0126425,0.00942698,0.00932089,0.00788948 +2021-12-15,3,0.0148837,0.00861391,0.00930444,0.00788948 +2021-12-16,3,0.0154799,0.00855327,0.00932523,0.00788948 +2021-12-17,3,0.0137762,0.00907136,0.00884206,0.00788948 +2021-12-20,3,0.0058756,0.00977069,0.00945793,0.00788948 +2021-12-21,3,0.00575413,0.0101245,0.0113462,0.00788948 +2021-12-22,3,0.00538957,0.0101395,0.0115989,0.00788948 +2021-12-23,3,0.00507472,0.0102032,0.0115346,0.00788948 +2021-12-24,3,0.00476253,0.0100886,0.0121462,0.00788948 +2021-12-27,3,0.00704395,0.00931267,0.00970007,0.00788948 +2021-12-28,3,0.00720781,0.00857042,0.0100286,0.00788948 +2021-12-29,3,0.00584476,0.00852041,0.00995784,0.00788948 +2021-12-30,3,0.0096602,0.0084501,0.00952141,0.00788948 +2021-12-31,3,0.00959467,0.00836296,0.00996044,0.00788948 +2022-01-03,3,0.00846313,0.0087287,0.00933114,0.00788948 +2022-01-04,3,0.00779523,0.0086567,0.00982281,0.00788948 +2022-01-05,3,0.0080787,0.00812121,0.00826975,0.00788948 +2022-01-06,3,0.00370498,0.00846075,0.00735916,0.00788948 +2022-01-07,3,0.00452287,0.0081402,0.00735042,0.00788948 +2022-01-10,3,0.00320518,0.00816725,0.0070693,0.00788948 +2022-01-11,3,0.00710131,0.00810385,0.00738598,0.00788948 +2022-01-12,3,0.00665361,0.00806165,0.00768254,0.00788948 +2022-01-13,3,0.00643055,0.00748208,0.00800752,0.00788948 +2022-01-14,3,0.00567997,0.00753273,0.0075393,0.00788948 +2022-01-17,3,0.00781219,0.00729874,0.0079175,0.00788948 +2022-01-18,3,0.0121984,0.00764071,0.00706363,0.00788948 +2022-01-19,3,0.0121988,0.00682814,0.00632606,0.00788948 +2022-01-20,3,0.0128115,0.00704557,0.00728283,0.00788948 +2022-01-21,3,0.0159459,0.00700859,0.00776796,0.00788948 +2022-01-24,3,0.0100654,0.0082959,0.0081058,0.00788948 +2022-01-25,3,0.0104712,0.00867496,0.00814353,0.00788948 +2022-01-27,3,0.011482,0.00877583,0.00938099,0.00788948 +2022-01-28,3,0.0117641,0.00871942,0.00769407,0.00788948 +2022-01-31,3,0.0138794,0.00914006,0.00902329,0.00788948 +2022-02-01,3,0.011652,0.00896003,0.00907416,0.00788948 +2022-02-02,3,0.0116056,0.00905054,0.00924194,0.00788948 +2022-02-03,3,0.0113214,0.00906261,0.00945918,0.00788948 +2022-02-04,3,0.0129344,0.00895781,0.00918813,0.00788948 +2022-02-07,3,0.0176814,0.0093272,0.00992703,0.00788948 +2022-02-08,3,0.0235564,0.00911864,0.00912166,0.00788948 +2022-02-09,3,0.0228339,0.00926372,0.00932252,0.00788948 +2022-02-10,3,0.0222184,0.00918674,0.00945801,0.00788948 +2022-02-11,3,0.0215397,0.00943514,0.0099351,0.00788948 +2022-02-14,3,0.0143211,0.0104253,0.011334,0.00788948 +2022-02-15,3,0.0023422,0.0116301,0.0128862,0.00788948 +2022-02-16,3,0.00234906,0.0115929,0.0141535,0.00788948 +2022-02-17,3,0.0204302,0.0115424,0.0143434,0.00788948 +2022-02-18,3,0.0265421,0.0114531,0.0141092,0.00788948 +2022-02-21,3,0.0274529,0.01097,0.0109102,0.00788948 +2022-02-22,3,0.0276047,0.00927622,0.00945165,0.00788948 +2022-02-23,3,0.0275107,0.00925158,0.0095119,0.00788948 +2022-02-24,3,0.0165487,0.0124797,0.0148683,0.00788948 +2022-02-25,3,0.011846,0.0132046,0.0139787,0.00788948 +2022-02-28,3,0.0123517,0.0132533,0.0142788,0.00788948 +2022-03-02,3,0.0180783,0.0133199,0.0138483,0.00788948 +2022-03-03,3,0.0196059,0.0131716,0.0139568,0.00788948 +2022-03-04,3,0.0173275,0.012504,0.0121438,0.00788948 +2022-03-07,3,0.00691725,0.0122155,0.0109413,0.00788948 +2022-03-08,3,0.0132277,0.0123461,0.0128016,0.00788948 +2022-03-09,3,0.0127877,0.0131305,0.0127374,0.00788948 +2022-03-10,3,0.0133013,0.0132804,0.0140914,0.00788948 +2022-03-11,3,0.0155514,0.0131272,0.0124587,0.00788948 +2022-03-14,3,0.015202,0.0121259,0.0111956,0.00788948 +2022-03-15,3,0.0130885,0.0128626,0.0119952,0.00788948 +2022-03-16,3,0.011581,0.0129701,0.0117689,0.00788948 +2022-03-17,3,0.00793124,0.0126741,0.0119374,0.00788948 +2022-03-21,3,0.00662245,0.0123998,0.0127774,0.00788948 +2022-03-22,3,0.00464727,0.0124602,0.0128498,0.00788948 +2022-03-23,3,0.0056234,0.0123007,0.0117628,0.00788948 +2022-03-24,3,0.00573902,0.0121637,0.0109925,0.00788948 +2022-03-25,3,0.00535391,0.0117513,0.0115293,0.00788948 +2022-03-28,3,0.00851961,0.0115434,0.0113888,0.00788948 +2022-03-29,3,0.0108482,0.0111921,0.011142,0.00788948 +2022-03-30,3,0.0126251,0.00971174,0.00940926,0.00788948 +2022-03-31,3,0.0138335,0.00932765,0.00924128,0.00788948 +2022-04-01,3,0.0132926,0.00931817,0.00905556,0.00788948 +2022-04-04,3,0.00713537,0.00984667,0.00988706,0.00788948 +2022-04-05,3,0.00735923,0.010043,0.00945052,0.00788948 +2022-04-06,3,0.00709414,0.00997102,0.0103507,0.00788948 +2022-04-07,3,0.00925704,0.00941605,0.00996093,0.00788948 +2022-04-08,3,0.00561079,0.00937156,0.0096853,0.00788948 +2022-04-11,3,0.0106933,0.00867881,0.0100938,0.00788948 +2022-04-12,3,0.0140426,0.00868042,0.0102877,0.00788948 +2022-04-13,3,0.0149416,0.00868565,0.0101048,0.00788948 +2022-04-18,3,0.0139703,0.00911991,0.00959471,0.00788948 +2022-04-19,3,0.0143515,0.00871971,0.00981524,0.00788948 +2022-04-20,3,0.0144789,0.00898961,0.00962126,0.00788948 +2022-04-21,3,0.0137478,0.00908377,0.00982237,0.00788948 +2022-04-22,3,0.0129719,0.0092201,0.00939992,0.00788948 +2022-04-25,3,0.0112672,0.00916917,0.00986725,0.00788948 +2022-04-26,3,0.0128021,0.00944517,0.00966612,0.00788948 +2022-04-27,3,0.0129176,0.00954698,0.00982784,0.00788948 +2022-04-28,3,0.00986153,0.00964987,0.010263,0.00788948 +2022-04-29,3,0.0099532,0.00965212,0.0097334,0.00788948 +2022-05-02,3,0.00962916,0.00948449,0.00925374,0.00788948 +2022-05-04,3,0.00623017,0.00995307,0.00932033,0.00788948 +2022-05-05,3,0.00826105,0.00996477,0.00933127,0.00788948 +2022-05-06,3,0.00838289,0.00970698,0.00920365,0.00788948 +2022-05-09,3,0.00991031,0.0090449,0.0097673,0.00788948 +2022-05-10,3,0.0174408,0.00901774,0.00993195,0.00788948 +2022-05-11,3,0.0172773,0.00864927,0.0101641,0.00788948 +2022-05-12,3,0.0188194,0.00919398,0.00962401,0.00788948 +2022-05-13,3,0.0225982,0.00902834,0.00992287,0.00788948 +2022-05-16,3,0.0229826,0.00923979,0.00936381,0.00788948 +2022-05-17,3,0.0197653,0.0106292,0.0111983,0.00788948 +2022-05-18,3,0.0198612,0.0106245,0.0109091,0.00788948 +2022-05-19,3,0.0147368,0.0110338,0.0125774,0.00788948 +2022-05-20,3,0.00835751,0.0119565,0.0140421,0.00788948 +2022-05-23,3,0.0109267,0.0118526,0.0143608,0.00788948 +2022-05-24,3,0.0107023,0.0114468,0.0140351,0.00788948 +2022-05-25,3,0.0100649,0.0113861,0.0138012,0.00788948 +2022-05-26,3,0.00994635,0.0110622,0.0110516,0.00788948 +2022-05-27,3,0.00991511,0.010422,0.0100288,0.00788948 +2022-05-30,3,0.0043942,0.0109533,0.00925034,0.00788948 +2022-05-31,3,0.00564527,0.0108034,0.00978553,0.00788948 +2022-06-01,3,0.00564042,0.0107128,0.00998915,0.00788948 +2022-06-02,3,0.00604441,0.0107412,0.00986491,0.00788948 +2022-06-03,3,0.00911953,0.010334,0.00989015,0.00788948 +2022-06-06,3,0.0129593,0.00959582,0.00941995,0.00788948 +2022-06-07,3,0.0133592,0.00966775,0.00940981,0.00788948 +2022-06-08,3,0.0134703,0.00963651,0.00949219,0.00788948 +2022-06-09,3,0.011,0.00972392,0.00959065,0.00788948 +2022-06-10,3,0.0115957,0.0103192,0.00952059,0.00788948 +2022-06-13,3,0.00940592,0.0108362,0.010626,0.00788948 +2022-06-14,3,0.014451,0.0108601,0.0104087,0.00788948 +2022-06-15,3,0.0156731,0.0108491,0.0105152,0.00788948 +2022-06-16,3,0.0126924,0.0103685,0.00914567,0.00788948 +2022-06-17,3,0.0122833,0.0104147,0.00915805,0.00788948 +2022-06-20,3,0.012317,0.00971153,0.00959812,0.00788948 +2022-06-21,3,0.0101996,0.00960393,0.00975542,0.00788948 +2022-06-22,3,0.0056881,0.00984362,0.00988421,0.00788948 +2022-06-23,3,0.0056269,0.00977347,0.0100978,0.00788948 +2022-06-24,3,0.00461151,0.00982896,0.0104517,0.00788948 +2022-06-27,3,0.00332317,0.00982043,0.0105706,0.00788948 +2022-06-28,3,0.00331781,0.00950822,0.00958682,0.00788948 +2022-06-29,3,0.00576011,0.00858893,0.00966698,0.00788948 +2022-06-30,3,0.00595332,0.00856538,0.00969335,0.00788948 +2022-07-01,3,0.00484309,0.00840949,0.00959888,0.00788948 +2022-07-04,3,0.00559174,0.00814568,0.00948015,0.00788948 +2022-07-05,3,0.00840819,0.00814359,0.00964454,0.00788948 +2022-07-06,3,0.00769248,0.00874262,0.00951425,0.00788948 +2022-07-07,3,0.00573295,0.00880827,0.00956409,0.00788948 +2022-07-08,3,0.00625761,0.00867086,0.00939331,0.00788948 +2022-07-11,3,0.0097135,0.00872092,0.00907054,0.00788948 +2022-07-12,3,0.00772368,0.00884938,0.00972622,0.00788948 +2022-07-13,3,0.00620781,0.00793259,0.00753916,0.00788948 +2022-07-14,3,0.0043053,0.00771388,0.00793578,0.00788948 +2022-07-15,3,0.00430971,0.00780716,0.00800112,0.00788948 +2022-07-18,3,0.00600366,0.00753657,0.00682923,0.00788948 +2022-07-19,3,0.00844437,0.00729395,0.00673748,0.00788948 +2022-07-20,3,0.0080679,0.0072476,0.00690157,0.00788948 +2022-07-21,3,0.0107724,0.00661295,0.00599593,0.00788948 +2022-07-22,3,0.0115952,0.00601498,0.00607622,0.00788948 +2022-07-25,3,0.0100791,0.00628938,0.00615131,0.00788948 +2022-07-26,3,0.00626353,0.00668747,0.00605352,0.00788948 +2022-07-27,3,0.00718071,0.00668368,0.00592267,0.00788948 +2022-07-28,3,0.00628966,0.0072845,0.00679482,0.00788948 +2022-07-29,3,0.00446652,0.00743709,0.00697006,0.00788948 +2022-08-01,3,0.00307923,0.00737122,0.0069534,0.00788948 +2022-08-02,3,0.00304571,0.00702234,0.00714122,0.00788948 +2022-08-03,3,0.00376495,0.00711392,0.00716914,0.00788948 +2022-08-04,3,0.00332716,0.00699591,0.00738666,0.00788948 +2022-08-05,3,0.00322784,0.00671078,0.00748619,0.00788948 +2022-08-08,3,0.00311506,0.0064652,0.00713856,0.00788948 +2022-08-10,3,0.00307108,0.00645771,0.00772338,0.00788948 +2022-08-11,3,0.00737472,0.00657587,0.00728852,0.00788948 +2022-08-12,3,0.0102707,0.00614396,0.00631302,0.00788948 +2022-08-16,3,0.00979632,0.00590717,0.00657953,0.00788948 +2022-08-17,3,0.00877967,0.00579162,0.00662096,0.00788948 +2022-08-18,3,0.00841222,0.00582099,0.00721579,0.00788948 +2022-08-19,3,0.00804029,0.00662842,0.00573474,0.00788948 +2022-08-22,3,0.00760773,0.00749036,0.00691885,0.00788948 +2022-08-23,3,0.0146184,0.00735307,0.00725309,0.00788948 +2022-08-24,3,0.0159803,0.00726363,0.00726968,0.00788948 +2022-08-25,3,0.0158253,0.00728698,0.00752683,0.00788948 +2022-08-26,3,0.0161384,0.00715829,0.00724693,0.00788948 +2022-08-29,3,0.0139067,0.00736732,0.00734141,0.00788948 +2022-08-30,3,0.00696135,0.0085579,0.00833386,0.00788948 +2022-09-01,3,0.00524319,0.00862029,0.00760632,0.00788948 +2022-09-02,3,0.00501075,0.00840277,0.00759012,0.00788948 +2022-09-05,3,0.00477238,0.00833849,0.00819256,0.00788948 +2022-09-06,3,0.00459477,0.00822795,0.00819492,0.00788948 +2022-09-07,3,0.00528689,0.00772137,0.0075623,0.00788948 +2022-09-08,3,0.00615052,0.00760744,0.00799804,0.00788948 +2022-09-09,3,0.0109097,0.00757625,0.0082193,0.00788948 +2022-09-12,3,0.0107943,0.0075205,0.00816565,0.00788948 +2022-09-13,3,0.0117601,0.00752401,0.0078996,0.00788948 +2022-09-14,3,0.0118216,0.00760429,0.00748325,0.00788948 +2022-09-15,3,0.0116904,0.00778777,0.00773365,0.00788948 +2022-09-16,3,0.0108922,0.00862842,0.00716886,0.00788948 +2022-09-19,3,0.0118115,0.00858491,0.00850428,0.00788948 +2022-09-20,3,0.00793039,0.00881122,0.00881022,0.00788948 +2022-09-21,3,0.00767081,0.00870828,0.00884734,0.00788948 +2022-09-22,3,0.0081627,0.00843851,0.00700291,0.00788948 +2022-09-23,3,0.0126511,0.00873095,0.00737316,0.00788948 +2022-09-26,3,0.0110179,0.00913241,0.0079071,0.00788948 +2022-09-27,3,0.0155051,0.00879737,0.00907665,0.00788948 +2022-09-28,3,0.0140596,0.00881426,0.00936335,0.00788948 +2022-09-29,3,0.0138728,0.00869601,0.00947545,0.00788948 +2022-09-30,3,0.0130123,0.00855541,0.00765381,0.00788948 +2022-10-03,3,0.0138144,0.0084489,0.0073486,0.00788948 +2022-10-04,3,0.00878397,0.00942247,0.00943056,0.00788948 +2022-10-06,3,0.00844935,0.00928672,0.0108429,0.00788948 +2022-10-07,3,0.0105139,0.00927543,0.0105983,0.00788948 +2022-10-10,3,0.0110143,0.00923,0.00997513,0.00788948 +2022-10-11,3,0.00694552,0.0093449,0.0107179,0.00788948 +2022-10-12,3,0.00702693,0.00906217,0.0101391,0.00788948 +2022-10-13,3,0.00399479,0.00898561,0.00988856,0.00788948 +2022-10-14,3,0.00403239,0.00922326,0.00955931,0.00788948 +2022-10-17,3,0.00432421,0.00935123,0.00861775,0.00788948 +2022-10-18,3,0.00466133,0.00906359,0.00946246,0.00788948 +2022-10-19,3,0.00478656,0.00871091,0.00996687,0.00788948 +2022-10-20,3,0.00478404,0.00825528,0.00983205,0.00788948 +2022-10-21,3,0.00635201,0.00813013,0.00968878,0.00788948 +2022-10-24,3,0.0061702,0.00823777,0.0100444,0.00788948 +2022-10-25,3,0.00590473,0.00828496,0.00984314,0.00788948 +2022-10-27,3,0.00657979,0.00796299,0.00835968,0.00788948 +2022-10-28,3,0.00656771,0.00748085,0.0077002,0.00788948 +2022-10-31,3,0.0045216,0.00780862,0.00750252,0.00788948 +2022-11-01,3,0.00373898,0.00762918,0.00820475,0.00788948 +2022-11-02,3,0.00481989,0.00761713,0.00773553,0.00788948 +2022-11-03,3,0.00936963,0.00746558,0.00724895,0.00788948 +2022-11-04,3,0.00956427,0.00711248,0.00732139,0.00788948 +2022-11-07,3,0.00952686,0.00616672,0.00633131,0.00788948 +2022-11-09,3,0.00925533,0.00610481,0.00686797,0.00788948 +2022-11-10,3,0.00840661,0.00639464,0.00570737,0.00788948 +2022-11-11,3,0.0028886,0.00717119,0.00699811,0.00788948 +2022-11-14,3,0.00451632,0.00655127,0.00683506,0.00788948 +2022-11-15,3,0.00471098,0.00649588,0.00668269,0.00788948 +2022-11-16,3,0.00482934,0.00627124,0.0068176,0.00788948 +2022-11-17,3,0.00741989,0.00621733,0.00662202,0.00788948 +2022-11-18,3,0.00716722,0.00564027,0.00698528,0.00788948 +2022-11-21,3,0.00435025,0.00596993,0.00665244,0.00788948 +2022-11-22,3,0.00439005,0.00601095,0.00639729,0.00788948 +2022-11-23,3,0.00428337,0.00602171,0.00686506,0.00788948 +2022-11-24,3,0.0023003,0.00647288,0.00642596,0.00788948 +2022-11-25,3,0.00499727,0.00635191,0.00690612,0.00788948 +2022-11-28,3,0.00502721,0.00596908,0.00645193,0.00788948 +2022-11-29,3,0.00530707,0.00595866,0.00616666,0.00788948 +2022-11-30,3,0.00366456,0.00600432,0.00639596,0.00788948 +2022-12-01,3,0.00357857,0.00544598,0.00599048,0.00788948 +2022-12-02,3,0.00354238,0.00591453,0.00613388,0.00788948 +2022-12-05,3,0.00350375,0.00586458,0.00617923,0.00788948 +2022-12-06,3,0.00495975,0.00591844,0.00608309,0.00788948 +2022-12-07,3,0.00451851,0.0057847,0.00612285,0.00788948 +2022-12-08,3,0.00764351,0.00574722,0.00638843,0.00788948 +2022-12-09,3,0.00792847,0.0058235,0.00606763,0.00788948 +2022-12-12,3,0.00931135,0.00567248,0.00615202,0.00788948 +2022-12-13,3,0.00850315,0.00515668,0.00579298,0.00788948 +2022-12-14,3,0.00849539,0.00510499,0.00637828,0.00788948 +2022-12-15,3,0.00715481,0.00587308,0.00668364,0.00788948 +2022-12-16,3,0.0097213,0.00604843,0.00679553,0.00788948 +2022-12-19,3,0.0109147,0.00628041,0.00704956,0.00788948 +2022-12-20,3,0.0120016,0.00622725,0.00663418,0.00788948 +2022-12-21,3,0.0112658,0.0063106,0.00634653,0.00788948 +2022-12-22,3,0.0112628,0.00618327,0.00654977,0.00788948 +2022-12-23,3,0.00629624,0.00698161,0.00615258,0.00788948 +2022-12-26,3,0.00459922,0.00704636,0.00585422,0.00788948 +2022-12-27,3,0.00388044,0.00720485,0.00757464,0.00788948 +2022-12-28,3,0.00654645,0.0071286,0.00658237,0.00788948 +2022-12-29,3,0.00601765,0.0071344,0.00709199,0.00788948 +2022-12-30,3,0.00640563,0.00662632,0.00605625,0.00788948 +2023-01-02,3,0.00936611,0.00648392,0.00618758,0.00788948 +2023-01-03,3,0.00998282,0.00636124,0.00637079,0.00788948 +2023-01-04,3,0.00920677,0.00681902,0.00818834,0.00788948 +2023-01-05,3,0.00918928,0.00675382,0.00776215,0.00788948 +2023-01-06,3,0.00892253,0.00683686,0.00880291,0.00788948 +2023-01-09,3,0.00568173,0.00743134,0.00888386,0.00788948 +2023-01-10,3,0.00532128,0.00757078,0.00828453,0.00788948 +2023-01-11,3,0.00542509,0.00750981,0.00810803,0.00788948 +2023-01-12,3,0.00569132,0.0074117,0.00824048,0.00788948 +2023-01-13,3,0.00621491,0.00744387,0.00892064,0.00788948 +2023-01-16,3,0.00591992,0.00693737,0.008147,0.00788948 +2023-01-17,3,0.00476319,0.00697155,0.00856334,0.00788948 +2023-01-18,3,0.00646341,0.00693092,0.0084402,0.00788948 +2023-01-19,3,0.00875502,0.00696829,0.0080581,0.00788948 +2023-01-20,3,0.00951573,0.00689711,0.00835837,0.00788948 +2023-01-23,3,0.00862306,0.00689043,0.00850214,0.00788948 +2023-01-24,3,0.00831359,0.00614816,0.00611538,0.00788948 +2023-01-25,3,0.0075185,0.00639775,0.0058788,0.00788948 +2023-01-27,3,0.00638287,0.00694568,0.00709267,0.00788948 +2023-01-30,3,0.00729609,0.00702457,0.00756666,0.00788948 +2023-01-31,3,0.00749257,0.00692203,0.00669101,0.00788948 +2023-02-01,3,0.00790322,0.00687942,0.00620201,0.00788948 +2023-02-02,3,0.00777493,0.00674136,0.00628354,0.00788948 +2023-02-03,3,0.00519873,0.00702146,0.00845334,0.00788948 +2023-02-06,3,0.00514657,0.00696576,0.00857723,0.00788948 +2023-02-07,3,0.00616526,0.00698016,0.0081328,0.00788948 +2023-02-08,3,0.00543423,0.00706344,0.00897006,0.00788948 +2023-02-09,3,0.00543636,0.00671777,0.00631148,0.00788948 +2023-02-10,3,0.00607584,0.0062887,0.00586261,0.00788948 +2023-02-13,3,0.00626354,0.0063235,0.00563605,0.00788948 +2023-02-14,3,0.00434198,0.0065767,0.00580783,0.00788948 +2023-02-15,3,0.0063555,0.00648862,0.00592284,0.00788948 +2023-02-16,3,0.00563067,0.00646456,0.00632621,0.00788948 +2023-02-17,3,0.0058275,0.0064264,0.00564838,0.00788948 +2023-02-20,3,0.00585024,0.00640526,0.00570084,0.00788948 +2023-02-21,3,0.00539657,0.00618384,0.00624148,0.00788948 +2023-02-22,3,0.00550176,0.00678111,0.00766958,0.00788948 +2023-02-23,3,0.00619354,0.00663291,0.00634315,0.00788948 +2023-02-24,3,0.010039,0.00665016,0.00626595,0.00788948 +2023-02-27,3,0.00967378,0.00643531,0.00583683,0.00788948 +2023-02-28,3,0.00848383,0.00594081,0.00626916,0.00788948 +2023-03-01,3,0.0102823,0.00611683,0.0063849,0.00788948 +2023-03-02,3,0.0109183,0.0062765,0.00637856,0.00788948 +2023-03-03,3,0.00914246,0.00708059,0.00728762,0.00788948 +2023-03-06,3,0.00642349,0.00713528,0.00824602,0.00788948 +2023-03-08,3,0.00407274,0.00670725,0.00615065,0.00788948 +2023-03-09,3,0.00595601,0.00694346,0.00613561,0.00788948 +2023-03-10,3,0.00811641,0.0071494,0.00751376,0.00788948 +2023-03-13,3,0.00568752,0.00719783,0.00753276,0.00788948 +2023-03-14,3,0.0061668,0.0069854,0.00862212,0.00788948 +2023-03-15,3,0.00552187,0.00670465,0.00744371,0.00788948 +2023-03-16,3,0.00626481,0.00694367,0.00790899,0.00788948 +2023-03-17,3,0.00634694,0.00706617,0.00857015,0.00788948 +2023-03-20,3,0.00592751,0.00678329,0.00809184,0.00788948 +2023-03-21,3,0.0044445,0.00695477,0.00855037,0.00788948 +2023-03-22,3,0.00598013,0.00690333,0.00764493,0.00788948 +2023-03-23,3,0.00916432,0.00696942,0.00867132,0.00788948 +2023-03-24,3,0.00699083,0.00702902,0.00909267,0.00788948 +2023-03-27,3,0.00694275,0.00670778,0.00712719,0.00788948 +2023-03-28,3,0.00575431,0.00653285,0.006924,0.00788948 +2023-03-29,3,0.00636068,0.00684535,0.00870153,0.00788948 +2023-03-31,3,0.00319437,0.00756982,0.00745581,0.00788948 +2023-04-03,3,0.00301351,0.00734796,0.00784515,0.00788948 +2023-04-05,3,0.00213397,0.00736386,0.00857767,0.00788948 +2023-04-06,3,0.00496078,0.00714851,0.00756951,0.00788948 +2023-04-10,3,0.0052445,0.00682868,0.00781675,0.00788948 +2023-04-11,3,0.00443259,0.00639019,0.00767699,0.00788948 +2023-04-12,3,0.00305546,0.00638921,0.00750285,0.00788948 +2023-04-13,3,0.00285508,0.00603977,0.00614538,0.00788948 +2023-04-17,3,0.00378445,0.00641141,0.0057844,0.00788948 +2023-04-18,3,0.00338002,0.00594305,0.00654368,0.00788948 +2023-04-19,3,0.00272928,0.00573898,0.00670463,0.00788948 +2023-04-20,3,0.00285677,0.00547311,0.00665043,0.00788948 +2023-04-21,3,0.00289288,0.00544417,0.00637576,0.00788948 +2023-04-24,3,0.00271104,0.0055875,0.00640836,0.00788948 +2023-04-25,3,0.00433023,0.00535723,0.00676618,0.00788948 +2023-04-26,3,0.00489588,0.00519106,0.00650202,0.00788948 +2023-04-27,3,0.00829188,0.00524311,0.00624184,0.00788948 +2023-04-28,3,0.00882866,0.00522221,0.00633586,0.00788948 +2023-05-02,3,0.00875512,0.00489678,0.00616975,0.00788948 +2023-05-03,3,0.00838852,0.00522186,0.00633335,0.00788948 +2023-05-04,3,0.00756086,0.00531198,0.00602682,0.00788948 +2023-05-05,3,0.00469923,0.00600335,0.00588773,0.00788948 +2023-05-08,3,0.00219982,0.00570666,0.00601667,0.00788948 +2023-05-09,3,0.00410401,0.00571479,0.00622903,0.00788948 +2023-05-10,3,0.00454768,0.00554686,0.00629359,0.00788948 +2023-05-11,3,0.00457557,0.00551545,0.00660684,0.00788948 +2023-05-12,3,0.00520877,0.00528358,0.00664597,0.00788948 +2023-05-15,3,0.00565089,0.00491423,0.00597893,0.00788948 +2023-05-16,3,0.00488753,0.00532447,0.00620141,0.00788948 +2023-05-17,3,0.00418395,0.00549545,0.00617797,0.00788948 +2023-05-18,4,0.00354074,0.00536714,0.00620778,0.00781683 +2023-05-19,4,0.00493675,0.00539352,0.0060623,0.00781683 +2023-05-22,4,0.00484162,0.00543652,0.00599816,0.00781683 +2023-05-23,4,0.00483796,0.00537786,0.00617354,0.00781683 +2023-05-24,4,0.00551791,0.00538891,0.00621902,0.00781683 +2023-05-25,4,0.00601092,0.00524546,0.00553911,0.00781683 +2023-05-26,4,0.00426577,0.00553776,0.00550496,0.00781683 +2023-05-29,4,0.0037141,0.00556112,0.00555465,0.00781683 +2023-05-30,4,0.00357045,0.00552183,0.00546305,0.00781683 +2023-05-31,4,0.00347907,0.00556822,0.00547031,0.00781683 +2023-06-01,4,0.00432931,0.00559614,0.00535558,0.00781683 +2023-06-02,4,0.00488232,0.00542996,0.00554312,0.00781683 +2023-06-05,4,0.00473439,0.00520301,0.00581113,0.00781683 +2023-06-06,4,0.00546548,0.00479743,0.00562531,0.00781683 +2023-06-07,4,0.00460368,0.00458306,0.00569805,0.00781683 +2023-06-08,4,0.00425921,0.00476918,0.00564361,0.00781683 +2023-06-09,4,0.00430591,0.00486089,0.00544499,0.00781683 +2023-06-12,4,0.00524246,0.00483066,0.00558812,0.00781683 +2023-06-13,4,0.00476059,0.0049669,0.00549249,0.00781683 +2023-06-14,4,0.00476113,0.00487018,0.00548368,0.00781683 +2023-06-15,4,0.005002,0.00474911,0.00537665,0.00781683 +2023-06-16,4,0.00409959,0.00470865,0.00571471,0.00781683 +2023-06-19,4,0.00410272,0.00479766,0.00523805,0.00781683 +2023-06-20,4,0.00510725,0.00475404,0.00515376,0.00781683 +2023-06-21,4,0.00631273,0.00467749,0.00517497,0.00781683 +2023-06-22,4,0.0066801,0.00480878,0.00507804,0.00781683 +2023-06-23,4,0.003612,0.00482749,0.00519025,0.00781683 +2023-06-26,4,0.00286203,0.00482485,0.00510451,0.00781683 +2023-06-27,4,0.00422532,0.00474378,0.00515493,0.00781683 +2023-06-28,4,0.00406379,0.00492946,0.00533056,0.00781683 +2023-06-30,4,0.0060742,0.00527283,0.00514696,0.00781683 +2023-07-03,4,0.00527876,0.00501045,0.0050453,0.00781683 +2023-07-04,4,0.00541877,0.00487615,0.00485125,0.00781683 +2023-07-05,4,0.00562383,0.00500856,0.00483482,0.00781683 +2023-07-06,4,0.00498557,0.00501975,0.00494898,0.00781683 +2023-07-07,4,0.00392563,0.00546769,0.0054011,0.00781683 +2023-07-10,4,0.00442868,0.00534413,0.00524204,0.00781683 +2023-07-11,4,0.0044678,0.00524885,0.00485954,0.00781683 +2023-07-12,4,0.00295681,0.00522674,0.00487681,0.00781683 +2023-07-13,4,0.00257083,0.00518504,0.00510685,0.00781683 +2023-07-14,4,0.00796151,0.00515185,0.00536159,0.00781683 +2023-07-17,4,0.00753683,0.00527439,0.00543613,0.00781683 +2023-07-18,4,0.00745124,0.00517689,0.00513471,0.00781683 +2023-07-19,4,0.00757507,0.00497974,0.00481694,0.00781683 +2023-07-20,4,0.00635264,0.00488436,0.00518586,0.00781683 +2023-07-21,4,0.00417696,0.00583848,0.00548821,0.00781683 +2023-07-24,4,0.00468374,0.00589892,0.00479507,0.00781683 +2023-07-25,4,0.0047591,0.00579124,0.00540697,0.00781683 +2023-07-26,4,0.00603939,0.00564882,0.00526137,0.00781683 +2023-07-27,4,0.00627507,0.00576517,0.00469823,0.00781683 +2023-07-28,4,0.00770372,0.00557444,0.00525381,0.00781683 +2023-07-31,4,0.00742235,0.00554004,0.00518351,0.00781683 +2023-08-01,4,0.00741758,0.00530525,0.00526193,0.00781683 +2023-08-02,4,0.00562665,0.00564713,0.0053678,0.00781683 +2023-08-03,4,0.00458564,0.00578681,0.00537877,0.00781683 +2023-08-04,4,0.00447229,0.00597769,0.00523973,0.00781683 +2023-08-07,4,0.00365687,0.00594437,0.00495792,0.00781683 +2023-08-08,4,0.00394158,0.00575791,0.00516316,0.00781683 +2023-08-09,4,0.00342523,0.00566647,0.00484691,0.00781683 +2023-08-10,4,0.00327949,0.00561508,0.00499198,0.00781683 +2023-08-11,4,0.00370896,0.00567437,0.00494832,0.00781683 +2023-08-14,4,0.00370178,0.00559546,0.0050465,0.00781683 +2023-08-16,4,0.00383713,0.00548105,0.00519091,0.00781683 +2023-08-17,4,0.0032092,0.00532813,0.00530647,0.00781683 +2023-08-18,4,0.00422488,0.00530191,0.0051277,0.00781683 +2023-08-21,4,0.00367838,0.00534722,0.00523137,0.00781683 +2023-08-22,4,0.00388069,0.00515093,0.00500843,0.00781683 +2023-08-23,4,0.00356693,0.00485008,0.0050821,0.00781683 +2023-08-24,4,0.00391207,0.00478273,0.0050973,0.00781683 +2023-08-25,4,0.00510475,0.00495936,0.00520608,0.00781683 +2023-08-28,4,0.00529001,0.00483185,0.0050666,0.00781683 +2023-08-29,4,0.0052853,0.0047896,0.00512752,0.00781683 +2023-08-30,4,0.00517073,0.0047661,0.00500709,0.00781683 +2023-08-31,4,0.00303663,0.00471007,0.00532782,0.00781683 +2023-09-01,4,0.0017346,0.00514085,0.00546341,0.00781683 +2023-09-04,4,0.00284507,0.00490408,0.00537173,0.00781683 +2023-09-05,4,0.00351364,0.00471017,0.00536766,0.00781683 +2023-09-06,4,0.0032812,0.00454354,0.00545491,0.00781683 +2023-09-07,4,0.00341725,0.00445382,0.00527816,0.00781683 +2023-09-08,4,0.00340123,0.00434906,0.00513732,0.00781683 +2023-09-11,4,0.00301339,0.00470159,0.00548649,0.00781683 +2023-09-12,4,0.00662558,0.00466514,0.00525493,0.00781683 +2023-09-13,4,0.00662057,0.00448368,0.00518166,0.00781683 +2023-09-14,4,0.00603622,0.00448999,0.00528334,0.00781683 +2023-09-15,4,0.00458658,0.00451916,0.00521313,0.00781683 +2023-09-18,4,0.00499673,0.004387,0.00509351,0.00781683 +2023-09-20,4,0.0040635,0.00517193,0.00542018,0.00781683 +2023-09-21,4,0.00476765,0.00539609,0.00573383,0.00781683 +2023-09-22,4,0.00586296,0.00541101,0.00505971,0.00781683 +2023-09-25,4,0.00629273,0.00530266,0.00563697,0.00781683 +2023-09-26,4,0.00641246,0.0052912,0.00556313,0.00781683 +2023-09-27,4,0.00709654,0.00508312,0.0049588,0.00781683 +2023-09-28,4,0.00594396,0.00545051,0.00560658,0.00781683 +2023-09-29,4,0.00631377,0.00559424,0.00517151,0.00781683 +2023-10-03,4,0.00715799,0.00571576,0.00488357,0.00781683 +2023-10-04,4,0.00633518,0.00571591,0.00487992,0.00781683 +2023-10-05,4,0.00653711,0.00561816,0.00532672,0.00781683 +2023-10-06,4,0.00656478,0.00557258,0.00533397,0.00781683 +2023-10-09,4,0.00503205,0.00571934,0.00508616,0.00781683 +2023-10-10,4,0.00363895,0.00596093,0.00538042,0.00781683 +2023-10-11,4,0.00397486,0.00591897,0.00482532,0.00781683 +2023-10-12,4,0.00397947,0.00587887,0.00546852,0.00781683 +2023-10-13,4,0.00413623,0.00568429,0.00501596,0.00781683 +2023-10-16,4,0.00640656,0.00558565,0.00563042,0.00781683 +2023-10-17,4,0.00425993,0.00547078,0.00524344,0.00781683 +2023-10-18,4,0.00525332,0.00557655,0.00494488,0.00781683 +2023-10-19,4,0.00979777,0.0055055,0.00491423,0.00781683 +2023-10-20,4,0.010984,0.00553445,0.00498706,0.00781683 +2023-10-23,4,0.00969949,0.00580721,0.00567955,0.00781683 +2023-10-25,4,0.00925053,0.00566708,0.00550145,0.00781683 +2023-10-26,4,0.00656427,0.00608507,0.00546088,0.00781683 +2023-10-27,4,0.00551088,0.00662026,0.00542568,0.00781683 +2023-10-30,4,0.00640698,0.00674715,0.00534643,0.00781683 +2023-10-31,4,0.0058239,0.00666109,0.00508564,0.00781683 +2023-11-01,4,0.00395769,0.00651991,0.00510783,0.00781683 +2023-11-02,4,0.00464947,0.00642965,0.00523082,0.00781683 +2023-11-03,4,0.00446693,0.0063855,0.00483316,0.00781683 +2023-11-06,4,0.00177165,0.00659678,0.00544548,0.00781683 +2023-11-07,4,0.00537963,0.00649358,0.00522567,0.00781683 +2023-11-08,4,0.00540507,0.00627811,0.00505242,0.00781683 +2023-11-09,4,0.00520199,0.00626262,0.00505316,0.00781683 +2023-11-10,4,0.00572201,0.00607748,0.0050241,0.00781683 +2023-11-13,4,0.0056631,0.00563719,0.00536626,0.00781683 +2023-11-15,4,0.00317345,0.00637505,0.00540462,0.00781683 +2023-11-16,4,0.00267727,0.00641076,0.00525689,0.00781683 +2023-11-17,4,0.00248058,0.00639758,0.00509685,0.00781683 +2023-11-20,4,0.00256566,0.00641081,0.00499374,0.00781683 +2023-11-21,4,0.00455854,0.00635024,0.00529526,0.00781683 +2023-11-22,4,0.00452607,0.00610406,0.00538484,0.00781683 +2023-11-23,4,0.00417702,0.00599467,0.00525952,0.00781683 +2023-11-24,4,0.00720567,0.00555228,0.00504748,0.00781683 +2023-11-28,4,0.00688784,0.00536964,0.00514164,0.00781683 +2023-11-29,4,0.00726936,0.00501591,0.00585896,0.00781683 +2023-11-30,4,0.00817065,0.00483724,0.00622125,0.00781683 +2023-12-01,4,0.00839516,0.00484862,0.00577718,0.00781683 +2023-12-04,4,0.00361827,0.00581003,0.00614978,0.00781683 +2023-12-05,4,0.00348498,0.00564249,0.00604881,0.00781683 +2023-12-06,4,0.00295862,0.00563182,0.00568731,0.00781683 +2023-12-07,4,0.00600955,0.00575773,0.00562199,0.00781683 +2023-12-08,4,0.00757017,0.00567889,0.00545794,0.00781683 +2023-12-11,4,0.00801768,0.00534882,0.0055183,0.00781683 +2023-12-12,4,0.00683246,0.00548494,0.0055817,0.00781683 +2023-12-13,4,0.0111661,0.00535588,0.00571301,0.00781683 +2023-12-14,4,0.00994064,0.00578658,0.005801,0.00781683 +2023-12-15,4,0.00785918,0.00603656,0.00646642,0.00781683 +2023-12-18,4,0.008173,0.00600167,0.0061109,0.00781683 +2023-12-19,4,0.00929258,0.00594065,0.00576304,0.00781683 +2023-12-20,4,0.00232887,0.00676851,0.00611467,0.00781683 +2023-12-21,4,0.0043366,0.00666857,0.00604066,0.00781683 +2023-12-22,4,0.00468268,0.00656782,0.00615728,0.00781683 +2023-12-26,4,0.00561742,0.00657737,0.00609577,0.00781683 +2023-12-27,4,0.00471696,0.00667242,0.00591802,0.00781683 +2023-12-28,4,0.00503044,0.00605965,0.00580897,0.00781683 +2023-12-29,4,0.00520157,0.00638346,0.00611515,0.00781683 +2024-01-01,4,0.00651029,0.00635267,0.00612508,0.00781683 +2024-01-02,4,0.00662507,0.00651324,0.00601459,0.00781683 +2024-01-03,4,0.00595515,0.00659462,0.00708236,0.00781683 +2024-01-04,4,0.0051269,0.00602448,0.00596021,0.00781683 +2024-01-05,4,0.00731921,0.00595019,0.00590601,0.00781683 +2024-01-08,4,0.00463983,0.00627648,0.00588982,0.00781683 +2024-01-09,4,0.00583592,0.00626284,0.0060552,0.00781683 +2024-01-10,4,0.012938,0.00622093,0.00606843,0.00781683 +2024-01-11,4,0.0130388,0.00616002,0.0061728,0.00781683 +2024-01-12,4,0.0121414,0.00642437,0.0057248,0.00781683 +2024-01-15,4,0.0116417,0.00632996,0.00597899,0.00781683 +2024-01-16,4,0.0142093,0.00627234,0.00606173,0.00781683 +2024-01-17,4,0.0112338,0.00730617,0.00746162,0.00781683 +2024-01-18,4,0.0140225,0.00735168,0.00801298,0.00781683 +2024-01-19,4,0.0146518,0.00739002,0.00794078,0.00781683 +2024-01-23,4,0.0114947,0.00757932,0.00666822,0.00781683 +2024-01-24,4,0.011246,0.00778131,0.00707672,0.00781683 +2024-01-25,4,0.01064,0.00767262,0.007662,0.00781683 +2024-01-29,4,0.00798187,0.00821622,0.00687533,0.00781683 +2024-01-30,4,0.00587069,0.00825755,0.00707318,0.00781683 +2024-01-31,4,0.00504728,0.00820451,0.00771468,0.00781683 +2024-02-01,4,0.0072885,0.00818815,0.00726714,0.00781683 +2024-02-02,4,0.00647659,0.00822422,0.00811571,0.00781683 +2024-02-05,4,0.00714665,0.00807362,0.00795571,0.00781683 +2024-02-06,4,0.00675268,0.00790286,0.00825435,0.00781683 +2024-02-07,4,0.00730142,0.00778504,0.00716874,0.00781683 +2024-02-08,4,0.00539971,0.00809845,0.00785047,0.00781683 +2024-02-09,4,0.00571486,0.00793615,0.00814928,0.00781683 +2024-02-12,4,0.00122936,0.00807021,0.00832697,0.00781683 +2024-02-13,4,0.00110127,0.00806226,0.00841122,0.00781683 +2024-02-14,4,0.004805,0.0081225,0.00823605,0.00781683 +2024-02-15,4,0.00539158,0.00782522,0.00793482,0.00781683 +2024-02-16,4,0.0051941,0.00779111,0.0081618,0.00781683 +2024-02-19,4,0.00554713,0.00705734,0.00631107,0.00781683 +2024-02-20,4,0.00555817,0.00641854,0.00554527,0.00781683 +2024-02-21,4,0.00713073,0.00709287,0.00742757,0.00781683 +2024-02-22,4,0.00577832,0.00714542,0.0077636,0.00781683 +2024-02-23,4,0.0100952,0.00648893,0.0059588,0.00781683 +2024-02-26,4,0.00966728,0.00644527,0.005959,0.00781683 +2024-02-27,4,0.00986419,0.00637455,0.00577062,0.00781683 +2024-02-28,4,0.00690311,0.00620778,0.00612378,0.00781683 +2024-02-29,4,0.00697537,0.00584522,0.00627608,0.00781683 +2024-03-01,4,0.00483864,0.00643388,0.00640307,0.00781683 +2024-03-04,4,0.00454978,0.00640578,0.00628088,0.00781683 +2024-03-05,4,0.00806412,0.00636206,0.00622514,0.00781683 +2024-03-06,4,0.00847481,0.00619728,0.00649831,0.00781683 +2024-03-07,4,0.00823898,0.00612269,0.0067852,0.00781683 +2024-03-11,4,0.00837039,0.0061244,0.0061812,0.00781683 +2024-03-12,4,0.00893187,0.00584353,0.00622596,0.00781683 +2024-03-13,4,0.00684357,0.006627,0.00632949,0.00781683 +2024-03-14,4,0.00719331,0.00657168,0.00590801,0.00781683 +2024-03-15,4,0.00699677,0.00659349,0.0061394,0.00781683 +2024-03-18,4,0.00728412,0.00657088,0.00592417,0.00781683 +2024-03-19,4,0.00462496,0.00681279,0.00591466,0.00781683 +2024-03-20,4,0.00523119,0.00662558,0.00632648,0.00781683 +2024-03-21,4,0.00498433,0.00674515,0.00681706,0.00781683 +2024-03-22,4,0.00537173,0.00673959,0.00633013,0.00781683 +2024-03-26,4,0.00433134,0.00671111,0.00645195,0.00781683 +2024-03-27,4,0.00424717,0.0064697,0.00626391,0.00781683 +2024-03-28,4,0.00300097,0.00667592,0.00710863,0.00781683 +2024-04-01,4,0.00326921,0.00667455,0.00679561,0.00781683 +2024-04-02,4,0.00338964,0.00669383,0.00654713,0.00781683 +2024-04-03,4,0.00329459,0.00634255,0.00623188,0.00781683 +2024-04-04,4,0.0066684,0.00634511,0.00593693,0.00781683 +2024-04-05,4,0.00830981,0.00572708,0.00631602,0.00781683 +2024-04-08,4,0.00667447,0.00583022,0.0063923,0.00781683 +2024-04-09,4,0.0063952,0.00583298,0.00667115,0.00781683 +2024-04-10,4,0.0072192,0.00581552,0.00648084,0.00781683 +2024-04-12,4,0.00875452,0.00634168,0.00616651,0.00781683 +2024-04-15,4,0.00701215,0.00657802,0.00569441,0.00781683 +2024-04-16,4,0.00602336,0.00653931,0.00620667,0.00781683 +2024-04-18,4,0.00341336,0.00614405,0.00645576,0.00781683 +2024-04-19,4,0.00606949,0.00617693,0.00636884,0.00781683 +2024-04-22,4,0.00644071,0.00632861,0.00636121,0.00781683 +2024-04-23,4,0.0067438,0.00623576,0.00645377,0.00781683 +2024-04-24,4,0.00673792,0.00584042,0.00611536,0.00781683 +2024-04-25,4,0.0071495,0.00571307,0.00659748,0.00781683 +2024-04-26,4,0.00642754,0.0059702,0.00612739,0.00781683 +2024-04-29,4,0.00388435,0.00614298,0.00572667,0.00781683 +2024-04-30,4,0.00409903,0.00611004,0.00530105,0.00781683 +2024-05-02,4,0.00614417,0.0060661,0.00524358,0.00781683 +2024-05-03,4,0.00762919,0.00608822,0.00590324,0.00781683 +2024-05-06,4,0.00807293,0.00597024,0.00510581,0.00781683 +2024-05-07,4,0.00853128,0.00586184,0.00536256,0.00781683 +2024-05-08,4,0.00852103,0.00587902,0.00552025,0.00781683 +2024-05-09,4,0.0036634,0.00647125,0.00608585,0.00781683 +2024-05-10,4,0.00369183,0.00661369,0.0060627,0.00781683 +2024-05-13,4,0.00364212,0.00654003,0.00577128,0.00781683 +2024-05-14,4,0.00357106,0.00663473,0.00590657,0.00781683 +2024-05-15,4,0.00593019,0.00656464,0.00589746,0.00781683 +2024-05-16,4,0.00651062,0.00622275,0.00583111,0.00781683 +2024-05-17,4,0.00702857,0.00599864,0.00605151,0.00781683 +2024-05-21,4,0.00754852,0.00592268,0.00608999,0.00781683 +2024-05-22,4,0.00906859,0.00579032,0.00610775,0.00781683 +2024-05-23,4,0.00425563,0.00639762,0.00617506,0.00781683 +2024-05-24,4,0.00485433,0.00634078,0.00606232,0.00781683 +2024-05-27,4,0.0169393,0.00638022,0.006083,0.00781683 +2024-05-28,4,0.0336126,0.00642793,0.00588276,0.00781683 +2024-05-29,4,0.0385602,0.00656577,0.0060469,0.00781683 +2024-05-30,4,0.0383864,0.00634714,0.00610602,0.00781683 +2024-05-31,4,0.0391385,0.00620835,0.00614893,0.00781683 +2024-06-03,4,0.0364806,0.00843835,0.00770256,0.00781683 +2024-06-04,4,0.0144827,0.0124298,0.0153608,0.00781683 +2024-06-05,4,0.00884038,0.0132755,0.0171201,0.00781683 +2024-06-06,4,0.00876212,0.0133131,0.0166144,0.00781683 +2024-06-07,4,0.00196573,0.0135211,0.0172397,0.00781683 +2024-06-10,4,0.00139625,0.0134637,0.01581,0.00781683 +2024-06-11,4,0.0022592,0.0125055,0.0103351,0.00781683 +2024-06-12,4,0.00225136,0.0121097,0.0102523,0.00781683 +2024-06-13,4,0.00297568,0.0120941,0.0101313,0.00781683 +2024-06-14,4,0.00281364,0.0109729,0.00995672,0.00781683 +2024-06-18,4,0.00414921,0.0107266,0.00984994,0.00781683 +2024-06-19,4,0.00416311,0.0110535,0.0101092,0.00781683 +2024-06-20,4,0.00453595,0.0110461,0.0102178,0.00781683 +2024-06-21,4,0.00402851,0.0112598,0.010148,0.00781683 +2024-06-24,4,0.0037352,0.0112169,0.0103728,0.00781683 +2024-06-25,4,0.00411998,0.011413,0.0101966,0.00781683 +2024-06-26,4,0.00421502,0.0114241,0.00986788,0.00781683 +2024-06-27,4,0.00371364,0.0114988,0.0100374,0.00781683 +2024-06-28,4,0.00328211,0.0114068,0.0101772,0.00781683 +2024-07-01,4,0.00300337,0.0112974,0.00993769,0.00781683 +2024-07-02,4,0.00296933,0.011293,0.00975416,0.00781683 +2024-07-03,4,0.00324023,0.0113158,0.0100793,0.00781683 +2024-07-04,4,0.00324525,0.0107436,0.00963874,0.00781683 +2024-07-05,4,0.00471484,0.00698195,0.00637986,0.00781683 +2024-07-08,4,0.00468356,0.0052482,0.00624355,0.00781683 +2024-07-09,4,0.0044853,0.00515536,0.00634343,0.00781683 +2024-07-10,4,0.00367054,0.00415024,0.00607219,0.00781683 +2024-07-11,4,0.00763703,0.00412045,0.00598394,0.00781683 +2024-07-12,4,0.00691662,0.00435201,0.00586553,0.00781683 +2024-07-15,4,0.00665542,0.00435501,0.00576241,0.00781683 +2024-07-16,4,0.00659222,0.00434583,0.00606232,0.00781683 +2024-07-18,4,0.00441229,0.00441508,0.00604781,0.00781683 +2024-07-19,4,0.00840429,0.00531184,0.00597062,0.00781683 +2024-07-22,4,0.00832136,0.00525813,0.00628225,0.00781683 +2024-07-23,4,0.00812808,0.00527638,0.00626356,0.00781683 +2024-07-24,4,0.00747318,0.00526916,0.00598739,0.00781683 +2024-07-25,4,0.00714295,0.00514587,0.00597922,0.00781683 +2024-07-26,4,0.0062297,0.00599496,0.00638377,0.00781683 +2024-07-29,4,0.0131626,0.00595183,0.00625052,0.00781683 +2024-07-30,4,0.0127704,0.00585564,0.00649803,0.00781683 +2024-07-31,4,0.015062,0.00580932,0.00619895,0.00781683 +2024-08-01,4,0.014434,0.00575331,0.00617512,0.00781683 +2024-08-02,4,0.01601,0.00613979,0.00601094,0.00781683 +2024-08-05,4,0.00866738,0.00786528,0.00721345,0.00781683 +2024-08-06,4,0.00985914,0.00784887,0.00628176,0.00781683 +2024-08-07,4,0.00756105,0.00819267,0.00699774,0.00781683 +2024-08-08,4,0.0098346,0.00824902,0.00728181,0.00781683 +2024-08-09,4,0.009062,0.00843327,0.00692389,0.00781683 +2024-08-12,4,0.00904014,0.00807848,0.00739235,0.00781683 +2024-08-13,4,0.00650999,0.00824403,0.00750787,0.00781683 +2024-08-14,4,0.0062581,0.00801558,0.00696202,0.00781683 +2024-08-16,4,0.00180939,0.00850562,0.00803051,0.00781683 +2024-08-19,4,0.00281686,0.00846122,0.00811093,0.00781683 +2024-08-20,4,0.00296134,0.00841476,0.00783329,0.00781683 +2024-08-21,4,0.00299692,0.0080929,0.00758347,0.00781683 +2024-08-22,4,0.00305802,0.0080714,0.00774295,0.00781683 +2024-08-23,4,0.00278588,0.00744333,0.00723554,0.00781683 +2024-08-26,4,0.00149772,0.00769725,0.00796004,0.00781683 +2024-08-27,4,0.00157373,0.00771796,0.00764905,0.00781683 +2024-08-28,4,0.00288412,0.0073711,0.00716435,0.00781683 +2024-08-29,4,0.00268487,0.00737647,0.0069263,0.00781683 +2024-08-30,4,0.00519888,0.00721467,0.00720569,0.00781683 +2024-09-02,4,0.00562321,0.00687057,0.00623863,0.00781683 +2024-09-03,4,0.0063875,0.00688587,0.00599388,0.00781683 +2024-09-04,4,0.00651851,0.00695192,0.0067138,0.00781683 +2024-09-05,4,0.0114198,0.00551535,0.00550149,0.00781683 +2024-09-06,4,0.00899784,0.00613317,0.00595383,0.00781683 +2024-09-09,4,0.00909729,0.00589309,0.00621737,0.00781683 +2024-09-10,4,0.00913551,0.00576733,0.00607467,0.00781683 +2024-09-11,4,0.00852105,0.00567036,0.00616364,0.00781683 +2024-09-12,4,0.00152573,0.0065966,0.00627363,0.00781683 +2024-09-13,4,0.0064203,0.00627321,0.00633867,0.00781683 +2024-09-16,4,0.0063359,0.0062712,0.00640008,0.00781683 +2024-09-17,4,0.00651463,0.00575586,0.00622719,0.00781683 +2024-09-18,4,0.00584795,0.00575722,0.00620247,0.00781683 +2024-09-19,4,0.00563841,0.00511356,0.00555081,0.00781683 +2024-09-20,4,0.0039399,0.00604267,0.00644481,0.00781683 +2024-09-23,4,0.00820843,0.00606946,0.00639957,0.00781683 +2024-09-24,4,0.00819387,0.00608346,0.00622672,0.00781683 +2024-09-25,4,0.011774,0.00596837,0.00642472,0.00781683 +2024-09-26,4,0.00879596,0.00603655,0.00668817,0.00781683 +2024-09-27,4,0.00767305,0.00592222,0.0064425,0.00781683 +2024-09-30,4,0.0112184,0.00672573,0.00627855,0.00781683 +2024-10-01,4,0.0111321,0.00672051,0.00646563,0.00781683 +2024-10-03,4,0.00746919,0.00772324,0.00747009,0.00781683 +2024-10-04,4,0.00625454,0.00770337,0.00788897,0.00781683 +2024-10-07,4,0.0046735,0.00772275,0.00800238,0.00781683 +2024-10-08,4,0.00367012,0.00803364,0.00778949,0.00781683 +2024-10-09,4,0.00402312,0.00783543,0.00695259,0.00781683 +2024-10-10,4,0.00556133,0.00762054,0.0070437,0.00781683 +2024-10-11,4,0.00623605,0.00751111,0.00753413,0.00781683 +2024-10-14,4,0.00465701,0.00739179,0.00778128,0.00781683 +2024-10-15,4,0.00638763,0.00676153,0.00680836,0.00781683 +2024-10-16,4,0.00654273,0.00681438,0.00687911,0.00781683 +2024-10-17,4,0.00607217,0.00705911,0.00759781,0.00781683 +2024-10-18,4,0.00501674,0.00714696,0.00740906,0.00781683 +2024-10-21,4,0.00742799,0.0070184,0.0067011,0.00781683 +2024-10-22,4,0.00623293,0.00733523,0.00766357,0.00781683 +2024-10-23,4,0.00664854,0.00689661,0.00711759,0.00781683 +2024-10-24,4,0.00700089,0.00674313,0.0068828,0.00781683 +2024-10-25,4,0.00590072,0.00670991,0.00717158,0.00781683 +2024-10-28,4,0.00750178,0.0069934,0.00772588,0.00781683 +2024-10-29,4,0.00863504,0.00681235,0.00722108,0.00781683 +2024-10-30,4,0.0101251,0.0068071,0.00736032,0.00781683 +2024-10-31,4,0.01143,0.00661887,0.00630129,0.00781683 +2024-11-01,4,0.0112038,0.00661692,0.00657367,0.00781683 +2024-11-04,4,0.00921159,0.00621562,0.00655717,0.00781683 +2024-11-05,4,0.009256,0.00641119,0.00620667,0.00781683 +2024-11-06,4,0.00606347,0.00666667,0.00582953,0.00781683 +2024-11-07,4,0.00616596,0.0067594,0.00579822,0.00781683 +2024-11-08,4,0.00601428,0.00675143,0.0059191,0.00781683 +2024-11-11,4,0.00681598,0.00664542,0.00603149,0.00781683 +2024-11-12,4,0.00626133,0.0068078,0.00603957,0.00781683 +2024-11-13,4,0.0120962,0.0067113,0.00710234,0.00781683 +2024-11-14,4,0.0125637,0.00672351,0.00694095,0.00781683 +2024-11-18,4,0.0121931,0.00671247,0.00705656,0.00781683 +2024-11-19,4,0.0121557,0.00674704,0.00681371,0.00781683 +2024-11-21,4,0.0145761,0.00666341,0.0066875,0.00781683 +2024-11-22,4,0.0108584,0.00805908,0.00795185,0.00781683 +2024-11-25,4,0.00939275,0.00818042,0.00767587,0.00781683 +2024-11-26,4,0.00980477,0.00816267,0.00708293,0.00781683 +2024-11-27,4,0.00980481,0.00817729,0.00724185,0.00781683 +2024-11-28,4,0.00372065,0.00846778,0.00715508,0.00781683 +2024-11-29,4,0.00470309,0.00836421,0.00782585,0.00781683 +2024-12-02,4,0.00546165,0.00829895,0.00826171,0.00781683 +2024-12-03,4,0.0048939,0.00836236,0.00875584,0.00781683 +2024-12-04,4,0.00487264,0.00831279,0.00716038,0.00781683 +2024-12-05,4,0.00193264,0.00789367,0.00900604,0.00781683 +2024-12-06,4,0.00496103,0.00779258,0.0076601,0.00781683 +2024-12-09,4,0.00526832,0.00780138,0.00747955,0.00781683 +2024-12-10,4,0.00822326,0.00758526,0.00726116,0.00781683 +2024-12-11,4,0.0080629,0.00738211,0.0077576,0.00781683 +2024-12-12,4,0.00859768,0.00696922,0.00605097,0.00781683 +2024-12-13,4,0.00487716,0.00749688,0.00787599,0.00781683 +2024-12-16,4,0.0089377,0.00736436,0.00687979,0.00781683 +2024-12-17,4,0.00857699,0.00758241,0.00706609,0.00781683 +2024-12-18,4,0.00896316,0.0076255,0.00804515,0.00781683 +2024-12-19,4,0.00846117,0.0078139,0.00740221,0.00781683 +2024-12-20,4,0.00518508,0.00785473,0.00715045,0.00781683 +2024-12-23,4,0.00372043,0.00815237,0.00802976,0.00781683 +2024-12-24,4,0.00434306,0.00735536,0.00644934,0.00781683 +2024-12-26,4,0.00940298,0.00706613,0.00602617,0.00781683 +2024-12-27,4,0.0107117,0.00705451,0.00657652,0.00781683 +2024-12-30,4,0.0131107,0.00686803,0.00718484,0.00781683 +2024-12-31,4,0.0132429,0.00636043,0.00592227,0.00781683 +2025-01-01,4,0.0130899,0.00628822,0.00585717,0.00781683 +2025-01-02,4,0.00764416,0.00722147,0.00700935,0.00781683 +2025-01-03,4,0.00756799,0.00726019,0.00792654,0.00781683 +2025-01-06,4,0.00701932,0.00773636,0.00726513,0.00781683 +2025-01-07,4,0.00702338,0.00758062,0.00731114,0.00781683 +2025-01-08,4,0.00741412,0.00757611,0.0069397,0.00781683 +2025-01-09,4,0.008,0.00735302,0.00770345,0.00781683 +2025-01-10,4,0.00804781,0.00734916,0.00691579,0.00781683 +2025-01-13,4,0.00417265,0.00752385,0.00705993,0.00781683 +2025-01-14,4,0.00808332,0.00758558,0.00766809,0.00781683 +2025-01-15,4,0.00863397,0.00743899,0.00678011,0.00781683 +2025-01-16,4,0.0083953,0.00754776,0.00728083,0.00781683 +2025-01-17,4,0.00842025,0.00736246,0.0071942,0.00781683 +2025-01-20,4,0.00840691,0.00713117,0.00652661,0.00781683 +2025-01-21,4,0.00744028,0.00756101,0.00734799,0.00781683 +2025-01-22,4,0.00822758,0.00736508,0.00768949,0.00781683 +2025-01-23,4,0.00835586,0.00726304,0.00705278,0.00781683 +2025-01-24,4,0.00887317,0.00728637,0.00776259,0.00781683 +2025-01-27,4,0.0047347,0.00743684,0.00745233,0.00781683 +2025-01-28,4,0.00677056,0.0074317,0.00772871,0.00781683 +2025-01-29,4,0.00868423,0.00758986,0.00786542,0.00781683 +2025-01-30,4,0.00921063,0.00762176,0.00751047,0.00781683 +2025-01-31,4,0.00868002,0.00781697,0.00781854,0.00781683 +2025-02-01,4,0.00872599,0.00694185,0.00689445,0.00781683 +2025-02-03,4,0.00918714,0.00705888,0.00754374,0.00781683 +2025-02-04,4,0.00487601,0.00722492,0.00725918,0.00781683 +2025-02-05,4,0.00501457,0.00723484,0.00744854,0.00781683 +2025-02-06,4,0.00548589,0.00722695,0.00722596,0.00781683 +2025-02-07,4,0.00524018,0.00714843,0.00650798,0.00781683 +2025-02-10,4,0.00580339,0.00724463,0.00745875,0.00781683 +2025-02-11,4,0.00209295,0.00689019,0.00730178,0.00781683 +2025-02-12,4,0.00210695,0.00687705,0.00684249,0.00781683 +2025-02-13,4,0.00209853,0.00690938,0.00688337,0.00781683 +2025-02-14,4,0.00238072,0.00685192,0.0071883,0.00781683 +2025-02-17,4,0.00442871,0.00686719,0.00698356,0.00781683 +2025-02-18,4,0.00449143,0.00635536,0.00549524,0.00781683 +2025-02-19,4,0.00456565,0.00605173,0.00578469,0.00781683 +2025-02-20,4,0.00790294,0.0059758,0.00570936,0.00781683 +2025-02-21,4,0.00847393,0.00604432,0.00571149,0.00781683 +2025-02-24,4,0.00818761,0.00644493,0.00629119,0.00781683 +2025-02-25,4,0.0108508,0.00623133,0.00598808,0.00781683 +2025-02-27,4,0.0119783,0.00615863,0.0061723,0.00781683 +2025-02-28,4,0.00605086,0.00677478,0.00645133,0.00781683 +2025-03-03,4,0.00688692,0.00674699,0.00619951,0.00781683 +2025-03-04,4,0.00646458,0.00635678,0.00638744,0.00781683 +2025-03-05,4,0.00498823,0.00688309,0.00583671,0.00781683 +2025-03-06,4,0.00241056,0.00714744,0.0070961,0.00781683 +2025-03-07,4,0.00373061,0.00622302,0.00635959,0.00781683 +2025-03-10,4,0.00691552,0.00627672,0.00648001,0.00781683 +2025-03-11,4,0.00685893,0.0062795,0.00646003,0.00781683 +2025-03-12,4,0.00713466,0.00617004,0.00636741,0.00781683 +2025-03-13,4,0.00478744,0.00582613,0.00600705,0.00781683 +2025-03-17,4,0.0047388,0.00577956,0.00635466,0.00781683 +2025-03-18,4,0.00553345,0.00651116,0.00623809,0.00781683 +2025-03-19,4,0.00872531,0.0065301,0.00607935,0.00781683 +2025-03-20,4,0.00773791,0.00679349,0.0071001,0.00781683 +2025-03-21,4,0.00791115,0.0066892,0.00691469,0.00781683 +2025-03-24,4,0.00758386,0.00692762,0.00758965,0.00781683 +2025-03-25,4,0.00906722,0.00699067,0.00714951,0.00781683 +2025-03-26,4,0.00869344,0.00732736,0.00806445,0.00781683 +2025-03-27,4,0.00938504,0.00721924,0.0078727,0.00781683 +2025-03-28,4,0.0149801,0.00699289,0.00737779,0.00781683 +2025-04-01,4,0.0193888,0.00742556,0.00744254,0.00781683 +2025-04-02,4,0.0180838,0.00754817,0.00795481,0.00781683 +2025-04-03,4,0.0219229,0.00686774,0.0066178,0.00781683 +2025-04-04,4,0.0232764,0.0073925,0.00743652,0.00781683 +2025-04-07,4,0.0116476,0.00917127,0.00954228,0.00781683 +2025-04-08,4,0.0117457,0.00949946,0.0101821,0.00781683 +2025-04-09,4,0.00683108,0.0093982,0.0105886,0.00781683 +2025-04-11,4,0.0083984,0.00990433,0.00989069,0.00781683 +2025-04-15,4,0.0062061,0.0103438,0.0105537,0.00781683 +2025-04-16,4,0.00815405,0.00989694,0.00900987,0.00781683 +2025-04-17,4,0.00791778,0.010104,0.0087098,0.00781683 +2025-04-21,4,0.00808708,0.00978327,0.0094607,0.00781683 +2025-04-22,4,0.00810974,0.00990609,0.00963447,0.00781683 +2025-04-23,4,0.0075544,0.00962079,0.00934148,0.00781683 +2025-04-24,4,0.00730911,0.00982432,0.00955413,0.00781683 +2025-04-25,4,0.00511867,0.00981701,0.00934217,0.00781683 +2025-04-28,4,0.00285609,0.00989348,0.00950544,0.00781683 +2025-04-29,4,0.00288872,0.00978577,0.00899348,0.00781683 +2025-04-30,4,0.00410996,0.00973908,0.00876259,0.00781683 +2025-05-02,4,0.00613429,0.00964827,0.00919762,0.00781683 +2025-05-05,4,0.0193743,0.00942523,0.00931162,0.00781683 +2025-05-06,4,0.0208771,0.00907786,0.00966034,0.00781683 +2025-05-07,4,0.0208945,0.00884192,0.00960456,0.00781683 +2025-05-08,4,0.0211098,0.00906923,0.00919715,0.00781683 +2025-05-09,4,0.0195421,0.00942876,0.0090434,0.00781683 +2025-05-12,4,0.0108737,0.0109827,0.0119242,0.00781683 +2025-05-13,4,0.00980689,0.010128,0.0109145,0.00781683 +2025-05-14,4,0.00994765,0.0099777,0.0109157,0.00781683 +2025-05-15,4,0.00616086,0.0099977,0.0103616,0.00781683 +2025-05-16,4,0.00870784,0.00978038,0.0111095,0.00781683 +2025-05-19,4,0.00918746,0.00912564,0.0100268,0.00781683 +2025-05-20,4,0.00821952,0.00924565,0.00967205,0.00781683 +2025-05-21,4,0.008017,0.00901591,0.00999205,0.00781683 +2025-05-22,4,0.00679385,0.00873302,0.0100124,0.00781683 +2025-05-23,4,0.00528908,0.00901408,0.00995463,0.00781683 +2025-05-26,4,0.00373341,0.00903818,0.0101311,0.00781683 +2025-05-27,4,0.00374816,0.00902213,0.00999288,0.00781683 +2025-05-28,4,0.00441627,0.00892188,0.0104121,0.00781683 +2025-05-29,4,0.00497113,0.00870745,0.0102175,0.00781683 +2025-05-30,4,0.0065584,0.00858612,0.00952611,0.00781683 +2025-06-02,4,0.00629552,0.00838605,0.00908216,0.00781683 +2025-06-03,4,0.00368487,0.00844938,0.0090724,0.00781683 +2025-06-04,4,0.00391056,0.00852817,0.00934487,0.00781683 +2025-06-05,4,0.00736959,0.00859998,0.00878044,0.00781683 +2025-06-06,4,0.00594133,0.00884474,0.00851226,0.00781683 +2025-06-09,4,0.00754631,0.00877734,0.00909488,0.00781683 +2025-06-10,4,0.00757358,0.00831289,0.00826019,0.00781683 +2025-06-11,4,0.00733853,0.00657423,0.0064811,0.00781683 +2025-06-12,4,0.00602884,0.00666384,0.00619169,0.00781683 +2025-06-13,4,0.00733455,0.00665245,0.00607708,0.00781683 +2025-06-16,4,0.00728338,0.00640443,0.00646013,0.00781683 +2025-06-17,4,0.00698382,0.00642511,0.00614057,0.00781683 +2025-06-18,4,0.00720726,0.00640029,0.00630589,0.00781683 +2025-06-19,4,0.00758588,0.00606516,0.00644087,0.00781683 +2025-06-20,4,0.0065803,0.00644453,0.00633704,0.00781683 +2025-06-23,4,0.00625469,0.00635167,0.00619452,0.00781683 +2025-06-24,4,0.00642143,0.006146,0.00622362,0.00781683 +2025-06-25,4,0.00665687,0.00622116,0.00661341,0.00781683 +2025-06-26,4,0.00333547,0.00638427,0.00597603,0.00781683 +2025-06-27,4,0.00291738,0.00629071,0.00613605,0.00781683 +2025-06-30,4,0.00225707,0.00633987,0.00616796,0.00781683 +2025-07-01,4,0.00255164,0.00630221,0.00646301,0.00781683 +2025-07-02,4,0.00207906,0.006352,0.00616772,0.00781683 +2025-07-03,4,0.00298759,0.00593552,0.00686674,0.00781683 +2025-07-04,4,0.00411115,0.00584771,0.0069271,0.00781683 +2025-07-07,4,0.00387602,0.00571688,0.00626102,0.00781683 +2025-07-08,4,0.00465037,0.00558024,0.00653484,0.00781683 +2025-07-09,4,0.00487579,0.0054908,0.00616444,0.00781683 +2025-07-10,4,0.004783,0.00567502,0.00627356,0.00781683 +2025-07-11,4,0.00406723,0.00595271,0.0064844,0.00781683 +2025-07-14,4,0.00482894,0.00569508,0.00618002,0.00781683 +2025-07-15,4,0.00414007,0.00565907,0.00611328,0.00781683 +2025-07-16,4,0.00533594,0.00548526,0.00646142,0.00781683 +2025-07-17,4,0.00584263,0.00548407,0.00609031,0.00781683 +2025-07-18,4,0.0067178,0.00551522,0.0061514,0.00781683 +2025-07-21,4,0.00607707,0.00562329,0.0061172,0.00781683 +2025-07-22,4,0.00731683,0.00512496,0.00636658,0.00781683 +2025-07-23,4,0.00616504,0.00522457,0.00606492,0.00781683 +2025-07-24,4,0.00590581,0.00536588,0.00614873,0.00781683 +2025-07-25,4,0.00568889,0.00543552,0.00630419,0.00781683 +2025-07-28,4,0.00620709,0.00491649,0.00611979,0.00781683 +2025-07-29,4,0.00551754,0.00507472,0.00628332,0.00781683 +2025-07-30,4,0.00531673,0.00500374,0.00631975,0.00781683 +2025-07-31,4,0.00542563,0.00498801,0.00614761,0.00781683 +2025-08-01,4,0.00584364,0.00511651,0.00641602,0.00781683 +2025-08-04,4,0.0068062,0.00528181,0.00547975,0.00781683 +2025-08-05,4,0.00688969,0.00520086,0.00577226,0.00781683 +2025-08-06,4,0.00737251,0.00518783,0.00582796,0.00781683 +2025-08-07,4,0.0073675,0.00514825,0.00618304,0.00781683 +2025-08-08,4,0.00588364,0.00535333,0.00526973,0.00781683 +2025-08-11,4,0.00523866,0.00570386,0.00574509,0.00781683 +2025-08-12,4,0.00351109,0.0055983,0.00501489,0.00781683 +2025-08-13,4,0.00373282,0.00572411,0.00526156,0.00781683 +2025-08-14,4,0.00670629,0.00564636,0.00599979,0.00781683 +2025-08-18,4,0.00530892,0.0058454,0.00505857,0.00781683 +2025-08-19,4,0.00672089,0.00581926,0.00450631,0.00781683 +2025-08-20,4,0.00654675,0.00561233,0.00490604,0.00781683 +2025-08-21,4,0.00584049,0.00558357,0.00481141,0.00781683 +2025-08-22,4,0.00790283,0.00596857,0.00535066,0.00781683 +2025-08-25,4,0.00721781,0.00581817,0.00451466,0.00781683 +2025-08-26,4,0.00674014,0.00605806,0.00545453,0.00781683 +2025-08-28,4,0.00476216,0.00603336,0.00552812,0.00781683 +2025-08-29,4,0.0040909,0.00592791,0.0046538,0.00781683 +2025-09-01,4,0.0026828,0.00612865,0.00585657,0.00781683 +2025-09-02,4,0.00223765,0.00608234,0.00482517,0.00781683 +2025-09-03,4,0.00181386,0.00610827,0.00498904,0.00781683 +2025-09-04,4,0.00173418,0.00582017,0.0052176,0.00781683 +2025-09-05,4,0.00155747,0.00567459,0.00496177,0.00781683 +2025-09-08,4,0.00263448,0.00549609,0.00482589,0.00781683 +2025-09-09,4,0.00328181,0.00542978,0.00474013,0.00781683 +2025-09-10,4,0.00323667,0.00537974,0.00470938,0.00781683 +2025-09-11,4,0.00312611,0.00511129,0.00486932,0.00781683 +2025-09-12,4,0.00434574,0.00494379,0.00498101,0.00781683 +2025-09-15,4,0.00513264,0.0050692,0.00515556,0.00781683 +2025-09-16,4,0.00404791,0.00517108,0.00545058,0.00781683 +2025-09-17,4,0.00355775,0.00517905,0.00527053,0.00781683 +2025-09-18,4,0.00194644,0.00496872,0.00531907,0.00781683 +2025-09-19,4,0.00301942,0.00510248,0.00537043,0.00781683 +2025-09-22,4,0.00366775,0.00521725,0.00497584,0.00781683 +2025-09-23,4,0.00374486,0.00513953,0.00500784,0.00781683 +2025-09-24,4,0.00714129,0.00493506,0.00497041,0.00781683 +2025-09-25,4,0.00672403,0.00483746,0.0050025,0.00781683 +2025-09-26,4,0.00463666,0.00493929,0.00541124,0.00781683 +2025-09-29,4,0.00424984,0.00476825,0.00572043,0.00781683 +2025-09-30,4,0.00470387,0.00474239,0.00561639,0.00781683 +2025-10-01,4,0.00380614,0.00501095,0.00534139,0.00781683 +2025-10-03,4,0.00383824,0.00498445,0.0051827,0.00781683 +2025-10-06,4,0.00359994,0.00494042,0.00573023,0.00781683 +2025-10-07,4,0.00410954,0.00491225,0.00551745,0.00781683 +2025-10-08,4,0.0046736,0.00497108,0.0055466,0.00781683 +2025-10-09,4,0.00586651,0.00497379,0.00559682,0.00781683 +2025-10-10,4,0.00590568,0.00498134,0.00533806,0.00781683 +2025-10-13,4,0.00500228,0.00494755,0.00539434,0.00781683 +2025-10-14,4,0.00339371,0.00502696,0.00536549,0.00781683 +2025-10-15,4,0.00385549,0.00515812,0.00561475,0.00781683 +2025-10-16,4,0.00362619,0.00548672,0.00539668,0.00781683 +2025-10-17,4,0.00407125,0.00543953,0.00503461,0.00781683 +2025-10-20,4,0.00380661,0.00541015,0.00514108,0.00781683 +2025-10-21,4,0.00417995,0.00525141,0.00541296,0.00781683 +2025-10-23,4,0.005595,0.00522836,0.00570618,0.00781683 +2025-10-24,4,0.00604638,0.0051697,0.00539236,0.00781683 +2025-10-27,4,0.00486112,0.00527085,0.00557113,0.00781683 +2025-10-28,4,0.00530538,0.00516928,0.00560504,0.00781683 +2025-10-29,4,0.00351228,0.0050115,0.00541866,0.00781683 +2025-10-30,4,0.00346014,0.00492101,0.00549277,0.00781683 +2025-10-31,4,0.00387947,0.00513503,0.00520787,0.00781683 +2025-11-03,4,0.0046095,0.00503474,0.0056699,0.00781683 +2025-11-04,4,0.00420126,0.0051048,0.0055308,0.00781683 +2025-11-06,4,0.00319309,0.00503285,0.00535498,0.00781683 +2025-11-07,4,0.00275004,0.00490472,0.00541096,0.00781683 +2025-11-10,4,0.00276887,0.00495373,0.00503322,0.00781683 +2025-11-11,4,0.00413698,0.00501397,0.0050834,0.00781683 +2025-11-12,4,0.00367459,0.00503457,0.00510273,0.00781683 +2025-11-13,4,0.00396499,0.00492284,0.00493561,0.00781683 +2025-11-14,4,0.0051353,0.00483343,0.0049955,0.00781683 +2025-11-17,4,0.00532932,0.00479096,0.00486772,0.00781683 +2025-11-18,4,0.00516528,0.00490158,0.00493065,0.00781683 +2025-11-19,4,0.00743962,0.00464393,0.00522987,0.00781683 +2025-11-20,4,0.00706564,0.00467617,0.0051379,0.00781683 +2025-11-21,4,0.00656208,0.00478554,0.00498015,0.00781683 +2025-11-24,4,0.00607113,0.00485558,0.00491624,0.00781683 +2025-11-25,4,0.00664619,0.00486604,0.00503009,0.00781683 +2025-11-26,4,0.00227675,0.00538982,0.00546398,0.00781683 +2025-11-27,4,0.00266416,0.00526032,0.00538646,0.00781683 +2025-11-28,4,0.00424171,0.00522948,0.00538947,0.00781683 +2025-12-01,4,0.00575334,0.00515439,0.00522147,0.00781683 +2025-12-02,4,0.00562492,0.00513799,0.00490434,0.00781683 +2025-12-03,4,0.00567695,0.00468427,0.00493463,0.00781683 +2025-12-04,4,0.00642775,0.00473413,0.00494539,0.00781683 +2025-12-05,4,0.00639185,0.00479529,0.00506793,0.00781683 +2025-12-08,4,0.00482999,0.00513315,0.00513779,0.00781683 +2025-12-09,4,0.0053445,0.00520915,0.004965,0.00781683 +2025-12-10,4,0.00514408,0.0052289,0.00482844,0.00781683 +2025-12-11,4,0.00433845,0.00529347,0.00493665,0.00781683 +2025-12-12,4,0.00437983,0.005244,0.00493498,0.00781683 +2025-12-15,4,0.00579529,0.00515195,0.00545312,0.00781683 +2025-12-16,4,0.004163,0.00530823,0.0052293,0.00781683 +2025-12-17,4,0.00409911,0.00524963,0.00520529,0.00781683 +2025-12-18,4,0.00493839,0.00515004,0.00489812,0.00781683 +2025-12-19,4,0.00483699,0.0051667,0.00513454,0.00781683 +2025-12-22,4,0.00195356,0.00536179,0.00543028,0.00781683 diff --git a/dashboard/data/shocks_btc.csv b/dashboard/data/shocks_btc.csv new file mode 100644 index 0000000..9b786df --- /dev/null +++ b/dashboard/data/shocks_btc.csv @@ -0,0 +1,6 @@ +horizon,n_shocks,mean_abs_return,ci_low,ci_high,baseline_mean_abs_return,ratio_to_baseline +1,158,0.0398933,0.0338323,0.0459544,0.0231963,1.71982 +3,158,0.0349456,0.029858,0.0400332,0.0231963,1.50652 +7,158,0.0337972,0.0287088,0.0388856,0.0231963,1.45701 +14,158,0.0358201,0.0307586,0.0408816,0.0231963,1.54422 +21,158,0.0343837,0.0290793,0.039688,0.0231963,1.48229 diff --git a/dashboard/data/shocks_nifty.csv b/dashboard/data/shocks_nifty.csv new file mode 100644 index 0000000..921fc5d --- /dev/null +++ b/dashboard/data/shocks_nifty.csv @@ -0,0 +1,6 @@ +horizon,n_shocks,mean_abs_return,ci_low,ci_high,baseline_mean_abs_return,ratio_to_baseline +1,141,0.0144207,0.0114861,0.0173553,0.00728936,1.97832 +3,141,0.013929,0.0109521,0.0169059,0.00728936,1.91086 +7,141,0.0134668,0.0105732,0.0163604,0.00728936,1.84747 +14,141,0.011986,0.00972227,0.0142496,0.00728936,1.64431 +21,141,0.00943022,0.00790426,0.0109562,0.00728936,1.2937 diff --git a/dashboard/requirements.txt b/dashboard/requirements.txt index c43190f..8ce35b4 100644 --- a/dashboard/requirements.txt +++ b/dashboard/requirements.txt @@ -1,6 +1,7 @@ -streamlit==1.40.0 -pandas>=2.0.0 -numpy>=1.24.0 -plotly>=5.18.0 -scipy>=1.11.0 -Pillow>=10.0.0 +# Dashboard runtime only — pinned, tested together on Python 3.11, 3.12, 3.13 and 3.14. +# (Training/analysis deps are in requirements-research.txt. There is deliberately no requirements.txt at the +# repo root, so Streamlit Community Cloud can only install this file.) +streamlit==1.63.0 +pandas==3.0.5 +numpy==2.4.6 +plotly==6.9.0 diff --git a/dashboard/runtime.txt b/dashboard/runtime.txt deleted file mode 100644 index 2c07333..0000000 --- a/dashboard/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -3.11 diff --git a/dashboard/views/__init__.py b/dashboard/views/__init__.py new file mode 100644 index 0000000..c97fa90 --- /dev/null +++ b/dashboard/views/__init__.py @@ -0,0 +1 @@ +"""Dashboard pages; each module exposes render().""" diff --git a/dashboard/views/_ui.py b/dashboard/views/_ui.py new file mode 100644 index 0000000..92c59be --- /dev/null +++ b/dashboard/views/_ui.py @@ -0,0 +1,22 @@ +"""Small presentation helpers shared by the dashboard pages.""" +import plotly.graph_objects as go +import streamlit as st + +COLORS = {"BTC": "#f7931a", "NIFTY": "#4488ff", "accent": "#00c8f8", "muted": "#8ba3c4", "bad": "#ff4d6d", + "good": "#00d68f"} + + +def kcard(label: str, value: str, sub: str = "") -> None: + st.markdown(f"
{label}
{value}
" + f"
{sub}
", unsafe_allow_html=True) + + +def style(fig: go.Figure, height: int = 380, **layout) -> go.Figure: + base = dict(height=height, margin=dict(l=10, r=10, t=40, b=10), hovermode="x unified", + legend=dict(orientation="h", y=1.08, x=0)) + fig.update_layout(**{**base, **layout}) + return fig + + +def show(fig: go.Figure) -> None: + st.plotly_chart(fig, width="stretch", config={"displaylogo": False}) diff --git a/dashboard/views/forecast.py b/dashboard/views/forecast.py new file mode 100644 index 0000000..8b07832 --- /dev/null +++ b/dashboard/views/forecast.py @@ -0,0 +1,124 @@ +import numpy as np +import pandas as pd +import plotly.graph_objects as go +import streamlit as st + +import data +from pipeline import volatility as vol +from views._ui import COLORS, kcard, show, style + +MODES = ("A date in the committed price history", "Paste your own closing prices") +EXAMPLE = "\n".join(f"{100 * np.exp(0.01 * np.sin(i / 3)):.2f}" for i in range(70)) + + +def _realised_after(close: pd.Series, asof: pd.Timestamp): + """Realised σ of the next h log returns after `asof`, if the committed data contains them.""" + pos = close.index.get_loc(asof) + nxt = close.iloc[pos: pos + vol.HORIZON + 1] + if len(nxt) < vol.HORIZON + 1: + return None + return float(np.log(nxt / nxt.shift(1)).dropna().std()) + + +def _show_result(out: dict, asset: str, realised=None): + c = st.columns(4) + with c[0]: + kcard("Forecast daily σ", f"{out['daily_vol']:.2%}", f"std of next {out['horizon_days']} daily log returns") + with c[1]: + days = vol.ANNUALISATION_DAYS[asset] + kcard("Annualised", f"{out['annualised_vol']:.1%}", f"× √{days} ({'calendar' if days == 365 else 'trading'} days)") + with c[2]: + if realised is None: + kcard("Realised", "—", "not in the committed data (future or too recent)") + else: + err = realised - out["daily_vol"] + kcard("Realised (from data)", f"{realised:.2%}", f"forecast error {err:+.2%}") + with c[3]: + i = out["inputs"] + kcard("Recent realised daily σ", f"{i['log_vol_5']:.2%}", + f"last 5 days · 22d {i['log_vol_22']:.2%} · 60d {i['log_vol_60']:.2%}") + if out["warning"]: + st.warning(out["warning"]) + + +def _model_quality(asset: str): + st.subheader("How good is this model?") + m = data.metrics()[asset] + rows = [] + for name, s in m["summary"].items(): + rows.append({"model": name, "test RMSE (σ)": s["test_rmse_vol"], "test MAE (σ)": s["test_mae_vol"], + "test R² (log σ)": s["test_r2_log"], "test QLIKE ↓": s["test_qlike"], + "train R² (log σ)": s["train_r2_log"]}) + st.dataframe(pd.DataFrame(rows).set_index("model").style.format("{:.4f}"), width="stretch") + st.caption(f"Purged walk-forward evaluation: 5 expanding-window folds, 5-day gap between train and test, " + f"{m['n_rows']:,} days ({m['date_range'][0]} → {m['date_range'][1]}). QLIKE is the standard loss for " + "volatility forecasts and penalises under-prediction most. The Random Forest fits training data " + "better but generalises worse than the 4-parameter HAR model, which is why HAR is served.") + + oos = data.table("oos", asset) + fig = go.Figure() + fig.add_trace(go.Scattergl(x=oos["date"], y=oos["actual_vol"], name="realised next-5-day σ", + line=dict(color="#8ba3c4", width=0.8))) + fig.add_trace(go.Scattergl(x=oos["date"], y=oos["har_vol"], name="HAR forecast (out-of-sample)", + line=dict(color=COLORS[asset], width=1.3))) + fig.add_trace(go.Scattergl(x=oos["date"], y=oos["mean_vol"], name="historical-mean baseline", + line=dict(color="#ffffff", width=0.8, dash="dot"))) + show(style(fig, title=f"{asset}: out-of-sample forecasts vs realised volatility", yaxis_tickformat=".1%")) + + +def _model_card(mdl: vol.HARModel): + with st.expander("Model card"): + st.markdown(f""" +**log σ̂(t+1..t+5) = {mdl.intercept:+.3f} {mdl.coef['log_vol_5']:+.3f}·log σ₅ {mdl.coef['log_vol_22']:+.3f}·log σ₂₂ {mdl.coef['log_vol_60']:+.3f}·log σ₆₀** + +- σₙ = sample std of the last n daily log returns, known at the close of day t. Target = std of the next 5. +- Fitted by OLS on {mdl.n_train:,} days ({mdl.trained_from} → {mdl.trained_through}). Stored as JSON + (`models/har_{mdl.asset.lower()}.json`) — no pickle, no scikit-learn needed to serve it. +- The coefficients sum to {sum(mdl.coef.values()):.2f} < 1: forecasts mean-revert toward the long-run level. +- `exp(log forecast)` is a conditional *median*; the model systematically under-predicts the most turbulent weeks + and over-predicts the calmest ones (it shrinks toward the mean). +- Not for trading or risk decisions. Trained on {mdl.asset} only; pasted prices from other assets are outside its training data. +""") + + +def render(): + st.title("Volatility forecast") + st.caption("Forecasts how volatile the next 5 trading days will be, from the last 61+ daily closes. " + "Training and this page use the same feature code (`pipeline/volatility.py`).") + asset = st.selectbox("Asset", data.ASSETS) + mdl, close = data.model(asset), data.prices(asset) + mode = st.radio("Input", MODES, horizontal=True) + + if mode == MODES[0]: + first, last = close.index[vol.MIN_CLOSES - 1], close.index[-1] + d = st.date_input("Forecast as of the close of", value=last.date(), min_value=first.date(), + max_value=last.date(), format="YYYY-MM-DD") + if d is None: + st.error("Please pick a date.") + return + hist = close.loc[: pd.Timestamp(d)] + asof = hist.index[-1] + if asof.date() != d: + st.info(f"No {asset} close on {d} (weekend or holiday) — using the previous close, {asof:%Y-%m-%d}.") + try: + out = vol.forecast(mdl, hist) + except vol.InputError as exc: + st.error(str(exc)) + return + _show_result(out, asset, _realised_after(close, asof)) + else: + with st.form("paste"): + text = st.text_area(f"Daily closing prices, oldest first (at least {vol.MIN_CLOSES}; commas, spaces or " + "new lines)", height=160, placeholder=EXAMPLE[:200] + " …") + submitted = st.form_submit_button("Forecast") + if not submitted: + st.info(f"Paste at least {vol.MIN_CLOSES} consecutive daily closes and press **Forecast**.") + else: + try: + out = vol.forecast(mdl, vol.parse_closes(text)) + except vol.InputError as exc: + st.error(str(exc)) + else: + _show_result(out, asset) + _model_quality(asset) + _model_card(mdl) diff --git a/dashboard/views/fragility.py b/dashboard/views/fragility.py new file mode 100644 index 0000000..4c89e1b --- /dev/null +++ b/dashboard/views/fragility.py @@ -0,0 +1,38 @@ +import plotly.graph_objects as go +import streamlit as st +from plotly.subplots import make_subplots + +import data +from views._ui import COLORS, kcard, show, style + +COMPONENTS = {"persistence_norm": "A · persistence (lag-1 autocorr. of |r|)", + "vol_of_vol_norm": "B · vol-of-vol (CoV of 7-day vol)", + "tail_freq_norm": "C · tail frequency (|r| > 2σ₃₀)"} + + +def render(): + st.title("Market Fragility Index (MFI)") + st.markdown("**MFI = mean of three 30-day components**, each rescaled to [0, 1] by its own expanding (past-only) " + "min and max. Higher = shocks have recently been more persistent, volatility less stable and large " + "moves more frequent. Computed on real daily prices.") + asset = st.selectbox("Asset", data.ASSETS) + mfi = data.table("mfi", asset).set_index("date").loc["2016":] + md = data.metrics()[asset]["market_dynamics"] + c = st.columns(3) + with c[0]: + kcard("Highest MFI", f"{md['mfi_max']:.2f}", md["mfi_max_date"]) + with c[1]: + kcard("Highest in March 2020", f"{md['mfi_2020_03_max']:.2f}", "COVID crash") + with c[2]: + kcard("Average since 2016", f"{md['mfi_mean_since_2016']:.2f}", "") + + fig = go.Figure(go.Scattergl(x=mfi.index, y=mfi["MFI"], name="MFI", line=dict(color=COLORS[asset], width=1))) + show(style(fig, height=320, title=f"{asset} MFI", yaxis_range=[0, 1])) + fig = make_subplots(rows=3, cols=1, shared_xaxes=True, vertical_spacing=0.05, + subplot_titles=list(COMPONENTS.values())) + for i, col in enumerate(COMPONENTS, 1): + fig.add_trace(go.Scattergl(x=mfi.index, y=mfi[col], line=dict(width=0.8)), row=i, col=1) + show(style(fig, height=560, showlegend=False)) + st.caption("Caveats: expanding min-max scaling is unstable early in the sample, so peaks in the first years are " + "partly a short-history effect. The MFI is descriptive; it has not been validated against an external " + "fragility measure (e.g. VIX), and its weights are equal by assumption.") diff --git a/dashboard/views/gmsi.py b/dashboard/views/gmsi.py new file mode 100644 index 0000000..cf318be --- /dev/null +++ b/dashboard/views/gmsi.py @@ -0,0 +1,62 @@ +import pandas as pd +import plotly.graph_objects as go +import streamlit as st + +import data +from views._ui import COLORS, show, style + + +def render(): + st.title("GMSI and forward volatility") + cal = data.gmsi_calibration() + st.markdown(""" +The **Global Market Stress Index (GMSI)** is an equal-weight average of expanding (past-only) z-scores of daily +GDELT event signals — event count, share of negative events, inverted Goldstein score — plus headline sentiment and +an attention proxy. It contains **no price data**. (Sentiment exists only for Oct 2024 – Jan 2025, so on most +days the index is driven by the three GDELT components.) + +The GMSI series itself is built from GDELT files that are not committed to the repository, so the two charts +below are from the original analysis run; the significance numbers underneath are recomputed here. +""") + c = st.columns(2) + for col, a in zip(c, data.ASSETS): + with col: + st.image(str(data.figure(f"cond_exp_{a}.png")), width="stretch") + st.caption("Mean forward 7- and 14-day volatility by GMSI quintile (full-sample quintiles: an in-sample " + "description, not a forecast). The lowest-stress quintile Q1 has the highest forward volatility; " + "Q2–Q5 are roughly flat, not a monotonic decline.") + + st.subheader("Is the relationship statistically significant?") + rows = [] + for a in data.ASSETS: + r = cal["assets"][a] + rows.append({"asset": a, "Spearman ρ (published)": r["statistic"], + "p if days were independent": r["p_value_if_iid"], + f"p, AR(1) null φ={r['phi']}": r["p_value"], + "variance inflation": r["variance_inflation"], + "forward-vol lag-1 autocorr.": r["fwd_vol_lag1_acf"]}) + st.dataframe(pd.DataFrame(rows).set_index("asset").style.format( + {"Spearman ρ (published)": "{:+.4f}", "p if days were independent": "{:.1e}", + f"p, AR(1) null φ={cal['assumed_gmsi_lag1_acf']}": "{:.3f}", "variance inflation": "{:.1f}×", + "forward-vol lag-1 autocorr.": "{:.3f}"}), width="stretch") + st.caption(f"Both GMSI (lag-1 autocorrelation ≈ {cal['assumed_gmsi_lag1_acf']}) and forward volatility are highly " + "persistent, so neighbouring days are not independent evidence. The AR(1) null simulates an " + "independent index with the same persistence; its p-value is still a lower bound because the real " + "GMSI autocorrelation decays more slowly than an AR(1).") + + fpr = pd.DataFrame(cal["false_positive_rate"]) + fig = go.Figure() + fig.add_bar(x=[f"φ = {p}" for p in fpr["phi"]], y=fpr["iid_shuffle"], name="i.i.d. shuffle (original test)", + marker_color=COLORS["bad"]) + fig.add_bar(x=[f"φ = {p}" for p in fpr["phi"]], y=fpr["circular_shift"], name="circular shift (corrected test)", + marker_color=COLORS["good"]) + fig.add_hline(y=0.05, line_dash="dash", annotation_text="nominal 5%") + show(style(fig, height=340, barmode="group", hovermode="x", yaxis_tickformat=".0%", + title="How often each placebo test calls an UNRELATED persistent index 'significant' " + "(real BTC forward vol)")) + st.info("Bottom line: the original placebo test shuffled days independently, which manufactures significance " + "for persistent series. With a valid null the BTC correlation is borderline and the NIFTY one is not " + "significant. The idea that calm news flow precedes volatility (\"complacency\") is a hypothesis " + "worth testing on more data, not an established result.") + with st.expander("GMSI sanity checks (original run)"): + st.image(str(data.figure("gmsi_sanity_checks.png")), width="stretch") diff --git a/dashboard/views/methodology.py b/dashboard/views/methodology.py new file mode 100644 index 0000000..ffb2a57 --- /dev/null +++ b/dashboard/views/methodology.py @@ -0,0 +1,40 @@ +import streamlit as st + + +def render(): + st.title("Methodology & limitations") + st.markdown(""" +### Data +| Source | Used for | Notes | +|---|---|---| +| Yahoo Finance via `yfinance` | daily BTC-USD (2015–2025) and ^NSEI (2010–2025) closes | committed in `data/raw/`; research use only | +| GDELT 2.0 DOC API | 1,500 headline titles, Oct 2024 – Jan 2025 | sentiment experiments only | +| GDELT 1.0 event files | daily event counts / tone / Goldstein for GMSI | not committed (several GB) | + +### Volatility forecast (served model) +- **Target:** standard deviation of the next 5 daily log returns, modelled as its log. +- **Features:** trailing 5-, 22- and 60-day realised volatility (log). Computed by one function used for both training and serving. +- **Model:** HAR-style OLS (Corsi, 2009). Chosen over a Random Forest because it scored better out of sample on + both assets while being far simpler; the forest over-fitted (train R² ≈ 0.5, test ≈ 0). +- **Validation:** 5-fold expanding-window walk-forward with a 5-day purge gap (so no training label overlaps the + test period). Metrics: RMSE / MAE of σ, R² of log σ, QLIKE. + +### Market dynamics +- **MFI:** equal-weight mean of rolling persistence, vol-of-vol and tail frequency, each scaled by expanding min-max. +- **Shocks:** |r| above the expanding 95th percentile of past days; post-shock |r| compared with the normal level. + +### GMSI significance +- Spearman correlation with forward 7-day volatility; significance from a **circular-shift** permutation test + (preserves autocorrelation) and a calibrated AR(1) null. The original i.i.d. shuffle is invalid for persistent series. + +### Limitations +- Sentiment covers ~3 months — far too little to train or validate a sentiment model; the sentiment Random Forest + was archived. +- The GMSI series is not in the repository, so GMSI charts cannot be regenerated from it without the GDELT pipeline. +- All analyses are associations in historical data; nothing here establishes causality. +- Two assets, daily frequency, one data vendor. Not suitable for trading or risk decisions. + +### Corrections log +Earlier versions of this dashboard showed results generated from simulated data, a fabricated null distribution, +p-values no code produced and a constant "model". All were removed or recomputed — see `docs/ISSUES.md`. +""") diff --git a/dashboard/views/overview.py b/dashboard/views/overview.py new file mode 100644 index 0000000..5b5342d --- /dev/null +++ b/dashboard/views/overview.py @@ -0,0 +1,68 @@ +import plotly.graph_objects as go +import streamlit as st +from plotly.subplots import make_subplots + +import data +from views._ui import COLORS, kcard, show, style + + +def render(): + st.title("FinSentinel — stress, fragility and volatility") + st.caption("Daily BTC-USD (2015–2025) and NIFTY 50 (2010–2025). Every figure on this site is computed from " + "real prices by `run_pipeline.py`, or by the served model at request time.") + + m, cal = data.metrics(), data.gmsi_calibration() + sh = {a: data.table("shocks", a, parse_dates=()) for a in data.ASSETS} + c = st.columns(4) + for col, a in zip(c[:2], data.ASSETS): + har, base = m[a]["summary"]["HAR (served)"], m[a]["summary"]["Mean (dummy)"] + with col: + kcard(f"{a} 5-day vol forecast", f"R² {har['test_r2_log']:+.3f}", + f"out-of-sample (log scale) · mean baseline {base['test_r2_log']:+.3f}") + with c[2]: + b, n = sh["BTC"].iloc[-1], sh["NIFTY"].iloc[-1] + kcard("After a top-5% shock", f"{b['ratio_to_baseline']:.2f}× / {n['ratio_to_baseline']:.2f}×", + f"BTC / NIFTY mean |r| vs normal, {int(b['horizon'])} days later") + with c[3]: + bt, nf = cal["assets"]["BTC"], cal["assets"]["NIFTY"] + kcard("GMSI → forward vol", f"p ≈ {bt['p_value']:.2f} / {nf['p_value']:.2f}", + f"BTC / NIFTY, calibrated null (ρ = {bt['statistic']:+.3f} / {nf['statistic']:+.3f})") + + st.subheader("What the data actually shows") + btc_s, nif_s = sh["BTC"], sh["NIFTY"] + st.markdown(f""" +1. **Volatility is forecastable mostly from its own past.** A 4-parameter HAR model on 5/22/60-day realised + volatility beats a Random Forest, a persistence forecast and the historical mean in purged walk-forward tests + on both assets — but it explains only a small share of the variance + (out-of-sample R² {m['BTC']['summary']['HAR (served)']['test_r2_log']:.3f} BTC, + {m['NIFTY']['summary']['HAR (served)']['test_r2_log']:.3f} NIFTY, log scale). Its biggest misses are + event weeks that past volatility cannot see: the March 2020 COVID crash, the August 2024 sell-off (BTC) and + the June 2024 Indian election-result week (NIFTY). +2. **Shocks persist differently.** After a top-5% move, BTC's absolute returns stay + ~{btc_s['ratio_to_baseline'].min():.1f}–{btc_s['ratio_to_baseline'].max():.1f}× normal for three weeks; + NIFTY starts at {nif_s['ratio_to_baseline'].iloc[0]:.1f}× and decays to {nif_s['ratio_to_baseline'].iloc[-1]:.1f}×. +3. **The news-based stress index (GMSI) is at best weakly related to future volatility.** Low-stress quintiles + preceded the highest volatility, but once autocorrelation is accounted for the correlation is borderline for BTC + (p ≈ {bt['p_value']:.2f}) and not significant for NIFTY (p ≈ {nf['p_value']:.2f}). Treat the "complacency + effect" as a hypothesis, not a finding. +""") + + fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.06, + subplot_titles=("BTC-USD close (log scale)", "NIFTY 50 close (log scale)")) + for i, a in enumerate(data.ASSETS, 1): + s = data.prices(a).loc["2015":] + fig.add_trace(go.Scattergl(x=s.index, y=s.values, name=a, line=dict(color=COLORS[a], width=1.3)), row=i, col=1) + fig.update_yaxes(type="log", row=i, col=1) + show(style(fig, height=520, showlegend=False)) + + with st.expander("What changed compared with earlier versions of this dashboard"): + st.markdown(""" +- Removed the MFI, shock-decay and "AC₁ paradox" results that had been generated from **simulated** GARCH data + (a silent fallback in the old analysis script) and labelled as real. They are now recomputed on real prices; + the regime statistics that need the (uncommitted) GMSI series were dropped. +- Removed a fabricated "null distribution" chart and p-values that no code produced; significance is now + computed with a test that is valid for autocorrelated series. +- The old served "model" was a Random Forest trained on ~10 rows that predicted a constant; it was replaced by + the walk-forward-validated HAR model on the forecast page. +- Details: `docs/ISSUES.md` in the repository. +""") diff --git a/dashboard/views/shocks.py b/dashboard/views/shocks.py new file mode 100644 index 0000000..169c436 --- /dev/null +++ b/dashboard/views/shocks.py @@ -0,0 +1,34 @@ +import pandas as pd +import plotly.graph_objects as go +import streamlit as st + +import data +from views._ui import COLORS, show, style + + +def render(): + st.title("Shock propagation") + st.markdown("A **shock** is a day whose absolute log return exceeds the 95th percentile of all *previous* days " + "(expanding threshold, 250-day burn-in). The chart shows the mean absolute return h days later, " + "divided by the average absolute return over the same period, with 95% confidence intervals.") + fig = go.Figure() + tables = [] + for a in data.ASSETS: + sp = data.table("shocks", a, parse_dates=()) + base = sp["baseline_mean_abs_return"] + fig.add_trace(go.Scatter(x=sp["horizon"], y=sp["ci_high"] / base, mode="lines", line=dict(width=0), showlegend=False, + hoverinfo="skip")) + fig.add_trace(go.Scatter(x=sp["horizon"], y=sp["ci_low"] / base, mode="lines", fill="tonexty", line=dict(width=0), + fillcolor="rgba(150,150,150,0.2)", showlegend=False, hoverinfo="skip")) + fig.add_trace(go.Scatter(x=sp["horizon"], y=sp["ratio_to_baseline"], name=f"{a} ({int(sp['n_shocks'][0])} shocks)", + mode="lines+markers", line=dict(color=COLORS[a], width=2))) + tables.append(sp.assign(asset=a)) + fig.add_hline(y=1, line_dash="dash", annotation_text="normal day") + show(style(fig, height=420, hovermode="x", xaxis_title="days after the shock", + yaxis_title="mean |r| ÷ normal mean |r|")) + t = pd.concat(tables)[["asset", "horizon", "n_shocks", "mean_abs_return", "ci_low", "ci_high", + "baseline_mean_abs_return", "ratio_to_baseline"]] + st.dataframe(t.set_index(["asset", "horizon"]).style.format("{:.4f}", subset=t.columns[3:]), width="stretch") + st.caption("Reading: BTC's elevated volatility after a shock barely decays over three weeks (volatility " + "clustering is long-memory); NIFTY's starts higher relative to normal and fades steadily. " + "Overlapping post-shock windows make neighbouring horizons correlated, so the CIs are approximate.") diff --git a/data/raw/nifty_google_trends.csv b/data/raw/nifty_google_trends.csv index 37637b8..38815eb 100644 --- a/data/raw/nifty_google_trends.csv +++ b/data/raw/nifty_google_trends.csv @@ -191,5 +191,3 @@ date,google_trend 2025-10,51 2025-11,52 2025-12,52 -2025-11,52 -2025-12,52 diff --git a/data_pipeline/requirements.txt b/data_pipeline/requirements.txt index e081518..dd45f3f 100644 --- a/data_pipeline/requirements.txt +++ b/data_pipeline/requirements.txt @@ -30,4 +30,4 @@ praw>=7.7 # Uses requests (already listed above) # ── Source 8: Quandl / Nasdaq Data Link ────────────────────────────────────── -quandl>=3.6.0 +nasdaq-data-link>=1.0.4 diff --git a/data_pipeline/sources/fetch_gdelt.py b/data_pipeline/sources/fetch_gdelt.py index 89d4f42..5d6aa0f 100644 --- a/data_pipeline/sources/fetch_gdelt.py +++ b/data_pipeline/sources/fetch_gdelt.py @@ -149,8 +149,9 @@ def fetch_gdelt(log=None): month_key = month_start.strftime("%Y_%m") parquet_path = _CACHE_DIR / f"{month_key}.parquet" - # Use parquet cache if valid - if parquet_path.exists(): + # Use parquet cache if valid — but always re-query the current, still-incomplete month + is_current_month = (month_start.year, month_start.month) == (today.year, today.month) + if parquet_path.exists() and not is_current_month: try: df_month = pd.read_parquet(parquet_path) all_months.append(df_month) diff --git a/data_pipeline/sources/fetch_quandl.py b/data_pipeline/sources/fetch_quandl.py index 874c86f..28e1b11 100644 --- a/data_pipeline/sources/fetch_quandl.py +++ b/data_pipeline/sources/fetch_quandl.py @@ -126,10 +126,10 @@ def fetch_quandl(log=None): return [] try: - import quandl - quandl.ApiConfig.api_key = api_key + import nasdaqdatalink # successor of the deprecated `quandl` package (same get() API) + nasdaqdatalink.ApiConfig.api_key = api_key except ImportError: - log.error("quandl not installed. Run: pip install quandl") + log.error("nasdaq-data-link not installed. Run: pip install nasdaq-data-link") return [] _RAW_DIR.mkdir(parents=True, exist_ok=True) @@ -156,7 +156,7 @@ def fetch_quandl(log=None): log.warning("Could not read cached file %s: %s", out_path, exc) continue - df = _pull_dataset(quandl, code, log) + df = _pull_dataset(nasdaqdatalink, code, log) if df is None: if ds.get("expected_unavailable"): diff --git a/data_pipeline/sources/fetch_yfinance.py b/data_pipeline/sources/fetch_yfinance.py index 9cca3fd..76fed01 100644 --- a/data_pipeline/sources/fetch_yfinance.py +++ b/data_pipeline/sources/fetch_yfinance.py @@ -15,7 +15,7 @@ open, high, low, close, volume, adj_close, log_return, vol_7d, vol_14d, vol_30d, vol_60d -Rolling vols are annualised (×√252). +Rolling vols are annualised with √365 for crypto (trades every day) and √252 otherwise. Index: date (YYYY-MM-DD, no timezone). NaNs preserved — no forward-fill. """ @@ -52,6 +52,7 @@ ] START_DATE = "2010-01-01" +CRYPTO = {"BTC-USD", "ETH-USD"} # --------------------------------------------------------------------------- @@ -68,14 +69,14 @@ def _ticker_to_filename(ticker: str) -> str: return f"{clean}.csv" -def _compute_features(df: pd.DataFrame) -> pd.DataFrame: +def _compute_features(df: pd.DataFrame, periods_per_year: int = 252) -> pd.DataFrame: """Add log_return and annualised rolling volatility columns.""" df = df.copy() df["log_return"] = np.log(df["close"] / df["close"].shift(1)) for window in [7, 14, 30, 60]: df[f"vol_{window}d"] = ( - df["log_return"].rolling(window).std() * np.sqrt(252) + df["log_return"].rolling(window).std() * np.sqrt(periods_per_year) ) return df @@ -132,7 +133,7 @@ def _download_ticker(ticker: str, log) -> pd.DataFrame | None: raw.index = raw.index.strftime("%Y-%m-%d") # Add derived columns - raw = _compute_features(raw) + raw = _compute_features(raw, 365 if ticker in CRYPTO else 252) return raw diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..b9f9762 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,423 @@ +# FinSentinel — Architecture + +This document has two parts: +- **Part A** describes the **current** system, after the fixes. It is what you should explain in an interview. +- **Part B** is the forensic audit of the **original** code at commit `e1eb270`. It explains *why* things changed. + +--- + +# Part A — Current architecture + +## A1. End-to-end narrative + +1. **Raw data**: committed daily prices in `data/raw/{btc,nifty}_prices.csv`, loaded and validated by `pipeline/data.py:25-45` (required columns, unique dates, positive closes). +2. **Features and target**: `pipeline/volatility.py:51-75` turns a close series into trailing features and the target. Every feature uses only data up to day t. + - Features: log returns, |r|, r², and 5/22/60-day realised vol (raw and log). + - Target: log std of the next 5 log returns. +3. **Training and evaluation**: `run_pipeline.py:47-114`. + - Purged walk-forward comparison of HAR, Random Forest, persistence and mean baselines (5 expanding folds, 5-day gap). + - The final HAR model is then fit on all rows (`pipeline/volatility.py:90-96`) and written as JSON to `models/har_{asset}.json` (L108-111). +4. **Research outputs**, also written by `run_pipeline.py`: + - MFI and shock propagation on real prices (`pipeline/market_dynamics.py`), saved to `dashboard/data/*.csv` (L99-114). + - A calibrated null for the published GMSI correlations (`pipeline/stats.py:76-95`), saved to `dashboard/data/gmsi_calibration.json` (L117-145). +5. **Serving**: `dashboard/app.py` routes to one module per page in `dashboard/views/`. + - All file reads go through `dashboard/data.py`: the model is loaded with `st.cache_resource` (L44-46), prices and tables with `st.cache_data` (L39-62). + - The forecast page calls `pipeline.volatility.forecast()` (L155-170), the **same** `price_features()` function used in training. + +## A2. Components + +```mermaid +flowchart LR + RAW[(data/raw/*_prices.csv)] --> D[pipeline/data.py
validated loaders] + D --> V[pipeline/volatility.py
features · target · HARModel · forecast] + D --> MD[pipeline/market_dynamics.py
MFI · shocks · regimes] + D --> ST[pipeline/stats.py
circular-shift test · AR1 null] + V & MD & ST --> RP[run_pipeline.py] + RP --> M[(models/har_*.json)] + RP --> DD[(dashboard/data/*.csv, *.json)] + M & DD & RAW --> DL[dashboard/data.py
st.cache_resource / st.cache_data] + V --> DL + DL --> VIEWS[dashboard/views/*.py] --> APP[dashboard/app.py] + FIG[(reports/figures/*.png)] --> DL + S08[scripts/08_market_dynamics_analysis.py] --> FIG + MD --> S08 + VG[scripts/validate_gmsi.py, regime_analysis.py] -. needs uncommitted GMSI .-> FIG + ST --> VG +``` + +## A3. Training vs inference: the boundary + +```mermaid +flowchart TB + subgraph TRAIN["TRAINING — offline: python run_pipeline.py (~1 min)"] + T1[load_close(asset)] --> T2["price_features() → training_frame()
drop NaN rows on used columns only"] + T2 --> T3["walk-forward: TimeSeriesSplit(5, gap=5)
HAR · RF · persistence · mean"] + T3 --> T4[metrics.json, oos_*.csv] + T2 --> T5["HARModel.fit(all rows) → OLS on log σ5, σ22, σ60"] + T5 --> T6[(models/har_asset.json
intercept + 3 coefs + feature contract)] + end + T6 == "boundary: a JSON file with a versioned feature contract
(windows, horizon, feature names checked on load)" ==> I2 + subgraph INFER["INFERENCE — dashboard request"] + I1[user picks date or pastes closes] --> I0["validate_closes / parse_closes
InputError → friendly st.error"] + I0 --> I3["price_features(with_target=False) — SAME function"] + I2["HARModel.from_json (st.cache_resource)"] --> I4 + I3 --> I4["predict_log → exp − 1e-6 → daily σ, ×√365 / √252"] + I4 --> I5[cards + realised σ if the data has it] + end +``` + +**What is baked into the artifact:** the intercept, 3 coefficients, the windows `(5, 22, 60)`, the horizon `5`, and training metadata and metrics. No preprocessing object needs to be serialized, because the features are a deterministic function of the closes. `HARModel.from_json` (`pipeline/volatility.py:113-123`) **refuses** a file whose windows, horizon or feature names differ from the code, which makes train/serve skew a load-time error instead of a silent bug. + +**What the caller must provide:** at least 61 strictly positive, finite, consecutive daily closes, oldest first (`pipeline/volatility.py:140-152`). + +## A4. Runtime request path + +```mermaid +sequenceDiagram + actor U as User + participant S as Streamlit + participant A as app.py + participant F as views/forecast.py + participant C as dashboard/data.py (caches) + participant P as pipeline/volatility.py + U->>S: choose "Volatility forecast", BTC, date + S->>A: rerun + A->>F: render() + F->>C: model("BTC") [cache_resource], prices("BTC") [cache_data] + F->>P: forecast(model, closes up to date) + P->>P: validate → price_features → predict + P-->>F: daily σ, annualised σ, inputs, warning + F->>C: metrics(), table("oos", BTC) + F-->>U: cards + model comparison + out-of-sample chart +``` + +Measured with a real browser (`tests/e2e/browser_smoke.py`, Streamlit 1.63.0, Python 3.11): first paint 2.5–3.8 s, each page 0.6–4.3 s, 0 exceptions, 0 console errors. Before the fix the landing page took 185 s. + +## A5. Module table + +| File | Responsibility | Key functions | Called by | Calls | +|---|---|---|---|---| +| `pipeline/data.py` | paths, validated price loading | `load_prices` L25, `load_close` L43 | run_pipeline, scripts/08, dashboard/data | pandas | +| `pipeline/volatility.py` | feature/target contract, HAR model, input validation, forecast | `price_features` L51, `training_frame` L72, `HARModel` L78, `parse_closes` L126, `validate_closes` L140, `forecast` L155 | run_pipeline, dashboard, tests | numpy, pandas | +| `pipeline/market_dynamics.py` | MFI, shocks, regimes, within-spell AC1 | `compute_mfi` L33, `identify_shocks` L56, `shock_propagation` L64, `expanding_regimes` L80, `within_spell_ac1` L89 | run_pipeline, scripts/08, regime_analysis | numpy, pandas | +| `pipeline/stats.py` | valid significance tests | `permutation_test` L42, `ar1_null` L76 | run_pipeline, validate_gmsi | scipy | +| `pipeline/sentiment.py` | text cleaning, FinBERT polarity by label name | `clean_text`, `finbert_polarity`, `score_finbert` | notebooks 02/03 | transformers (lazy) | +| `run_pipeline.py` | all offline training and results | `walk_forward` L47, `run_volatility` L80, `run_gmsi_calibration` L117, `run_sentiment_rf` L148 | CLI, CI | pipeline.*, sklearn | +| `dashboard/data.py` | cached file access, missing-artifact errors | `model` L45, `prices` L40, `metrics` L50, `table` L60 | views | pipeline.volatility, pipeline.data | +| `dashboard/views/*.py` | one page each | `render()` | app.py | data, plotly | + +## A6. State, seeds, paths, magic numbers (current) +- **Seeds:** RF `random_state=42` (`pipeline/train_rf_model.py:9-10`); all Monte-Carlo code uses `np.random.default_rng(seed)` (`pipeline/stats.py`, `run_pipeline.py:32`). There is no global RNG mutation anywhere. +- **Shared state:** only Streamlit's caches and per-user widget state. No module-level mutable data. +- **Paths:** every path is derived from `Path(__file__).resolve()` (`pipeline/data.py:8-12`, `dashboard/data.py:18`, `scripts/*.py`). Commands work from any CWD. +- **Magic numbers, all named constants with comments:** + - `HORIZON=5`, `WINDOWS=(5,22,60)`, `EPS=1e-6`, `ANNUALISATION_DAYS` (`pipeline/volatility.py:28-33`) + - `MFI_WINDOW=30`, `SHOCK_QUANTILE=0.95`, `SHOCK_BURN_IN=250` (`pipeline/market_dynamics.py:22-25`) + - `PUBLISHED_GMSI_SPEARMAN`, `GMSI_LAG1_ACF=0.82` (`run_pipeline.py:35-36`): inputs taken from the original analysis, because the GMSI series is not committed + +--- + +# Part B — Audit of the original code (commit `e1eb270`) + +> Scope: the repository at commit `e1eb270` (2026-03-23), read end to end. Line numbers refer to that commit (`git show e1eb270:`). Every claim cites `file:line` (or `notebook cell N`). + +## 0. The one-paragraph truth + +FinSentinel is **three loosely-coupled, mostly offline research tracks plus a static dashboard**, not an end-to-end ML system: + +1. **Data collection**: a modular fetcher package (`data_pipeline/`) plus ad-hoc notebooks and scripts that download prices (yfinance), headlines (GDELT DOC API), and GDELT event files. +2. **Research analyses**, run by hand in notebooks and scripts: + - a sentiment→volatility Random Forest (abandoned) + - a "VSI" index (abandoned, because it contained volatility itself) + - an exogenous stress index, GMSI, with conditional-expectation and placebo tests + - a fragility/shock analysis, MFI. **Its committed outputs were produced by its synthetic-data fallback.** +3. **A Streamlit dashboard** (`dashboard/app.py`) that shows **PNG figures, hard-coded numbers, and freshly simulated GARCH/AR(1) data**. + +**The dashboard loads no model, reads no data file, and calls no pipeline code.** The serialized model `models/rf_btc.pkl` is never loaded by anything in the repo, and it is a constant predictor (§6). + +--- + +## 1. End-to-end narrative (what really happens, step by step) + +### 1a. Track A: sentiment-augmented volatility forecasting (Dec 2025 – Jan 2026, abandoned) + +| Step | Where | What it does | +|---|---|---| +| 1 | `notebooks/01_data_collection.ipynb` cell 3 | `yf.download` BTC-USD (2015→) and ^NSEI (2010→). Writes `data/raw/{btc,nifty}_prices.csv` with a **simple** return `close.pct_change()`. | +| 2 | `notebooks/01a_text_data_collection.ipynb` cells 4-11 | GDELT DOC API headline titles. The committed run only fetched 2015-01-01→01-02, which returned empty. The committed `data/raw/text_data.csv` (1,500 headlines, 2024-10-03 → 2025-01-01) came from an earlier run that is not in the notebook. | +| 3 | `notebooks/02_preprocessing.ipynb` cells 3-5 | `clean_text`: lowercase, strip URLs, **delete every non-`[a-zA-Z\s]` character**, keep if length > 10 → 1,377 rows → `data/processed/text_preprocessed.csv`. | +| 4 | `notebooks/03_sentiment_analysis.ipynb` cells 3-6 | FinBERT (`ProsusAI/finbert`) score = `probs[2] - probs[0]`; VADER compound. **Label-order bug, see ISSUES P0-3.** | +| 5 | `notebooks/04_time_alignment.ipynb` cells 3-11 | Log returns, daily mean sentiment per UTC date per asset, inner join on date, lags 1/2/3/5 → `btc_sentiment_aligned.csv` (75 rows) and `nifty_sentiment_aligned.csv` (54 rows), per `notebooks/05_correlation_analysis.ipynb` cell 3 output. | +| 6 | `run_pipeline.py:9-24` → `pipeline/feature_engineering.py:3-56` → `pipeline/train_rf_model.py:7-35` | Builds 9 features plus target `log(std(r[t+1..t+5]) + 1e-6)`, does an 80/20 chronological split, fits `RandomForestRegressor`, and dumps `models/rf_btc.pkl`. With 75 input rows, only about 11 rows survive `dropna`, so every tree is a single leaf (§6). | +| 6' | `notebooks/06_rf_volatility_forecasting.ipynb` | Same idea with 12 features and a 1-step target. Prints `len(btc_df) = 15` (cell 3) and **all feature importances = 0.0** (cell 7). | +| 6'' | `notebooks/07_sentiment_augmented_volatality_NIFTY.ipynb` cell 4 | CNN on NIFTY. **Crashes**: `Found array with 0 sample(s)`. | + +### 1b. Track B: VSI → GMSI (Jan 2026 – Mar 2026) + +| Step | Where | What it does | +|---|---|---| +| 1 | `scripts/run_events_pipeline.py:96-172`, `scripts/run_gdelt_pipeline.py:101-155` | Download daily GDELT 1.0 event / GKG zip files and filter them by root code, country, and keywords. Output is gitignored and **not in the repo**. | +| 2 | `notebooks/11_event_detection_and_labeling.ipynb` cells 14-19 | Aggregate the events into a daily `events_daily_2015_2025.csv` (3,998 days): `event_count`, `avg_goldstein`, `neg_event_share`, and `conflict/economic/political_events`. **The last three are all 0** (cell 20 `describe()` shows mean 0.0) because a string-vs-int comparison never matches (ISSUES P1-6). | +| 3 | `scripts/construct_vsi_full.py:5-176` | VSI = mean of z(vol_30d), z(sentiment), z(attention). It contains volatility itself, and `notebooks/13_gmsi_validation.ipynb` cell 17 reports corr(VSI, vol) = 0.92 for BTC and 0.96 for NIFTY. This is the "mechanical coupling" the README mentions. | +| 4 | `scripts/reconstruct_gmsi.py:9-95` | **"Pure exogenous" GMSI** = equal-weight mean of 6 expanding z-scores (event count, negative share, −Goldstein, −sentiment, −sentiment surprise, attention), with `fillna(0)` (L65). Sentiment exists for only about 82 days, so 3 of the 6 components are 0 on roughly 98% of days. → `gmsi_exogenous.csv` (not in repo). | +| 5 | `scripts/validate_gmsi.py:8-105`, `scripts/sanity_check_gmsi.py`, `scripts/regime_analysis.py` | Spearman GMSI(t) vs forward vol, quintile conditional means, KS/MWU tests, a **1000-shuffle i.i.d. placebo**, and regime stats. These produce the real-data figures `cond_exp_*`, `placebo_test_*`, `gmsi_sanity_checks`, and `regime/*`. | + +### 1c. Track C: MFI / shock propagation ("Paper 2") + +| Step | Where | What it does | +|---|---|---| +| 1 | `scripts/08_market_dynamics_analysis.py:72-112` | Looks for `data/processed/btc_features.csv`, `nifty_features.csv`, and `gmsi_daily.csv`. **No code in the repo writes any of these three files** (grep: they appear only in this script and its notebook copy). | +| 2 | `scripts/08_market_dynamics_analysis.py:855-857` | Files missing → `generate_synthetic_data()` (L162-198): GARCH(1,1) t-innovations for BTC and NIFTY, plus an AR(1) "GMSI", all from `np.random.seed(42)` (L39). | +| 3 | L203-436 | MFI, shocks, regimes, and regime stats run on the synthetic data → `fig1/3/4/5/6_*.png`. | +| 4 | — | Those PNGs were copied to `reports/figures/` and `dashboard/assets/`, and their numbers were typed into `dashboard/app.py:393-404`. **Proven identical** by `analysis/verify_dashboard_numbers.py` (DATA_REPORT §9, MODEL_REPORT §7). | + +### 1d. The dashboard at runtime + +`streamlit run dashboard/app.py` runs top to bottom on every interaction: + +1. `st.set_page_config` (`app.py:19-24`). +2. A 335-line CSS string is injected (`app.py:36-372`). +3. Module-level constants are defined (`app.py:379-404`): conditional expectations, correlations, regime stats, shock decay. +4. `gen_market_data()` (`app.py:409-447`, `@st.cache_data`) simulates 2,000 business days of GARCH returns for "BTC" and "NIFTY" plus an AR(1) "GMSI", with `np.random.seed(42)`. +5. A sidebar of 7 `st.button`s sets `st.session_state.page` and calls `st.rerun()` (`app.py:561-576`). +6. One `if/elif` branch renders the chosen page (`app.py:626-1322`) from `load_img(...)` PNGs (`app.py:29-33`), the constants, and the simulated `mdf`. + +There is **no preprocessing, no model, and no user input that reaches any computation**, apart from two radio buttons that select which hard-coded dict to plot (`app.py:837-840`). + +--- + +## 2. Component diagram + +```mermaid +flowchart LR + subgraph EXT[External sources] + YF[yfinance] + GD[GDELT DOC API / event + GKG zip files] + GT[Google Trends] + FR[FRED / AlphaVantage / NewsAPI / Reddit / Quandl] + end + + subgraph DP[data_pipeline/ — modular fetchers] + FA[fetch_all.py] --> SRC[sources/fetch_*.py] + SRC --> UT[utils/cache, logger, manifest] + end + + subgraph NB[notebooks/ 01-13 — manual, ordered by filename] + N01[01 prices] --> N02[02 clean text] --> N03[03 FinBERT+VADER] --> N04[04 align] + N04 --> N05[05 corr] & N06[06 RF] & N09[09/10 VSI] + N11[11 events agg] --> N12[12 GMSI v0 StandardScaler] + N13[13 VSI validation] + end + + subgraph SC[scripts/] + EVT[run_events_pipeline / run_gdelt_pipeline / download_gdelt] + VSI[construct_vsi_full.py] + RG[reconstruct_gmsi.py] + VAL[validate_gmsi.py / sanity_check_gmsi.py / regime_analysis.py] + S08[08_market_dynamics_analysis.py
synthetic fallback] + end + + subgraph PL[pipeline/ + run_pipeline.py] + FE[feature_engineering.build_features] --> TR[train_rf_model.train_random_forest] --> EV[evaluate.*] + DB[dataset_builder.py — unused] + end + + RAW[(data/raw/*.csv
committed)] + PROC[(data/processed/*
gitignored, NOT in repo)] + PKL[(models/rf_btc.pkl)] + FIG[(reports/figures/*.png)] + ASSET[(dashboard/assets/*.png
byte-identical copies)] + APP[dashboard/app.py] + + YF --> N01 --> RAW + YF & FR & GD & GT --> DP --> RAW + GD --> EVT --> PROC + RAW --> N02 + N03 & N04 & N11 --> PROC + PROC --> VSI & RG & VAL & PL + RG --> PROC + PL --> PKL + VAL --> FIG + S08 --> FIG + FIG -. manual copy .-> ASSET --> APP + PKL -. never loaded .-x APP +``` + +--- + +## 3. Runtime request path (what happens when a user clicks) + +```mermaid +sequenceDiagram + actor U as User (browser) + participant ST as Streamlit server + participant APP as dashboard/app.py (re-executed top→bottom) + participant C as st.cache_data + participant FS as dashboard/assets/*.png + + U->>ST: click sidebar button "Shock Propagation" + ST->>APP: rerun script with widget state + APP->>APP: set_page_config, inject CSS, define constants (L379-404) + APP->>C: gen_market_data() + C-->>APP: cached synthetic DataFrame (1,971 rows) + APP->>APP: button handler sets session_state.page="shock"; st.rerun() (L575-576) + ST->>APP: rerun again + APP->>FS: PIL.Image.open(fig6_shock_decay_comparison.png) (L1047) + APP->>APP: plot SHOCK_DECAY constants with Plotly (L1059-1067) + APP-->>ST: delta messages (markdown, images, plotly JSON) + ST-->>U: rendered page + Note over APP: No preprocessing. No model. No data file read.
Nothing the user enters reaches any computation. +``` + +**Measured cost** (`streamlit.testing.v1.AppTest`, Streamlit 1.40.0, Python 3.11.17, this sandbox): +- `overview` takes **185.2 s** to render. +- `regime` takes **31.4 s**. +- Every other page takes under 1 s. + +**Root cause:** one plotly `add_vrect(row=…, col=…)` call per regime segment (`app.py:668-675` and `1167-1172`). That is 620 calls on a 2-row subplot that already contains 1,971-point traces, and each call re-scans the figure, so the cost grows quadratically. The same 620 shapes on an empty figure took 0.2 s. See ISSUES P2-1. + +--- + +## 4. Training pipeline vs inference pipeline: the boundary + +**The boundary is the pickle file, and nothing ever crosses it.** Training writes `models/rf_btc.pkl`. No code reads it: `grep -rn "rf_btc\|joblib.load\|pickle.load" --include=*.py --include=*.ipynb` returns zero hits outside `analysis/`. The only reference to the file is the `joblib.dump` at `pipeline/train_rf_model.py:33`. The "inference pipeline" a candidate might describe does not exist. + +```mermaid +flowchart TB + subgraph TRAIN["TRAINING (offline, run once by hand: python run_pipeline.py)"] + A1[data/processed/btc_sentiment_aligned.csv
75 rows, 2024-10-08 → 2024-12/2025-01
NOT committed] --> A2["build_features()
pipeline/feature_engineering.py:3-56
rolling 5/22/60 · surprise · interactions
target = log(std r[t+1..t+5] + 1e-6)
dropna → ~11 rows"] + A2 --> A3["train_test_split(test_size=0.2, shuffle=False)
run_pipeline.py:15-17"] + A3 --> A4["RandomForestRegressor(600 trees, depth 8,
min_samples_leaf=10, sqrt, rs=42)
pipeline/train_rf_model.py:8-17"] + A4 --> A5["RMSE/MAE on exp(pred) vs exp(y) (L20-28)"] + A4 --> A6[(models/rf_btc.pkl)] + end + + A6 -. "boundary: NOTHING loads this file" .-x I0 + + subgraph INFER["'INFERENCE' AS IMPLEMENTED (dashboard/app.py)"] + I0[user click] --> I1[hard-coded dicts L379-404] + I0 --> I2[PNG files from dashboard/assets] + I0 --> I3["gen_market_data(): np.random.seed(42) GARCH + AR(1) (L409-447)"] + I1 & I2 & I3 --> I4[Plotly / st.image] + end + + subgraph WOULD["What an inference path WOULD need (does not exist)"] + W1[latest ≥60 daily closes + same-day headlines] --> W2[clean_text → FinBERT (fixed label order) → VADER] + W2 --> W3[daily mean per asset → build_features identical to training] + W3 --> W4[model.predict → exp(·) − 1e-6 → 5-day σ of daily log returns] + end +``` + +--- + +## 5. Module-by-module table + +| File | Responsibility | Key functions / objects | Called by | Calls | +|---|---|---|---|---| +| `run_pipeline.py` | Train the BTC RF from `data/processed/btc_sentiment_aligned.csv` | `run(asset)` L9-24 | CLI `python run_pipeline.py` (L27-28) | `build_features`, `train_random_forest`, `feature_importance`, `plot_predictions`, sklearn `train_test_split` | +| `pipeline/feature_engineering.py` | Features + target | `build_features(df, target_horizon=5)` L3-56 | `run_pipeline.py:13` | pandas/numpy only | +| `pipeline/train_rf_model.py` | Fit, score, pickle | `train_random_forest(...)` L7-35 | `run_pipeline.py:19` | sklearn RF, `joblib.dump` L33 | +| `pipeline/evaluate.py` | Importance print + plot | `plot_predictions` L5-14, `feature_importance` L17-26 | `run_pipeline.py:23-24` | matplotlib | +| `pipeline/dataset_builder.py` | Alternative split helper | `build_dataset` L18-24 | **nobody** (dead). It also references `TARGET="log_vol"` (L16) and `vol_5/vol_22/vol_60/sent_vol`, which `build_features` never returns. | sklearn | +| `data_pipeline/fetch_all.py` | Orchestrate 8 fetchers, write manifest | `run_source` L92-109 (dynamic import), `run_pipeline` L137-178, `main` L183-197 | CLI | `sources.*`, `utils.*` | +| `data_pipeline/sources/fetch_yfinance.py` | 17 tickers OHLCV + log return + vols ×√252 | `_download_ticker` L83-137, `fetch_yfinance` L144-196 | fetch_all | yfinance, cache, manifest | +| `…/fetch_fred.py` | 15 FRED series | `fetch_fred` L77-157 | fetch_all | fredapi | +| `…/fetch_gdelt.py` | GKG daily aggregates via BigQuery | `_MONTH_QUERY` L50-74, `fetch_gdelt` L99-197 | fetch_all | google-cloud-bigquery | +| `…/fetch_trends.py` | 14 Google Trends terms | `fetch_trends` L100-189 | fetch_all | pytrends | +| `…/fetch_alphavantage.py`, `fetch_reddit.py`, `fetch_newsapi.py`, `fetch_quandl.py` | Other sources | `fetch_*` | fetch_all | requests / praw / quandl | +| `data_pipeline/utils/cache.py` | 24 h file-age cache | `is_cache_valid` L19-39 | all fetchers | — | +| `data_pipeline/utils/logger.py` | Logger to `data/raw/pipeline.log` | `get_logger` L54-57 | all | logging | +| `data_pipeline/utils/manifest.py` | `data/raw/manifest.json` | `build_record` L37-88, `write_manifest` L91-107 | all | json | +| `scripts/run_events_pipeline.py` | Download + filter GDELT events, 2025-05-30→2025-12-31 | module-level loop L96-172 | manual | requests | +| `scripts/run_gdelt_pipeline.py` | Download + keyword-filter GKG, 2020-03-17→2025-12-31 | module-level loop L101-155 | manual | requests | +| `scripts/download_gdelt.py`, `filter_gdelt_events.py` | Quarterly GDELT zips, column subset | `download_quarter`, `filter_daily_file` | **nobody** (functions defined, never invoked) | — | +| `scripts/construct_vsi_full.py` | VSI (contains vol) | `create_vsi_dataset` L5-176 | manual `__main__` | pandas | +| `scripts/reconstruct_gmsi.py` | Exogenous GMSI | `expanding_z_score` L4-7, `reconstruct_gmsi` L9-95 | manual | pandas | +| `scripts/validate_gmsi.py` | Lagged Spearman, quintiles, KS/MWU, placebo | `validate_asset` L8-105 | manual | scipy, seaborn | +| `scripts/sanity_check_gmsi.py` | ADF, same-day corr, 4-panel figure | `sanity_check` L9-73 | manual | statsmodels | +| `scripts/regime_analysis.py` | Regimes (full-sample quantiles), diagnostics, shocks | `assign_regimes` L21-41, `shock_response` L98-141 | manual | scipy, statsmodels | +| `scripts/08_market_dynamics_analysis.py` | MFI, shocks, regimes, **synthetic fallback** | `load_or_generate_data` L72-112, `generate_synthetic_data` L162-198, `compute_mfi` L203-278, `identify_shocks` L283-294, `define_regimes` L377-401 | manual (+ verbatim copy in `notebooks/08_market_dynamics_analysis.ipynb`, never executed) | scipy, matplotlib | +| `scripts/data_check.py` | Print shapes of processed files | module-level | manual | pandas | +| `dashboard/app.py` | The whole UI | `load_img` L29-33, `gen_market_data` L409-447, `t()` L466-478, `page_header` L610-620, page branches L626-1322 | Streamlit | streamlit, plotly, PIL, numpy, pandas | +| `src/*.py`, `docs/methodology.md`, `Untitled.ipynb` | Empty placeholders (0 lines / 0 cells) | — | — | — | + +--- + +## 6. Contract of the serialized artifact `models/rf_btc.pkl` + +Verified by loading it with scikit-learn 1.8.0 (`analysis/model_eval.py` §A, output in `analysis/outputs/model_eval_stdout.txt`): + +| Property | Value | +|---|---| +| Object | bare `sklearn.ensemble.RandomForestRegressor`. **Not** a `Pipeline`: no scaler, imputer, or encoder is baked in. | +| Pickled with | scikit-learn **1.8.0** (`_sklearn_version` in the pickle bytes), numpy 2.x (`numpy._core` module path) | +| Size | 232,081 bytes | +| Params | `n_estimators=600, max_depth=8, min_samples_leaf=10, max_features='sqrt', random_state=42, bootstrap=True, criterion='squared_error'` | +| `feature_names_in_` (order matters) | `finbert_score, vader_score, finbert_surprise, vader_surprise, abs_return, sq_return, sent_x_vol5, sent_x_vol22, sent_x_absret` | +| Output | `log(σ + 1e-6)`, where σ = sample std of **daily log returns over t+1…t+5** (not annualised). The caller must apply `exp(pred) − 1e-6`. | +| What the caller must compute by hand | everything: log returns, `rolling(5)` sentiment means for surprises, `vol_5`/`vol_22` for interactions, FinBERT with the *same* (buggy) `probs[2]-probs[0]` mapping | +| **Actual behaviour** | **All 600 trees have depth 0 (a single leaf). All 9 feature importances are 0.0.** For 1,000 random inputs it returns exactly one value, **−3.7299327 → σ = 0.02399** (≈2.4% daily). It is a constant: functionally `DummyRegressor(strategy="mean")` with bootstrap noise. | +| Why | Bootstrap sample sizes at the root are 2–8 distinct rows. A split needs ≥ `2 × min_samples_leaf` = 20 rows. | +| Loaded by | **nothing** | + +--- + +## 7. Global / shared state, seeds, hard-coded paths, magic numbers + +### 7a. Global and shared state +- `dashboard/app.py:16` and `scripts/08_market_dynamics_analysis.py:38`: `warnings.filterwarnings("ignore")` hides every warning, including the Plotly/Streamlit deprecations. +- `dashboard/app.py:411`: `np.random.seed(42)` inside a cached function mutates the **process-global** NumPy RNG. +- `dashboard/app.py:945`: `np.random.seed(99)` runs on every render of the placebo page, inside the shared server process. +- `dashboard/app.py:449`: `mdf` is a module-level DataFrame shared by every page. +- `st.session_state.page` (`app.py:498-500`) is the only per-user state. +- `data_pipeline/utils/logger.py:22`: `_root_logger_configured` is a module global. +- `data_pipeline/fetch_all.py:35`: `sys.path.insert(0, …)` mutates the import path. + +### 7b. Random seeds: where they are and aren't + +| Place | Seed | +|---|---| +| RF `pipeline/train_rf_model.py:13`, `notebooks/06` cell 5 | `random_state=42` ✔ | +| `scripts/validate_gmsi.py:79` | `np.random.seed(42)` ✔ (global) | +| `scripts/08_market_dynamics_analysis.py:39` | `np.random.seed(42)` at import ✔. This seed is *why the synthetic figures are exactly reproducible*. | +| `notebooks/13` cell 17 | `np.random.seed(42)` ✔ | +| KMeans `notebooks/08_graphs_and_plots` cell 14, `notebooks/12` cell 16 | `random_state=42` ✔ | +| `notebooks/09_VSI_Long_v2` cell 34 `sklearn.utils.resample(df)` | **unseeded** ✘ | +| `notebooks/10_vsi_variants` cell 13 `sample(frac=1, replace=True)` | **unseeded** ✘ | +| `dashboard/app.py:411, 945` | 42 and 99 (synthetic data and a fake null distribution) | + +### 7c. Hard-coded / CWD-dependent paths +- **CWD = repo root assumed:** + - `run_pipeline.py:10` (`data/processed/...`) + - `pipeline/train_rf_model.py:30` (`Path("models")`) + - `scripts/reconstruct_gmsi.py:13,17,25,90` + - `scripts/validate_gmsi.py:58,105,108-120` + - `scripts/regime_analysis.py:10-16` + - `scripts/sanity_check_gmsi.py:11-17,47,72` + - `scripts/construct_vsi_full.py:182-195` + - `scripts/data_check.py:16-20` +- **CWD = `scripts/` assumed (`../data/...`):** `scripts/download_gdelt.py:7`, `filter_gdelt_events.py:4-5`, `run_events_pipeline.py:14-15`, `run_gdelt_pipeline.py:17-18`. These contradict the line above: the two script families cannot be run from the same directory. +- **CWD = `notebooks/` assumed:** every notebook uses `../data/...`, except `01a`, which writes `data/raw` relative to `notebooks/` (cell 2). So `notebooks/data/raw/` exists in `.gitignore:32`. +- **Script-relative (correct):** `dashboard/app.py:27` (`os.path.dirname(__file__)`) and all `data_pipeline/*` (`Path(__file__).resolve().parents[2]`). +- **Absolute Windows paths** in committed reports: `reports/exogenous_vsi_v1_results` (`e:/financial-sentiment-research-project/...`) and `reports/regimes_vsi_results` (`C:/Users/Dell/.gemini/antigravity/brain/.../*.png`). +- **Hard-coded date windows:** + - `data_pipeline/sources/fetch_trends.py:59` `TIMEFRAME = "2010-01-01 2026-03-21"` + - `scripts/run_events_pipeline.py:11-12`, `scripts/run_gdelt_pipeline.py:13-14` + - `notebooks/01_data_collection` cell 2 `END_DATE = "2025-12-31"` + +### 7d. Magic numbers (and what they encode) + +| Value | Where | Meaning / problem | +|---|---|---| +| `1e-6` | `feature_engineering.py:21` | log floor; daily σ is ~0.01–0.1, so harmless | +| `5, 22, 60` | `feature_engineering.py:15-17` | ~1 week / 1 month / 1 quarter of *trading* days, also applied to 7-day-a-week BTC | +| `target_horizon=5` | `feature_engineering.py:3,20` | target window t+1..t+5. The comment on L19 says "next-day volatility", which is wrong. | +| `600, 8, 10, "sqrt", 42` | `train_rf_model.py:9-13` | RF hyperparameters, never tuned (no search code exists anywhere) | +| `0.2` | `run_pipeline.py:16` | test fraction | +| `√252` | `fetch_yfinance.py:78`, `08_…py:152-154, 884-887`, `notebooks/09` cell 16 | annualisation using equity trading days. **Also applied to BTC, which trades 365 days a year.** `notebooks/13` cell 3 uses `√365`. Inconsistent. | +| `0.20 / 0.80` | `regime_analysis.py:28-29`, `08_…py:377`, `app.py:437-438` | regime cut-offs | +| `0.95` | `08_…py:283`, `regime_analysis.py:106`, `validate_gmsi.py:63` | "shock" / "tail" definition | +| `30` | `08_…py:203` (MFI window), `reconstruct_gmsi.py:4,37` (z-score `min_periods`, surprise window) | — | +| `0.7 / 0.3` | `08_…py:463-464` | MFI "high/low fragility" lines; arbitrary | +| `0.6 / 0.4`, `0.7 / 0.3` | `notebooks/09` cell 6, `notebooks/10` cell 3 | FinBERT/VADER blend weights, chosen by hand | +| `1000` vs **`500`** | `validate_gmsi.py:78` vs README L52, `app.py:635,710,890` | placebo permutations: the code does 1000, the docs say 500 | diff --git a/docs/DATA_REPORT.md b/docs/DATA_REPORT.md new file mode 100644 index 0000000..20820b6 --- /dev/null +++ b/docs/DATA_REPORT.md @@ -0,0 +1,402 @@ +# FinSentinel — Data Report + +> **Status after fixes.** This report profiles the data as committed at `e1eb270`. Since then, the two duplicated rows in `nifty_google_trends.csv` were removed (194 → 192 rows). Everything else in `data/raw` is unchanged. + +> Every statistic in this document was produced in this session by +> `analysis/data_profile.py` (outputs in `analysis/outputs/`: `data_profile_stdout.txt`, `profile_summary.json`, CSVs and PNGs), +> `analysis/model_eval.py` and `analysis/verify_dashboard_numbers.py`. +> Re-run: `pip install -r analysis/requirements.txt && python analysis/data_profile.py`. +> Anything that could not be computed is marked **NOT VERIFIED**, with the reason. + +--- + +## 0. What "the dataset" is in this project (read this first) + +There is **no single training dataset** in the repo. There are four groups of data: + +| Group | Committed? | Used by | Profiled here? | +|---|---|---|---| +| A. Daily prices `data/raw/btc_prices.csv`, `nifty_prices.csv` | ✔ | everything | ✔ full | +| B. Headlines `data/raw/text_data.csv` | ✔ | sentiment track (Track A) | ✔ full | +| C. Google Trends `data/raw/*_google_trends.csv` (monthly) | ✔ | VSI notebooks 09/10 | ✔ full | +| D. Everything in `data/processed/` (aligned tables, GDELT events aggregate, `gmsi_exogenous.csv`, `*_vsi_full.csv`) | ✘ (gitignored, `.gitignore:31`) | RF training, GMSI, all "Paper 1" figures | **Partly reconstructed** (§6). GMSI and events are **NOT VERIFIED**: the source GDELT files are not in the repo, and `data.gdeltproject.org` returned HTTP 403 from this sandbox. | + +The **ML training table** (`btc_sentiment_aligned.csv` → `build_features`) is rebuilt in §6 from groups A and B, with one substitution: FinBERT scores could not be recomputed (huggingface.co is blocked here), so VADER is used as a labelled stand-in **only to reproduce row counts**. No FinBERT statistic is reported anywhere. + +--- + +## 1. Provenance + +| File | Source | Collection method | Period (verified) | License / terms | Confidence | +|---|---|---|---|---|---| +| `btc_prices.csv` | Yahoo Finance via `yfinance` (`notebooks/01_data_collection.ipynb` cell 3) | `yf.download("BTC-USD", start="2015-01-01", end="2025-12-31")`, reset index, `return = close.pct_change()`, `dropna()` | 2015-01-02 → 2025-12-30, 4,016 rows | Yahoo's terms allow personal, non-commercial use only. yfinance is an unofficial scraper with no SLA. Redistributing the CSV in a public repo is a grey area. | high | +| `nifty_prices.csv` | same, ticker `^NSEI` | same, `start="2010-01-01"` | 2010-01-05 → 2025-12-30, 3,927 rows | same; the index data belongs to NSE Indices Ltd | high | +| `text_data.csv` | GDELT 2.0 **DOC API** (`api.gdeltproject.org/api/v2/doc/doc`), article **titles only** | per-day keyword queries (`notebooks/01a_text_data_collection.ipynb` cell 4). The committed file was produced by a run that is **not** in the notebook: the notebook's own run covers 2015-01-01→02 and returned empty (cell 5 output). | 2024-10-03 01:15 UTC → 2025-01-01 16:30 UTC, 1,500 rows | GDELT is open and free to use with attribution; the underlying headlines belong to their publishers. `source` (publisher) is empty in the committed file. | high (source); **unknown** (exact query run) | +| `btc_google_trends.csv`, `nifty_google_trends.csv` | Google Trends | **unknown.** No code in the repo writes these two files. `notebooks/01_data_collection.ipynb` cell 6 writes `btc_trends.csv`/`nifty_trends.csv` with a column named `trend`, and the committed files have `google_trend` with `YYYY-MM` dates. Probably a manual CSV export. | BTC 2015-01 → 2025-12 (132 months); NIFTY 2010-01 → 2025-12 (194 rows, **2 duplicated**) | Google Trends terms of service | medium | +| `manifest.json`, `pipeline.log` | `data_pipeline/fetch_all.py`, run 2026-03-21 | yfinance only; FRED and the others were never run successfully (log L1-80) | — | — | high | + +**Interview line:** "Prices come from Yahoo via yfinance and headlines from the GDELT DOC API. Both are free, but Yahoo's terms make this research-only. I don't have a reproducible script for the exact headline pull or for the Trends export. That's a provenance gap I'd fix by moving those pulls into `data_pipeline/` with a manifest entry." + +--- + +## 2. File format and loading + +From `analysis/outputs/file_metadata.csv`: + +| File | Bytes | Lines | Encoding | Delimiter | Header | +|---|---|---|---|---|---| +| btc_prices.csv | 423,823 | 4,017 | ASCII | `,` | `date,open,high,low,close,volume,return` | +| nifty_prices.csv | 379,817 | 3,928 | ASCII | `,` | same | +| text_data.csv | 241,848 | 1,501 | **UTF-8 with non-ASCII** (Devanagari, Hangul, …) | `,` (quoted fields) | `timestamp,text,source,asset,channel` | +| btc_google_trends.csv | 1,439 | 133 | ASCII | `,` | `date,google_trend` | +| nifty_google_trends.csv | 2,146 | 195 | ASCII | `,` | `date,google_trend` | + +All files are loaded with plain `pd.read_csv(..., parse_dates=[...])` (e.g. `notebooks/04_time_alignment.ipynb` cells 2 and 4). There is no schema validation and no dtype specification. + +--- + +## 3. Structure and column inventory + +### 3a. Shapes and memory (`df.info()` saved as `analysis/outputs/info_*.txt`) + +| Dataset | Rows × Cols | Memory (deep) | +|---|---|---| +| btc_prices | 4,016 × 7 | 219.8 KiB | +| nifty_prices | 3,927 × 7 | 214.9 KiB | +| text_data | 1,500 × 5 | 550.8 KiB | +| btc_google_trends | 132 × 2 | 8.4 KiB | +| nifty_google_trends | 194 × 2 | 12.3 KiB | + +### 3b. Column inventory (full CSVs: `analysis/outputs/inventory_*.csv`) + +**btc_prices / nifty_prices** + +| Column | dtype | Non-null | Null % | n_unique BTC / NIFTY | Cardinality ratio BTC / NIFTY | Meaning (confidence) | +|---|---|---|---|---|---|---| +| date | datetime64 | all | 0 | 4,016 / 3,927 | 1.000 / 1.000 | bar date (high) | +| open | float64 | all | 0 | 4,013 / 3,897 | 0.9993 / 0.9924 | day open, USD / index points (high) | +| high | float64 | all | 0 | 4,013 / 3,896 | 0.9993 / 0.9921 | intraday high (high) | +| low | float64 | all | 0 | 4,014 / 3,894 | 0.9995 / 0.9916 | intraday low (high) | +| close | float64 | all | 0 | 4,013 / 3,887 | 0.9993 / 0.9898 | close (high) | +| volume | int64 | all | 0 | 4,016 / **2,206** | 1.000 / **0.5618** | traded volume; **NIFTY has 774 zeros** (§4c) (medium) | +| return | float64 | all | 0 | 4,016 / 3,924 | 1.000 / 0.9992 | **simple** return `pct_change` (high). Matches recomputation to 3.1e-16 (BTC) and 1.0e-16 (NIFTY). | + +**text_data** + +| Column | dtype | Non-null | Null % | n_unique | Ratio | Meaning | +|---|---|---|---|---|---|---| +| timestamp | str | 1,500 | 0 | 1,133 | 0.7553 | GDELT seendate, UTC | +| text | str | 1,499 | 0.07 | 1,390 | 0.9267 | headline title | +| source | float64 | **0** | **100.0** | 0 | 0 | publisher, **always empty** | +| asset | str | 1,500 | 0 | 2 | 0.0013 | BTC / NIFTY query | +| channel | str | 1,500 | 0 | 1 | 0.0007 | constant `news_gdelt` (zero information) | + +**google_trends**: `date` is a string `YYYY-MM` (not parsed), and `google_trend` is int64 0–100. + +--- + +## 4. Numeric columns + +Full table: `analysis/outputs/numeric_profile_*.csv`. The key rows are reproduced below. + +### 4a. BTC prices + +| stat | open | high | low | close | volume | return | +|---|---|---|---|---|---|---| +| count | 4016 | 4016 | 4016 | 4016 | 4016 | 4016 | +| mean | 27,518 | 28,072.6 | 26,932.6 | 27,538.9 | 2.22e10 | 0.00203 | +| median | 11,352 | 11,570.4 | 11,015.3 | 11,358.4 | 1.78e10 | 0.00125 | +| mode (count) | 233.42 (2) | 244.25 (2) | 429.08 (2) | 236.15 (2) | 7.86e6 (1) | −0.3717 (1) | +| std | 31,747.8 | 32,290.5 | 31,170 | 31,758.7 | 2.29e10 | 0.03522 | +| variance | 1.008e9 | 1.043e9 | 9.716e8 | 1.009e9 | 5.25e20 | 0.001241 | +| min / max | 176.90 / 124,752 | 211.73 / 126,198 | 171.51 / 123,196 | 178.10 / 124,753 | 7.86e6 / 3.51e11 | −0.3717 / 0.2525 | +| range | 124,575 | 125,986 | 123,025 | 124,574 | 3.51e11 | 0.6242 | +| Q1 / Q2 / Q3 | 3,671.5 / 11,352 / 42,807.8 | 3,754.6 / 11,570.4 / 43,575.5 | 3,619.8 / 11,015.3 / 41,906.5 | 3,673.2 / 11,358.4 / 42,840.4 | 2.22e9 / 1.78e10 / 3.37e10 | −0.01214 / 0.00125 / 0.01607 | +| IQR | 39,136.3 | 39,820.9 | 38,286.8 | 39,167.2 | 3.15e10 | 0.02821 | +| P1 / P5 | 226.6 / 256.3 | 230.6 / 261.7 | 222.7 / 251.7 | 226.7 / 256.3 | 1.51e7 / 2.66e7 | −0.1006 / −0.0528 | +| P95 / P99 | 101,769 / 116,816 | 104,025 / 117,874 | 99,766.5 / 115,248 | 101,752 / 116,820 | 6.60e10 / 9.45e10 | 0.0556 / 0.1042 | +| skew | 1.306 | 1.293 | 1.321 | 1.305 | 2.013 | −0.120 | +| excess kurtosis | 0.726 | 0.677 | 0.779 | 0.721 | 12.79 | **7.98** | +| CV | 1.154 | 1.150 | 1.157 | 1.153 | 1.032 | 17.35 | +| zeros / negatives | 0 / 0 | 0 / 0 | 0 / 0 | 0 / 0 | 0 / 0 | 1 / 1,896 | +| outliers IQR×1.5 | 204 | 209 | 205 | 202 | 80 | **379** | +| outliers \|z\|>3 | 4 | 3 | 5 | 4 | 53 | **70** | + +### 4b. NIFTY prices + +| stat | open | high | low | close | volume | return | +|---|---|---|---|---|---|---| +| mean | 11,843.6 | 11,900.2 | 11,770.4 | 11,836.6 | 240,987 | 0.000462 | +| median | 10,101 | 10,155.7 | 10,049.1 | 10,113.7 | 213,500 | 0.000588 | +| mode (count) | 4,878.6 (2) | 5,016.25 (2) | 4,924.3 (2) | 5,274.85 (3) | **0 (774)** | 0 (4) | +| std | 6,228.7 | 6,250.9 | 6,201.8 | 6,227.4 | 202,284 | 0.010398 | +| variance | 3.880e7 | 3.907e7 | 3.846e7 | 3.878e7 | 4.09e10 | 0.000108 | +| min / max | 4,623.15 / 26,325.8 | 4,623.15 / 26,325.8 | 4,531.15 / 26,172.4 | 4,544.2 / 26,216.1 | 0 / 1,811,000 | −0.1298 / 0.0876 | +| range | 21,702.7 | 21,702.7 | 21,641.3 | 21,671.9 | 1.81e6 | 0.2174 | +| Q1 / Q2 / Q3 | 6,207.6 / 10,101 / 17,005.3 | 6,258.1 / 10,155.7 / 17,112.2 | 6,179.9 / 10,049.1 / 16,847 | 6,216.2 / 10,113.7 / 16,983.4 | 131,700 / 213,500 / 312,150 | −0.00474 / 0.00059 / 0.00610 | +| IQR | 10,797.7 | 10,854.1 | 10,667.1 | 10,767.2 | 180,450 | 0.01085 | +| P1 / P5 | 4,841.5 / 5,148.5 | 4,879.3 / 5,179.5 | 4,787.6 / 5,101.5 | 4,840.1 / 5,139.5 | 0 / 0 | −0.0263 / −0.0156 | +| P95 / P99 | 24,642 / 25,866.3 | 24,764.1 / 25,946.7 | 24,535.5 / 25,786.6 | 24,653.2 / 25,866.4 | 642,600 / 873,090 | 0.0162 / 0.0261 | +| skew | 0.824 | 0.824 | 0.826 | 0.825 | 1.477 | **−0.688** | +| excess kurtosis | −0.533 | −0.533 | −0.526 | −0.531 | 4.283 | **11.80** | +| CV | 0.526 | 0.525 | 0.527 | 0.526 | 0.839 | 22.50 | +| zeros / negatives | 0/0 | 0/0 | 0/0 | 0/0 | **774** / 0 | 4 / 1,834 | +| outliers IQR / \|z\|>3 | 0 / 0 | 0 / 0 | 0 / 0 | 0 / 0 | 285 / 49 | 156 / 47 | + +### 4c. Plausibility checks (`profile_summary.json → plausibility`) + +| Check | BTC | NIFTY | +|---|---|---| +| future dates (> 2026-10-09) | 0 | 0 | +| duplicate dates | 0 | 0 | +| non-positive prices | 0 | 0 | +| `high < low` / close outside [low, high] / open outside [low, high] | 0 / 0 / 0 | 0 / 0 / 0 | +| **volume == 0** | 0 | **774 rows**: 249 in 2010, 242 in 2011, 242 in 2012, 13 in 2013, then scattered (1–13/yr) up to 2024-07-03. **Physically meaningless for an index that traded**, so it is a data-vendor gap. No model in the repo uses `volume`, so it is harmless today, but it must not be fed to a model as-is. | +| day gaps | all 1 day, 0 missing calendar days (BTC trades 24/7) ✔ | gaps of 1/2/3/4/5/6 days = 2,967/120/735/95/8/1, i.e. weekends and Indian market holidays ✔ | +| largest \|log return\| | **2020-03-12: 0.4647** (COVID crash, real), 2015-01-14: 0.2376, 2017-12-07: 0.2251 | 2020-03-23: 0.1390, 2020-03-12: 0.0867 | +| first-row `return` | 0.00249: the first row is the *second* trading day, because `dropna()` in nb01 removed day 1 | 0.00873 | + +**Distributions are plausible for what they measure.** Prices are strictly positive with huge right skew because BTC went from about \$178 to about \$125k (the CV of 1.15 reflects the trend, not dispersion). Returns are fat-tailed: excess kurtosis is 7.98 for BTC and 11.80 for NIFTY, against 0 for a Gaussian. NIFTY returns are negatively skewed (−0.688): crashes are larger than rallies. + +**Why the two outlier counts disagree (379 vs 70 for BTC returns):** the IQR rule uses the middle 50% of the data. With fat tails the IQR is narrow (0.0282), so 1.5×IQR flags many ordinary big days. The z-rule uses the std (0.0352), which the extreme days themselves inflate (masking), so it flags fewer. **Neither should be used to delete rows here.** In volatility modelling the "outliers" *are* the signal, and dropping them would remove exactly the events the project studies. The repo correctly never removes them. + +--- + +## 5. Categorical columns and text + +### 5a. Categorical profile (`profile_summary.json → categorical.text_data`) + +| Column | Value counts | Mode | Entropy (bits) | Rare (<1%) | Messy variants | NA-like strings / true NaN | +|---|---|---|---|---|---|---| +| asset | NIFTY 750 (50%), BTC 750 (50%) | BTC (tie) | 1.0 | 0 | none | 0 / 0 | +| channel | news_gdelt 1,500 (100%) | news_gdelt | 0.0 | 0 | none | 0 / 0 | +| source | NaN 1,500 (100%) | — | — | — | — | 0 / 1,500 | + +**Train/test unseen-category risk:** none in practice, because no categorical column is used as a model feature (`asset` is only a filter). + +### 5b. Headline text (the real "categorical" problem) + +| Metric | Value | +|---|---| +| Rows / distinct UTC days | 1,500 / 91 | +| Headline length (chars) | mean 87.9, median 79, min 21, max 253 | +| **Dominant script** (`unicodedata`) | Latin 1,261 · **Devanagari 150** · **Hangul 52** · Gujarati 14 · Cyrillic 7 · Tamil 5 · CJK 3 · Kannada 2 · Malayalam 2 · Hebrew 2 · Telugu 1 · Arabic 1 | +| By asset | BTC: Latin 687, Hangul 52, Cyrillic 6, CJK 2, Hebrew 2, Arabic 1 · NIFTY: Latin 574, Devanagari 150, Gujarati 14, Tamil 5, … | +| Exact duplicate (timestamp, text, asset) rows | 65 | +| Duplicate headline text (any time) | 109 | +| After `clean_text` + `len > 10` (nb02) | **1,377 rows** (matches nb02's printed 1,377 ✔); 123 dropped | +| Dropped rows by script | Hangul 52, Devanagari 50, Cyrillic 7, Tamil 5, CJK 3, Hebrew 2, Latin 1, Telugu 1, Malayalam 1, Arabic 1 | +| **Kept non-Latin rows** | **117.** The ASCII-only regex `[^a-zA-Z\s]` strips the native script and keeps only embedded English tokens, e.g. `"Stock Market : शेयर बाजार में बड़ी गिरावट ..."` → `"stock market"`. FinBERT then scores that fragment (`notebooks/03` cell 2 output row 4). | +| Near-duplicates after cleaning | 192 | +| Headlines/day | BTC mean 7.54 (max 32), 82 days with any headline; NIFTY mean 7.59 (max 23), 87 days | + +**Implication:** FinBERT and VADER are English models. About 16% of headlines (239 non-Latin rows) are either dropped or reduced to garbled English fragments. The dropped rows are not random: they are non-English sources, mostly Indian-language (NIFTY) and Korean (BTC). So the sentiment signal is biased toward English-language outlets. + +### 5c. Messy variants +No casing or whitespace variants were found in `asset` or `channel`. The messy-variant problem in this repo is in the **text**: duplicates (65 exact, 192 near) and mixed scripts. + +### 5d. Google Trends + +| | BTC | NIFTY | +|---|---|---| +| rows | 132 (monthly) | 194 (monthly) | +| mean / median / std | 22.71 / 21 / 16.91 | 36.65 / 26 / 25.78 | +| min / max | 2 / 100 | 8 / 100 | +| skew / excess kurtosis | 1.141 / 2.464 | 0.698 / −0.797 | +| **duplicates** | 0 | **2 exact duplicate rows (2025-11, 2025-12 appear twice)** | + +Trends values are *relative to the peak month of the queried window* (that's how Google normalises them), so a series pulled over a different window is on a different scale. The notebooks also merge monthly values onto daily rows (`notebooks/09` cell 4: merge on date + `ffill`). Only the 1st of each month matches, and every other day is forward-filled. + +--- + +## 6. The ML training table (reconstructed) and the target + +### 6a. Reconstruction path (`analysis/common.py` mirrors each original step) + +`text_data.csv` → `clean_text` (nb02) → VADER (nb03; **FinBERT substituted by VADER**) → daily mean per UTC date and asset, inner join with BTC prices, lags, `dropna` (nb04) → `build_features` (`pipeline/feature_engineering.py`) → 80/20 chronological split (`run_pipeline.py:15-17`). + +| Stage | Rows | +|---|---| +| headlines after cleaning | 1,377 | +| BTC aligned table (nb04) | **77** (the original run printed **75**, `notebooks/05` cell 3 output) | +| after `build_features(...).dropna()` | **13** | +| train / test | **10 / 3** (train dates 2024-12-14 → 2024-12-24; test 2024-12-25 → 2024-12-27) | + +**Why 75 → 13:** `vol_60 = rolling(60).std()` (`pipeline/feature_engineering.py:17`) is computed and then *not used as a feature* (it is commented out on L46). But `df.dropna()` (L40) still deletes the 59 rows where it is NaN. The `shift(-5)` target (L20) deletes the last 5. That leaves 77 − 59 − 5 = 13 rows. + +**Discrepancy (flagged):** my reconstruction has 77 aligned rows versus the original 75. The committed `nifty_prices.csv` starts in 2010, but the price file used at the time started on 2023-01-02 with `+05:30` timestamps (see the `notebooks/04` cell 2 output). So the raw price files were re-downloaded after the RF was trained. The committed pickle has at most 8 distinct rows in any bootstrap sample (MODEL_REPORT §1), which is consistent with an 8-row (or slightly larger) training set. **Exact original training rows: NOT VERIFIED.** + +### 6b. Target (training table) + +`log_vol_target = log(std(r[t+1..t+5]) + 1e-6)`, where r is the daily log return. + +| | value | +|---|---| +| n | 13 | +| mean / std | −3.8507 / 0.3294 | +| min / median / max | −4.3990 / −3.7462 / −3.5053 | +| in volatility space | 0.01229 … 0.03004 (daily σ) | + +**Baseline (DummyRegressor = train mean), scored like `pipeline/train_rf_model.py:20-24`:** RMSE 0.009553 and MAE 0.009414 in volatility space on the 3 test rows. MODEL_REPORT §2 shows the RF gives 0.009647 and 0.009509, i.e. **worse than or equal to the trivial baseline**. + +### 6c. Target on the full price history (what a usable dataset looks like) + +Same target definition, computed over all committed prices (`price_feature_frame`): + +| | BTC `vol_target` | BTC `log_vol_target` | NIFTY `vol_target` | NIFTY `log_vol_target` | +|---|---|---|---|---| +| n | 3,951 | 3,951 | 3,862 | 3,862 | +| mean / median | 0.02858 / 0.02381 | −3.775 / −3.738 | 0.00866 / 0.00743 | −4.904 / −4.903 | +| std | 0.02017 | 0.684 | 0.00582 | 0.546 | +| skew | 2.362 | −0.291 | 4.254 | 0.100 | +| excess kurtosis | 12.33 | 0.166 | 36.35 | 0.769 | +| Jarque-Bera (p) | 28,689 (≈0) | 60.2 (≈0) | 224,217 (≈0) | 101.6 (≈0) | + +**Normality / transform:** raw volatility is strongly right-skewed and heavy-tailed. **The log transform is justified**: it cuts BTC skew from 2.36 to −0.29 and kurtosis from 12.3 to 0.17. It is still formally non-normal (JB p≈0 at n≈4,000, which rejects even tiny deviations), but it is close enough for squared-error loss to behave. Plots: `analysis/outputs/target_distribution_{btc,nifty}.png`. + +**Note for the interview:** this is a **regression** task, so "class balance" does not apply. The analogue is that the target is heavy-tailed: calm periods dominate, and squared error in volatility space is dominated by a few turbulent weeks. + +--- + +## 7. Relationships (full price history; sentiment is unavailable before 2024-10-03) + +Features are those in `pipeline/feature_engineering.py` that don't need sentiment. Full matrices: `analysis/outputs/corr_{pearson,spearman}_{btc,nifty}.csv`. Heatmaps: `corr_heatmap_{btc,nifty}.png`. + +**Top correlated feature pairs (|Pearson|), i.e. multicollinearity** + +| BTC | r | NIFTY | r | +|---|---|---|---| +| abs_return ~ sq_return | 0.771 | vol_22 ~ vol_60 | 0.794 | +| vol_22 ~ vol_60 | 0.769 | abs_return ~ sq_return | 0.762 | +| vol_5 ~ vol_22 | 0.693 | vol_5 ~ vol_22 | 0.726 | + +`abs_return` and `sq_return` have **Spearman = 1.000**: one is a monotone transform of the other, so for a tree model `sq_return` adds **zero** information. + +**VIF** (with constant): BTC abs_return 2.93, sq_return 2.48, vol_5 2.30, vol_22 3.45, vol_60 2.45. NIFTY 2.73 / 2.42 / 2.61 / 4.15 / 2.75. Everything is below 5, so collinearity is moderate. That doesn't matter for an RF, but it would inflate coefficient variance in a linear model. + +**Feature ↔ target ranking** (`feature_target_ranking_*.csv`; MI = `mutual_info_regression`, random_state 42) + +| BTC | Pearson | Spearman | MI | NIFTY | Pearson | Spearman | MI | +|---|---|---|---|---|---|---|---| +| vol_22 | 0.456 | 0.470 | 0.297 | vol_60 | 0.376 | 0.390 | 0.234 | +| vol_60 | 0.411 | 0.404 | 0.275 | vol_22 | 0.437 | 0.454 | 0.207 | +| vol_5 | 0.422 | 0.429 | 0.157 | vol_5 | 0.383 | 0.343 | 0.121 | +| sq_return | 0.174 | 0.265 | 0.065 | abs_return | 0.253 | 0.180 | 0.033 | +| abs_return | 0.278 | 0.265 | 0.056 | sq_return | 0.197 | 0.180 | 0.030 | + +Domain sense: **volatility clusters**, so recent realised vol (especially the 1-month window) is the best predictor of next-week vol. A single day's return is a noisy proxy. This is exactly the HAR-RV intuition (Corsi, 2009). + +**Sentiment correlations:** the only verifiable ones are the printed outputs in `notebooks/05` (n = 75 BTC / 54 NIFTY). Example: BTC corr(finbert_score, vader_score) = **−0.352** (cell 4 output). Two sentiment models scoring the same headlines should correlate *positively*, and this negative value is the empirical fingerprint of the FinBERT label bug (ISSUES P0-3). Recomputing it: **NOT VERIFIED** (FinBERT is not runnable here). + +**Duplicates:** +- prices: 0 exact duplicate rows, 0 duplicate dates +- BTC trends: 0 +- **NIFTY trends: 2 exact duplicates** +- text: 65 exact duplicates (on timestamp + text + asset), 109 duplicate headline texts, 192 near-duplicates after cleaning + +--- + +## 8. Data quality and integrity + +### 8a. Missing-data pattern (`analysis/outputs/missingness_matrix.png`) + +The project joins on a daily calendar (2015-01-01 → 2025-12-31). Share of days missing: + +| Column | % missing | Mechanism | +|---|---|---| +| btc_close | 0.05 | 2 edge days (series starts 01-02, ends 12-30): structural | +| nifty_close | 32.63 | **Structured**: weekday distribution of missing days = Mon 34, Tue 29, Wed 31, Thu 29, Fri 41, **Sat 573, Sun 574**, so weekends plus exchange holidays. Not random. | +| btc_headlines / nifty_headlines | 97.96 / 97.83 | **Structured**: text only exists for 2024-10-03 → 2025-01-01. The missing indicators co-occur (corr 0.922). | +| *_trend_monthly | 96.71 | by construction (monthly data on a daily grid) | + +### 8b. How the code handles missing values, and whether that's defensible + +| Where | Handling | Defensible? | +|---|---|---| +| `notebooks/01` cell 3 | `dropna()` after `pct_change` | ✔ drops only the first row | +| `notebooks/04` cell 7 | **inner join** price × sentiment | ⚠ silently restricts the dataset to the 82/87 days with headlines | +| `pipeline/feature_engineering.py:40` | `dropna()` on everything, including the **unused** `vol_60` | ✘ throws away 59 of 75 rows for a feature that isn't used | +| `scripts/reconstruct_gmsi.py:65` | `fillna(0)` on z-scores before averaging | ⚠ "0 = neutral" is reasonable for a z-score, but because sentiment exists for ~2% of days, the index is effectively a 3-component index diluted by 3 zeros on ~98% of days, and a 6-component index on the other ~2%. **Its scale changes over time.** | +| `scripts/construct_vsi_full.py:26-28` | `rolling(..., min_periods=1).std()` | ✘ the first rows get std from 1–2 observations (NaN or ~0) and these are kept | +| `scripts/08_…:713` | GMSI reindex + `ffill` | ✔ (past-only) | +| `notebooks/09` cell 4 | monthly Trends merged on exact date + `ffill` | ⚠ the month value is known only after the month ends, but it is ffilled from day 1, which is a look-ahead of up to ~30 days | + +### 8c. Leakage audit (critical) + +| # | Question | Finding | Evidence | +|---|---|---|---| +| L1 | Does any feature encode the target? (RF pipeline) | **No.** The target uses r[t+1..t+5]; every feature uses data at or before t. | `pipeline/feature_engineering.py:15-38` vs L20 (`.shift(-5)` on a 5-day window) | +| L2 | Same for notebook 06 | **Partial overlap.** Target `rolling(5).std().shift(-1)` = std of r[t−3..t+1], so **4 of its 5 days are already observed at t** and also feed `vol_5` and `abs_return`. The "next-day volatility" it forecasts is mostly known. | `notebooks/06` cell 2 | +| L3 | Scaler/encoder/imputer fit before the split? | RF pipeline: **no scaler exists**. Rolling features are past-only. ✔ `notebooks/07` fits `y_scaler` on all of y before splitting (cell 4), which would be leakage, but the cell crashed. | `notebooks/07` cells 4-6 | +| L4 | GMSI v0 | `StandardScaler().fit_transform(X)` on the **full 2015-2025 sample** (look-ahead in normalisation) | `notebooks/12` cells 10-11 | +| L5 | GMSI "exogenous" | expanding z-scores (past-only) ✔. But `sentiment_surprise` uses `rolling(30, min_periods=1)` (past-only ✔). | `scripts/reconstruct_gmsi.py:4-7, 37, 41-56` | +| L6 | Regime thresholds | **Full-sample quantiles** `gmsi['pure_gmsi'].quantile(0.20/0.80)` = look-ahead. This contradicts the dashboard's "expanding quantile" claim (`app.py:1275`). | `scripts/regime_analysis.py:28-29` | +| L7 | Shock threshold (real-data regime script) | full-sample `quantile(0.95)` = look-ahead | `scripts/regime_analysis.py:106` | +| L8 | Conditional expectations | `pd.qcut` over the full sample. That's fine for a *descriptive* in-sample association, but it is **not a forecast**, and the dashboard's word "predicts" overstates it. | `scripts/validate_gmsi.py:42` | +| L9 | VSI | VSI **contains `vol_z`** and is then correlated with vol. That's a definitional (mechanical) leak, and the repo acknowledges it. | `scripts/construct_vsi_full.py:101,130-135`; `notebooks/13` cell 17 (0.92 / 0.96) | +| L10 | Temporal alignment of news vs NIFTY close | Headlines are bucketed by **UTC date**; NIFTY closes 15:30 IST = 10:00 UTC. About 14 h of "same-day" headlines come **after** the close. For *same-day* sentiment-return correlations (nb05) that is reverse causality: news reacting to the move. For forecasting t+1..t+5 it is fine. | `notebooks/04` cell 5 (`timestamp.dt.date`) | +| L11 | Trends | ffilled monthly values are visible from day 1 of the month (see 8b) | `notebooks/09` cell 4 | + +### 8d. Train/val/test split + +| | RF pipeline | Notebook 06 | +|---|---|---| +| Method | `train_test_split(test_size=0.2, shuffle=False)` (chronological holdout) | same | +| Ratio | 80/20 → **10/3 rows** (reconstructed) | 80/20 of 15 rows → 12/3 | +| Stratified | n/a (regression) | n/a | +| Seed | none needed (no shuffle) | none | +| Validation set | **none** (no tuning was done, so arguably none was needed) | none | +| Reproducible | the split is deterministic, but the **input file is not committed**, so the split is not reproducible from the repo | same | +| Gap / purge | **none.** The last 5 training targets use returns that fall in the test period (overlap leakage across the boundary). With 3 test rows this is moot. `analysis/model_eval.py` uses `TimeSeriesSplit(gap=5)`. | none | + +> ⚠ **There is effectively no test set**: 3 rows can't estimate anything. The real "evaluation" of the research claims (GMSI) is in-sample correlation plus a placebo test, and that test is miscalibrated (MODEL_REPORT §6). + +--- + +## 9. The data behind the dashboard's "real data" pages + +`analysis/verify_dashboard_numbers.py` re-runs `scripts/08_market_dynamics_analysis.py`'s synthetic branch and compares it with `dashboard/app.py`: + +| Dashboard constant | Dashboard value | Synthetic (seed 42) output | +|---|---|---| +| `NIFTY_REGIME_STATS` (app.py:393-397) | low 0.144/0.352/0.148 · med 0.151/0.350/0.117 · high 0.162/0.349/0.083 | **identical** to 3 dp | +| `SHOCK_DECAY.btc` (app.py:402) | 0.0119, 0.0138, 0.0115, 0.0119, 0.0097 | 0.0118, 0.0138, 0.0114, 0.0118, 0.0096 (the dashboard says "approximate values" read off the figure) | +| `SHOCK_DECAY.nifty` (app.py:403) | 0.0100, 0.0100, 0.0091, 0.0088, 0.0091 | 0.0100, 0.0099, 0.0091, 0.0088, 0.0090 | +| "MFI peak 0.76, COVID crash, Mar 2020" (app.py:636, 996-999) | 0.76 | synthetic BTC MFI max after 2017 = **0.753 on 2020-05-01**; global max 1.0 on 2016-05-19 | +| Date range of the synthetic data | "2016 → 2024 · ~2000 days" (app.py:596) | 2016-02-11 → 2023-08-31, 1,971 rows | + +The same functions run on the **real** committed prices (2016-01-01 → 2023-08-31) give: + +| | BTC real | NIFTY real | +|---|---|---| +| mean fwd \|r\| at t+1,3,7,14,21 after top-5% shocks | 0.0396, 0.0350, 0.0341, 0.0371, 0.0358 (**peaks at t+1: no "t+3 secondary wave"**) | 0.0163, 0.0156, 0.0140, 0.0124, 0.0098 | +| MFI max (date) | 0.986 (2017-01-06) | 1.000 (2016-02-16) | +| MFI max in Mar 2020 | 0.654 | 0.911 | +| max 30d annualised vol (date) | 1.645 (2020-04-06) | 0.766 (2020-04-23) | +| cumulative log return | 4.098 | 0.885 | + +The committed `fig1_mfi_btc.png` shows a cumulative log return peaking around 0.48 and a 30-day volatility never above about 0.5. Real BTC returned 4.10 log points over the same period, and its volatility reached 1.645. The figure is not BTC. + +--- + +## 10. Data limitations + +1. **Sample size.** + - Sentiment covers 91 days (82 BTC days with headlines). That is about 3 months, inside a single regime (the Q4-2024 BTC rally). No volatility model with 9 features can be fit on that. + - The price history (about 4,000 days) is adequate for univariate volatility models. + - GMSI covers about 4,000 days, but its effective sample size is much smaller because of autocorrelation (MODEL_REPORT §6: variance inflation of about 6.9× even under a mild AR(1) assumption). +2. **Representativeness.** + - Headlines are a keyword-query sample from GDELT, at most 250 per query per day, titles only, and English-biased after cleaning. + - BTC-USD is a single venue aggregate on Yahoo. NIFTY is an index, not tradable volume. +3. **Survivorship and selection.** The two assets were chosen after the fact. GDELT coverage expands over time, so `event_count` has a trend unrelated to stress, which only partly cancels in an expanding z-score. +4. **Bias risks.** + - Language bias in the sentiment input. + - A FinBERT score that measures "neutral − positive" rather than sentiment (P0-3). + - The GMSI conflict, economic, and political counts are always zero (P1-6). +5. **Do NOT use this data or these models for:** + - any trading or risk decision + - assets other than BTC-USD and NIFTY 50 + - intraday horizons + - periods before 2015 (GDELT GKG v2) or outside 2024-10 → 2025-01 for anything involving sentiment + - non-English news + - any claim about causality diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md new file mode 100644 index 0000000..76cc817 --- /dev/null +++ b/docs/DEPLOY.md @@ -0,0 +1,97 @@ +# Deploying the dashboard to Streamlit Community Cloud + +## What gets deployed + +| Item | Value | +|---|---| +| Entrypoint | `dashboard/app.py` | +| Dependencies | `dashboard/requirements.txt`: streamlit 1.63.0, pandas 3.0.5, numpy 2.4.6, plotly 6.9.0 | +| Config | `.streamlit/config.toml` (repo root: Cloud requires it there even when the entrypoint is in a subfolder) | +| Python | tested on 3.11, 3.12, 3.13 and 3.14; choose **3.12** in Advanced settings | +| Secrets | none needed | +| Data and model | committed: `data/raw/*_prices.csv` (~0.8 MB), `models/har_*.json` (<1 KB each), `dashboard/data/` (~0.7 MB), `reports/figures/` | +| Network at runtime | none (no live data fetches) | + +Size is far below any hosting limit, so **no Git LFS or external storage is needed**. The model is plain JSON, so +there is **no pickle or scikit-learn version to match** at deploy time. + +There is deliberately **no `requirements.txt` at the repo root**: Community Cloud accepts a dependency file +either at the root or next to the entrypoint. The heavier research pins live in `requirements-research.txt`, so the +dashboard file is the only candidate. + +## Step by step + +1. Push this branch to GitHub and merge it into the branch you want to deploy (e.g. `main`). +2. Go to **share.streamlit.io** and sign in with GitHub. +3. **Create app → Deploy a public app from GitHub.** +4. Fill in: + - Repository: `VT69/` + - Branch: `main` + - Main file path: `dashboard/app.py` +5. Open **Advanced settings** and set the **Python version to 3.12**. Community Cloud ignores `runtime.txt`; the + version is chosen here, and it can only be changed by deleting and redeploying the app. +6. Leave Secrets empty. Click **Deploy**. +7. When the build finishes, check the first lines of the build log show Python 3.12 and + `streamlit==1.63.0`. Then open each page. Expected: the landing page renders in a few seconds, and no red error boxes appear. + +If you are replacing the existing app at `financial-sentiment-market-analysis.streamlit.app`, change the main file +path to `dashboard/app.py` if needed, then **Reboot** it from the app menu so it rebuilds with the new requirements. + +## Updating the results + +```bash +pip install -r requirements-research.txt +python run_pipeline.py # rewrites models/ and dashboard/data/ from data/raw/ +pytest -q +git add models dashboard/data && git commit -m "Refresh results" && git push +``` + +Community Cloud redeploys on push. To refresh prices first: +`pip install -r data_pipeline/requirements.txt && python data_pipeline/fetch_all.py --source yfinance`. +Then copy the new BTC-USD / ^NSEI files into `data/raw/{btc,nifty}_prices.csv`. That step is manual on purpose: +it keeps the published numbers tied to a committed snapshot. + +## Verify locally before pushing + +```bash +pip install -r dashboard/requirements.txt pytest +streamlit run dashboard/app.py --server.headless true --server.port 8501 # from the repo root, like Cloud +pytest -q tests/test_dashboard.py # every page + input validation +pip install playwright && playwright install chromium +python tests/e2e/browser_smoke.py http://localhost:8501 # real browser +``` + +Evidence from the run before this commit (Python 3.11.17, Streamlit 1.63.0, headless Chromium): + +``` +first paint: 3.8s +Overview 1.6s h1='FinSentinel — stress, fragility and volatility' charts=1 exceptions=0 errors=0 +Volatility forecast 2.6s h1='Volatility forecast' charts=1 exceptions=0 errors=0 + historical: Forecast daily σ | 1.38% | std of next 5 daily log returns + bad input -> Value #3 ('abc') is not a number. + good input -> Forecast daily σ | 1.32% | std of next 5 daily log returns +GMSI & volatility 1.6s h1='GMSI and forward volatility' charts=1 exceptions=0 errors=0 +Market fragility (MFI) 3.7s h1='Market Fragility Index (MFI)' charts=2 exceptions=0 errors=0 +Shock propagation 1.6s h1='Shock propagation' charts=1 exceptions=0 errors=0 +Methodology & limitations 1.6s h1='Methodology & limitations' charts=0 exceptions=0 errors=0 +browser console errors: 0 +PASS +``` + +Timings include a fixed 1.5 s wait per page. `pytest tests/test_dashboard.py` → 10 passed on Python 3.11, 3.13 and 3.14. +The old app took **185 s** to render its landing page. + +## Troubleshooting + +| Symptom | Cause | Fix | +|---|---|---| +| Build log shows a different Python | Cloud ignores `runtime.txt`; the version is set at creation | Delete and redeploy with Python 3.12 in Advanced settings (the dependencies also work on 3.11–3.14) | +| Red box "A required data file is missing … run `python run_pipeline.py`" | `models/` or `dashboard/data/` not committed | Run the pipeline and commit both folders | +| `ModuleNotFoundError: pipeline` | app started from a copy without the repo root | Deploy from the full repo; `dashboard/data.py` adds the repo root to `sys.path` | +| Theme is not dark | `.streamlit/config.toml` not at the repo root | Keep it at the root; reboot the app | +| "This app has gone over its resource limits" | Unlikely: the app holds about 10k rows | Reboot; the caches are small | + +## Secrets +None are used. If you later add an API (e.g. live prices), put keys in the Cloud app's **Secrets** box and read them +with `st.secrets["NAME"]`. Locally use `.streamlit/secrets.toml`, which is in `.gitignore`. Never put keys in +`.env.example`. diff --git a/docs/INTERVIEW_DEFENSE.md b/docs/INTERVIEW_DEFENSE.md new file mode 100644 index 0000000..ccdba67 --- /dev/null +++ b/docs/INTERVIEW_DEFENSE.md @@ -0,0 +1,468 @@ +# FinSentinel — Interview Defense Pack + +All numbers below come from `python run_pipeline.py` (`dashboard/data/metrics.json`, `gmsi_calibration.json`, +`models/har_*.json`) or from the audit scripts in `analysis/`. If you are asked for a number that is not here, say +you'd have to check. Don't estimate. + +Numbers worth memorising: + +| Fact | Value | +|---|---| +| Data | BTC 4,016 days (2015-01-02 → 2025-12-30); NIFTY 3,927 days (2010-01-05 → 2025-12-30) | +| Modelling rows after warm-up | BTC 3,951, NIFTY 3,862 | +| Target | std of the next 5 daily log returns, modelled as log | +| Served model | HAR: log σ̂ = a + b₅·log σ₅ + b₂₂·log σ₂₂ + b₆₀·log σ₆₀ | +| BTC coefficients | −1.063, 0.202, 0.352, 0.198 (sum 0.75) | +| NIFTY coefficients | −1.499, 0.116, 0.445, 0.153 (sum 0.71) | +| Out-of-sample R² (log σ), HAR / RF / mean | BTC 0.047 / −0.026 / −0.385 · NIFTY 0.100 / 0.062 / −0.186 | +| QLIKE, HAR / RF / mean | BTC 1.150 / 1.221 / 1.966 · NIFTY 0.548 / 0.684 / 0.890 | +| RF train vs test R² | BTC 0.509 vs −0.026 · NIFTY 0.413 vs 0.062 (overfits) | +| Shocks | 158 (BTC) / 141 (NIFTY). Post-shock \|r\| is 1.72× normal at t+1 and 1.48× at t+21 for BTC; 1.98× and 1.29× for NIFTY | +| GMSI | Spearman with forward 7-day vol −0.084 (BTC), −0.058 (NIFTY); calibrated p ≈ 0.05 and ≈ 0.15 | +| Placebo flaw | i.i.d. shuffle flags an *independent* AR(0.9) series as significant 55–58% of the time (nominal 5%) | +| Old artifact | `rf_btc.pkl`: 600 single-leaf trees, all importances 0, constant σ = 0.0240 | + +--- + +## 1. Two-minute pitch (spoken) + +> "FinSentinel asks a practical risk question: **how volatile will Bitcoin and the NIFTY 50 be over the next week, +> and do news-based stress signals help predict that?** +> +> I built a reproducible pipeline on about ten years of daily prices: 4,000 days for BTC and 3,900 for NIFTY. +> The target is the standard deviation of the next five daily returns. Because volatility is heavily right-skewed, I +> model it in logs. +> +> I compared four models in a purged walk-forward setup: five expanding training windows, with a five-day gap +> so no training label overlaps the test period. The winner was a HAR model: a regression on last week's, +> last month's and last quarter's realised volatility. It beat a Random Forest, a persistence forecast and the +> historical mean on every metric, including QLIKE, which is the standard loss for volatility forecasts. The +> honest caveat is that it only explains about 5% of log-volatility variance for BTC and 10% for NIFTY. Its +> worst misses are event weeks like March 2020, which no backward-looking model can see. +> +> The original idea was that news sentiment and a GDELT-based global stress index would fill that gap. When I +> audited my own work, I found three serious problems: +> - the sentiment data only covered three months; +> - my FinBERT score used the wrong label order; +> - my placebo significance test was invalid for autocorrelated series. +> +> With a correct test, the stress-index relationship is borderline for BTC and not significant for NIFTY. I also +> found that some dashboard figures had come from a synthetic-data fallback. I removed them and recomputed +> everything on real data. +> +> The result is a Streamlit app that serves real forecasts with input validation, 40-odd tests and CI. The biggest +> lesson for me was that a strong baseline and a correct null hypothesis matter more than model complexity." + +## 2. Thirty-second version + +> "I forecast next-week volatility for Bitcoin and the NIFTY 50 from ten years of daily data. A simple HAR model +> on past realised volatility beat a Random Forest in purged walk-forward tests. Then I tested whether a +> news-based stress index adds signal. Once I corrected the significance test for autocorrelation, it was at +> best borderline. It's deployed as a Streamlit app with live forecasts, tests and CI. The most valuable part was +> auditing my own pipeline and fixing what was wrong." + +--- + +## 3. Anticipated questions with model answers + +### 3a. Data (12) + +**D1. Why this data?** +BTC and NIFTY are a deliberate contrast: a 24/7, retail-heavy crypto market and an institutional equity index +with trading hours. Daily prices from Yahoo are free and long enough (10+ years) to cover several regimes, +including 2017–18, March 2020 and 2022. GDELT was chosen for stress because it is free, global and goes back to +2015. + +**D2. How big is it?** +BTC has 4,016 daily rows and NIFTY 3,927. After the 60-day warm-up and the 5-day forward target, 3,951 and 3,862 +rows are modelled. The headline dataset is tiny: 1,500 titles over 91 days, which is why sentiment never became a +model input. + +**D3. Where exactly does it come from, and can you use it?** +Prices come from Yahoo Finance via `yfinance`, which is an unofficial scraper; Yahoo's terms allow personal or +research use only. Headlines come from the GDELT DOC API. One provenance gap I'd admit: the exact headline query +run and the Google Trends export aren't scripted in the repo. + +**D4. Missing values?** +BTC has none, because it trades every day. NIFTY is missing on weekends and holidays, which is structural, not +random. I don't forward-fill prices across those gaps. Each asset is modelled on its own trading calendar, so +returns are computed between actual trading days. Rows are dropped only where the features actually used are +undefined (the 60-day warm-up). The original code also dropped rows because of an *unused* feature, which cut +75 rows to 11. + +**D5. Outliers?** +Returns are fat-tailed: excess kurtosis is about 8 for BTC and 12 for NIFTY. The IQR rule flags 379 BTC return +days and the 3-sigma rule flags 70. I kept all of them, because in volatility modelling the extreme days *are* +the signal. Instead I handle them through the loss: I model log volatility, and I also report QLIKE, which is +robust to noise in the volatility proxy. + +**D6. Class imbalance?** +It's a regression problem, so there are no classes. The analogue is a skewed target: calm weeks dominate, so a +model can look good on RMSE while missing the few turbulent weeks. That's why I report results by quintile of +actual volatility. The model over-predicts calm weeks by about 0.6 log points and under-predicts turbulent ones +by about 0.55. + +**D7. How do you know there's no leakage?** +Three ways. +- Every feature is a trailing window known at day t's close, and the target uses returns t+1 to t+5. +- A unit test changes only *future* prices and asserts the features at t are unchanged (`tests/test_volatility.py`). +- Walk-forward folds have a 5-day gap so no training label overlaps the test period. + +I also found and fixed two leaks in the old notebooks: a target that was 80% already known, and a scaler fitted +on the full sample. + +**D8. What's in the target exactly?** +The sample standard deviation of the next five daily log returns. That is daily units, not annualised, and it is +modelled as log(σ + 1e-6). For display I annualise with √365 for BTC (it trades every day) and √252 for NIFTY. + +**D9. Why log returns?** +They add across time, they're symmetric for up and down moves, and for daily moves they're nearly equal to +percentage returns. One inconsistency I found and fixed: the raw files stored simple returns, while every model +used log returns. + +**D10. What's wrong with the sentiment data?** +It covers 91 days, and after the 60-day warm-up only about 13 usable training rows remain. 16% of headlines are +non-English, and the old cleaner either dropped them or reduced them to English fragments. The FinBERT score also +had the wrong label order. So I report sentiment as untested, not as a negative result. + +**D11. What would you collect more of?** +Multi-year headline history first, from a licensed news archive or GDELT GKG over 2015–2025. Then intraday data +for proper realised volatility (5-minute returns), which is a much less noisy target than daily squared returns. +Option-implied volatility (Deribit for BTC, India VIX for NIFTY) is the market's own forecast and the natural +benchmark. + +**D12. Representativeness and bias?** +Two assets, one data vendor, daily frequency. Headlines are English-biased. GDELT coverage grows over time, so +raw event counts trend upward for reasons unrelated to stress; expanding z-scores only partly remove that. I +wouldn't apply any of this to other assets or to intraday horizons without re-validating. + +### 3b. Modelling (12) + +**M1. Why HAR?** +It's the standard volatility benchmark (Corsi, 2009). It captures volatility clustering at three horizons with +four parameters, and on my data it beat everything else out of sample. With a low signal-to-noise target, the +simple model wins. + +**M2. How does HAR work?** +It's an ordinary least-squares regression of future log volatility on past log volatility measured over three +windows (5, 22, 60 days). Each window stands for traders with different horizons. +- The coefficients sum to 0.75 for BTC, below 1, so forecasts mean-revert toward the long-run level. +- The 22-day term has the biggest weight (0.35 for BTC, 0.45 for NIFTY): the monthly component matters most. + +**M3. How does a Random Forest work, and why did it lose?** +It averages many decision trees. Each tree is fit on a bootstrap resample, and at each split it considers only a +random subset of features. A tree splits to reduce squared error, and a leaf predicts the mean target of its rows. +Averaging decorrelated trees reduces variance. + +It lost because the signal is weak and mostly linear in logs. With depth 8 it memorised noise: training R² was +0.51 against −0.03 on test for BTC. Trees also can't extrapolate beyond the training range, which hurts in +unprecedented spikes. + +**M4. Why not XGBoost?** +Same issue as the RF: more capacity than this signal supports. I'd expect a heavily regularised boosted model to +roughly match HAR, not beat it. If I had richer features (implied volatility, intraday data, news), boosting +would be the next thing to try, with the same purged walk-forward evaluation. + +**M5. Why not logistic regression or a neural net?** +Logistic regression would need a classification framing ("high-volatility week yes/no"), which discards +information. A neural net needs far more data than 4,000 highly autocorrelated daily rows; there are only about +800 non-overlapping 5-day windows. The original CNN attempt had 54 rows and crashed. + +**M6. Why not GARCH?** +GARCH is the classic alternative, and I should have run it as a baseline. HAR is a close cousin and often +performs similarly for multi-day horizons. GARCH would also give a full conditional distribution, not just a +point forecast. It's on my list. + +**M7. How did you tune it?** +HAR has no hyperparameters beyond the windows. I kept the conventional 5/22 and swapped the daily term for 60 +days, and I didn't search over windows, to avoid overfitting the validation folds. The RF hyperparameters were +never tuned either. That's fair to say, because the RF overfit even at these settings, so tuning wouldn't change +the conclusion. + +**M8. What's your validation scheme?** +Expanding-window walk-forward with 5 folds, using `TimeSeriesSplit(gap=5)`. Every model is retrained on all data +before each test block and evaluated on the next block, with a 5-day purge so no overlapping target crosses the +boundary. The final model is refit on all data. + +**M9. What's your baseline?** +Two: the historical mean of log volatility, and a persistence forecast (next week's volatility = this week's). +Persistence is surprisingly bad (R² −0.37 BTC) because one week of returns is a very noisy volatility estimate. + +**M10. Is it overfitting?** +HAR has a train/test gap (0.28 → 0.05 for BTC), but mostly because the test folds include regime shifts. Its +per-fold test R² ranges from −0.06 to 0.16. The RF overfits clearly. Its learning curve stays flat: the gap +doesn't close between 250 and 3,300 training rows, so this is a signal problem, not a data-size problem. + +**M11. What happened to the sentiment Random Forest?** +It was trained on about 10 rows with `min_samples_leaf=10`, and a split needs at least 20, so every tree was a +single leaf. The pickle predicted a constant: 2.4% daily volatility, whatever the input. Every importance was +exactly zero, which the original notebook output even shows. I deleted it, and the training code now refuses to +train below that threshold instead of silently producing a constant. + +**M12. How is FinBERT used, and what was the bug?** +FinBERT is BERT fine-tuned on financial text. It outputs probabilities for positive, negative and neutral. The +ProsusAI model's label order is {0: positive, 1: negative, 2: neutral}, but the code assumed the order was +negative, neutral, positive. So `probs[2] − probs[0]` was "neutral minus positive", which is why it correlated +−0.35 with VADER. The fix reads the labels by name from `model.config.id2label`, and it has a unit test. + +### 3c. Metrics (6) + +**K1. Why these metrics?** +- RMSE and MAE on volatility are interpretable in the target's units. +- R² on log volatility measures share of variance explained versus the test mean. +- QLIKE is the loss that ranks volatility forecasts consistently even when the "true" volatility is measured + with noise (Patton, 2011). It's the one I'd optimise. + +**K2. Which metric matters most here?** +QLIKE, plus under-prediction in turbulent weeks. Risk systems lose money when they under-estimate volatility. + +**K3. Is R² = 0.05 any good?** +For next-week volatility from daily data, small R² is normal: realised volatility from five daily returns is a +very noisy measurement. The meaningful comparison is relative. HAR cuts QLIKE from 1.97 to 1.15 versus the +historical mean for BTC, and from 0.89 to 0.55 for NIFTY. I wouldn't sell it as more than "beats naive +baselines". + +**K4. What does a false positive cost here?** +Over-forecasting volatility means over-hedging and smaller positions: you give up return. A false negative +(under-forecasting before a spike) means under-hedged positions into a crash, margin calls, and VaR breaches. +The second is usually more expensive, which is why QLIKE's asymmetry fits the problem. + +**K5. Why not accuracy or F1?** +It's regression. If the business wanted a "high-volatility alert", I'd threshold the forecast and report +precision and recall at that threshold, plus the cost-weighted error. + +**K6. You report exp(log forecast). Is that biased?** +Yes. exp of a log-scale forecast is a conditional *median*, which is below the conditional mean for a +right-skewed variable. For risk use I'd add a smearing correction or forecast quantiles. The model card in the +app says this. + +### 3d. Engineering and deployment (9) + +**E1. How is the model served?** +The model is four numbers in a JSON file, loaded once per server with `st.cache_resource`. The forecast page +computes features with the *same* function used in training (`pipeline/volatility.price_features`) and returns +daily and annualised volatility. There's no pickle, so there's no scikit-learn version to match. The JSON also +stores the feature contract (windows, horizon), and loading fails if the code's contract differs. + +**E2. Latency?** +A forecast is a few rolling standard deviations on at most a few thousand numbers: milliseconds. Page renders +took 0.6–4 s in a real browser, mostly Streamlit and Plotly overhead. The old landing page took 185 s because of +620 quadratic Plotly `add_vrect` calls. I measured that before fixing it. + +**E3. What happens on bad input?** +`parse_closes` and `validate_closes` reject: +- non-numbers, with the position of the bad value +- fewer than 61 prices +- non-positive, NaN or infinite values +- more than 10,000 prices + +Each is raised as an `InputError` with a plain-English message and shown in the UI. Suspicious jumps (> 50% in a +day) produce a warning. These paths are covered by AppTest and the browser test. + +**E4. How would you scale it?** +It's stateless and cheap, so the bottleneck is Streamlit itself. For an API I'd wrap `forecast()` in FastAPI, keep +the JSON model in memory, and scale horizontally. Batch scoring for many assets is a vectorised rolling-window +computation. + +**E5. How do you monitor drift?** +Track realised versus forecast volatility as each 5-day window closes: +- rolling QLIKE and bias by volatility quintile +- the coefficient stability of refits +- input distribution checks (e.g. σ₂₂ percentile versus training) + +Alert if rolling QLIKE exceeds the walk-forward band for several weeks. + +**E6. How do you retrain?** +`python run_pipeline.py` rebuilds every model and result from `data/raw` in about a minute. CI rebuilds the +models and fails if they differ from what's committed (`git diff --exit-code models/`). So the published model +is always reproducible from the code. + +**E7. How is it tested?** +- 29 unit tests: no-look-ahead checks, target definition, HAR coefficient recovery, JSON contract, input + validation, and the false-positive rate of both permutation tests. +- 10 Streamlit AppTest tests covering every page and the error paths. +- A Playwright browser smoke test. +- GitHub Actions on Python 3.12 (research) and 3.11/3.13 (dashboard). + +**E8. Dependency management?** +Exact pins, tested together. The dashboard has 4 packages, tested on Python 3.11–3.14. The research environment +is separate (`requirements-research.txt`, Python 3.12+). I deliberately avoided a root `requirements.txt`, so +Streamlit Cloud can't install the wrong file. + +**E9. Secrets?** +None are needed. The old repo had a real FRED key in `.env.example`. I replaced it, and the key must be revoked +because it remains in git history. New keys go in `st.secrets` or a git-ignored `.env`. + +### 3e. Critical and stress questions (9) + +**C1. What's the weakest part of this project?** +The news side. Sentiment covers three months, and the GMSI result doesn't survive a correct significance test. +The forecasting model that works uses only prices, so the "sentiment" in the project's origin isn't what +delivers the result. + +**C2. What would you do differently?** +- Start with the baseline (HAR) and the evaluation harness before any complex model. +- Write the significance test with autocorrelation in mind from day one. +- Never let an analysis script fall back to synthetic data silently. +- Get a multi-year text source before designing sentiment features. + +**C3. What would break in production?** +- Yahoo data changes or rate limits; I'd use a licensed feed. +- Regime shifts that the 10-year history doesn't contain. +- Users pasting prices from another asset or with gaps. That's handled by validation, but not by asset checks. +- The model under-predicts exactly when it matters most (turbulent weeks), so it must not be used alone for risk + limits. + +**C4. What did you NOT do, and why?** +- No GARCH or implied-volatility benchmark, because of time. +- No intraday realised volatility, because there's no free data. +- No hyperparameter search, deliberately, to avoid overfitting a weak signal. +- No re-run of FinBERT after the fix, because the model download wasn't available in the audit environment. +- No re-run of the GMSI pipeline, because the raw GDELT event files are several GB and not in the repo. + +**C5. Some of your earlier dashboard results came from simulated data. How did that happen?** +The market-dynamics script had a fallback: if its input files were missing, it simulated GARCH data "for +demo purposes". The files it expected were never produced by any code, so it always simulated. The figures got +copied into the dashboard and described as real. + +I caught it during an audit: +- I re-ran the script in an empty directory and reproduced the dashboard numbers to three decimals. +- The "BTC" chart showed a cumulative return of 0.25 when real BTC did about 4.1 log points. + +I fixed the root cause (fail loudly; simulate only behind an explicit `--demo` flag with a watermark) and +recomputed everything on real prices. The real data doesn't show the "t+3 secondary wave" I had described. + +**C6. Isn't a "complacency effect" still interesting?** +It's an interesting hypothesis. The data shows that the lowest-stress quintile preceded the highest forward +volatility, but with a valid test the evidence is borderline for BTC (p ≈ 0.05) and absent for NIFTY. I'd +pre-register it and test it out of sample on 2026+ data before calling it a finding. + +**C7. Why should we trust your numbers now?** +- Every number on the dashboard is read from files produced by one command. +- CI rebuilds the models and fails on drift. +- The tests encode the properties I care about: no look-ahead, and valid false-positive rates. +- The audit scripts in `analysis/` reproduce the original problems from the original commit, so the corrections + are themselves checkable. + +**C8. How would you extend it?** +- Add implied volatility (India VIX, Deribit DVOL) as features and as benchmarks. +- Move to intraday realised volatility. +- Use a multi-year news archive and evaluate sentiment as an *incremental* signal on top of HAR, with the same + purged walk-forward test. +- Produce quantile forecasts for risk use. + +**C9. If you had one more week?** +GARCH and India VIX as benchmarks, plus a proper "does news add to HAR?" test on whatever multi-year text I +could license. That's the experiment the project was originally meant to answer. + +--- + +## 4. Do not bluff: honest answers to weak spots + +| Topic | Honest line | +|---|---| +| Sentiment value | "Untested. I only had three months of headlines, about 13 usable rows. I'd need years of text." | +| FinBERT accuracy | "I never evaluated FinBERT on labelled data. An earlier dashboard claimed 82.7%; no code produced that, so I removed it." | +| GMSI significance | "Borderline for BTC, not significant for NIFTY once you account for autocorrelation. My original test was wrong." | +| GMSI reproducibility | "The GMSI is built from several GB of GDELT event files that aren't in the repo; the charts are from the original run." | +| Model strength | "It beats naive baselines, but R² is about 0.05–0.10. It's a baseline-quality forecaster, not a trading signal." | +| GARCH / implied vol | "I didn't benchmark against them. That's the first thing I'd add." | +| MFI | "It's a descriptive index with equal weights by assumption. I haven't validated it against VIX; the earlier claim that I had was wrong." | +| Causality | "Everything here is association. Nothing establishes that news causes volatility." | +| Synthetic figures | Own it: "An analysis script silently fell back to simulated data. I found it, proved it, fixed the root cause and recomputed." | +| AI-written reports | "Some early write-ups in `reports/` were drafted with an AI assistant. I've annotated where they were wrong, and I can defend the code and numbers myself." | + +--- + +## 5. Glossary + +**Data and returns** +- **Log return**: ln(Pₜ/Pₜ₋₁). Additive over time; close to a % change for small moves. +- **Simple return**: Pₜ/Pₜ₋₁ − 1 (`pct_change`). It is what the raw CSVs store. +- **Realised volatility (σₙ)**: sample std of the last n daily log returns. +- **Annualisation**: σ_daily × √(periods per year): √365 for BTC, √252 trading days for NIFTY. +- **Fat tails / excess kurtosis**: more extreme moves than a normal distribution (normal = 0; BTC ≈ 8, NIFTY ≈ 12). +- **Skewness**: asymmetry. NIFTY returns are negatively skewed: crashes are bigger than rallies. +- **Volatility clustering**: large moves follow large moves. This is why past volatility predicts future volatility. +- **Mean reversion**: volatility drifts back to its long-run level. HAR coefficients summing to less than 1 encode it. +- **Jarque–Bera test**: a normality test based on skewness and kurtosis. + +**Model and target** +- **Target (here)**: log of the std of the next 5 log returns. +- **Conditional median**: exp(E[log σ]). What a log-scale model returns after exponentiating; below the mean. +- **HAR (Heterogeneous AutoRegressive)**: regression of future volatility on past volatility over several windows (Corsi, 2009). +- **OLS**: ordinary least squares; minimises squared residuals. Here via `numpy.linalg.lstsq`. +- **Random Forest**: a bagged ensemble of decision trees, each with random feature subsets (`max_features="sqrt"`). +- **Bagging / bootstrap**: training on resamples drawn with replacement; averaging reduces variance. +- **min_samples_leaf**: the minimum rows per leaf. A split needs at least 2× this many rows. +- **max_depth**: the maximum tree depth. +- **Impurity importance**: the total squared-error reduction from splits on a feature (computed on training data; biased). +- **Permutation importance**: the increase in held-out error when a feature is shuffled. +- **DummyRegressor**: predicts the training mean. The trivial baseline. +- **Persistence forecast**: tomorrow equals today (here: next-week σ = last-week σ). +- **GARCH(1,1)**: conditional variance σ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁. The old code used it to *simulate* data. +- **CNN, Huber loss, early stopping**: the abandoned NIFTY neural model. Huber is quadratic near 0 and linear in + the tails; early stopping halts training when validation loss stops improving. +- **KMeans**: clustering into k groups by distance. Used descriptively in the old notebooks. + +**Validation and leakage** +- **Walk-forward (expanding window)**: train on everything before a block, test on the block, repeat. +- **TimeSeriesSplit(gap)**: scikit-learn's walk-forward splitter; `gap` drops rows between train and test. +- **Purging / embargo**: removing training rows whose labels overlap the test period. +- **Leakage / look-ahead bias**: using information not available at prediction time. +- **Expanding vs rolling window**: all history up to t, versus the last n days. +- **StandardScaler / z-score**: (x − mean)/std. Leaks when fitted on the full sample. +- **Expanding min-max**: (x − min_past)/(max_past − min_past), mapping to [0, 1] with past-only extremes. + +**Metrics** +- **RMSE / MAE**: root mean squared / mean absolute error, in volatility units. +- **R² (log σ)**: 1 − SSE/SST on the log scale. Negative means worse than predicting the test mean. +- **QLIKE**: mean(σ²/σ̂² − ln(σ²/σ̂²) − 1). A robust volatility-forecast loss that penalises under-prediction more. + +**Statistics** +- **Pearson / Spearman correlation**: linear correlation, and correlation of ranks (robust to outliers and monotone transforms). +- **Autocorrelation (ACF), lag-1 AC1**: correlation of a series with its own past. +- **AR(1)**: xₜ = φxₜ₋₁ + εₜ. The simplest persistent process; φ is its lag-1 autocorrelation. +- **Effective sample size / variance inflation**: autocorrelation makes n observations worth fewer independent + ones, so null distributions widen (about 6.8× variance here). +- **Permutation (placebo) test**: compare the real statistic with its distribution under reshuffled data. +- **Exchangeability**: the requirement that all reorderings are equally likely under H₀. It fails for time series under i.i.d. shuffling. +- **Circular-shift test**: rotate one series against the other. It keeps both autocorrelations and is valid here. +- **p-value**: P(a statistic at least this extreme | H₀). +- **KS test / Mann–Whitney U / Kruskal–Wallis**: distribution-equality, rank-shift and multi-group rank tests. All assume independent observations. +- **Granger causality**: does the past of X improve the prediction of Y beyond Y's own past? +- **ADF test**: augmented Dickey–Fuller unit-root (stationarity) test. +- **Quantile regression**: models conditional quantiles instead of the mean. +- **VIF**: variance inflation factor, a multicollinearity measure (1/(1−R²) of a feature on the others). +- **Mutual information**: a dependence measure that captures non-linear relationships. +- **Conditional expectation by quintile**: mean target within each fifth of a signal's distribution. +- **Wasserstein distance**: "earth-mover" distance between distributions. Mentioned on the old dashboard, never computed. + +**Project-specific indices** +- **GMSI (Global Market Stress Index)**: equal-weight mean of expanding z-scores of GDELT event count, negative-event share, −Goldstein, −sentiment, −sentiment surprise and attention. +- **VSI (Volatility-weighted Sentiment Index)**: the earlier index. It multiplied sentiment by volatility, so it was mechanically correlated with volatility. +- **MFI (Market Fragility Index)**: the mean of normalised 30-day AC1(|r|) (persistence), CoV of 7-day volatility (vol-of-vol) and P(|r| > 2σ₃₀) (tail frequency). +- **Vol-of-vol / CoV**: std/mean of rolling volatility. +- **Shock**: a day with |r| above the expanding 95th percentile of past |r| (250-day burn-in). +- **Regime**: low/medium/high stress by expanding 20%/80% GMSI quantiles. +- **Within-spell AC1**: autocorrelation using only consecutive days inside the same regime. +- **Sentiment surprise**: today's sentiment minus its trailing mean. + +**Text and NLP** +- **GDELT**: Global Database of Events, Language and Tone. **Events**: coded actor-action records with a Goldstein score. **GKG**: themes, tone and entities per article. **DOC API**: an article search endpoint. +- **Goldstein scale**: −10 to +10 rating of an event's effect on stability. +- **FinBERT (ProsusAI)**: BERT fine-tuned for financial sentiment. Labels {0: positive, 1: negative, 2: neutral}. +- **id2label**: the model config's mapping from output index to label name. +- **Softmax**: turns logits into probabilities. +- **VADER**: rule- and lexicon-based sentiment; outputs a compound score in [−1, 1]. +- **Google Trends**: search interest 0–100, scaled to the peak of the queried window. + +**Engineering** +- **st.cache_data / st.cache_resource**: Streamlit caches for serialisable data, and for shared objects like models. +- **AppTest**: Streamlit's headless test harness. +- **Playwright**: browser automation, used for the end-to-end smoke test. +- **session_state / rerun**: Streamlit's per-user state; the script re-executes top to bottom on each interaction. +- **Plotly add_vrect**: shaded vertical band. Calling it per segment with row/col was the 185-second bottleneck. +- **joblib / pickle**: Python object serialisation; version-coupled to the library that wrote it. +- **JSON model**: the HAR model stored as numbers plus a feature contract; library-independent. +- **CI drift check**: CI rebuilds the models and fails if they differ from the committed ones. diff --git a/docs/ISSUES.md b/docs/ISSUES.md new file mode 100644 index 0000000..60e8269 --- /dev/null +++ b/docs/ISSUES.md @@ -0,0 +1,160 @@ +# FinSentinel — Issue Audit + +Severity scale: + +- **P0 BROKEN**: crashes, or produces wrong or misattributed results +- **P1 CORRECTNESS**: leakage, invalid statistics, wrong metric, skew, unseeded randomness +- **P2 DEPLOYMENT**: blocks or degrades Streamlit hosting +- **P3 QUALITY**: structure, duplication, error handling, paths, tests + +**Risk of fixing** is the chance that a fix breaks something else or changes a published number. + +Evidence files live in `analysis/outputs/` (see DATA_REPORT and MODEL_REPORT). + +--- + +## Resolution status (after the Phase 6 fixes) + +The audit below describes the code at commit `e1eb270`; file:line references point there (`git show e1eb270:`). + +| ID | Status | Fixed in | How | +|---|---|---|---| +| SEC-1 | ⚠ **partly: action needed from you** | `4d9deb7` | Placeholder in `.env.example`. **The key is still in git history: revoke it at FRED.** History was not rewritten (destructive; not approved). | +| P0-1 | ✅ | `797f039`, `e8e97df` | MFI and shock results regenerated from real prices; GMSI-regime/AC₁ results removed; dashboard reads only pipeline outputs | +| P0-2 | ✅ | `797f039` | script 08 reads real prices, fails loudly; synthetic only via `--demo` into `reports/figures/demo/` with a watermark | +| P0-3 | ✅ code / ⏳ re-run | `703167a`, `0c12070` | `pipeline/sentiment.finbert_polarity` resolves labels by name; notebook 03 uses it. Re-scoring needs FinBERT locally (`requirements-nlp.txt`) | +| P0-4 | ✅ | `807d47d` | constant pickle deleted; HAR served from JSON; legacy RF refuses to train when n < 2·min_samples_leaf | +| P0-5 | ✅ | `e8e97df` | fake null histogram removed | +| P0-6 | ✅ | `e8e97df`, `807d47d` | p-values computed by `run_pipeline.py` (calibrated null); README/dashboard text rewritten | +| P0-7 | ✅ (archived) | `0c12070` | every notebook has a known-issues header; logic lives in `pipeline/`/`scripts/` | +| P0-8 | ⚠ partial | `807d47d` | all *served* results rebuild from committed `data/raw`; GMSI inputs still need the GDELT pipeline (too large to commit) | +| P1-1 | ✅ | `703167a`, `032fb5a` | `pipeline.stats.permutation_test(method="circular")`; tested false-positive rate | +| P1-2 | ✅ | `e8e97df` | text now says "Q1 highest, Q2–Q5 roughly flat" | +| P1-3 | ✅ | `032fb5a`, `703167a` | expanding past-only regime and shock thresholds | +| P1-4 | ✅ | `0c12070` | notebook 06 target = std r[t+1..t+5] | +| P1-5 | ✅ | `807d47d` | `dropna(subset=used columns)`; comment fixed | +| P1-6 | ✅ code / ⏳ re-run | `0c12070` | `EventRootCode` read as zero-padded strings (needs GDELT files to re-aggregate) | +| P1-7 | ✅ | `713159d`, `e8e97df` | docs and dashboard describe the real method (equal-weight expanding z-scores, no PCA); coverage printed | +| P1-8, P1-9 | ✅ | `e8e97df` | unsupported 82.7%-accuracy and "validated vs VIX" claims removed | +| P1-10 | ✅ | `703167a`, `032fb5a` | `within_spell_ac1` uses consecutive same-regime days only | +| P1-11 | ✅ | `703167a`, `0c12070` | cleaner keeps numbers/symbols; non-English headlines dropped | +| P1-12 | ✅ | `b2de5f8`, `703167a` | √365 for BTC, √252 for NIFTY (`pipeline.volatility.annualise`) | +| P1-13 | ✅ | `807d47d` | `TimeSeriesSplit(gap=5)`; legacy RF split purged | +| P1-14, P1-15 | ✅ | `0c12070`, `713159d` | notebook bootstrap flagged; full rolling windows | +| P1-16 | ✅ | `703167a` | half-life fit dropped; shock curves vs baseline with 95% CIs | +| P2-1 | ✅ | `e8e97df` | landing page 185 s → 2.5–3.8 s (browser-measured) | +| P2-2 | ✅ | `e8e97df` | `runtime.txt` removed; Python version set in Streamlit Cloud (DEPLOY.md) | +| P2-3, P2-4 | ✅ | `e8e97df`, `807d47d` | exact pins; dashboard tested on 3.11/3.12/3.13/3.14; research on 3.12 | +| P2-5, P2-6, P2-7 | ✅ | `e8e97df` | no global seeding, no warning suppression, theme in `.streamlit/config.toml` | +| P3-1 | ✅ | `703167a`, `e8e97df`, `8f6f401` | pytest (unit + AppTest), Playwright smoke test, GitHub Actions incl. model drift check | +| P3-2 | ✅ | `713159d`, `797f039` | `Path(__file__)`-relative paths everywhere | +| P3-3 … P3-9 | ✅ | `807d47d`, `55b2328`, `0c12070` | dead code, placeholders, duplicate notebook/assets/reports removed; trends deduplicated; README rewritten | +| P3-10, P3-11 | ✅ | `b2de5f8` | current GDELT month never cached; `nasdaq-data-link` client | +| P3-12, P3-13 | ✅ | `807d47d`, `0c12070` | pipeline errors explicit; plots saved, not shown | +| P3-14, P3-16 | ✅ | `e8e97df` | dashboard split into `data.py` + `views/` | +| P3-15 | ✅ from here on | — | atomic, descriptive commits | + +--- + +## 🔐 SEC-1: A real-looking API key is committed (do this first, outside the code) + +| | | +|---|---| +| Where | `.env.example:16` contains `FRED_API_KEY=` followed by a 32-hex-character value, not a placeholder. Every other key in the file is `your_..._here`. | +| Why it matters | The file is public on GitHub, so the key must be treated as compromised. Removing the line does **not** remove it from git history (`git log -p .env.example`, commit `193ea3e`). | +| Fix | 1. **Revoke/rotate the key at fred.stlouisfed.org.** This step is required; editing the repo alone does not make the key safe. 2. Replace the value with `your_fred_api_key_here`. 3. Optionally purge it from history (`git filter-repo`). That rewrites history, so it is your call. | +| Risk | none for the code; a history rewrite affects forks and clones | + +--- + +## P0: BROKEN or wrong results + +| ID | Where | What's wrong | Why it matters | Proposed fix | Risk | +|---|---|---|---|---|---| +| **P0-1** | `dashboard/app.py:393-404` (constants), `:974, 1010, 1025, 1080, 1111` ("Real Data" headers), `:1290` ("Complete Results Summary — Real Data"); figures `reports/figures/fig{1,3,4,5,6}_*.png` = `dashboard/assets/` copies | MFI, shock-propagation, and regime numbers and figures come from **`scripts/08_market_dynamics_analysis.py`'s synthetic GARCH branch** (seed 42) but are labelled as real BTC/NIFTY data. Proven in `analysis/outputs/verify_dashboard_numbers_stdout.txt`: NIFTY regime stats identical to 3 dp; shock decay within ±0.0001; "MFI 0.76 COVID peak" = synthetic 0.753 on 2020-05-01. | This is the most serious issue in the repo. "Findings" 3 and 4 in the README (AC₁ paradox, BTC t+3 wave) are artefacts of a random seed. An interviewer who opens the figure will see BTC with a cumulative log return of about 0.25, when real BTC did about 4.10. | Regenerate MFI and shock figures from **real** prices (code exists; DATA_REPORT §9 already has the real values), **remove or relabel** the regime/AC₁ results that need GMSI (not in the repo), and rewrite the README/dashboard claims. **Design choice → see Phase 5.** | Medium: changes every published Paper-2 number | +| **P0-2** | `scripts/08_market_dynamics_analysis.py:72-112, 855-875` | Silent fallback to synthetic data when input files are missing. The expected files (`btc_features.csv`, `nifty_features.csv`, `gmsi_daily.csv`) are **produced by no code in the repo**, so the script always runs synthetic. | It manufactures "results" without failing. This is the root cause of P0-1. | Fail loudly (`FileNotFoundError` with instructions). Keep synthetic data only behind an explicit `--demo` flag, and watermark demo figures. | Low | +| **P0-3** | `notebooks/03_sentiment_analysis.ipynb` cell 4 (`return probs[2] - probs[0]`) | ProsusAI FinBERT label order is `{0: positive, 1: negative, 2: neutral}` (upstream `finbert/finbert.py:607-608`). The code computes **P(neutral) − P(positive)**, not P(pos) − P(neg). | Every FinBERT-derived number (`finbert_score`, VSI, `sentiment_core` in GMSI, the RF features) measures "neutrality minus positivity". Fingerprint: corr(FinBERT, VADER) = −0.352 on BTC (`notebooks/05` cell 4). | Use `model.config.id2label` to index by name: `p[label2id['positive']] - p[label2id['negative']]`. Re-score `text_with_sentiment.csv`. | Medium: must be re-run locally (huggingface.co is blocked in this sandbox); changes sentiment results | +| **P0-4** | `models/rf_btc.pkl`; trained by `pipeline/train_rf_model.py:8-17` on roughly 8–10 rows | All 600 trees have depth 0, all importances are 0.0, and the output is a constant −3.7299 (σ = 0.024) for any input. | The project's only "ML model" is a mean predictor. Presenting it as a forecaster is indefensible. | Delete it, or replace it with a model trained on the full price history (MODEL_REPORT §7b). **Design choice → Phase 5.** | Low | +| **P0-5** | `dashboard/app.py:944-954` | "Interactive Null Distribution — Simulated (same method)" is `np.random.normal(REAL_CORR_BTC*0.1, 0.022, 500)`: a fabricated histogram, **not** a permutation null. | Presented as a reproduction of a statistical test. | Remove it, or compute a real (circular-shift) null from data. | Low | +| **P0-6** | `dashboard/app.py:635, 710, 740-741, 890, 930-931, 1309-1310`; `README.md:52` | Placebo p-values "<2%", "~0.01–0.02", "~0.03–0.05" and "500 permutations" come from no code. `scripts/validate_gmsi.py:78` uses **1000** shuffles and printed p = 0.000 (BTC) / 0.003 (NIFTY) (`reports/exogenous_vsi_v1_results`). A calibrated null gives **0.046 / 0.147** (MODEL_REPORT §E). | Numbers that are made up, or inconsistent with the code, are the first thing a reviewer checks. | Report the calibrated p-values with method, or drop significance claims. | Low (text) | +| **P0-7** | `notebooks/01_data_collection.ipynb` cells 10-11 (`nifty_gdelt`, `btc_yahoo`, `nifty_yahoo`, `btc_fear_greed` undefined), `01a` cell 9 (`KeyError: 'timestamp'`, saved output), `01b` cell 5 (`KeyError: 'year'`), `07` cell 4 (`ValueError: 0 sample(s)`) | Notebooks do not run top to bottom. Several committed outputs are exceptions. | "Can you re-run your pipeline?" The honest answer today is no. | Mark them as archived exploratory notebooks, or fix the four cells. Move the working logic into scripts. | Low | +| **P0-8** | `run_pipeline.py:10`, `scripts/{reconstruct_gmsi,validate_gmsi,regime_analysis,sanity_check_gmsi,construct_vsi_full,data_check}.py` | All depend on `data/processed/*`, which is gitignored and not committed. Verified: `FileNotFoundError: data/processed/btc_sentiment_aligned.csv` and `…/gmsi_exogenous.csv`. GDELT event inputs are also absent. | None of the research results can be reproduced from the repo. | Commit the small processed artefacts (`gmsi_exogenous.csv` is about 4k rows), or add a documented `make data` path. | Low | + +--- + +## P1: CORRECTNESS + +| ID | Where | What's wrong | Why it matters | Fix | Risk | +|---|---|---|---|---|---| +| **P1-1** | `scripts/validate_gmsi.py:77-96`, `notebooks/13` cell 17, `notebooks/12` cell 22 | The placebo test uses an **i.i.d. shuffle** on autocorrelated series (GMSI ACF ≈ 0.82; forward vol ACF = 0.928). False-positive rate is **57.5% at φ=0.9** (MODEL_REPORT §D). | The headline "statistically significant" claim (Finding 2) is not supported. | Circular-shift or block permutation; or Newey-West/HAC standard errors; or a stationary bootstrap. Report the calibrated p. | Medium: the BTC claim becomes borderline and NIFTY is not significant | +| **P1-2** | `dashboard/app.py:870-871` ("monotonically decreasing … holds for both BTC and NIFTY, at both 7-day and 14-day horizons") | The dashboard's own values are not monotone. BTC 7d: Q3 0.0278 < Q4 0.0281 < Q5 0.0294; NIFTY 7d: Q2 0.0078 < Q3 0.0080 < Q4 0.0082 (`app.py:380, 384`). | A U-shape, not a decreasing trend. Easy to catch live. | Describe it as "Q1 is highest; Q2–Q5 roughly flat". | Low | +| **P1-3** | `scripts/regime_analysis.py:28-29` (full-sample 20/80% quantiles), `:106` (full-sample 95% shock threshold), `notebooks/12` cells 10-11 (StandardScaler on all of 2015-2025), `notebooks/09` cell 4 (monthly Trends ffilled from day 1), `notebooks/07` cell 4 (`y_scaler` on all y) | **Look-ahead** in normalisation and regime thresholds. The dashboard claims "expanding quantile, no look-ahead" (`app.py:1274-1275`). | In-sample thresholds are fine for description but not for "predicts" language. Results that rely on them can't be presented as forecasts. | Use expanding quantiles (as in `08_…py:377-401`), or say "in-sample descriptive". | Low | +| **P1-4** | `notebooks/06` cell 2: `rolling(5).std().shift(-1)` | The "next-day" target is std of r[t−3..t+1]. **4 of its 5 days are known at time t** and also feed `vol_5` and `abs_return`. | Partial target leakage; inflates any skill. | Use the target from `feature_engineering.py:20` (`shift(-5)`). | Low | +| **P1-5** | `pipeline/feature_engineering.py:17, 40, 46` and comment `:19` | `vol_60` is computed and unused, but `dropna()` still removes its 59 NaN rows, which **takes 75 rows down to about 11**. The comment says "next-day volatility" for a t+1..t+5 target. | This is a direct cause of P0-4. | Compute only the features that are used, or `dropna(subset=FEATURES+[target])`. Fix the comment. | Low | +| **P1-6** | `notebooks/11` cell 15 (`df["EventRootCode"].isin(["14","18",…])`) | `pd.read_csv` parses `EventRootCode` as int (or mixed, per the DtypeWarning in cell 16 output), so string membership never matches. `conflict_events`, `economic_events`, and `political_events` are **all 0** (cell 20 `describe`: mean 0.0). | The GMSI v0 (`notebooks/12` cells 9-11) averages 3 zero-variance columns into the index, diluting it by 50%. The README's "conflict themes" component doesn't exist in practice. | `read_csv(dtype={'EventRootCode': str})` and zero-pad, or compare ints. Rebuild the events aggregate. | Medium: needs the GDELT files | +| **P1-7** | `scripts/reconstruct_gmsi.py:61-70`; claims in `README.md:163-169` and `app.py:1247-1250` | Code: equal-weight mean of 6 expanding z-scores with `fillna(0)`. Docs: "PCA loading weights" and "expanding min-max → [0,1]". **No PCA anywhere in the repo** (`grep -rn PCA`). Sentiment exists on about 2% of days, so the index changes composition over time. | Methodology as described is not methodology as implemented. | Make the docs match the code, or implement PCA on an expanding window and drop components with no coverage. | Low (docs) / Medium (code) | +| **P1-8** | `app.py:1258-1260` "Consolidation: if max class prob ≥ 0.65 → FinBERT … else 0.6×FinBERT + 0.4×VADER. Validated: 82.7% accuracy on 300-article held-out set vs 64.3% VADER" | **No code** implements the 0.65 rule or any labelled evaluation (`grep -rn "82.7\|0.65\|held-out"` finds nothing relevant). | Unsupported performance claim. | Remove it, or build a labelled evaluation (e.g. the Financial PhraseBank). | Low | +| **P1-9** | `README.md:264`, `app.py:773` "MFI validated vs VIX (FRED)" | FRED was never pulled (`data/raw/pipeline.log`: only yfinance ran), and no code compares MFI with VIX. | Unsupported claim. | Remove it, or implement it (FRED key permitting). | Low | +| **P1-10** | `scripts/08_…py:424` (`sub["abs_return"].autocorr(lag=1)` on a regime-masked frame), `scripts/regime_analysis.py:76-77` (`acf` on a `dropna`'d regime slice) | Lag-1 autocorrelation computed on **non-contiguous** days: the last day of one low-stress spell is paired with the first day of the next one, weeks later. | The "AC₁ by regime" statistic, the basis of the "paradox", is mis-specified even on real data. | Compute AC1 only on within-spell consecutive pairs, or use a regime-interacted AR regression. | Low | +| **P1-11** | `notebooks/02` cell 3 `re.sub(r"[^a-zA-Z\s]", "", text)` | Deletes digits, `$`, `%`, and all non-Latin script. 117 non-Latin headlines survive as English fragments; 123 are dropped (DATA_REPORT §5b). | Biased, corrupted model input ("$450M" → "m"). | Keep digits and punctuation for FinBERT; language-detect and drop or translate non-English. | Medium | +| **P1-12** | `fetch_yfinance.py:78`, `08_…py:152-154, 884-887`, `notebooks/09` cell 16 vs `notebooks/13` cell 3 | BTC annualised with √252 in some places and √365 in others. | Volatility levels aren't comparable across files. | One helper, `annualise(asset)`. | Low | +| **P1-13** | `run_pipeline.py:15-17` | No purge gap between train and test for a 5-day-ahead target. | Overlapping label windows leak across the split. | `TimeSeriesSplit(gap=5)` (as used in `analysis/model_eval.py`). | Low | +| **P1-14** | `notebooks/09` cell 34, `notebooks/10` cell 13 | Unseeded bootstraps. | Reported bootstrap sds aren't reproducible. | `random_state=` / `np.random.default_rng(seed)`. | Low | +| **P1-15** | `scripts/construct_vsi_full.py:26-28` | `rolling(w, min_periods=1).std()`: the first rows use 1–2 observations. | Noisy early z-scores. | `min_periods=w`. | Low | +| **P1-16** | `08_…py:344-372` | "Half-life" comes from a log-linear fit on **5 points** of a non-monotone curve (synthetic BTC gives 57.9 days with R² = 0.60). | Not a meaningful estimate. | Fit an AR/HAR decay on the full series, or drop it. | Low | + +### Train/inference skew: both paths side by side + +| Step | TRAINING (`run_pipeline.py` → `pipeline/*`) | INFERENCE (`dashboard/app.py`) | +|---|---|---| +| Input | `data/processed/btc_sentiment_aligned.csv` (prices + daily FinBERT/VADER) | none: no file is read except PNGs (`app.py:29-33`) | +| Text preprocessing | `clean_text` (nb02) | none | +| Sentiment model | FinBERT `probs[2]-probs[0]` + VADER | none | +| Features | 9 features (`feature_engineering.py:42-48`) | none | +| Scaling | none | none | +| Model | `RandomForestRegressor` → `models/rf_btc.pkl` | **never loaded** | +| Output | log(5-day σ) | hard-coded constants (`app.py:379-404`) + seeded simulation (`app.py:409-447`) | + +**Verdict:** there is no skew to measure because **there is no inference path**. If one were added, the features would have to be rebuilt exactly as in training, including the FinBERT mapping, the UTC-date bucketing, and ≥ 60 days of history (because of the `vol_60`/`dropna` quirk). Today none of that exists. + +The same problem exists *inside training*: `notebooks/06` (12 features, 1-day target) and `pipeline/` (9 features, 5-day target) are **two different models with different targets**, both called "the RF". + +--- + +## P2: DEPLOYMENT (Streamlit Community Cloud) + +| ID | Where | What's wrong | Evidence | Fix | Risk | +|---|---|---|---|---|---| +| **P2-1** | `dashboard/app.py:668-675` (overview), `:1167-1172` (regime) | `fig.add_vrect(row=…, col=…)` in a loop: 620 calls on a 2-row subplot with 1,971-point traces. Each call re-scans the figure, so cost is quadratic. **Overview (the landing page) takes 185.2 s; regime takes 31.4 s.** Nothing is cached, so it repeats on every visit. | `AppTest` timings (ARCHITECTURE §3); isolated test: building the figure took 177.9 s, `to_json` 0.0 s | Build a `shapes=[…]` list once and `update_layout(shapes=…)`, and/or `@st.cache_data` the figure. Better still, delete the synthetic chart (P0-1). | Low | +| **P2-2** | `dashboard/runtime.txt` | Community Cloud **does not read `runtime.txt`**; the Python version is chosen in the deploy dialog's *Advanced settings*. Source: Streamlit forum staff replies (not official docs). | — | Remove the file and document the setting in DEPLOY.md. | None | +| **P2-3** | `dashboard/requirements.txt:2-6` | Floor-only pins (`>=`). Today they resolve to pandas 2.3.3, numpy 2.4.6, **plotly 7.1.0**, scipy 1.17.1, Pillow 11.3.0 (checked in a clean Python 3.11.17 venv). The file says `plotly>=5.18`, and a major-version jump happened silently. | `uv pip install -r` in a clean venv | Pin exact versions that are tested together (`==`). Drop `scipy`: it is only imported, never used for computation (`app.py:13`). | Low | +| **P2-4** | `requirements.txt` (root) | Unpinned. It includes `tensorflow`, `torch`, `transformers`, `snscrape` (unmaintained), and `django-pipeline` (a Django asset library, unrelated). It is missing `scipy`, `statsmodels`, `streamlit`, `bs4`, `tqdm`, `python-dotenv`. Python version per notebook kernels is 3.12.1 vs README "3.11". Whether it resolves: **NOT VERIFIED** (multi-GB install not attempted). | — | Split into `requirements-dashboard.txt` (pinned, small) and `requirements-research.txt`. | Low | +| **P2-5** | `app.py:411, 945` | `np.random.seed()` mutates the global RNG inside a multi-user server process. | — | Use `np.random.default_rng(seed)` locally. | Low | +| **P2-6** | `app.py:16` | `warnings.filterwarnings("ignore")` hides deprecation warnings (e.g. `use_container_width`, deprecated in later Streamlit releases) until something breaks. | — | Remove it. | Low | +| **P2-7** | — | No `.streamlit/config.toml`. The dark theme is forced with CSS `!important` overrides (`app.py:36-372`), which flash on load and break when Streamlit changes its DOM test-ids. | — | Set `[theme] base="dark"` etc. in `config.toml`; keep minimal CSS. | Low | +| **P2-8** | sizes | Model 232 KB, assets 1.4 MB, repo data about 1 MB. **Well within hosting limits; no LFS needed.** | `du -sh` | — | — | + +**Does the app crash?** Not in this sandbox: all 7 pages ran with 0 exceptions under Streamlit 1.40.0 / Python 3.11.17, and `/_stcore/health` returned `ok`. The observable failure is the **3-minute first paint** of the landing page (P2-1), which looks like a hung app. **Live Streamlit Cloud behaviour: NOT VERIFIED** (no access to the deployment or its logs). + +--- + +## P3: QUALITY + +| ID | Where | Issue | Fix | +|---|---|---|---| +| P3-1 | repo-wide | **No tests, no CI, no linting.** | Add `pytest` smoke tests for features/target, plus `AppTest` for the dashboard. | +| P3-2 | ARCHITECTURE §7c | CWD-dependent relative paths in three incompatible conventions (repo root / `scripts/` / `notebooks/`); absolute Windows paths in `reports/*_results`. | Use `Path(__file__).resolve()` roots everywhere. | +| P3-3 | `pipeline/dataset_builder.py` | Dead code that references columns which don't exist (`log_vol`, `sent_vol`). | Delete it. | +| P3-4 | `src/*.py` (5 empty files), `docs/methodology.md` (empty), `Untitled.ipynb` (0 cells) | Placeholders. | Delete them. | +| P3-5 | `notebooks/08_market_dynamics_analysis.ipynb` | Verbatim copy of `scripts/08_…py`, never executed. | Delete it, or import the script. | +| P3-6 | `reports/figures/*` ≡ `dashboard/assets/*` (byte-identical) | Two copies; they will drift. | Generate into one place. | +| P3-7 | `reports/exogenous_vsi_v1_results`, `reports/regimes_vsi_results` | No file extension; the first is a subset of the second; image paths point to `C:/Users/Dell/.gemini/antigravity/brain/…`. These read as AI-agent walkthroughs. | Rename to `.md`, dedupe, use relative paths, and make sure you can personally defend every sentence. | +| P3-8 | `README.md:112-113` lists `06_volatility_forecasting.ipynb`, `07_model_evaluation.ipynb` (don't exist); `:133` "Source CSVs (gitignored)" (they're committed); `:17` "Real-time analysis" (static); `dashboard/README.md:37` says the dashboard **uses synthetic data**, contradicting the main README | Documentation that contradicts itself and the code. | Rewrite after the fixes. | +| P3-9 | `nifty_google_trends.csv` rows 192-195 | Duplicate 2025-11/2025-12 rows. | `drop_duplicates`. | +| P3-10 | `data_pipeline/sources/fetch_gdelt.py:153-160` | The parquet cache never expires, so the current (partial) month is frozen forever. | Skip the cache for the current month. | +| P3-11 | `data_pipeline/sources/fetch_quandl.py:129` | Uses the deprecated `quandl` package; README_DATA says `nasdaqdatalink`. | Switch to `nasdaq-data-link`. | +| P3-12 | `notebooks/01a` cell 4 (`except: pass`), many `except Exception` that log and continue | Errors swallowed silently. | Narrow the exceptions and surface failures. | +| P3-13 | `pipeline/evaluate.py:14` | `plt.show()` in pipeline code (blocks or no-ops headless). | Save to a file. | +| P3-14 | `dashboard/app.py:1322` | Code and a stray comment on the same line, no trailing newline. | Cosmetic. | +| P3-15 | git history | 10 commits titled "Jan 2 Updated"; 19,067 lines added in one "Added Dashboard" commit. | Descriptive, atomic commits from here on. | +| P3-16 | `dashboard/app.py` (1,322 lines) | One file with 335 lines of CSS, data, and 7 pages. | Split into `pages/`, `theme.css`, and a `data.py` that loads results from files. | diff --git a/docs/MODEL_REPORT.md b/docs/MODEL_REPORT.md new file mode 100644 index 0000000..947128c --- /dev/null +++ b/docs/MODEL_REPORT.md @@ -0,0 +1,275 @@ +# FinSentinel — Model Report + +> **Status after fixes.** This report audits commit `e1eb270`. The repository now serves the HAR model evaluated in §7b; `run_pipeline.py` reproduces those walk-forward numbers exactly (`dashboard/data/metrics.json`). The calibrated GMSI p-values are Monte-Carlo estimates: this report's run gave 0.046 (BTC) / 0.147 (NIFTY), and `run_pipeline.py` (a different random stream, 2,000 draws) gives 0.046 / 0.163. Quote them as "≈0.05" and "≈0.15". + +> All numbers come from `analysis/model_eval.py` (`analysis/outputs/model_eval_stdout.txt`, `model_eval_summary.json`, `model_eval_walk_forward.csv`, `model_eval_{btc,nifty}.png`, `model_eval_placebo_validity.csv`) and `analysis/verify_dashboard_numbers.py`, run in this session. +> Environment: Python 3.12.3, scikit-learn 1.8.0 (the artifact's own version), numpy 2.5.3, pandas 3.0.6, scipy 1.18.1. + +The repo contains **one trained ML model**: the BTC Random Forest. It also has two abandoned ones (a 12-feature RF in nb06, and a CNN in nb07 that crashed) and a set of **statistical tests** that carry the actual research claims (GMSI conditional expectations, the placebo test, MFI/shock analysis). Both are covered here, because an interviewer will probe both. + +--- + +## 1. Headline findings (read before anything else) + +| # | Finding | Evidence | +|---|---|---| +| 1 | The committed model `models/rf_btc.pkl` is a **constant**. All 600 trees have depth 0, all 9 importances are 0.0, and every input yields −3.7299327 (σ = 0.02399). | §A of `model_eval_stdout.txt` | +| 2 | Re-running the pipeline reproduces this. 10 training rows < 2×`min_samples_leaf` = 20, so no split is possible, and the RF is **no better than `DummyRegressor(mean)`** (RMSE 0.009647 vs 0.009553). | §B | +| 3 | The notebook version (`notebooks/06` cells 3, 6, 7) trained on **15 rows**. It reported RMSE 0.005628 / MAE 0.005529 on **3 test rows**, with **all importances = 0.0**. Those metrics come from a constant predictor and carry no information. | notebook outputs | +| 4 | Done properly (4,000 days of price data, walk-forward), the RF with the repo's hyperparameters **loses to a 3-variable linear HAR model** on BTC and NIFTY, and on BTC it is below zero R². | §C | +| 5 | The repo's placebo test (i.i.d. shuffle) is **miscalibrated** for autocorrelated series. With an *independent* fake GMSI (AR coefficient 0.9) it declares significance **57.5%** of the time at α=0.05. | §D | +| 6 | Under a (still optimistic) AR(1) null, the published GMSI→volatility correlations have **p ≈ 0.046 (BTC) and p ≈ 0.147 (NIFTY)**. The dashboard shows "<2%" and "~0.03–0.05". | §E | +| 7 | Every MFI, shock-propagation, and "AC₁ paradox" number on the dashboard is the output of **`np.random.seed(42)` synthetic data**. | `verify_dashboard_numbers_stdout.txt` | + +--- + +## 2. Preprocessing pipeline, in order (RF track) + +| # | Step | Code | Rationale | Assessment | +|---|---|---|---|---| +| 1 | Lowercase, strip URLs, delete non-`[a-zA-Z\s]`, keep len > 10 | `notebooks/02` cells 3-4 | normalise text for the models | Lowercasing suits FinBERT (it's built on bert-base-uncased). Deleting every non-ASCII letter and digit is harmful: `"$450M"` → `"m"`, `"10 key things"` → `"key things"`, and Hindi/Korean become English fragments (DATA_REPORT §5b). | +| 2 | FinBERT score = `probs[2] − probs[0]` | `notebooks/03` cell 4 | "positive − negative" | **Wrong index mapping.** Upstream ProsusAI defines `label_dict = {0:'positive', 1:'negative', 2:'neutral'}` (`finbert/finbert.py:607-608` in github.com/ProsusAI/finBERT, fetched this session). So the code computes **P(neutral) − P(positive)**. Fingerprints: corr(finbert, vader) = −0.352 on BTC (`notebooks/05` cell 4); "Bitcoin Price Decline Forces $450M in Long Liquidations" → 0.0106 and "stock market" → 0.896 (`notebooks/04` cell 4). Checking the live HF `config.json`: **NOT VERIFIED** (huggingface.co blocked from this sandbox). | +| 3 | VADER compound | `notebooks/03` cell 5 | lexicon baseline | fine; VADER was built for social media, not finance | +| 4 | Daily mean per UTC date per asset | `notebooks/04` cell 5 | match daily bars | equal-weights each headline; UTC date ≠ NIFTY session (DATA_REPORT §8c L10) | +| 5 | Log return `diff(log close)` | `notebooks/04` cell 3 | additive, ≈ % change for small moves | ✔ | +| 6 | Inner join prices × sentiment, lags 1/2/3/5, `dropna` | `notebooks/04` cells 7-8 | lead-lag features | Lag features are built but **not used** by `build_features`, and their `dropna` costs 5 rows. | +| 7 | `build_features` | `pipeline/feature_engineering.py:3-56` | §3 | `dropna` after computing the unused `vol_60` costs 59 rows | +| 8 | Chronological 80/20 | `run_pipeline.py:15-17` | no future in train | ✔ in principle; no purge gap | +| — | Scaling / imputation / encoding | none | trees are scale-invariant | ✔ correct for RF | + +--- + +## 3. Feature engineering (`pipeline/feature_engineering.py`) + +r_t = daily log return. All windows are trailing, so they only use data at or before t. + +| Feature | Formula | Line | Why it exists | Used by the model? | +|---|---|---|---|---| +| `finbert_score` | mean over the day's headlines of P(neutral) − P(positive) (*intended*: P(pos) − P(neg)) | input | news tone | ✔ | +| `vader_score` | mean VADER compound | input | lexicon tone | ✔ | +| `finbert_surprise` | finbert_t − mean(finbert_{t−4..t}) | L28-30 | the *change* in tone matters more than its level | ✔ | +| `vader_surprise` | same for VADER | L31-33 | same | ✔ | +| `abs_return` | \|r_t\| | L24 | today's move (a one-day vol proxy) | ✔ | +| `sq_return` | r_t² | L25 | ARCH-style variance proxy. **Redundant with `abs_return`** for trees (Spearman = 1.000). | ✔ | +| `vol_5`, `vol_22` | std(r_{t−4..t}), std(r_{t−21..t}) | L15-16 | volatility clustering | only via interactions | +| `vol_60` | std(r_{t−59..t}) | L17 | quarter-scale vol | ✘ (commented out L46), but **its NaNs still drive `dropna`** | +| `sent_x_vol5`, `sent_x_vol22` | finbert × vol | L36-37 | "news matters more in volatile markets" | ✔ | +| `sent_x_absret` | finbert × \|r_t\| | L38 | same idea at one day | ✔ | +| **target** `log_vol_target` | log(std(r_{t+1..t+5}) + 1e-6) | L20-21 | log stabilises a skewed, positive target (BTC skew 2.36 → −0.29, DATA_REPORT §6c) | — | + +Note: raw vol features were removed from the model (L46 comment), presumably to force the model to use sentiment. This deliberately throws away the strongest known predictor of future volatility, which is past volatility (DATA_REPORT §7: vol_22 has the highest correlation with the target). That makes the sentiment model weaker, not more honest. + +--- + +## 4. Algorithms and how they work + +### 4a. Random Forest Regressor: the configured model + +Hyperparameters as configured (`pipeline/train_rf_model.py:8-15`, confirmed from the pickle): `n_estimators=600, max_depth=8, min_samples_leaf=10, max_features="sqrt", random_state=42, n_jobs=-1`. Defaults left in place: `bootstrap=True`, `criterion="squared_error"`, `min_samples_split=2`, `max_samples=None`. **No hyperparameter search exists anywhere in the repo.** + +**How it works (interview depth):** +1. Each of the 600 trees is trained on a **bootstrap sample**: n rows drawn with replacement, so about 63% of distinct rows appear in each. +2. At every node, the tree considers only a random subset of features (`sqrt`: ⌊√9⌋ = 3 of 9) and picks the threshold that most reduces **squared error**, i.e. the within-child variance of y. +3. Splitting stops at `max_depth=8`, or when a child would have fewer than `min_samples_leaf=10` rows. A leaf predicts the **mean y** of its training rows. +4. The forest's prediction is the **average of the 600 tree predictions**. +5. Bagging plus feature subsampling **decorrelates** the trees, so averaging reduces variance without raising bias much. That is why forests resist overfitting better than a single deep tree. +6. What it still can't do: + - **extrapolate.** Predictions are bounded by the range of training targets, which hurts for unprecedented volatility spikes. + - exploit smooth linear structure efficiently. That's why HAR-OLS beats it in §C. + - learn anything when n < 2×`min_samples_leaf`. Every tree is then a single leaf, which is what happened here. +7. Impurity importance (`feature_importances_`) is biased toward high-cardinality continuous features and is computed on training data. That's why permutation importance on held-out data is reported in §8. + +### 4b. CNN (`notebooks/07`, never ran) +`Conv1D(64,3) → Conv1D(32,3) → GlobalAvgPool → Dense(1)` on 30-day windows, Huber loss with δ=0.01, Adam, early stopping. It crashed in cell 4 because NIFTY had 54 rows, all removed by `rolling(60)` + `dropna`. Had it run, `y_scaler` was fit on the full target before the split (leakage). + +### 4c. Statistical machinery behind the research claims + +| Method | Where | What it does | +|---|---|---| +| Spearman ρ | `validate_gmsi.py:36` | Pearson correlation of ranks; robust to monotone transforms and outliers | +| Quintile conditional means | `validate_gmsi.py:42-44` | E[fwd vol \| GMSI quintile] over the full sample (descriptive) | +| Placebo / permutation | `validate_gmsi.py:77-96` | shuffle GMSI i.i.d. 1,000×, recompute ρ, two-sided empirical p. **Assumes exchangeability, which fails for autocorrelated series (§D).** | +| KS / Mann-Whitney | `validate_gmsi.py:70-71`, `regime_analysis.py:173-174` | distribution and median shift tests; also assume independent observations | +| Granger, quantile regression | `notebooks/09` cells 36-48 | n ≈ 60; stress-regime subsets of 11 and 7 rows (cell 44 prints "Not enough data") | +| MFI | `08_…py:203-278` | mean of expanding-min-max-normalised rolling AC1(\|r\|), CoV(vol_7d), and P(\|r\| > 2σ₃₀) | +| Shock propagation | `08_…py:283-372` | mean \|r_{t+h}\| after days where \|r_t\| > expanding Q95; log-linear "half-life" fit on **5 points** | + +--- + +## 5. Why a Random Forest? The honest comparison + +| Alternative | Pro | Con | Chosen? Why | +|---|---|---|---| +| **HAR-RV (OLS on log vol over 1/5/22 days)** | the standard volatility benchmark; 4 parameters; interpretable; extrapolates | linear in logs | **Not tried in the repo.** §C shows it **beats the RF on both assets.** It should have been the baseline. | +| GARCH(1,1) / EGARCH | the textbook conditional-variance model; uses all returns | needs the `arch` library; univariate unless exogenous regressors are added | not tried. The repo even *simulates* GARCH (`app.py:414-420`) but never fits one. | +| Logistic / linear regression on sentiment | interpretable, cheap | same small-n problem | not tried | +| XGBoost / LightGBM | usually beats RF on tabular data | more hyperparameters; same n=10 failure | not tried | +| Neural nets (CNN/LSTM) | sequence modelling | data-hungry; n ≈ 54 here | tried (nb07), crashed | +| **Random Forest** | non-linear interactions, little tuning, scale-free | can't extrapolate; useless at n=10 | **chosen.** Likely reason: "sentiment × volatility interactions are non-linear". No comparison was ever run. | + +**Honest answer for the interview:** "I picked RF because it handles non-linear interactions without much tuning. The real problem was data, not algorithm: three months of headlines give about ten usable rows. When I re-ran the comparison on price data alone, a three-variable HAR regression beat the forest. In hindsight I should have started with HAR as the baseline and asked whether sentiment adds anything on top of it." + +--- + +## 6. Validation strategy + +| Aspect | Repo | Sound? | +|---|---|---| +| Scheme | single chronological 80/20 holdout (`run_pipeline.py:15-17`) | the direction is right (no shuffling), but there is one split and no purge gap | +| Size | 10 train / 3 test (reconstructed); nb06: 12 / 3 | ✘ cannot estimate error | +| k-fold / CV | none | ✘ | +| Hyperparameter tuning | none (and so no validation set needed) | — | +| Research claims | in-sample correlation + i.i.d. placebo | ✘ the null is wrong (below) | + +### §D. Is the placebo test valid? (No.) +Setup: the **real** BTC forward-7-day volatility series (n = 4,009, lag-1 autocorrelation **0.928**), built exactly as in `construct_vsi_full.py:26` + `validate_gmsi.py:23`, correlated with a **fake GMSI generated independently** as AR(1) noise. 200 simulations per φ, 1,000 permutations each, two-sided p as in `validate_gmsi.py:95`. + +| Fake-GMSI AR coefficient φ | False-positive rate, **repo's i.i.d. shuffle** | False-positive rate, circular-shift permutation | +|---|---|---| +| 0.0 | 0.070 | 0.070 | +| 0.5 | 0.225 | 0.070 | +| 0.9 | **0.575** | 0.060 | +| 0.98 | **0.740** | 0.055 | + +**Why:** a permutation test is valid only if, under H₀, every reordering is equally likely (exchangeability). Shuffling a persistent series destroys its autocorrelation, so the null distribution is far too narrow: its sd is about 1/√n = 0.0158. When **both** series are persistent, spurious correlations of ±0.05–0.10 are routine. A circular shift preserves the autocorrelation and stays close to the nominal 5% (5.5–7% here, within Monte-Carlo error of 200 sims). + +### §E. Calibrated null for the published numbers +`reports/figures/gmsi_sanity_checks.png` shows GMSI lag-1 ACF ≈ 0.82, decaying slowly (still ≈ 0.2 at lag 30). Simulating an independent AR(1) GMSI with φ=0.82 (2,000 draws) against the real forward vol: + +| | BTC | NIFTY | +|---|---|---| +| published Spearman ρ (`validate_gmsi.py` output; `app.py:389-390`) | −0.0837 | −0.0580 | +| null sd, i.i.d. theory | 0.0158 | 0.0160 | +| null sd, AR(1) φ=0.82 | **0.0414** | **0.0404** | +| variance inflation | 6.86× | 6.41× | +| p (i.i.d. normal approx: what the repo's test approximates) | 1.2e-7 | 2.8e-4 | +| **p (AR(1) φ=0.82 null)** | **0.046** | **0.147** | +| dashboard claim | "< 2%" (`app.py:635`, `740`) | "< 0.05", "~0.03–0.05" (`app.py:741, 930`) | + +Because the real GMSI ACF decays **more slowly** than 0.82^k, the true null is even wider, so the true p-values are **larger** than these. The numbers above are the most favourable case for the claim. Conclusion: BTC is borderline at best, and NIFTY is not significant. The dashboard's p-values match neither the code's output (1,000 shuffles → p = 0.000 / 0.003 per `reports/exogenous_vsi_v1_results`) nor a valid test. + +--- + +## 7. Re-run results vs claims + +### 7a. RF track + +| Source | Claim | Reproduced (this session) | Match? | +|---|---|---|---| +| `notebooks/06` cell 6 | RMSE 0.005628, MAE 0.005529 | Raw input not committed. Reconstructed pipeline: RF 0.009647 / 0.009509 vs Dummy 0.009553 / 0.009414 (3 test rows) | **✘ different data**; both are constant predictors | +| `notebooks/06` cell 7 | importances all 0.0 | all 0.0 | ✔ (the notebook itself shows the model learned nothing) | +| `models/rf_btc.pkl` | — | constant −3.7299327 | — | + +### 7b. Walk-forward on the full price history (what the model *can* do) +`TimeSeriesSplit(n_splits=5, gap=5)`, price features only (sentiment doesn't exist before 2024-10), same target, same RF hyperparameters. Mean over 5 folds: + +| BTC | test RMSE (vol) | test MAE (vol) | test R² (log) | test QLIKE | train R² (log) | +|---|---|---|---|---|---| +| HAR OLS log(vol5, vol22, vol60) | **0.01878** | **0.01270** | **0.0474** | **1.1496** | 0.2824 | +| RF (repo params) | 0.01912 | 0.01316 | −0.0265 | 1.2210 | 0.5085 | +| dummy mean | 0.02124 | 0.01501 | −0.3847 | 1.9660 | 0.0000 | +| persistence (log vol_5) | 0.02156 | 0.01532 | −0.3674 | 1.7989 | −0.0383 | + +| NIFTY | test RMSE | test MAE | test R² (log) | test QLIKE | train R² (log) | +|---|---|---|---|---|---| +| HAR OLS | **0.00488** | **0.00311** | **0.1001** | **0.5479** | 0.2068 | +| RF (repo params) | 0.00519 | 0.00322 | 0.0620 | 0.6839 | 0.4128 | +| dummy mean | 0.00558 | 0.00363 | −0.1862 | 0.8905 | 0.0000 | +| persistence | 0.00574 | 0.00396 | −0.4390 | 1.2695 | −0.3420 | + +Per-fold test R² (log) for the RF: BTC −0.115, 0.110, −0.094, −0.044, 0.010; NIFTY 0.046, 0.110, 0.153, 0.121, −0.121. **Fold variance is as large as the mean**, so the differences between RF and HAR on any single fold aren't meaningful. The averages consistently favour HAR. + +**How much does the model beat trivial?** BTC RF vs dummy: RMSE 0.01912 vs 0.02124 (−10%), QLIKE 1.221 vs 1.966. HAR does better still. *"Beats the dummy mean"* is a low bar here, because the dummy ignores volatility clustering entirely. The meaningful baseline is HAR. + +--- + +## 8. Metrics: which and why + +| Metric | Definition | Why | Weakness | +|---|---|---|---| +| RMSE in vol space (repo) | √mean((σ̂ − σ)²) | in the target's units | dominated by the few turbulent weeks | +| MAE in vol space (repo) | mean\|σ̂ − σ\| | robust | same scale issue | +| R² on log vol (added) | 1 − SSE/SST | share of variance explained vs the test-set mean | negative = worse than predicting the test mean | +| **QLIKE** (added) | mean(σ²/σ̂² − log(σ²/σ̂²) − 1) | **the loss that matters for volatility forecasts**: robust to noise in the realised-vol proxy (Patton 2011), and punishes under-prediction more, which is the costly error in risk | less intuitive | + +**Business meaning:** +- A **false positive** (over-forecasting volatility) means over-hedging and lower position sizes: the cost is giving up return. +- A **false negative** (under-forecasting before a spike) means under-hedging into a crash: margin calls and VaR breaches. + +QLIKE's asymmetry matches that cost structure. For risk management, under-prediction in Q5 (turbulent) weeks is the metric to watch, and that is exactly where the model fails (§10). + +--- + +## 9. Feature importance (last walk-forward fold) + +| BTC feature | impurity | permutation Δ MSE (mean ± sd, 20 repeats) | +|---|---|---| +| vol_22 | 0.395 | **+0.0229 ± 0.0060** | +| vol_5 | 0.259 | −0.0069 ± 0.0032 | +| vol_60 | 0.213 | −0.0037 ± 0.0026 | +| abs_return | 0.068 | −0.0018 ± 0.0010 | +| sq_return | 0.065 | −0.0019 ± 0.0012 | + +| NIFTY feature | impurity | permutation | +|---|---|---| +| vol_22 | 0.449 | −0.0118 ± 0.0051 | +| vol_60 | 0.240 | **+0.0080 ± 0.0027** | +| vol_5 | 0.196 | −0.0059 ± 0.0014 | +| abs_return | 0.063 | −0.0002 ± 0.0006 | +| sq_return | 0.052 | −0.0002 ± 0.0005 | + +**Sanity read:** +- Impurity importance says "monthly vol matters most", which makes domain sense. +- Permutation importance shows that, out of sample, **only one feature carries real information per asset**. Permuting the others *improves* MSE (negative Δ), which means the forest overfits them. +- The two methods disagree because impurity is measured on training data (the RF's train R² is 0.51 against −0.03 on test), and correlated features (vol_5/22/60) share importance. Permuting one leaves the others as proxies. + +--- + +## 10. Overfitting check and error analysis + +**Train/test gap:** BTC RF train R² 0.509 vs test −0.026; NIFTY 0.413 vs 0.062. HAR shows 0.282 → 0.047 and 0.207 → 0.100. **The RF overfits**: `max_depth=8` with `min_samples_leaf=10` memorises noise in about 3,000 rows of a low signal-to-noise target. + +**Learning curve (last fold, training window = most recent N rows):** + +| n_train | BTC train / test R² | NIFTY train / test R² | +|---|---|---| +| 250 | 0.408 / −0.045 | 0.407 / −0.123 | +| 500 | 0.402 / −0.043 | 0.453 / −0.124 | +| 1,000 | 0.438 / 0.019 | 0.496 / −0.182 | +| 2,000 | 0.415 / 0.043 | 0.448 / −0.113 | +| 3,288 / 3,214 | 0.441 / 0.010 | 0.399 / −0.121 | + +The gap does not close with more data. This is a capacity and signal problem, not a data-volume one. Regularise harder (shallower trees, larger leaves) or use a linear model. + +**Error analysis (last fold, by quintile of the *actual* future vol):** + +| BTC | n | MAE (vol) | bias (pred − actual, log) | +|---|---|---|---| +| Q1 calm | 132 | 0.00902 | **+0.652** | +| Q3 | 132 | 0.00344 | −0.019 | +| Q5 turbulent | 132 | **0.01704** | **−0.540** | + +NIFTY follows the same pattern: +0.777 in Q1, −0.460 in Q5. + +The model **shrinks toward the mean**: it over-predicts calm weeks and under-predicts turbulent ones, and in risk terms the under-prediction is the costly error. + +**Worst misses:** +- BTC: 2024-08-03/04 (actual 0.074 vs predicted 0.020, the week of the 2024-08-05 global sell-off and yen carry-trade unwind), 2025-02-28/03-01, 2024-03-15. +- NIFTY: **2024-05-28 → 2024-06-03** (actual about 0.039 vs predicted about 0.006, the week of the Indian general-election result on 2024-06-04). + +These are **scheduled or exogenous events that past volatility cannot see**, which is precisely the gap a *working* news signal should fill. It is the strongest argument for the project's original idea, and the clearest way to frame it in an interview. + +--- + +## 11. The MFI / shock / regime results (Paper 2) + +`analysis/verify_dashboard_numbers.py` reproduces `dashboard/app.py:393-404` from the synthetic branch of `scripts/08_market_dynamics_analysis.py`: +- NIFTY regime stats are identical to 3 dp. +- Shock-decay values match within ±0.0001. +- The "MFI 0.76 COVID peak" is the synthetic value 0.753 on 2020-05-01. + +The committed `fig1/3/4/5/6` PNGs regenerate visually identical (pixel shapes differ by 1–2 px from font rendering). + +On real prices the same code gives a BTC shock curve that **peaks at t+1** (0.0396), with **no t+3 secondary wave**, and an MFI that peaks in 2017, not in March 2020 (DATA_REPORT §9). **The "AC₁ paradox", the "BTC t+3 retail-lag wave", and the "MFI COVID peak" are properties of a random-number generator.** + +The one real-data regime result is in `reports/regimes_vsi_results`, from `scripts/regime_analysis.py`: NIFTY 7-day-vol AR(1) falls from 0.94 (low stress) to 0.76 (high stress). It uses **full-sample** quantiles (look-ahead) and computes AR(1) on **non-contiguous** regime slices, which the code comment at `regime_analysis.py:71-75` admits "breaks time continuity". Re-verifying it: **NOT VERIFIED** (needs `gmsi_exogenous.csv`). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..a0d93f6 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,44 @@ +# docs/ — reading guide + +## If you are studying this project cold (recommended order) + +| # | Read | Time | Why | +|---|---|---|---| +| 1 | [`../README.md`](../README.md) | 5 min | what the project claims now, and the results table | +| 2 | [`ARCHITECTURE.md`](ARCHITECTURE.md) **Part A** | 15 min | how the current system fits together; the training/inference boundary | +| 3 | [`MODEL_REPORT.md`](MODEL_REPORT.md) §1, §4–§10 | 25 min | why HAR, how it was validated, metrics, failure modes | +| 4 | [`DATA_REPORT.md`](DATA_REPORT.md) §0, §1, §6–§8, §10 | 20 min | the data, the target, leakage audit, limitations | +| 5 | [`INTERVIEW_DEFENSE.md`](INTERVIEW_DEFENSE.md) | 45 min | pitch, ~50 Q&As, "do not bluff" list, glossary. Rehearse out loud. | +| 6 | [`ISSUES.md`](ISSUES.md) resolution table, then P0 rows | 15 min | what was wrong in the original and how each item was fixed | +| 7 | [`ARCHITECTURE.md`](ARCHITECTURE.md) **Part B** | optional | the full forensic audit of the original code | +| 8 | [`DEPLOY.md`](DEPLOY.md) | 10 min | how to host the dashboard; verification evidence | + +Then open the code in this order: `pipeline/volatility.py` → `run_pipeline.py` → `dashboard/data.py` → +`dashboard/views/forecast.py` → `pipeline/stats.py` → `tests/`. + +## Index + +| File | Contents | +|---|---| +| `ARCHITECTURE.md` | A: current architecture (diagrams, module table, artifact contract). B: audit of commit `e1eb270` | +| `DATA_REPORT.md` | provenance, schema, full numeric/categorical/text profile, target, correlations, missingness, leakage audit, limitations | +| `MODEL_REPORT.md` | preprocessing, features, algorithms, alternatives, validation, re-run metrics, importance, overfitting, error analysis, placebo validity | +| `ISSUES.md` | resolution table + P0–P3 issues with file:line, impact, fix, risk | +| `DEPLOY.md` | Streamlit Community Cloud steps, local verification, troubleshooting | +| `INTERVIEW_DEFENSE.md` | 2-min / 30-s pitch, 48 Q&As, honest weak spots, glossary | + +## Reproducing the numbers + +```bash +pip install -r requirements-research.txt +python run_pipeline.py # current models and results (dashboard/data, models/) +pytest -q + +pip install -r analysis/requirements.txt +python analysis/data_profile.py # DATA_REPORT tables (analysis/outputs/) +python analysis/model_eval.py # MODEL_REPORT audit (reads the original artefacts from commit e1eb270 via git) +python analysis/verify_dashboard_numbers.py # proves the old dashboard numbers were synthetic +``` + +`analysis/` needs a full git clone, because it reads the deleted original files (`models/rf_btc.pkl`, the old +`scripts/08…py`, the old `dashboard/app.py`) from the audited commit with `git show`. diff --git a/docs/methodology.md b/docs/methodology.md deleted file mode 100644 index e69de29..0000000 diff --git a/models/har_btc.json b/models/har_btc.json new file mode 100644 index 0000000..f28d718 --- /dev/null +++ b/models/har_btc.json @@ -0,0 +1,29 @@ +{ + "asset": "BTC", + "intercept": -1.063051005891508, + "coef": { + "log_vol_5": 0.20162346552835966, + "log_vol_22": 0.3515907636247535, + "log_vol_60": 0.1979625399497312 + }, + "horizon": 5, + "windows": [ + 5, + 22, + 60 + ], + "trained_from": "2015-03-03", + "trained_through": "2025-12-25", + "n_train": 3951, + "metrics": { + "test_rmse_vol": 0.01878103222476856, + "test_mae_vol": 0.012697029585598919, + "test_r2_log": 0.04738194723544191, + "test_qlike": 1.1496354068681478, + "train_rmse_vol": 0.019602947970405103, + "train_mae_vol": 0.012614002736757576, + "train_r2_log": 0.2823629204373729, + "train_qlike": 1.2669679297595506 + }, + "model_type": "HAR-log-linear" +} \ No newline at end of file diff --git a/models/har_nifty.json b/models/har_nifty.json new file mode 100644 index 0000000..34a9c9a --- /dev/null +++ b/models/har_nifty.json @@ -0,0 +1,29 @@ +{ + "asset": "NIFTY", + "intercept": -1.498705455180645, + "coef": { + "log_vol_5": 0.1155124540913702, + "log_vol_22": 0.4451301782960222, + "log_vol_60": 0.1534038417509863 + }, + "horizon": 5, + "windows": [ + 5, + 22, + 60 + ], + "trained_from": "2010-04-06", + "trained_through": "2025-12-22", + "n_train": 3862, + "metrics": { + "test_rmse_vol": 0.0048802378568615495, + "test_mae_vol": 0.0031133899244102344, + "test_r2_log": 0.10006871334780434, + "test_qlike": 0.5479008965624766, + "train_rmse_vol": 0.004526627604221555, + "train_mae_vol": 0.0031501766747854404, + "train_r2_log": 0.20681250114640165, + "train_qlike": 0.4362818553430358 + }, + "model_type": "HAR-log-linear" +} \ No newline at end of file diff --git a/models/rf_btc.pkl b/models/rf_btc.pkl deleted file mode 100644 index 3a6a374..0000000 Binary files a/models/rf_btc.pkl and /dev/null differ diff --git a/notebooks/01_data_collection.ipynb b/notebooks/01_data_collection.ipynb index 7a68319..7c5e370 100644 --- a/notebooks/01_data_collection.ipynb +++ b/notebooks/01_data_collection.ipynb @@ -1,5 +1,18 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - cells 10-11 reference undefined `nifty_gdelt`, `btc_yahoo`, `nifty_yahoo`, `btc_fear_greed` (NameError) — never run end-to-end\n", + "> - cell 3 stores a SIMPLE return (`pct_change`); later notebooks overwrite it with a log return\n", + "> - the committed `data/raw/text_data.csv` was not produced by this notebook" + ] + }, { "metadata": {}, "cell_type": "markdown", diff --git a/notebooks/01a_text_data_collection.ipynb b/notebooks/01a_text_data_collection.ipynb index 318cbc6..e3e8c3b 100644 --- a/notebooks/01a_text_data_collection.ipynb +++ b/notebooks/01a_text_data_collection.ipynb @@ -1,5 +1,18 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - the committed run only queried 2015-01-01→02 (empty result); the headline file came from an unrecorded run\n", + "> - cell 9 fails with `KeyError` (yfinance news schema changed)\n", + "> - writes relative to `notebooks/` (`notebooks/data/raw`)" + ] + }, { "metadata": {}, "cell_type": "markdown", @@ -253,12 +266,12 @@ "evalue": "'timestamp'", "output_type": "error", "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mKeyError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[1;32mIn[6], line 5\u001B[0m\n\u001B[0;32m 2\u001B[0m nifty_yahoo \u001B[38;5;241m=\u001B[39m fetch_yahoo_news(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m^NSE\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mNIFTY\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m 4\u001B[0m yahoo_df \u001B[38;5;241m=\u001B[39m pd\u001B[38;5;241m.\u001B[39mconcat([btc_yahoo, nifty_yahoo], ignore_index\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)\n\u001B[1;32m----> 5\u001B[0m yahoo_df[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtimestamp\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m pd\u001B[38;5;241m.\u001B[39mto_datetime(\u001B[43myahoo_df\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtimestamp\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m]\u001B[49m)\u001B[38;5;241m.\u001B[39mdt\u001B[38;5;241m.\u001B[39mtz_localize(\u001B[38;5;28;01mNone\u001B[39;00m)\n\u001B[0;32m 6\u001B[0m yahoo_df[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdate\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m yahoo_df[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtimestamp\u001B[39m\u001B[38;5;124m\"\u001B[39m]\u001B[38;5;241m.\u001B[39mdt\u001B[38;5;241m.\u001B[39mdate\n\u001B[0;32m 8\u001B[0m yahoo_df\u001B[38;5;241m.\u001B[39mhead(), \u001B[38;5;28mlen\u001B[39m(yahoo_df)\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\frame.py:4102\u001B[0m, in \u001B[0;36mDataFrame.__getitem__\u001B[1;34m(self, key)\u001B[0m\n\u001B[0;32m 4100\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcolumns\u001B[38;5;241m.\u001B[39mnlevels \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m1\u001B[39m:\n\u001B[0;32m 4101\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_getitem_multilevel(key)\n\u001B[1;32m-> 4102\u001B[0m indexer \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mcolumns\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_loc\u001B[49m\u001B[43m(\u001B[49m\u001B[43mkey\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 4103\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m is_integer(indexer):\n\u001B[0;32m 4104\u001B[0m indexer \u001B[38;5;241m=\u001B[39m [indexer]\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\range.py:417\u001B[0m, in \u001B[0;36mRangeIndex.get_loc\u001B[1;34m(self, key)\u001B[0m\n\u001B[0;32m 415\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mKeyError\u001B[39;00m(key) \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01merr\u001B[39;00m\n\u001B[0;32m 416\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(key, Hashable):\n\u001B[1;32m--> 417\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mKeyError\u001B[39;00m(key)\n\u001B[0;32m 418\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_check_indexing_error(key)\n\u001B[0;32m 419\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mKeyError\u001B[39;00m(key)\n", - "\u001B[1;31mKeyError\u001B[0m: 'timestamp'" + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[6], line 5\u001b[0m\n\u001b[0;32m 2\u001b[0m nifty_yahoo \u001b[38;5;241m=\u001b[39m fetch_yahoo_news(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m^NSE\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNIFTY\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 4\u001b[0m yahoo_df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mconcat([btc_yahoo, nifty_yahoo], ignore_index\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m----> 5\u001b[0m yahoo_df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimestamp\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mto_datetime(\u001b[43myahoo_df\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtimestamp\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m)\u001b[38;5;241m.\u001b[39mdt\u001b[38;5;241m.\u001b[39mtz_localize(\u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 6\u001b[0m yahoo_df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdate\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m yahoo_df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimestamp\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mdt\u001b[38;5;241m.\u001b[39mdate\n\u001b[0;32m 8\u001b[0m yahoo_df\u001b[38;5;241m.\u001b[39mhead(), \u001b[38;5;28mlen\u001b[39m(yahoo_df)\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\frame.py:4102\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 4100\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mnlevels \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 4101\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_multilevel(key)\n\u001b[1;32m-> 4102\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4103\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(indexer):\n\u001b[0;32m 4104\u001b[0m indexer \u001b[38;5;241m=\u001b[39m [indexer]\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\range.py:417\u001b[0m, in \u001b[0;36mRangeIndex.get_loc\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 415\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[0;32m 416\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(key, Hashable):\n\u001b[1;32m--> 417\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n\u001b[0;32m 418\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_indexing_error(key)\n\u001b[0;32m 419\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n", + "\u001b[1;31mKeyError\u001b[0m: 'timestamp'" ] } ], diff --git a/notebooks/01b_data_expansion.ipynb b/notebooks/01b_data_expansion.ipynb index d40938a..7ad9b78 100644 --- a/notebooks/01b_data_expansion.ipynb +++ b/notebooks/01b_data_expansion.ipynb @@ -1,5 +1,16 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - Yahoo economic-calendar scrape; cell 5 fails with `KeyError: 'year'`; nothing downstream uses its output" + ] + }, { "cell_type": "code", "id": "initial_id", @@ -258,26 +269,26 @@ "evalue": "'year'", "output_type": "error", "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mKeyError\u001B[0m Traceback (most recent call last)", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:3805\u001B[0m, in \u001B[0;36mIndex.get_loc\u001B[1;34m(self, key)\u001B[0m\n\u001B[0;32m 3804\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m-> 3805\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_engine\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_loc\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcasted_key\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 3806\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mKeyError\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m err:\n", - "File \u001B[1;32mindex.pyx:167\u001B[0m, in \u001B[0;36mpandas._libs.index.IndexEngine.get_loc\u001B[1;34m()\u001B[0m\n", - "File \u001B[1;32mindex.pyx:196\u001B[0m, in \u001B[0;36mpandas._libs.index.IndexEngine.get_loc\u001B[1;34m()\u001B[0m\n", - "File \u001B[1;32mpandas\\\\_libs\\\\hashtable_class_helper.pxi:7081\u001B[0m, in \u001B[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001B[1;34m()\u001B[0m\n", - "File \u001B[1;32mpandas\\\\_libs\\\\hashtable_class_helper.pxi:7089\u001B[0m, in \u001B[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001B[1;34m()\u001B[0m\n", - "\u001B[1;31mKeyError\u001B[0m: 'year'", + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:3805\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 3804\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 3805\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3806\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "File \u001b[1;32mindex.pyx:167\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32mindex.pyx:196\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32mpandas\\\\_libs\\\\hashtable_class_helper.pxi:7081\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32mpandas\\\\_libs\\\\hashtable_class_helper.pxi:7089\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n", + "\u001b[1;31mKeyError\u001b[0m: 'year'", "\nThe above exception was the direct cause of the following exception:\n", - "\u001B[1;31mKeyError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[1;32mIn[7], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m yahoo_events[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdate_fixed\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m \u001B[43myahoo_events\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mapply\u001B[49m\u001B[43m(\u001B[49m\u001B[43mbuild_event_date\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43maxis\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;241;43m1\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[0;32m 3\u001B[0m yahoo_events[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdate_fixed\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m pd\u001B[38;5;241m.\u001B[39mto_datetime(\n\u001B[0;32m 4\u001B[0m yahoo_events[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdate_fixed\u001B[39m\u001B[38;5;124m\"\u001B[39m],\n\u001B[0;32m 5\u001B[0m errors\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcoerce\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m 6\u001B[0m )\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\frame.py:10374\u001B[0m, in \u001B[0;36mDataFrame.apply\u001B[1;34m(self, func, axis, raw, result_type, args, by_row, engine, engine_kwargs, **kwargs)\u001B[0m\n\u001B[0;32m 10360\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mpandas\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mcore\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mapply\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m frame_apply\n\u001B[0;32m 10362\u001B[0m op \u001B[38;5;241m=\u001B[39m frame_apply(\n\u001B[0;32m 10363\u001B[0m \u001B[38;5;28mself\u001B[39m,\n\u001B[0;32m 10364\u001B[0m func\u001B[38;5;241m=\u001B[39mfunc,\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 10372\u001B[0m kwargs\u001B[38;5;241m=\u001B[39mkwargs,\n\u001B[0;32m 10373\u001B[0m )\n\u001B[1;32m> 10374\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mop\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mapply\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241m.\u001B[39m__finalize__(\u001B[38;5;28mself\u001B[39m, method\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mapply\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\apply.py:916\u001B[0m, in \u001B[0;36mFrameApply.apply\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 913\u001B[0m \u001B[38;5;28;01melif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mraw:\n\u001B[0;32m 914\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mapply_raw(engine\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mengine, engine_kwargs\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mengine_kwargs)\n\u001B[1;32m--> 916\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mapply_standard\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\apply.py:1063\u001B[0m, in \u001B[0;36mFrameApply.apply_standard\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 1061\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mapply_standard\u001B[39m(\u001B[38;5;28mself\u001B[39m):\n\u001B[0;32m 1062\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mengine \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpython\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n\u001B[1;32m-> 1063\u001B[0m results, res_index \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mapply_series_generator\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 1064\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m 1065\u001B[0m results, res_index \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mapply_series_numba()\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\apply.py:1081\u001B[0m, in \u001B[0;36mFrameApply.apply_series_generator\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 1078\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m option_context(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmode.chained_assignment\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28;01mNone\u001B[39;00m):\n\u001B[0;32m 1079\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m i, v \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28menumerate\u001B[39m(series_gen):\n\u001B[0;32m 1080\u001B[0m \u001B[38;5;66;03m# ignore SettingWithCopy here in case the user mutates\u001B[39;00m\n\u001B[1;32m-> 1081\u001B[0m results[i] \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[43mv\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 1082\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(results[i], ABCSeries):\n\u001B[0;32m 1083\u001B[0m \u001B[38;5;66;03m# If we have a view on v, we need to make a copy because\u001B[39;00m\n\u001B[0;32m 1084\u001B[0m \u001B[38;5;66;03m# series_generator will swap out the underlying data\u001B[39;00m\n\u001B[0;32m 1085\u001B[0m results[i] \u001B[38;5;241m=\u001B[39m results[i]\u001B[38;5;241m.\u001B[39mcopy(deep\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m)\n", - "Cell \u001B[1;32mIn[6], line 2\u001B[0m, in \u001B[0;36mbuild_event_date\u001B[1;34m(row)\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mbuild_event_date\u001B[39m(row):\n\u001B[1;32m----> 2\u001B[0m year \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(\u001B[43mrow\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43myear\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m]\u001B[49m)\n\u001B[0;32m 3\u001B[0m val \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(row[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mactual\u001B[39m\u001B[38;5;124m\"\u001B[39m])\u001B[38;5;241m.\u001B[39mstrip()\n\u001B[0;32m 5\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m val \u001B[38;5;129;01min\u001B[39;00m MONTH_MAP:\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\series.py:1121\u001B[0m, in \u001B[0;36mSeries.__getitem__\u001B[1;34m(self, key)\u001B[0m\n\u001B[0;32m 1118\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_values[key]\n\u001B[0;32m 1120\u001B[0m \u001B[38;5;28;01melif\u001B[39;00m key_is_scalar:\n\u001B[1;32m-> 1121\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_get_value\u001B[49m\u001B[43m(\u001B[49m\u001B[43mkey\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 1123\u001B[0m \u001B[38;5;66;03m# Convert generator to list before going through hashable part\u001B[39;00m\n\u001B[0;32m 1124\u001B[0m \u001B[38;5;66;03m# (We will iterate through the generator there to check for slices)\u001B[39;00m\n\u001B[0;32m 1125\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m is_iterator(key):\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\series.py:1237\u001B[0m, in \u001B[0;36mSeries._get_value\u001B[1;34m(self, label, takeable)\u001B[0m\n\u001B[0;32m 1234\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_values[label]\n\u001B[0;32m 1236\u001B[0m \u001B[38;5;66;03m# Similar to Index.get_value, but we do not fall back to positional\u001B[39;00m\n\u001B[1;32m-> 1237\u001B[0m loc \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mindex\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_loc\u001B[49m\u001B[43m(\u001B[49m\u001B[43mlabel\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 1239\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m is_integer(loc):\n\u001B[0;32m 1240\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_values[loc]\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:3812\u001B[0m, in \u001B[0;36mIndex.get_loc\u001B[1;34m(self, key)\u001B[0m\n\u001B[0;32m 3807\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(casted_key, \u001B[38;5;28mslice\u001B[39m) \u001B[38;5;129;01mor\u001B[39;00m (\n\u001B[0;32m 3808\u001B[0m \u001B[38;5;28misinstance\u001B[39m(casted_key, abc\u001B[38;5;241m.\u001B[39mIterable)\n\u001B[0;32m 3809\u001B[0m \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;28many\u001B[39m(\u001B[38;5;28misinstance\u001B[39m(x, \u001B[38;5;28mslice\u001B[39m) \u001B[38;5;28;01mfor\u001B[39;00m x \u001B[38;5;129;01min\u001B[39;00m casted_key)\n\u001B[0;32m 3810\u001B[0m ):\n\u001B[0;32m 3811\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m InvalidIndexError(key)\n\u001B[1;32m-> 3812\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mKeyError\u001B[39;00m(key) \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01merr\u001B[39;00m\n\u001B[0;32m 3813\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m:\n\u001B[0;32m 3814\u001B[0m \u001B[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001B[39;00m\n\u001B[0;32m 3815\u001B[0m \u001B[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001B[39;00m\n\u001B[0;32m 3816\u001B[0m \u001B[38;5;66;03m# the TypeError.\u001B[39;00m\n\u001B[0;32m 3817\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_check_indexing_error(key)\n", - "\u001B[1;31mKeyError\u001B[0m: 'year'" + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[7], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m yahoo_events[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdate_fixed\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43myahoo_events\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuild_event_date\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3\u001b[0m yahoo_events[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdate_fixed\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mto_datetime(\n\u001b[0;32m 4\u001b[0m yahoo_events[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdate_fixed\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 5\u001b[0m errors\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcoerce\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 6\u001b[0m )\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\frame.py:10374\u001b[0m, in \u001b[0;36mDataFrame.apply\u001b[1;34m(self, func, axis, raw, result_type, args, by_row, engine, engine_kwargs, **kwargs)\u001b[0m\n\u001b[0;32m 10360\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapply\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m frame_apply\n\u001b[0;32m 10362\u001b[0m op \u001b[38;5;241m=\u001b[39m frame_apply(\n\u001b[0;32m 10363\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 10364\u001b[0m func\u001b[38;5;241m=\u001b[39mfunc,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 10372\u001b[0m kwargs\u001b[38;5;241m=\u001b[39mkwargs,\n\u001b[0;32m 10373\u001b[0m )\n\u001b[1;32m> 10374\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapply\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\apply.py:916\u001b[0m, in \u001b[0;36mFrameApply.apply\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 913\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mraw:\n\u001b[0;32m 914\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_raw(engine\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine, engine_kwargs\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine_kwargs)\n\u001b[1;32m--> 916\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply_standard\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\apply.py:1063\u001b[0m, in \u001b[0;36mFrameApply.apply_standard\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1061\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply_standard\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m 1062\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpython\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m-> 1063\u001b[0m results, res_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply_series_generator\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1064\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1065\u001b[0m results, res_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_series_numba()\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\apply.py:1081\u001b[0m, in \u001b[0;36mFrameApply.apply_series_generator\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1078\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_context(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode.chained_assignment\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 1079\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, v \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(series_gen):\n\u001b[0;32m 1080\u001b[0m \u001b[38;5;66;03m# ignore SettingWithCopy here in case the user mutates\u001b[39;00m\n\u001b[1;32m-> 1081\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1082\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(results[i], ABCSeries):\n\u001b[0;32m 1083\u001b[0m \u001b[38;5;66;03m# If we have a view on v, we need to make a copy because\u001b[39;00m\n\u001b[0;32m 1084\u001b[0m \u001b[38;5;66;03m# series_generator will swap out the underlying data\u001b[39;00m\n\u001b[0;32m 1085\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m results[i]\u001b[38;5;241m.\u001b[39mcopy(deep\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "Cell \u001b[1;32mIn[6], line 2\u001b[0m, in \u001b[0;36mbuild_event_date\u001b[1;34m(row)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mbuild_event_date\u001b[39m(row):\n\u001b[1;32m----> 2\u001b[0m year \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(\u001b[43mrow\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43myear\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m)\n\u001b[0;32m 3\u001b[0m val \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(row[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mactual\u001b[39m\u001b[38;5;124m\"\u001b[39m])\u001b[38;5;241m.\u001b[39mstrip()\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m val \u001b[38;5;129;01min\u001b[39;00m MONTH_MAP:\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\series.py:1121\u001b[0m, in \u001b[0;36mSeries.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 1118\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[key]\n\u001b[0;32m 1120\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m key_is_scalar:\n\u001b[1;32m-> 1121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_value\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1123\u001b[0m \u001b[38;5;66;03m# Convert generator to list before going through hashable part\u001b[39;00m\n\u001b[0;32m 1124\u001b[0m \u001b[38;5;66;03m# (We will iterate through the generator there to check for slices)\u001b[39;00m\n\u001b[0;32m 1125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_iterator(key):\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\series.py:1237\u001b[0m, in \u001b[0;36mSeries._get_value\u001b[1;34m(self, label, takeable)\u001b[0m\n\u001b[0;32m 1234\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[label]\n\u001b[0;32m 1236\u001b[0m \u001b[38;5;66;03m# Similar to Index.get_value, but we do not fall back to positional\u001b[39;00m\n\u001b[1;32m-> 1237\u001b[0m loc \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1239\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(loc):\n\u001b[0;32m 1240\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[loc]\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:3812\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 3807\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(casted_key, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[0;32m 3808\u001b[0m \u001b[38;5;28misinstance\u001b[39m(casted_key, abc\u001b[38;5;241m.\u001b[39mIterable)\n\u001b[0;32m 3809\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28many\u001b[39m(\u001b[38;5;28misinstance\u001b[39m(x, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m casted_key)\n\u001b[0;32m 3810\u001b[0m ):\n\u001b[0;32m 3811\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InvalidIndexError(key)\n\u001b[1;32m-> 3812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[0;32m 3813\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[0;32m 3814\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[0;32m 3815\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[0;32m 3816\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n\u001b[0;32m 3817\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_indexing_error(key)\n", + "\u001b[1;31mKeyError\u001b[0m: 'year'" ] } ], diff --git a/notebooks/02_preprocessing.ipynb b/notebooks/02_preprocessing.ipynb index 19b0214..bcb4ee2 100644 --- a/notebooks/02_preprocessing.ipynb +++ b/notebooks/02_preprocessing.ipynb @@ -1,5 +1,16 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - **FIXED:** `clean_text` deleted digits, `$`, `%` and every non-Latin character (\"$450M\" → \"m\"; Hindi/Korean headlines reduced to English fragments). Now uses `pipeline.sentiment.clean_text` + an English-only gate" + ] + }, { "metadata": {}, "cell_type": "markdown", @@ -154,7 +165,12 @@ }, "cell_type": "code", "source": [ - "def clean_text(text):\n", + "import sys\n", + "sys.path.insert(0, \"..\")\n", + "from pipeline.sentiment import clean_text, is_english_candidate # fixed cleaner (keeps numbers, drops non-English)\n", + "\n", + "\n", + "def _original_clean_text(text): # kept for reference — DO NOT USE\n", " if not isinstance(text, str):\n", " return \"\"\n", "\n", @@ -179,7 +195,7 @@ "cell_type": "code", "source": [ "df[\"clean_text\"] = df[\"text\"].apply(clean_text)\n", - "df = df[df[\"clean_text\"].str.len() > 10]" + "df = df[df[\"clean_text\"].apply(is_english_candidate)]" ], "id": "75e5ab86575919cd", "outputs": [], diff --git a/notebooks/03_sentiment_analysis.ipynb b/notebooks/03_sentiment_analysis.ipynb index ea97449..d7bbeaf 100644 --- a/notebooks/03_sentiment_analysis.ipynb +++ b/notebooks/03_sentiment_analysis.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - **FIXED:** FinBERT score was `probs[2] - probs[0]` = P(neutral) − P(positive) because ProsusAI/finbert's labels are {0: positive, 1: negative, 2: neutral}. Now resolved by label name via `pipeline.sentiment.finbert_polarity`. Saved outputs reflect the bug\n", + "> - needs `pip install -r requirements-nlp.txt`" + ] + }, { "metadata": {}, "cell_type": "markdown", @@ -24,7 +36,10 @@ "import pandas as pd\n", "import torch\n", "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n", - "from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer" + "from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer\n", + "import sys\n", + "sys.path.insert(0, \"..\")\n", + "from pipeline.sentiment import finbert_polarity" ], "id": "227c114e999095de", "outputs": [], @@ -193,10 +208,11 @@ " with torch.no_grad():\n", " outputs = model(**inputs)\n", "\n", - " probs = torch.softmax(outputs.logits, dim=1).numpy()[0]\n", + " probs = torch.softmax(outputs.logits, dim=1).numpy()\n", "\n", - " # FinBERT order: negative, neutral, positive\n", - " return probs[2] - probs[0]" + " # ProsusAI/finbert labels are {0: positive, 1: negative, 2: neutral} — resolve by NAME, never by index\n", + " # (the original `probs[2] - probs[0]` computed P(neutral) - P(positive)).\n", + " return float(finbert_polarity(probs, model.config.id2label)[0])" ], "id": "fd688e3d42b80fcc", "outputs": [], diff --git a/notebooks/04_time_alignment.ipynb b/notebooks/04_time_alignment.ipynb index 3e2e020..c956034 100644 --- a/notebooks/04_time_alignment.ipynb +++ b/notebooks/04_time_alignment.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - headlines are bucketed by UTC date; NIFTY closes 10:00 UTC, so ~14 h of 'same-day' headlines arrive after the close (reverse causality for same-day correlations)\n", + "> - the lag features built here are not used by the model" + ] + }, { "metadata": {}, "cell_type": "markdown", diff --git a/notebooks/05_correlation_analysis.ipynb b/notebooks/05_correlation_analysis.ipynb index 9485a81..98efeb2 100644 --- a/notebooks/05_correlation_analysis.ipynb +++ b/notebooks/05_correlation_analysis.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - n = 75 (BTC) / 54 (NIFTY) days; correlations reported without significance tests\n", + "> - corr(FinBERT, VADER) = −0.35 is a fingerprint of the FinBERT label bug fixed in notebook 03" + ] + }, { "metadata": {}, "cell_type": "markdown", diff --git a/notebooks/06_rf_volatility_forecasting.ipynb b/notebooks/06_rf_volatility_forecasting.ipynb index 1d483b3..7d6e7af 100644 --- a/notebooks/06_rf_volatility_forecasting.ipynb +++ b/notebooks/06_rf_volatility_forecasting.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - **FIXED:** target was `rolling(5).std().shift(-1)` = std of r[t−3..t+1] (4 of 5 days already known at t); now std of r[t+1..t+5]\n", + "> - saved output: trained on 15 rows, every feature importance 0.0 → constant predictor. Superseded by `run_pipeline.py` (HAR model, walk-forward evaluation)" + ] + }, { "cell_type": "code", "id": "initial_id", @@ -219,8 +231,8 @@ "btc_df[\"vol_22\"] = btc_df[\"return\"].rolling(22).std()\n", "btc_df[\"vol_60\"] = btc_df[\"return\"].rolling(60).std()\n", "\n", - "# NEXT-day volatility target\n", - "btc_df[\"volatility_1d\"] = btc_df[\"return\"].rolling(5).std().shift(-1)\n", + "# Target: std of the NEXT 5 log returns r[t+1..t+5] (was .shift(-1) = r[t-3..t+1], 4/5 already observed at t)\n", + "btc_df[\"volatility_1d\"] = btc_df[\"return\"].rolling(5).std().shift(-5)\n", "btc_df[\"log_vol_1d\"] = np.log(btc_df[\"volatility_1d\"] + 1e-6)\n", "\n", "btc_df[\"abs_return\"] = np.abs(btc_df[\"return\"])\n", diff --git a/notebooks/07_sentiment_augmented_volatality_NIFTY.ipynb b/notebooks/07_sentiment_augmented_volatality_NIFTY.ipynb index 6f4df1f..f436678 100644 --- a/notebooks/07_sentiment_augmented_volatality_NIFTY.ipynb +++ b/notebooks/07_sentiment_augmented_volatality_NIFTY.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - crashed in cell 4 (0 samples: 54 rows < 60-day window)\n", + "> - **FIXED:** target scaler is now fit on the training part only (was fit on all of y — leakage)" + ] + }, { "cell_type": "code", "id": "initial_id", @@ -300,7 +312,9 @@ "cell_type": "code", "source": [ "y_scaler = StandardScaler()\n", - "y_scaled = y_scaler.fit_transform(y.reshape(-1,1)).flatten()" + "# fit on the training portion only (fitting on all of y leaks test-period statistics)\n", + "y_scaler.fit(y[: int(0.8 * len(y))].reshape(-1, 1))\n", + "y_scaled = y_scaler.transform(y.reshape(-1, 1)).flatten()" ], "id": "62d53657ba4047d8", "outputs": [ @@ -309,17 +323,17 @@ "evalue": "Found array with 0 sample(s) (shape=(0, 1)) while a minimum of 1 is required by StandardScaler.", "output_type": "error", "traceback": [ - "\u001B[31m---------------------------------------------------------------------------\u001B[39m", - "\u001B[31mValueError\u001B[39m Traceback (most recent call last)", - "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[5]\u001B[39m\u001B[32m, line 2\u001B[39m\n\u001B[32m 1\u001B[39m y_scaler = StandardScaler()\n\u001B[32m----> \u001B[39m\u001B[32m2\u001B[39m y_scaled = \u001B[43my_scaler\u001B[49m\u001B[43m.\u001B[49m\u001B[43mfit_transform\u001B[49m\u001B[43m(\u001B[49m\u001B[43my\u001B[49m\u001B[43m.\u001B[49m\u001B[43mreshape\u001B[49m\u001B[43m(\u001B[49m\u001B[43m-\u001B[49m\u001B[32;43m1\u001B[39;49m\u001B[43m,\u001B[49m\u001B[32;43m1\u001B[39;49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m.flatten()\n", - "\u001B[36mFile \u001B[39m\u001B[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\utils\\_set_output.py:316\u001B[39m, in \u001B[36m_wrap_method_output..wrapped\u001B[39m\u001B[34m(self, X, *args, **kwargs)\u001B[39m\n\u001B[32m 314\u001B[39m \u001B[38;5;129m@wraps\u001B[39m(f)\n\u001B[32m 315\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mwrapped\u001B[39m(\u001B[38;5;28mself\u001B[39m, X, *args, **kwargs):\n\u001B[32m--> \u001B[39m\u001B[32m316\u001B[39m data_to_wrap = \u001B[43mf\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 317\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(data_to_wrap, \u001B[38;5;28mtuple\u001B[39m):\n\u001B[32m 318\u001B[39m \u001B[38;5;66;03m# only wrap the first output for cross decomposition\u001B[39;00m\n\u001B[32m 319\u001B[39m return_tuple = (\n\u001B[32m 320\u001B[39m _wrap_data_with_container(method, data_to_wrap[\u001B[32m0\u001B[39m], X, \u001B[38;5;28mself\u001B[39m),\n\u001B[32m 321\u001B[39m *data_to_wrap[\u001B[32m1\u001B[39m:],\n\u001B[32m 322\u001B[39m )\n", - "\u001B[36mFile \u001B[39m\u001B[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\base.py:907\u001B[39m, in \u001B[36mTransformerMixin.fit_transform\u001B[39m\u001B[34m(self, X, y, **fit_params)\u001B[39m\n\u001B[32m 892\u001B[39m warnings.warn(\n\u001B[32m 893\u001B[39m (\n\u001B[32m 894\u001B[39m \u001B[33mf\u001B[39m\u001B[33m\"\u001B[39m\u001B[33mThis object (\u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mself\u001B[39m.\u001B[34m__class__\u001B[39m.\u001B[34m__name__\u001B[39m\u001B[38;5;132;01m}\u001B[39;00m\u001B[33m) has a `transform`\u001B[39m\u001B[33m\"\u001B[39m\n\u001B[32m (...)\u001B[39m\u001B[32m 902\u001B[39m \u001B[38;5;167;01mUserWarning\u001B[39;00m,\n\u001B[32m 903\u001B[39m )\n\u001B[32m 905\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m y \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m 906\u001B[39m \u001B[38;5;66;03m# fit method of arity 1 (unsupervised transformation)\u001B[39;00m\n\u001B[32m--> \u001B[39m\u001B[32m907\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mfit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mfit_params\u001B[49m\u001B[43m)\u001B[49m.transform(X)\n\u001B[32m 908\u001B[39m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[32m 909\u001B[39m \u001B[38;5;66;03m# fit method of arity 2 (supervised transformation)\u001B[39;00m\n\u001B[32m 910\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m.fit(X, y, **fit_params).transform(X)\n", - "\u001B[36mFile \u001B[39m\u001B[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:924\u001B[39m, in \u001B[36mStandardScaler.fit\u001B[39m\u001B[34m(self, X, y, sample_weight)\u001B[39m\n\u001B[32m 922\u001B[39m \u001B[38;5;66;03m# Reset internal state before fitting\u001B[39;00m\n\u001B[32m 923\u001B[39m \u001B[38;5;28mself\u001B[39m._reset()\n\u001B[32m--> \u001B[39m\u001B[32m924\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mpartial_fit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43msample_weight\u001B[49m\u001B[43m)\u001B[49m\n", - "\u001B[36mFile \u001B[39m\u001B[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\base.py:1336\u001B[39m, in \u001B[36m_fit_context..decorator..wrapper\u001B[39m\u001B[34m(estimator, *args, **kwargs)\u001B[39m\n\u001B[32m 1329\u001B[39m estimator._validate_params()\n\u001B[32m 1331\u001B[39m \u001B[38;5;28;01mwith\u001B[39;00m config_context(\n\u001B[32m 1332\u001B[39m skip_parameter_validation=(\n\u001B[32m 1333\u001B[39m prefer_skip_nested_validation \u001B[38;5;129;01mor\u001B[39;00m global_skip_validation\n\u001B[32m 1334\u001B[39m )\n\u001B[32m 1335\u001B[39m ):\n\u001B[32m-> \u001B[39m\u001B[32m1336\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfit_method\u001B[49m\u001B[43m(\u001B[49m\u001B[43mestimator\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n", - "\u001B[36mFile \u001B[39m\u001B[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:961\u001B[39m, in \u001B[36mStandardScaler.partial_fit\u001B[39m\u001B[34m(self, X, y, sample_weight)\u001B[39m\n\u001B[32m 959\u001B[39m xp, _, X_device = get_namespace_and_device(X)\n\u001B[32m 960\u001B[39m first_call = \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28mhasattr\u001B[39m(\u001B[38;5;28mself\u001B[39m, \u001B[33m\"\u001B[39m\u001B[33mn_samples_seen_\u001B[39m\u001B[33m\"\u001B[39m)\n\u001B[32m--> \u001B[39m\u001B[32m961\u001B[39m X = \u001B[43mvalidate_data\u001B[49m\u001B[43m(\u001B[49m\n\u001B[32m 962\u001B[39m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[32m 963\u001B[39m \u001B[43m \u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m 964\u001B[39m \u001B[43m \u001B[49m\u001B[43maccept_sparse\u001B[49m\u001B[43m=\u001B[49m\u001B[43m(\u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[33;43mcsr\u001B[39;49m\u001B[33;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[33;43mcsc\u001B[39;49m\u001B[33;43m\"\u001B[39;49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m 965\u001B[39m \u001B[43m \u001B[49m\u001B[43mdtype\u001B[49m\u001B[43m=\u001B[49m\u001B[43msupported_float_dtypes\u001B[49m\u001B[43m(\u001B[49m\u001B[43mxp\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mX_device\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m 966\u001B[39m \u001B[43m \u001B[49m\u001B[43mensure_all_finite\u001B[49m\u001B[43m=\u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[33;43mallow-nan\u001B[39;49m\u001B[33;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[32m 967\u001B[39m \u001B[43m \u001B[49m\u001B[43mreset\u001B[49m\u001B[43m=\u001B[49m\u001B[43mfirst_call\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m 968\u001B[39m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 969\u001B[39m n_features = X.shape[\u001B[32m1\u001B[39m]\n\u001B[32m 971\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m sample_weight \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n", - "\u001B[36mFile \u001B[39m\u001B[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\utils\\validation.py:2902\u001B[39m, in \u001B[36mvalidate_data\u001B[39m\u001B[34m(_estimator, X, y, reset, validate_separately, skip_check_array, **check_params)\u001B[39m\n\u001B[32m 2900\u001B[39m out = X, y\n\u001B[32m 2901\u001B[39m \u001B[38;5;28;01melif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m no_val_X \u001B[38;5;129;01mand\u001B[39;00m no_val_y:\n\u001B[32m-> \u001B[39m\u001B[32m2902\u001B[39m out = \u001B[43mcheck_array\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43minput_name\u001B[49m\u001B[43m=\u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[33;43mX\u001B[39;49m\u001B[33;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mcheck_params\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 2903\u001B[39m \u001B[38;5;28;01melif\u001B[39;00m no_val_X \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m no_val_y:\n\u001B[32m 2904\u001B[39m out = _check_y(y, **check_params)\n", - "\u001B[36mFile \u001B[39m\u001B[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1097\u001B[39m, in \u001B[36mcheck_array\u001B[39m\u001B[34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, ensure_all_finite, ensure_non_negative, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001B[39m\n\u001B[32m 1095\u001B[39m n_samples = _num_samples(array)\n\u001B[32m 1096\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m n_samples < ensure_min_samples:\n\u001B[32m-> \u001B[39m\u001B[32m1097\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[32m 1098\u001B[39m \u001B[33m\"\u001B[39m\u001B[33mFound array with \u001B[39m\u001B[38;5;132;01m%d\u001B[39;00m\u001B[33m sample(s) (shape=\u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[33m) while a\u001B[39m\u001B[33m\"\u001B[39m\n\u001B[32m 1099\u001B[39m \u001B[33m\"\u001B[39m\u001B[33m minimum of \u001B[39m\u001B[38;5;132;01m%d\u001B[39;00m\u001B[33m is required\u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[33m.\u001B[39m\u001B[33m\"\u001B[39m\n\u001B[32m 1100\u001B[39m % (n_samples, array.shape, ensure_min_samples, context)\n\u001B[32m 1101\u001B[39m )\n\u001B[32m 1103\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m ensure_min_features > \u001B[32m0\u001B[39m \u001B[38;5;129;01mand\u001B[39;00m array.ndim == \u001B[32m2\u001B[39m:\n\u001B[32m 1104\u001B[39m n_features = array.shape[\u001B[32m1\u001B[39m]\n", - "\u001B[31mValueError\u001B[39m: Found array with 0 sample(s) (shape=(0, 1)) while a minimum of 1 is required by StandardScaler." + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[5]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m y_scaler = StandardScaler()\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m y_scaled = \u001b[43my_scaler\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43my\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreshape\u001b[49m\u001b[43m(\u001b[49m\u001b[43m-\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m.flatten()\n", + "\u001b[36mFile \u001b[39m\u001b[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\utils\\_set_output.py:316\u001b[39m, in \u001b[36m_wrap_method_output..wrapped\u001b[39m\u001b[34m(self, X, *args, **kwargs)\u001b[39m\n\u001b[32m 314\u001b[39m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[32m 315\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mwrapped\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, *args, **kwargs):\n\u001b[32m--> \u001b[39m\u001b[32m316\u001b[39m data_to_wrap = \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 317\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data_to_wrap, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[32m 318\u001b[39m \u001b[38;5;66;03m# only wrap the first output for cross decomposition\u001b[39;00m\n\u001b[32m 319\u001b[39m return_tuple = (\n\u001b[32m 320\u001b[39m _wrap_data_with_container(method, data_to_wrap[\u001b[32m0\u001b[39m], X, \u001b[38;5;28mself\u001b[39m),\n\u001b[32m 321\u001b[39m *data_to_wrap[\u001b[32m1\u001b[39m:],\n\u001b[32m 322\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\base.py:907\u001b[39m, in \u001b[36mTransformerMixin.fit_transform\u001b[39m\u001b[34m(self, X, y, **fit_params)\u001b[39m\n\u001b[32m 892\u001b[39m warnings.warn(\n\u001b[32m 893\u001b[39m (\n\u001b[32m 894\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mThis object (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m.\u001b[34m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m) has a `transform`\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m (...)\u001b[39m\u001b[32m 902\u001b[39m \u001b[38;5;167;01mUserWarning\u001b[39;00m,\n\u001b[32m 903\u001b[39m )\n\u001b[32m 905\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m y \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 906\u001b[39m \u001b[38;5;66;03m# fit method of arity 1 (unsupervised transformation)\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m907\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mfit_params\u001b[49m\u001b[43m)\u001b[49m.transform(X)\n\u001b[32m 908\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 909\u001b[39m \u001b[38;5;66;03m# fit method of arity 2 (supervised transformation)\u001b[39;00m\n\u001b[32m 910\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.fit(X, y, **fit_params).transform(X)\n", + "\u001b[36mFile \u001b[39m\u001b[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:924\u001b[39m, in \u001b[36mStandardScaler.fit\u001b[39m\u001b[34m(self, X, y, sample_weight)\u001b[39m\n\u001b[32m 922\u001b[39m \u001b[38;5;66;03m# Reset internal state before fitting\u001b[39;00m\n\u001b[32m 923\u001b[39m \u001b[38;5;28mself\u001b[39m._reset()\n\u001b[32m--> \u001b[39m\u001b[32m924\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpartial_fit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msample_weight\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\base.py:1336\u001b[39m, in \u001b[36m_fit_context..decorator..wrapper\u001b[39m\u001b[34m(estimator, *args, **kwargs)\u001b[39m\n\u001b[32m 1329\u001b[39m estimator._validate_params()\n\u001b[32m 1331\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[32m 1332\u001b[39m skip_parameter_validation=(\n\u001b[32m 1333\u001b[39m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[32m 1334\u001b[39m )\n\u001b[32m 1335\u001b[39m ):\n\u001b[32m-> \u001b[39m\u001b[32m1336\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:961\u001b[39m, in \u001b[36mStandardScaler.partial_fit\u001b[39m\u001b[34m(self, X, y, sample_weight)\u001b[39m\n\u001b[32m 959\u001b[39m xp, _, X_device = get_namespace_and_device(X)\n\u001b[32m 960\u001b[39m first_call = \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mn_samples_seen_\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m961\u001b[39m X = \u001b[43mvalidate_data\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 962\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 963\u001b[39m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 964\u001b[39m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[43m=\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcsr\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcsc\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 965\u001b[39m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m=\u001b[49m\u001b[43msupported_float_dtypes\u001b[49m\u001b[43m(\u001b[49m\u001b[43mxp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX_device\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 966\u001b[39m \u001b[43m \u001b[49m\u001b[43mensure_all_finite\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mallow-nan\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 967\u001b[39m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfirst_call\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 968\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 969\u001b[39m n_features = X.shape[\u001b[32m1\u001b[39m]\n\u001b[32m 971\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m sample_weight \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\utils\\validation.py:2902\u001b[39m, in \u001b[36mvalidate_data\u001b[39m\u001b[34m(_estimator, X, y, reset, validate_separately, skip_check_array, **check_params)\u001b[39m\n\u001b[32m 2900\u001b[39m out = X, y\n\u001b[32m 2901\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m no_val_y:\n\u001b[32m-> \u001b[39m\u001b[32m2902\u001b[39m out = \u001b[43mcheck_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_name\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mX\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mcheck_params\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2903\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_y:\n\u001b[32m 2904\u001b[39m out = _check_y(y, **check_params)\n", + "\u001b[36mFile \u001b[39m\u001b[32mE:\\financial-sentiment-corr\\.venv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1097\u001b[39m, in \u001b[36mcheck_array\u001b[39m\u001b[34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, ensure_all_finite, ensure_non_negative, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[39m\n\u001b[32m 1095\u001b[39m n_samples = _num_samples(array)\n\u001b[32m 1096\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m n_samples < ensure_min_samples:\n\u001b[32m-> \u001b[39m\u001b[32m1097\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1098\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mFound array with \u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[33m sample(s) (shape=\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m) while a\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1099\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m minimum of \u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[33m is required\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1100\u001b[39m % (n_samples, array.shape, ensure_min_samples, context)\n\u001b[32m 1101\u001b[39m )\n\u001b[32m 1103\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m ensure_min_features > \u001b[32m0\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m array.ndim == \u001b[32m2\u001b[39m:\n\u001b[32m 1104\u001b[39m n_features = array.shape[\u001b[32m1\u001b[39m]\n", + "\u001b[31mValueError\u001b[39m: Found array with 0 sample(s) (shape=(0, 1)) while a minimum of 1 is required by StandardScaler." ] } ], diff --git a/notebooks/08_graphs_and_plots.ipynb b/notebooks/08_graphs_and_plots.ipynb index cfb1bcf..1c14115 100644 --- a/notebooks/08_graphs_and_plots.ipynb +++ b/notebooks/08_graphs_and_plots.ipynb @@ -1,5 +1,16 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - exploratory plots on 75/54 rows; KMeans regimes are descriptive only; FinBERT values carry the label bug" + ] + }, { "cell_type": "code", "id": "initial_id", diff --git a/notebooks/08_market_dynamics_analysis.ipynb b/notebooks/08_market_dynamics_analysis.ipynb deleted file mode 100644 index 031c5fe..0000000 --- a/notebooks/08_market_dynamics_analysis.ipynb +++ /dev/null @@ -1,99 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 5, - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.10.0" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": "# \ud83d\udcca Notebook 08: Market Dynamics Analysis\n## Phase 2 \u2014 Fragility \u00b7 Shock Propagation \u00b7 Regime Dynamics\n\n**Objective:** Understand *why* and *how* markets move \u2014 not predict them.\n\n| Component | Method | Purpose |\n|-----------|--------|---------|\n| **Market Fragility Index (MFI)** | AC1(|r|) + VoV + TailFreq | Measure structural vulnerability |\n| **Shock Propagation** | Forward vol at t+1,3,7,14,21 | How volatility evolves after shocks |\n| **Regime Conditioning** | GMSI quantile regimes | State-dependent behavior |\n\n> **No price-derived inputs in GMSI (leakage corrected). No look-ahead bias. No black-box ML.**\n\n---\n## Data Expected\n```\ndata/processed/btc_features.csv # columns: log_return, vol_7d, vol_14d, vol_30d\ndata/processed/nifty_features.csv # same structure\ndata/processed/gmsi_daily.csv # column: gmsi (pure exogenous, [0,1])\n```\nIf files are missing, realistic synthetic GARCH(1,1) data is generated automatically." - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "## Setup" - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": "\"\"\"\n=============================================================================\nNOTEBOOK 08: Market Dynamics Analysis\n=============================================================================\nObjective:\n Understand WHY and HOW markets move through:\n 1. Market Fragility Index (MFI)\n 2. Shock Propagation Analysis\n 3. Regime-Conditioned Behavior\n\nPhilosophy:\n - No price-derived inputs in GMSI (already corrected)\n - No look-ahead / future leakage\n - No black-box ML\n - Weak but real signals > strong but artificial ones\n - Every metric has a clear mathematical definition\n\nData Expected (from your project's data/processed/ folder):\n - btc_features.csv : BTC daily data with log_returns, vol_7d, vol_14d, vol_30d\n - nifty_features.csv: NIFTY daily data with same structure\n - gmsi_daily.csv : Pure exogenous GMSI (no price-derived inputs)\n\nIf files are not found, realistic synthetic data is generated for demo purposes.\n=============================================================================\n\"\"\"\n\n# \u2500\u2500\u2500 0. Imports \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport matplotlib.gridspec as gridspec\nfrom matplotlib.patches import Patch\nimport warnings\nfrom scipy import stats\nfrom scipy.stats import mannwhitneyu, kruskal\nimport os\n\nwarnings.filterwarnings(\"ignore\")\nnp.random.seed(42)\n\nplt.rcParams.update({\n \"figure.facecolor\": \"#0d1117\",\n \"axes.facecolor\": \"#161b22\",\n \"axes.edgecolor\": \"#30363d\",\n \"axes.labelcolor\": \"#c9d1d9\",\n \"xtick.color\": \"#8b949e\",\n \"ytick.color\": \"#8b949e\",\n \"text.color\": \"#c9d1d9\",\n \"grid.color\": \"#21262d\",\n \"grid.linewidth\": 0.6,\n \"figure.titlesize\": 14,\n \"axes.titlesize\": 12,\n \"font.family\": \"monospace\",\n})\n\nCOLORS = {\n \"low\": \"#3fb950\", # green \u2013 low stress / healthy\n \"medium\": \"#d29922\", # yellow \u2013 medium\n \"high\": \"#f85149\", # red \u2013 high stress / fragile\n \"btc\": \"#f7931a\", # bitcoin orange\n \"nifty\": \"#0070f3\", # blue \u2013 nifty\n \"accent\": \"#bc8cff\", # purple \u2013 highlights\n \"mfi\": \"#79c0ff\", # light blue \u2013 MFI\n}\n\nSAVE_DIR = \"market_dynamics_output\"\nos.makedirs(SAVE_DIR, exist_ok=True)\n\n\n# \u2500\u2500\u2500 1. Data Loading / Synthetic Fallback \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndef load_or_generate_data():\n \"\"\"\n Attempt to load real project data.\n Falls back to realistic synthetic data if files are missing.\n\n Synthetic data is calibrated to match:\n BTC: annualised vol ~80%, fat-tailed returns, volatility clustering\n NIFTY: annualised vol ~20%, moderate clustering\n GMSI: exogenous, bounded [0,1], slightly AR(1)\n \"\"\"\n DATA_PATHS = {\n \"btc\": [\"data/processed/btc_features.csv\",\n \"data/raw/btc_daily.csv\",\n \"notebooks/data/btc_features.csv\"],\n \"nifty\": [\"data/processed/nifty_features.csv\",\n \"data/raw/nifty_daily.csv\",\n \"notebooks/data/nifty_features.csv\"],\n \"gmsi\": [\"data/processed/gmsi_daily.csv\",\n \"src/gmsi_daily.csv\",\n \"notebooks/data/gmsi_daily.csv\"],\n }\n\n results = {}\n for key, paths in DATA_PATHS.items():\n loaded = False\n for p in paths:\n if os.path.exists(p):\n try:\n df = pd.read_csv(p, parse_dates=True, index_col=0)\n df.index = pd.to_datetime(df.index)\n results[key] = df\n print(f\" \u2705 Loaded {key} from: {p} ({len(df)} rows)\")\n loaded = True\n break\n except Exception as e:\n print(f\" \u26a0\ufe0f Could not parse {p}: {e}\")\n if not loaded:\n print(f\" \ud83d\udd27 Generating synthetic {key} data (demo mode)\")\n results[key] = None\n\n return results\n\n\ndef simulate_garch_returns(n, omega, alpha, beta, mu=0.0, df_t=5):\n \"\"\"\n Simulate returns from GARCH(1,1) with t-distributed innovations.\n This gives realistic volatility clustering and fat tails.\n\n \u03c3\u00b2_t = \u03c9 + \u03b1\u00b7\u03b5\u00b2_{t-1} + \u03b2\u00b7\u03c3\u00b2_{t-1}\n r_t = \u03bc + \u03c3_t \u00b7 z_t, z_t ~ t(df)\n\n Parameters are in daily log-return units:\n BTC: \u03c9~1e-4 gives ~\u03c3_daily \u2248 3-5%\n NIFTY: \u03c9~2e-5 gives ~\u03c3_daily \u2248 1%\n \"\"\"\n sigma2 = np.zeros(n)\n ret = np.zeros(n)\n uncond_v = omega / (1 - alpha - beta + 1e-10)\n sigma2[0] = uncond_v # unconditional variance (start at steady state)\n\n for t in range(1, n):\n eps2 = ret[t-1] ** 2\n sigma2[t] = omega + alpha * eps2 + beta * sigma2[t-1]\n sigma2[t] = max(sigma2[t], 1e-10)\n # t-distribution scaled so variance = 1: divide by sqrt(df/(df-2))\n scale = np.sqrt(df_t / (df_t - 2))\n z = np.random.standard_t(df_t) / scale\n ret[t] = mu + np.sqrt(sigma2[t]) * z\n\n return ret, np.sqrt(sigma2)\n\n\ndef build_features(ret, sigma, dates):\n \"\"\"\n Build log returns + rolling volatility features from simulated data.\n All returns and vol are in natural log-return space (e.g., 0.03 = 3%).\n \"\"\"\n df = pd.DataFrame({\"log_return\": ret, \"realized_vol_daily\": sigma}, index=dates)\n\n # Annualised rolling historical volatility (standard in finance)\n df[\"vol_7d\"] = df[\"log_return\"].rolling(7).std() * np.sqrt(252)\n df[\"vol_14d\"] = df[\"log_return\"].rolling(14).std() * np.sqrt(252)\n df[\"vol_30d\"] = df[\"log_return\"].rolling(30).std() * np.sqrt(252)\n\n # Absolute return in daily log-return units (used for shock detection)\n df[\"abs_return\"] = df[\"log_return\"].abs()\n\n return df.dropna()\n\n\ndef generate_synthetic_data():\n \"\"\"\n Generate 2000 days (~8 years) of realistic synthetic market + GMSI data.\n \"\"\"\n n = 2000\n dates = pd.bdate_range(\"2016-01-01\", periods=n)\n\n # BTC: high vol (~3-5% daily), strong clustering (\u03b1+\u03b2 close to 1), fat tails\n # \u03c9 = 1e-5, uncond. daily vol = sqrt(1e-5 / (1-0.12-0.85)) = sqrt(0.000333) \u2248 1.8%\n btc_ret, btc_sig = simulate_garch_returns(\n n, omega=1e-5, alpha=0.12, beta=0.85, mu=0.0003, df_t=4\n )\n btc = build_features(btc_ret, btc_sig, dates)\n\n # NIFTY: lower vol (~1% daily), moderate clustering\n # \u03c9 = 3e-6, uncond. daily vol \u2248 sqrt(0.0001) = 1%\n nifty_ret, nifty_sig = simulate_garch_returns(\n n, omega=3e-6, alpha=0.07, beta=0.90, mu=0.0003, df_t=6\n )\n nifty = build_features(nifty_ret, nifty_sig, dates)\n\n # GMSI: purely exogenous AR(1) with beta regime-shifts\n # Slight negative relationship with future vol (as found in research)\n gmsi_raw = np.zeros(n)\n gmsi_raw[0] = 0.4\n for t in range(1, n):\n shock = np.random.normal(0, 0.08)\n gmsi_raw[t] = 0.3 + 0.65 * gmsi_raw[t-1] + shock\n # Regime jumps (simulate news spikes)\n if np.random.rand() < 0.02:\n gmsi_raw[t] += np.random.choice([-0.3, 0.3])\n\n # Clip to [0,1] and smooth slightly\n gmsi_vals = pd.Series(gmsi_raw).clip(0, 1).rolling(3, min_periods=1).mean().values\n gmsi = pd.DataFrame({\"gmsi\": gmsi_vals}, index=dates)\n\n return btc, nifty, gmsi\n\n\n# \u2500\u2500\u2500 2. Market Fragility Index (MFI) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndef compute_mfi(df, window=30):\n \"\"\"\n Market Fragility Index (MFI)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n A composite, interpretable metric of how sensitive the market is to shocks.\n\n Components (all computed over a rolling window, no future leakage):\n\n (A) Volatility Persistence = AC1(|r_t|)\n Measured as the lag-1 autocorrelation of absolute returns over [window] days.\n High AC1 \u2192 shocks do not dissipate quickly \u2192 fragile.\n\n (B) Vol-of-Vol (VoV)\n = std(rolling_vol_7d) / mean(rolling_vol_7d) over [window] days\n High VoV \u2192 volatility regime is unstable \u2192 fragile.\n\n (C) Tail Risk Frequency\n = fraction of days in [window] where |r_t| > 2\u03c3 (rolling 30d \u03c3)\n Captures how often large moves occur, independent of their sign.\n\n MFI = (A_norm + B_norm + C_norm) / 3\n Each component is min-max normalised over its own full history\n (using expanding min/max to avoid look-ahead).\n\n Interpretation:\n MFI \u2192 1 : Market is fragile; shocks tend to amplify\n MFI \u2192 0 : Market is resilient; shocks decay quickly\n \"\"\"\n results = pd.DataFrame(index=df.index)\n\n # \u2500\u2500 Component A: Volatility Persistence (AC1 of |returns|) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n abs_ret = df[\"log_return\"].abs()\n\n def rolling_ac1(series, w):\n \"\"\"Lag-1 autocorrelation of a rolling window.\"\"\"\n vals = []\n for i in range(len(series)):\n if i < w - 1:\n vals.append(np.nan)\n else:\n chunk = series.iloc[i - w + 1: i + 1].values\n if np.std(chunk) < 1e-10:\n vals.append(0.0)\n else:\n corr = np.corrcoef(chunk[:-1], chunk[1:])[0, 1]\n vals.append(np.nan_to_num(corr, nan=0.0))\n return pd.Series(vals, index=series.index)\n\n results[\"persistence\"] = rolling_ac1(abs_ret, window)\n\n # \u2500\u2500 Component B: Vol-of-Vol \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n vol7 = df[\"vol_7d\"]\n results[\"vol_of_vol\"] = (\n vol7.rolling(window).std() /\n vol7.rolling(window).mean().replace(0, np.nan)\n )\n\n # \u2500\u2500 Component C: Tail Risk Frequency \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n # 2\u03c3 threshold from 30-day rolling std (pure historical, no leakage)\n sigma_30 = df[\"log_return\"].rolling(30).std()\n is_tail = (abs_ret > 2 * sigma_30).astype(float)\n results[\"tail_freq\"] = is_tail.rolling(window).mean()\n\n # \u2500\u2500 Normalise each component (expanding min-max, no look-ahead) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for col in [\"persistence\", \"vol_of_vol\", \"tail_freq\"]:\n s = results[col]\n expanding_min = s.expanding().min()\n expanding_max = s.expanding().max()\n denom = (expanding_max - expanding_min).replace(0, np.nan)\n results[f\"{col}_norm\"] = (s - expanding_min) / denom\n\n # \u2500\u2500 Composite MFI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n norm_cols = [\"persistence_norm\", \"vol_of_vol_norm\", \"tail_freq_norm\"]\n results[\"MFI\"] = results[norm_cols].mean(axis=1)\n\n return results\n\n\n# \u2500\u2500\u2500 3. Shock Propagation Analysis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndef identify_shocks(df, quantile=0.95):\n \"\"\"\n Define shocks as days where |log_return| exceeds the [quantile] threshold.\n Uses the expanding empirical quantile to avoid look-ahead bias.\n\n Returns boolean Series: True on shock days.\n \"\"\"\n abs_ret = df[\"log_return\"].abs()\n # Expanding quantile: threshold on day t uses only data up to t-1\n threshold = abs_ret.shift(1).expanding().quantile(quantile)\n shocks = abs_ret > threshold\n return shocks, threshold\n\n\ndef compute_shock_propagation(df, shock_mask, horizons=(1, 3, 7, 14, 21)):\n \"\"\"\n For each shock day, measure forward realized volatility at t+h.\n\n Forward vol at horizon h = abs(log_return at t+h)\n (Single-day absolute return as a proxy for instantaneous vol;\n rolling average is also computed for smoothness.)\n\n Returns:\n shock_df: DataFrame of shock events with forward vol at each horizon\n summary : mean \u00b1 std forward vol by horizon\n \"\"\"\n abs_ret = df[\"log_return\"].abs()\n shock_idx = np.where(shock_mask.values)[0]\n\n records = []\n for idx in shock_idx:\n row = {\n \"shock_date\": df.index[idx],\n \"shock_mag\": abs_ret.iloc[idx],\n \"shock_date_idx\": idx,\n }\n for h in horizons:\n fwd_idx = idx + h\n if fwd_idx < len(df):\n row[f\"fwd_vol_t{h}\"] = abs_ret.iloc[fwd_idx]\n # 3-day centred rolling vol around t+h (if available)\n lo = max(0, fwd_idx - 1)\n hi = min(len(df), fwd_idx + 2)\n row[f\"fwd_rollingvol_t{h}\"] = abs_ret.iloc[lo:hi].mean()\n else:\n row[f\"fwd_vol_t{h}\"] = np.nan\n row[f\"fwd_rollingvol_t{h}\"] = np.nan\n records.append(row)\n\n shock_df = pd.DataFrame(records).set_index(\"shock_date\")\n\n # Summary: mean forward vol by horizon\n fwd_cols = [f\"fwd_vol_t{h}\" for h in horizons]\n means = shock_df[fwd_cols].mean()\n stds = shock_df[fwd_cols].std()\n summary = pd.DataFrame({\"horizon\": list(horizons),\n \"mean_fwd_vol\": means.values,\n \"std_fwd_vol\": stds.values})\n return shock_df, summary\n\n\ndef estimate_shock_halflife(summary):\n \"\"\"\n Approximate shock half-life by fitting an exponential decay to\n mean forward vol vs horizon.\n\n Model: V(h) = V_0 \u00b7 exp(-\u03bb\u00b7h)\n Half-life = ln(2) / \u03bb\n\n Returns: (lambda, half_life_days, R\u00b2)\n \"\"\"\n h_vals = np.array(summary[\"horizon\"], dtype=float)\n v_vals = np.array(summary[\"mean_fwd_vol\"], dtype=float)\n\n # Remove NaN\n mask = ~np.isnan(v_vals)\n h_vals = h_vals[mask]\n v_vals = v_vals[mask]\n\n if len(h_vals) < 3:\n return np.nan, np.nan, np.nan\n\n # Log-linear regression: log(V) = log(V_0) - \u03bb\u00b7h\n log_v = np.log(v_vals + 1e-10)\n slope, intercept, r, p, se = stats.linregress(h_vals, log_v)\n lam = -slope\n half_life = np.log(2) / lam if lam > 0 else np.inf\n r2 = r ** 2\n\n return lam, half_life, r2\n\n\n# \u2500\u2500\u2500 4. Regime Conditioning \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndef define_regimes(gmsi_series, low_q=0.20, high_q=0.80):\n \"\"\"\n Define market stress regimes from GMSI.\n\n Regime assignment uses expanding quantiles (no look-ahead):\n Low Stress: GMSI \u2264 20th percentile\n High Stress: GMSI \u2265 80th percentile\n Medium : in between\n\n Returns: Series of regime labels {'low', 'medium', 'high'}\n \"\"\"\n regimes = pd.Series(\"medium\", index=gmsi_series.index, dtype=str)\n\n for i in range(1, len(gmsi_series)):\n hist = gmsi_series.iloc[:i]\n lo = hist.quantile(low_q)\n hi = hist.quantile(high_q)\n val = gmsi_series.iloc[i]\n if val <= lo:\n regimes.iloc[i] = \"low\"\n elif val >= hi:\n regimes.iloc[i] = \"high\"\n # else stays \"medium\"\n\n return regimes\n\n\ndef regime_stats(df, regimes, mfi_df):\n \"\"\"\n Compute key statistics within each regime:\n - Mean / std of realized volatility\n - Mean MFI\n - Shock frequency\n - Shock persistence (mean AC1 of abs returns)\n \"\"\"\n combined = df[[\"log_return\", \"vol_30d\", \"abs_return\"]].copy()\n combined[\"regime\"] = regimes\n combined[\"MFI\"] = mfi_df[\"MFI\"]\n\n stats_records = []\n for regime in [\"low\", \"medium\", \"high\"]:\n mask = combined[\"regime\"] == regime\n sub = combined[mask]\n if len(sub) < 10:\n continue\n\n # Volatility persistence within regime (AC1 of abs returns)\n ac1 = sub[\"abs_return\"].autocorr(lag=1)\n\n stats_records.append({\n \"regime\": regime,\n \"n_days\": len(sub),\n \"mean_vol30d\": sub[\"vol_30d\"].mean(),\n \"std_vol30d\": sub[\"vol_30d\"].std(),\n \"mean_MFI\": sub[\"MFI\"].mean(),\n \"shock_freq\": (sub[\"abs_return\"] > sub[\"abs_return\"].quantile(0.95)).mean(),\n \"persistence_ac1\": ac1,\n })\n\n return pd.DataFrame(stats_records).set_index(\"regime\")\n\n\n# \u2500\u2500\u2500 5. Plotting Functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndef fig_mfi_over_time(df, mfi_df, regimes, asset_name):\n \"\"\"Figure 1: MFI time series with regime background shading.\"\"\"\n fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True,\n gridspec_kw={\"hspace\": 0.08})\n fig.suptitle(f\"Market Fragility Index \u2014 {asset_name}\", y=0.98, fontsize=14, color=\"#c9d1d9\")\n\n dates = df.index\n\n # \u2500\u2500 Panel 1: Price proxy (cumulative log return) \u2500\u2500\n ax1 = axes[0]\n cum_ret = df[\"log_return\"].cumsum().values\n ax1.plot(dates, cum_ret, color=COLORS[\"btc\"] if \"BTC\" in asset_name else COLORS[\"nifty\"],\n linewidth=0.9, alpha=0.9)\n ax1.set_ylabel(\"Cum. Log Return\", fontsize=9)\n ax1.set_title(\"Price Index (Cumulative Log Return)\", fontsize=10, pad=4)\n ax1.grid(True, alpha=0.3)\n\n # \u2500\u2500 Panel 2: MFI \u2500\u2500\n ax2 = axes[1]\n mfi = mfi_df[\"MFI\"].reindex(dates)\n ax2.plot(dates, mfi, color=COLORS[\"mfi\"], linewidth=1.0, alpha=0.85, label=\"MFI\")\n ax2.fill_between(dates, mfi, alpha=0.15, color=COLORS[\"mfi\"])\n ax2.axhline(0.7, color=COLORS[\"high\"], linestyle=\"--\", linewidth=0.8, alpha=0.6, label=\"High fragility (0.7)\")\n ax2.axhline(0.3, color=COLORS[\"low\"], linestyle=\"--\", linewidth=0.8, alpha=0.6, label=\"Low fragility (0.3)\")\n ax2.set_ylabel(\"MFI\", fontsize=9)\n ax2.set_ylim(0, 1)\n ax2.legend(fontsize=8, loc=\"upper left\")\n ax2.grid(True, alpha=0.3)\n\n # \u2500\u2500 Panel 3: Vol 30d with regime shading \u2500\u2500\n ax3 = axes[2]\n vol30 = df[\"vol_30d\"].reindex(dates)\n ax3.plot(dates, vol30, color=\"#c9d1d9\", linewidth=0.8, alpha=0.85)\n\n # Regime background shading\n reg_colors = {\"low\": COLORS[\"low\"], \"medium\": COLORS[\"medium\"], \"high\": COLORS[\"high\"]}\n reg_vals = regimes.reindex(dates).fillna(\"medium\")\n prev_regime = None\n seg_start = None\n for d, r in reg_vals.items():\n if r != prev_regime:\n if prev_regime is not None:\n ax3.axvspan(seg_start, d, alpha=0.12, color=reg_colors[prev_regime], linewidth=0)\n seg_start = d\n prev_regime = r\n if prev_regime:\n ax3.axvspan(seg_start, dates[-1], alpha=0.12, color=reg_colors[prev_regime], linewidth=0)\n\n ax3.set_ylabel(\"30d Volatility\", fontsize=9)\n ax3.set_xlabel(\"Date\", fontsize=9)\n patches = [Patch(color=COLORS[\"low\"], alpha=0.5, label=\"Low Stress\"),\n Patch(color=COLORS[\"medium\"], alpha=0.5, label=\"Medium Stress\"),\n Patch(color=COLORS[\"high\"], alpha=0.5, label=\"High Stress\")]\n ax3.legend(handles=patches, fontsize=8, loc=\"upper right\")\n ax3.grid(True, alpha=0.3)\n\n plt.tight_layout()\n path = f\"{SAVE_DIR}/fig1_mfi_{asset_name.lower()}.png\"\n plt.savefig(path, dpi=150, bbox_inches=\"tight\")\n print(f\" Saved: {path}\")\n return fig\n\n\ndef fig_shock_decay(shock_summary_list, labels):\n \"\"\"Figure 2: Shock propagation / decay curves per asset.\"\"\"\n fig, ax = plt.subplots(figsize=(10, 5))\n colors = [COLORS[\"btc\"], COLORS[\"nifty\"], COLORS[\"accent\"]]\n\n for i, (summary, label) in enumerate(zip(shock_summary_list, labels)):\n h = summary[\"horizon\"].values\n mean = summary[\"mean_fwd_vol\"].values\n std = summary[\"std_fwd_vol\"].values\n c = colors[i % len(colors)]\n ax.plot(h, mean, \"o-\", color=c, label=label, linewidth=1.5, markersize=5)\n ax.fill_between(h, mean - 0.5*std, mean + 0.5*std, alpha=0.15, color=c)\n\n ax.set_xlabel(\"Days After Shock\", fontsize=10)\n ax.set_ylabel(\"Mean Forward Absolute Return\", fontsize=10)\n ax.set_title(\"Shock Propagation: Forward Volatility Decay After Top-5% Events\", fontsize=11)\n ax.legend(fontsize=9)\n ax.grid(True, alpha=0.3)\n\n path = f\"{SAVE_DIR}/fig2_shock_decay.png\"\n plt.savefig(path, dpi=150, bbox_inches=\"tight\")\n print(f\" Saved: {path}\")\n return fig\n\n\ndef fig_regime_shock_response(df, shock_df, regimes, asset_name, horizons=(1, 3, 7, 14)):\n \"\"\"\n Figure 3: Shock response separated by regime.\n Bar chart: mean forward vol at each horizon, grouped by regime.\n \"\"\"\n # Align regimes to shock events\n shock_dates = shock_df.index\n shock_regimes = regimes.reindex(shock_dates).fillna(\"medium\")\n\n fig, axes = plt.subplots(1, len(horizons), figsize=(14, 5), sharey=True)\n fig.suptitle(f\"Shock Response by Regime \u2014 {asset_name}\", fontsize=13, color=\"#c9d1d9\")\n\n regime_order = [\"low\", \"medium\", \"high\"]\n regime_colors = [COLORS[\"low\"], COLORS[\"medium\"], COLORS[\"high\"]]\n\n for i, h in enumerate(horizons):\n ax = axes[i]\n col = f\"fwd_vol_t{h}\"\n if col not in shock_df.columns:\n continue\n\n means = []\n stds = []\n ns = []\n for r in regime_order:\n mask = shock_regimes == r\n vals = shock_df.loc[mask, col].dropna()\n means.append(vals.mean() if len(vals) > 0 else 0)\n stds.append(vals.std() if len(vals) > 1 else 0)\n ns.append(len(vals))\n\n bars = ax.bar(regime_order, means, color=regime_colors, alpha=0.75,\n edgecolor=\"#30363d\", linewidth=0.5)\n ax.errorbar(regime_order, means, yerr=[s/2 for s in stds],\n fmt=\"none\", color=\"#c9d1d9\", capsize=4, linewidth=1.2)\n\n # Add N labels\n for bar, n in zip(bars, ns):\n ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() * 1.02,\n f\"n={n}\", ha=\"center\", va=\"bottom\", fontsize=7.5, color=\"#8b949e\")\n\n ax.set_title(f\"t+{h} days\", fontsize=10)\n ax.set_xlabel(\"Regime\", fontsize=8)\n if i == 0:\n ax.set_ylabel(\"Mean |Return|\", fontsize=9)\n ax.grid(True, alpha=0.3, axis=\"y\")\n\n plt.tight_layout()\n path = f\"{SAVE_DIR}/fig3_regime_shock_{asset_name.lower()}.png\"\n plt.savefig(path, dpi=150, bbox_inches=\"tight\")\n print(f\" Saved: {path}\")\n return fig\n\n\ndef fig_mfi_by_regime(regime_stats_df, asset_name):\n \"\"\"Figure 4: MFI distribution across regimes (violin/box-style summary).\"\"\"\n fig, axes = plt.subplots(1, 3, figsize=(12, 5))\n fig.suptitle(f\"Regime Statistics \u2014 {asset_name}\", fontsize=13, color=\"#c9d1d9\")\n\n metrics = [\n (\"mean_vol30d\", \"Mean Volatility (30d)\"),\n (\"mean_MFI\", \"Mean MFI\"),\n (\"persistence_ac1\", \"Vol Persistence (AC1)\"),\n ]\n\n regime_order = [r for r in [\"low\", \"medium\", \"high\"] if r in regime_stats_df.index]\n regime_colors = {\"low\": COLORS[\"low\"], \"medium\": COLORS[\"medium\"], \"high\": COLORS[\"high\"]}\n\n for ax, (col, title) in zip(axes, metrics):\n vals = [regime_stats_df.loc[r, col] if r in regime_stats_df.index else 0\n for r in regime_order]\n colors = [regime_colors[r] for r in regime_order]\n bars = ax.bar(regime_order, vals, color=colors, alpha=0.8,\n edgecolor=\"#30363d\", linewidth=0.5)\n ax.set_title(title, fontsize=10)\n ax.set_xlabel(\"Regime\", fontsize=8)\n ax.grid(True, alpha=0.3, axis=\"y\")\n\n for bar, v in zip(bars, vals):\n ax.text(bar.get_x() + bar.get_width()/2,\n bar.get_height() * 1.02 if v >= 0 else bar.get_height() - abs(v)*0.05,\n f\"{v:.3f}\", ha=\"center\", va=\"bottom\", fontsize=8.5, color=\"#c9d1d9\")\n\n plt.tight_layout()\n path = f\"{SAVE_DIR}/fig4_regime_stats_{asset_name.lower()}.png\"\n plt.savefig(path, dpi=150, bbox_inches=\"tight\")\n print(f\" Saved: {path}\")\n return fig\n\n\ndef fig_mfi_components(mfi_df, asset_name):\n \"\"\"Figure 5: Individual MFI component time series (decomposition).\"\"\"\n fig, axes = plt.subplots(3, 1, figsize=(14, 9), sharex=True,\n gridspec_kw={\"hspace\": 0.08})\n fig.suptitle(f\"MFI Component Decomposition \u2014 {asset_name}\", fontsize=13, color=\"#c9d1d9\")\n\n components = [\n (\"persistence_norm\", \"A: Volatility Persistence (AC1 of |r|)\", COLORS[\"btc\"]),\n (\"vol_of_vol_norm\", \"B: Vol-of-Vol (CoV of 7d vol)\", COLORS[\"accent\"]),\n (\"tail_freq_norm\", \"C: Tail Risk Frequency (|r| > 2\u03c3)\", COLORS[\"high\"]),\n ]\n\n for ax, (col, label, color) in zip(axes, components):\n if col in mfi_df.columns:\n ax.plot(mfi_df.index, mfi_df[col], color=color, linewidth=0.9, alpha=0.85)\n ax.fill_between(mfi_df.index, mfi_df[col], alpha=0.12, color=color)\n ax.set_ylabel(label, fontsize=8.5)\n ax.set_ylim(0, 1)\n ax.grid(True, alpha=0.3)\n\n axes[-1].set_xlabel(\"Date\", fontsize=9)\n plt.tight_layout()\n path = f\"{SAVE_DIR}/fig5_mfi_components_{asset_name.lower()}.png\"\n plt.savefig(path, dpi=150, bbox_inches=\"tight\")\n print(f\" Saved: {path}\")\n return fig\n\n\n# \u2500\u2500\u2500 6. Statistical Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndef regime_significance_tests(df, regimes, col=\"vol_30d\"):\n \"\"\"\n Test whether distributions of [col] differ significantly across regimes.\n Uses Kruskal-Wallis (non-parametric, appropriate for financial data).\n Also reports Mann-Whitney U for pairwise comparisons.\n \"\"\"\n print(f\"\\n Statistical Significance Tests for '{col}' across regimes:\")\n print(\" \" + \"\u2500\" * 55)\n\n groups = {}\n for r in [\"low\", \"medium\", \"high\"]:\n mask = regimes == r\n groups[r] = df.loc[mask, col].dropna().values\n\n # Kruskal-Wallis\n try:\n stat, p = kruskal(*[groups[r] for r in groups if len(groups[r]) > 0])\n print(f\" Kruskal-Wallis H={stat:.3f}, p={p:.4f} \"\n f\"{'\u2705 Significant' if p < 0.05 else '\u274c Not significant'}\")\n except Exception as e:\n print(f\" Kruskal-Wallis failed: {e}\")\n\n # Pairwise Mann-Whitney\n pairs = [(\"low\", \"high\"), (\"low\", \"medium\"), (\"medium\", \"high\")]\n for r1, r2 in pairs:\n if len(groups.get(r1, [])) < 3 or len(groups.get(r2, [])) < 3:\n continue\n try:\n stat, p = mannwhitneyu(groups[r1], groups[r2], alternative=\"two-sided\")\n print(f\" Mann-Whitney [{r1} vs {r2}]: U={stat:.0f}, p={p:.4f} \"\n f\"{'\u2705' if p < 0.05 else '\u274c'}\")\n except Exception as e:\n print(f\" Mann-Whitney [{r1} vs {r2}] failed: {e}\")\n\n\n# \u2500\u2500\u2500 7. Main Analysis Pipeline \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndef run_analysis(df_market, gmsi_df, asset_name):\n \"\"\"\n Full analysis pipeline for one asset.\n\n Steps:\n 1. Align market data with GMSI\n 2. Compute MFI\n 3. Define regimes\n 4. Identify shocks\n 5. Shock propagation\n 6. Regime conditioning\n 7. Statistical tests\n 8. Plots\n Returns: dict of all computed artifacts\n \"\"\"\n print(f\"\\n{'='*65}\")\n print(f\" ANALYSIS: {asset_name}\")\n print(f\"{'='*65}\")\n print(f\" Market data: {len(df_market)} rows ({df_market.index[0].date()} \u2192 {df_market.index[-1].date()})\")\n\n # \u2500\u2500 Step 1: Align \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n common_idx = df_market.index.intersection(gmsi_df.index)\n if len(common_idx) < 100:\n print(f\" \u26a0\ufe0f Only {len(common_idx)} overlapping dates with GMSI \u2014 using market-only dates\")\n # Forward-fill GMSI or use neutral value if no overlap\n gmsi_aligned = pd.Series(0.5, index=df_market.index, name=\"gmsi\")\n else:\n gmsi_aligned = gmsi_df[\"gmsi\"].reindex(df_market.index).ffill()\n print(f\" Aligned: {len(common_idx)} dates\")\n\n # \u2500\u2500 Step 2: MFI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(f\"\\n [1/5] Computing Market Fragility Index...\")\n mfi_df = compute_mfi(df_market, window=30)\n print(f\" MFI range: [{mfi_df['MFI'].min():.3f}, {mfi_df['MFI'].max():.3f}]\")\n print(f\" Mean MFI : {mfi_df['MFI'].mean():.3f}\")\n\n # \u2500\u2500 Step 3: Regimes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(f\"\\n [2/5] Defining Regimes from GMSI...\")\n regimes = define_regimes(gmsi_aligned)\n rc = regimes.value_counts()\n for r in [\"low\", \"medium\", \"high\"]:\n n = rc.get(r, 0)\n print(f\" {r:8s}: {n:5d} days ({100*n/len(regimes):.1f}%)\")\n\n # \u2500\u2500 Step 4: Shocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(f\"\\n [3/5] Identifying Shocks (top 5% abs returns)...\")\n shock_mask, threshold = identify_shocks(df_market, quantile=0.95)\n n_shocks = shock_mask.sum()\n print(f\" Shocks identified: {n_shocks} ({100*n_shocks/len(df_market):.1f}% of days)\")\n\n # \u2500\u2500 Step 5: Propagation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(f\"\\n [4/5] Computing Shock Propagation...\")\n horizons = (1, 3, 7, 14, 21)\n shock_df, summary = compute_shock_propagation(df_market, shock_mask, horizons=horizons)\n lam, halflife, r2 = estimate_shock_halflife(summary)\n print(f\" Shock half-life : {halflife:.1f} days (\u03bb={lam:.4f}, R\u00b2={r2:.3f})\")\n print(f\" Forward vol at t+1: {summary.loc[summary.horizon==1,'mean_fwd_vol'].values[0]:.4f}\")\n print(f\" Forward vol at t+14: {summary.loc[summary.horizon==14,'mean_fwd_vol'].values[0]:.4f}\")\n\n # \u2500\u2500 Step 6: Regime Stats \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(f\"\\n [5/5] Regime-Conditioned Statistics...\")\n rstats = regime_stats(df_market, regimes, mfi_df)\n print(rstats.to_string())\n\n # \u2500\u2500 Statistical Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n df_aligned = df_market.copy()\n df_aligned[\"regime\"] = regimes\n regime_significance_tests(df_aligned, regimes, col=\"vol_30d\")\n regime_significance_tests(df_aligned, regimes, col=\"abs_return\")\n\n # \u2500\u2500 Plots \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(f\"\\n Generating plots...\")\n plt.close(\"all\")\n fig1 = fig_mfi_over_time(df_market, mfi_df, regimes, asset_name)\n fig2 = fig_shock_decay([summary], [asset_name]) # single asset; multi-asset done later\n fig3 = fig_regime_shock_response(df_market, shock_df, regimes, asset_name)\n fig4 = fig_mfi_by_regime(rstats, asset_name)\n fig5 = fig_mfi_components(mfi_df, asset_name)\n plt.close(\"all\")\n\n return {\n \"asset\": asset_name,\n \"df\": df_market,\n \"mfi_df\": mfi_df,\n \"regimes\": regimes,\n \"shock_df\": shock_df,\n \"summary\": summary,\n \"rstats\": rstats,\n \"halflife\": halflife,\n \"lambda\": lam,\n }\n\n\ndef run_comparative_shock_plot(results_list):\n \"\"\"Figure 6: Side-by-side shock decay for all assets.\"\"\"\n summaries = [r[\"summary\"] for r in results_list]\n labels = [r[\"asset\"] for r in results_list]\n fig = fig_shock_decay(summaries, labels)\n path = f\"{SAVE_DIR}/fig6_shock_decay_comparison.png\"\n fig.savefig(path, dpi=150, bbox_inches=\"tight\")\n print(f\" Saved: {path}\")\n plt.close(\"all\")\n\n\ndef print_interpretation(results):\n \"\"\"Print plain-English scientific interpretation of results.\"\"\"\n r = results\n print(f\"\"\"\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 SCIENTIFIC INTERPRETATION \u2014 {r['asset']:<33} \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n\n1. MARKET FRAGILITY INDEX (MFI)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n The MFI captures three independent dimensions of fragility:\n A. Volatility Persistence: high AC1 of |returns| \u2192 shocks self-reinforce\n B. Vol-of-Vol: erratic volatility \u2192 regime instability\n C. Tail Frequency: clustering of large moves \u2192 non-Gaussian risk\n\n Mean MFI = {r['mfi_df']['MFI'].mean():.3f}\n \u2192 {'Elevated fragility. Market was frequently in states where '\n 'shocks could amplify.' if r['mfi_df']['MFI'].mean() > 0.55\n else 'Moderate fragility. Most of the sample was in recoverable regimes.'}\n\n2. SHOCK PROPAGATION\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Shock half-life \u2248 {r['halflife']:.1f} days\n \u2192 Shocks {'persist for several weeks \u2014 evidence of slow information '\n 'absorption or liquidity constraints.' if r['halflife'] > 10\n else 'decay within roughly 1\u20132 weeks \u2014 markets absorb news relatively fast.'}\n\n This is NOT prediction \u2014 it describes the structural dynamics of how\n information and risk flow through the market.\n\n3. REGIME BEHAVIOR\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Key cross-regime differences:\n{r['rstats'][['mean_vol30d','mean_MFI','persistence_ac1']].to_string()}\n\n Interpretation:\n \u2192 If MFI is HIGHER in low-stress regimes: markets become complacent\n and accumulate hidden fragility during quiet periods. Shocks then\n hit hard precisely because participants are under-positioned for risk.\n \u2192 If MFI is HIGHER in high-stress regimes: markets remain aware of\n their fragility and may actually recover faster (vol compression\n after risk-off events).\n\n4. CORE INSIGHT\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Markets are not driven directly by stress or news content, but by\n how information INTERACTS with current fragility levels, positioning,\n and liquidity. A given shock will have very different impact depending\n on the structural state the market is in when it arrives.\n\"\"\")\n\n\n# \u2500\u2500\u2500 8. Entry Point \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nif __name__ == \"__main__\":\n print(\"\\n\" + \"=\"*65)\n print(\" MARKET DYNAMICS ANALYSIS\")\n print(\" Phase 2: Fragility \u00b7 Shock Propagation \u00b7 Regime Dynamics\")\n print(\"=\"*65)\n\n # \u2500\u2500 Load data \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(\"\\n[LOADING DATA]\")\n raw = load_or_generate_data()\n\n # \u2500\u2500 Resolve: use real data if available, else synthetic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if all(v is None for v in raw.values()):\n print(\"\\n All files missing \u2192 generating full synthetic dataset\")\n btc_df, nifty_df, gmsi_df = generate_synthetic_data()\n else:\n btc_df, nifty_df, gmsi_df = raw.get(\"btc\"), raw.get(\"nifty\"), raw.get(\"gmsi\")\n\n if gmsi_df is None:\n print(\" \u26a0\ufe0f GMSI not found \u2014 generating synthetic GMSI\")\n n = max(len(btc_df) if btc_df is not None else 0,\n len(nifty_df) if nifty_df is not None else 0)\n dates = (btc_df if btc_df is not None else nifty_df).index\n _, _, gmsi_df = generate_synthetic_data()\n gmsi_df = gmsi_df.reindex(dates).ffill().bfill()\n\n if btc_df is None:\n print(\" \u26a0\ufe0f BTC data not found \u2014 generating synthetic BTC\")\n btc_df, _, _ = generate_synthetic_data()\n\n if nifty_df is None:\n print(\" \u26a0\ufe0f NIFTY data not found \u2014 generating synthetic NIFTY\")\n _, nifty_df, _ = generate_synthetic_data()\n\n # Ensure required columns exist\n for df, name in [(btc_df, \"BTC\"), (nifty_df, \"NIFTY\")]:\n if \"log_return\" not in df.columns and \"Close\" in df.columns:\n df[\"log_return\"] = np.log(df[\"Close\"] / df[\"Close\"].shift(1))\n print(f\" Computed log_return for {name} from Close prices\")\n if \"abs_return\" not in df.columns:\n df[\"abs_return\"] = df[\"log_return\"].abs()\n for w in [7, 14, 30]:\n col = f\"vol_{w}d\"\n if col not in df.columns:\n df[col] = df[\"log_return\"].rolling(w).std() * np.sqrt(252)\n df.dropna(subset=[\"log_return\"], inplace=True)\n\n # \u2500\u2500 Run analysis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(\"\\n[RUNNING ANALYSIS]\")\n btc_results = run_analysis(btc_df.copy(), gmsi_df, asset_name=\"BTC\")\n nifty_results = run_analysis(nifty_df.copy(), gmsi_df, asset_name=\"NIFTY\")\n\n # \u2500\u2500 Comparative plot \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print(\"\\n[COMPARATIVE PLOTS]\")\n run_comparative_shock_plot([btc_results, nifty_results])\n\n # \u2500\u2500 Interpretations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n print_interpretation(btc_results)\n print_interpretation(nifty_results)\n\n print(f\"\\n{'='*65}\")\n print(f\" OUTPUT FILES \u2192 {SAVE_DIR}/\")\n print(f\" fig1_mfi_*.png : MFI time series + regime background\")\n print(f\" fig2_shock_decay.png : Forward vol decay after shocks\")\n print(f\" fig3_regime_shock_*.png : Shock response by regime\")\n print(f\" fig4_regime_stats_*.png : Regime-level summary statistics\")\n print(f\" fig5_mfi_components_* : MFI component decomposition\")\n print(f\" fig6_shock_decay_*.png : BTC vs NIFTY shock decay comparison\")\n print(f\"{'='*65}\\n\")\n" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "---\n## Run the Analysis\n\nThe cell below runs the full pipeline. If your data files are in `data/processed/`, they will be loaded automatically. Otherwise synthetic demo data is used." - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": "# \u2500\u2500 Load data \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nraw = load_or_generate_data()\n\nif all(v is None for v in raw.values()):\n print(\"No data files found \u2192 using synthetic demo data\")\n btc_df, nifty_df, gmsi_df = generate_synthetic_data()\nelse:\n btc_df = raw.get(\"btc\")\n nifty_df = raw.get(\"nifty\")\n gmsi_df = raw.get(\"gmsi\")\n\n # Generate missing components\n if gmsi_df is None:\n _, _, gmsi_df = generate_synthetic_data()\n print(\"\u26a0\ufe0f GMSI not found \u2014 using synthetic GMSI\")\n if btc_df is None:\n btc_df, _, _ = generate_synthetic_data()\n print(\"\u26a0\ufe0f BTC not found \u2014 using synthetic BTC\")\n if nifty_df is None:\n _, nifty_df, _ = generate_synthetic_data()\n print(\"\u26a0\ufe0f NIFTY not found \u2014 using synthetic NIFTY\")\n\n # Ensure required columns exist (handles various column naming conventions)\n for df, name in [(btc_df, \"BTC\"), (nifty_df, \"NIFTY\")]:\n if \"log_return\" not in df.columns and \"Close\" in df.columns:\n df[\"log_return\"] = np.log(df[\"Close\"] / df[\"Close\"].shift(1))\n print(f\" Computed log_return for {name} from Close prices\")\n if \"abs_return\" not in df.columns:\n df[\"abs_return\"] = df[\"log_return\"].abs()\n for w in [7, 14, 30]:\n col = f\"vol_{w}d\"\n if col not in df.columns:\n df[col] = df[\"log_return\"].rolling(w).std() * np.sqrt(252)\n df.dropna(subset=[\"log_return\"], inplace=True)\n\nprint(f\"BTC: {len(btc_df)} rows\")\nprint(f\"NIFTY: {len(nifty_df)} rows\")\nprint(f\"GMSI: {len(gmsi_df)} rows\")" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "### BTC Analysis" - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": "btc_results = run_analysis(btc_df.copy(), gmsi_df, asset_name='BTC')" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "### NIFTY Analysis" - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": "nifty_results = run_analysis(nifty_df.copy(), gmsi_df, asset_name='NIFTY')" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "### Comparative: BTC vs NIFTY Shock Decay" - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": "run_comparative_shock_plot([btc_results, nifty_results]);" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "## Scientific Interpretations" - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": "print_interpretation(btc_results)\nprint_interpretation(nifty_results)" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "---\n## Summary: What We Learned\n\n| Question | Answer |\n|----------|--------|\n| **Why do markets become volatile?** | MFI captures the buildup of structural fragility \u2014 persistence of shocks, instability of vol regime, and clustering of tail events |\n| **When do shocks amplify vs decay?** | Estimated from shock half-life. Low MFI \u2192 fast decay. High MFI \u2192 slow decay / amplification |\n| **What conditions make markets fragile?** | Complacency (low-stress + under-positioning) raises hidden MFI. Shocks hit hardest when least expected |\n| **Role of GMSI?** | Not a direct driver \u2014 GMSI interacts with fragility. The same news event has very different impact depending on current MFI level |\n\n## Next Steps\n- [ ] Fit Hawkes process to shock arrivals (self-exciting dynamics)\n- [ ] MFI as a conditioning variable in volatility forecasting\n- [ ] Cross-asset shock transmission (BTC \u2192 NIFTY or vice versa)\n- [ ] Rolling shock half-life as a real-time fragility signal\n" - } - ] -} \ No newline at end of file diff --git a/notebooks/09_VSI_Long_v2.ipynb b/notebooks/09_VSI_Long_v2.ipynb index 2596910..5b6c137 100644 --- a/notebooks/09_VSI_Long_v2.ipynb +++ b/notebooks/09_VSI_Long_v2.ipynb @@ -1,5 +1,18 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - VSI multiplies sentiment by volatility weights, so it is mechanically correlated with volatility\n", + "> - monthly Google Trends values are forward-filled from day 1 of the month (up to ~1 month look-ahead)\n", + "> - bootstrap (cell 34) is unseeded; Granger / quantile regressions run on ~60 rows" + ] + }, { "metadata": {}, "cell_type": "markdown", diff --git a/notebooks/10_vsi_variants.ipynb b/notebooks/10_vsi_variants.ipynb index 701d8f1..ae9bf66 100644 --- a/notebooks/10_vsi_variants.ipynb +++ b/notebooks/10_vsi_variants.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - **FIXED:** missing `import numpy as np` before first use; cell 17 echoed the BTC result instead of NIFTY\n", + "> - bootstrap (cell 13) unseeded" + ] + }, { "cell_type": "code", "id": "initial_id", @@ -12,6 +24,7 @@ }, "source": [ "\n", + "import numpy as np\n", "import pandas as pd\n", "from scipy.stats import zscore" ], @@ -592,7 +605,7 @@ " max_lag=10\n", ")\n", "\n", - "btc_ll_corr" + "nifty_ll_corr" ], "id": "d86c36a358d4b21f", "outputs": [ diff --git a/notebooks/11_event_detection_and_labeling.ipynb b/notebooks/11_event_detection_and_labeling.ipynb index c0561a2..5019eae 100644 --- a/notebooks/11_event_detection_and_labeling.ipynb +++ b/notebooks/11_event_detection_and_labeling.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - **FIXED:** `EventRootCode` was parsed as int and compared with strings, so `conflict/economic/political_events` were always 0 (see cell 20 `describe`). Now read as zero-padded strings\n", + "> - cells 34-37: the relevance filter matched 0 events (the event aggregate has no theme columns)" + ] + }, { "metadata": {}, "cell_type": "markdown", @@ -718,9 +730,11 @@ "source": [ "def aggregate_event_file(fp):\n", " try:\n", - " df = pd.read_csv(fp)\n", + " df = pd.read_csv(fp, dtype={\"EventRootCode\": str})\n", " if df.empty:\n", " return None\n", + " # root codes are 2-char strings (\"01\"..\"20\"); parsed as int they never matched the lists below\n", + " df[\"EventRootCode\"] = df[\"EventRootCode\"].str.zfill(2)\n", "\n", " date = fp.split(\"_\")[-1].replace(\".csv\", \"\")\n", "\n", diff --git a/notebooks/12_feature_engineering.ipynb b/notebooks/12_feature_engineering.ipynb index a755331..8ce9993 100644 --- a/notebooks/12_feature_engineering.ipynb +++ b/notebooks/12_feature_engineering.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - GMSI v0: `StandardScaler` fit on the full 2015-2025 sample (look-ahead) and includes three all-zero event columns. Superseded by `scripts/reconstruct_gmsi.py` (expanding z-scores)\n", + "> - single-shuffle 'placebo' is not a test" + ] + }, { "cell_type": "code", "id": "initial_id", diff --git a/notebooks/13_gmsi_validation.ipynb b/notebooks/13_gmsi_validation.ipynb index 0b2baee..6c0a167 100644 --- a/notebooks/13_gmsi_validation.ipynb +++ b/notebooks/13_gmsi_validation.ipynb @@ -1,5 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ARCHIVED EXPLORATORY NOTEBOOK** — kept for provenance. Maintained code lives in `pipeline/`, `scripts/` and `run_pipeline.py` (start at `docs/README.md`).\n", + "> Saved outputs below come from the ORIGINAL run and predate the fixes listed here; the notebook has not been re-run since (its `data/processed/` inputs are not committed). Full audit: `docs/ISSUES.md`.\n", + ">\n", + "> **Known issues / fixes:**\n", + "> - validates VSI, which contains volatility — the 0.92 / 0.96 correlations are mechanical\n", + "> - the i.i.d.-shuffle placebo is invalid for autocorrelated series; see `pipeline/stats.py`" + ] + }, { "cell_type": "markdown", "id": "ed3ef7a3f4fc3d1f", diff --git a/pipeline/data.py b/pipeline/data.py new file mode 100644 index 0000000..9ab44d6 --- /dev/null +++ b/pipeline/data.py @@ -0,0 +1,45 @@ +"""pipeline/data.py — repo paths and validated loaders for the committed price files.""" +from __future__ import annotations + +from pathlib import Path + +import pandas as pd + +ROOT = Path(__file__).resolve().parents[1] +RAW = ROOT / "data" / "raw" +MODELS = ROOT / "models" +DASHBOARD_DATA = ROOT / "dashboard" / "data" +FIGURES = ROOT / "reports" / "figures" +ASSETS = ("BTC", "NIFTY") + +REQUIRED_PRICE_COLUMNS = {"date", "open", "high", "low", "close", "volume"} + + +def price_path(asset: str) -> Path: + asset = asset.upper() + if asset not in ASSETS: + raise ValueError(f"Unknown asset {asset!r}; expected one of {ASSETS}") + return RAW / f"{asset.lower()}_prices.csv" + + +def load_prices(asset: str) -> pd.DataFrame: + """Load data/raw/_prices.csv, validate it, return it sorted by date.""" + path = price_path(asset) + if not path.exists(): + raise FileNotFoundError(f"{path} not found — run notebooks/01_data_collection.ipynb or " + "`python data_pipeline/fetch_all.py --source yfinance`.") + df = pd.read_csv(path, parse_dates=["date"]) + missing = REQUIRED_PRICE_COLUMNS - set(df.columns) + if missing: + raise ValueError(f"{path.name} is missing columns {sorted(missing)}") + df = df.sort_values("date").reset_index(drop=True) + if df["date"].duplicated().any(): + raise ValueError(f"{path.name} has duplicate dates") + if (df["close"] <= 0).any() or df["close"].isna().any(): + raise ValueError(f"{path.name} has non-positive or missing closes") + return df + + +def load_close(asset: str) -> pd.Series: + df = load_prices(asset) + return df.set_index("date")["close"].rename(asset.upper()) diff --git a/pipeline/dataset_builder.py b/pipeline/dataset_builder.py deleted file mode 100644 index 033c567..0000000 --- a/pipeline/dataset_builder.py +++ /dev/null @@ -1,24 +0,0 @@ -# pipeline/dataset_builder.py - -from sklearn.model_selection import train_test_split - -FEATURES = [ - "finbert_score", - "vader_score", - "abs_return", - "sq_return", - "vol_5", - "vol_22", - "vol_60", - "sent_vol" -] - -TARGET = "log_vol" - -def build_dataset(df, test_size=0.2): - X = df[FEATURES] - y = df[TARGET] - - return train_test_split( - X, y, test_size=test_size, shuffle=False - ) diff --git a/pipeline/evaluate.py b/pipeline/evaluate.py index 19f78d6..ff4fc67 100644 --- a/pipeline/evaluate.py +++ b/pipeline/evaluate.py @@ -1,26 +1,30 @@ -import pandas as pd +"""pipeline/evaluate.py — reporting helpers for the (archived) sentiment Random Forest.""" +import matplotlib +matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np +import pandas as pd + +from pipeline.data import FIGURES -def plot_predictions(y_test, y_pred_log, asset="BTC", n=100): - actual = np.exp(y_test.values[:n]) - predicted = np.exp(y_pred_log[:n]) - plt.figure(figsize=(12,4)) +def plot_predictions(y_test, y_pred_log, asset="BTC", n=100): + actual = np.exp(np.asarray(y_test)[:n]) + predicted = np.exp(np.asarray(y_pred_log)[:n]) + plt.figure(figsize=(12, 4)) plt.plot(actual, label="Actual") plt.plot(predicted, label="Predicted (RF)") plt.title(f"{asset} — Sentiment-Aware Volatility Forecast") plt.legend() - plt.show() + FIGURES.mkdir(parents=True, exist_ok=True) + path = FIGURES / f"legacy_sentiment_rf_{asset.lower()}.png" + plt.savefig(path, dpi=100, bbox_inches="tight") + plt.close() + return path def feature_importance(model, features): - imp = pd.Series( - model.feature_importances_, - index=features - ).sort_values(ascending=False) - - print("\n📌 Feature Importance") + imp = pd.Series(model.feature_importances_, index=features).sort_values(ascending=False) + print("\nFeature importance (impurity, training data):") print(imp) - return imp diff --git a/pipeline/feature_engineering.py b/pipeline/feature_engineering.py index d5cb8c1..952ee3a 100644 --- a/pipeline/feature_engineering.py +++ b/pipeline/feature_engineering.py @@ -1,56 +1,52 @@ +""" +pipeline/feature_engineering.py — features for the (archived) sentiment-augmented +Random Forest experiment. See docs/MODEL_REPORT.md for why it was archived: +sentiment only exists for ~3 months (2024-10 → 2025-01), i.e. ~13 usable rows. + +Fixes vs the original: + * rows are dropped only for NaNs in the columns actually used (the original + `df.dropna()` also dropped the 59 warm-up rows of the unused `vol_60`, taking + 75 aligned rows down to ~11) + * the target is documented correctly: std of the NEXT `target_horizon` log returns +""" import numpy as np +FEATURES = [ + "finbert_score", "vader_score", + "finbert_surprise", "vader_surprise", + "abs_return", "sq_return", + "sent_x_vol5", "sent_x_vol22", "sent_x_absret", +] +TARGET = "log_vol_target" + + def build_features(df, target_horizon=5): """ - df must contain: - - date - - return - - finbert_score - - vader_score + df must contain: date, return (daily LOG return), finbert_score, vader_score. + Returns (X, y, FEATURES). """ - df = df.sort_values("date").reset_index(drop=True) - # Volatility memory + # Volatility memory (trailing windows, known at the close of day t) df["vol_5"] = df["return"].rolling(5).std() df["vol_22"] = df["return"].rolling(22).std() - df["vol_60"] = df["return"].rolling(60).std() - # Target: next-day volatility - df["vol_target"] = df["return"].rolling(5).std().shift(-target_horizon) - df["log_vol_target"] = np.log(df["vol_target"] + 1e-6) + # Target: std of r[t+1 .. t+target_horizon] — NOT "next-day" volatility + df["vol_target"] = df["return"].rolling(target_horizon).std().shift(-target_horizon) + df[TARGET] = np.log(df["vol_target"] + 1e-6) # Price dynamics df["abs_return"] = np.abs(df["return"]) df["sq_return"] = df["return"] ** 2 - # Sentiment surprise - df["finbert_surprise"] = ( - df["finbert_score"] - df["finbert_score"].rolling(5).mean() - ) - df["vader_surprise"] = ( - df["vader_score"] - df["vader_score"].rolling(5).mean() - ) + # Sentiment surprise: today's tone minus its trailing 5-day mean + df["finbert_surprise"] = df["finbert_score"] - df["finbert_score"].rolling(5).mean() + df["vader_surprise"] = df["vader_score"] - df["vader_score"].rolling(5).mean() # Sentiment interactions df["sent_x_vol5"] = df["finbert_score"] * df["vol_5"] df["sent_x_vol22"] = df["finbert_score"] * df["vol_22"] df["sent_x_absret"] = df["finbert_score"] * df["abs_return"] - df = df.dropna().reset_index(drop=True) - - FEATURES = [ - "finbert_score", "vader_score", - "finbert_surprise", "vader_surprise", - "abs_return", "sq_return", - #"vol_5", "vol_22", "vol_60", - "sent_x_vol5", "sent_x_vol22", "sent_x_absret" - ] - - X = df[FEATURES] - y = df["log_vol_target"] - - print("Target variance:", y.var()) - print(y.describe()) - - return X, y, FEATURES + df = df.dropna(subset=FEATURES + [TARGET]).reset_index(drop=True) + return df[FEATURES], df[TARGET], FEATURES diff --git a/pipeline/market_dynamics.py b/pipeline/market_dynamics.py new file mode 100644 index 0000000..ab0730c --- /dev/null +++ b/pipeline/market_dynamics.py @@ -0,0 +1,95 @@ +""" +pipeline/market_dynamics.py — Market Fragility Index (MFI), shock propagation +and regime helpers, computed on REAL prices only. + +Ported from scripts/08_market_dynamics_analysis.py with these corrections +(docs/ISSUES.md): + * no synthetic fallback — callers pass real data or get an error (P0-2) + * shocks need a 250-day burn-in before the expanding 95% threshold is trusted + (the original threshold on day 2 was computed from 1 observation) + * shock curves are reported against the unconditional mean |r| with 95% CIs, + instead of mean ± 0.5 sd and a 5-point "half-life" fit (P1-16) + * regime autocorrelation uses only consecutive days inside one regime spell + (the original paired the last day of one spell with the first day of the + next, weeks apart — P1-10) + * regime thresholds use expanding (past-only) quantiles (P1-3) +""" +from __future__ import annotations + +import numpy as np +import pandas as pd + +MFI_WINDOW = 30 +SHOCK_QUANTILE = 0.95 +SHOCK_BURN_IN = 250 +HORIZONS = (1, 3, 7, 14, 21) + + +def _expanding_minmax(s: pd.Series) -> pd.Series: + lo, hi = s.expanding().min(), s.expanding().max() + return (s - lo) / (hi - lo).replace(0, np.nan) + + +def compute_mfi(log_return: pd.Series, window: int = MFI_WINDOW) -> pd.DataFrame: + """MFI = mean of three expanding-min-max-normalised rolling components: + + A persistence lag-1 autocorrelation of |r| within the last `window` days (window-1 pairs) + B vol-of-vol std/mean of the 7-day rolling vol over `window` days + C tail freq. share of the last `window` days with |r| > 2 × trailing 30-day std + Everything uses data up to and including day t only. + """ + r = log_return.astype("float64") + a = r.abs() + out = pd.DataFrame(index=r.index) + persistence = a.rolling(window - 1).corr(a.shift(1)) + full = a.rolling(window).count() == window + out["persistence"] = persistence.where(~full | persistence.notna(), 0.0) # constant window → 0, as before + vol7 = r.rolling(7).std() + out["vol_of_vol"] = vol7.rolling(window).std() / vol7.rolling(window).mean().replace(0, np.nan) + out["tail_freq"] = (a > 2 * r.rolling(30).std()).astype(float).where(r.rolling(30).std().notna()).rolling(window).mean() + for c in ["persistence", "vol_of_vol", "tail_freq"]: + out[f"{c}_norm"] = _expanding_minmax(out[c]) + out["MFI"] = out[["persistence_norm", "vol_of_vol_norm", "tail_freq_norm"]].mean(axis=1, skipna=False) + return out + + +def identify_shocks(log_return: pd.Series, quantile: float = SHOCK_QUANTILE, + burn_in: int = SHOCK_BURN_IN) -> tuple[pd.Series, pd.Series]: + """Shock on day t ⇔ |r_t| > expanding quantile of |r| over days < t (needs `burn_in` past days).""" + a = log_return.abs() + threshold = a.shift(1).expanding(min_periods=burn_in).quantile(quantile) + return (a > threshold) & threshold.notna(), threshold + + +def shock_propagation(log_return: pd.Series, shocks: pd.Series, horizons=HORIZONS) -> pd.DataFrame: + """Mean |r_{t+h}| after shock days, vs the unconditional mean |r| over the same eligible period.""" + a = log_return.abs().to_numpy() + idx = np.flatnonzero(shocks.to_numpy()) + start = idx.min() if len(idx) else 0 + baseline = np.nanmean(a[start:]) + rows = [] + for h in horizons: + fwd = a[idx[idx + h < len(a)] + h] + m, sd, n = np.nanmean(fwd), np.nanstd(fwd, ddof=1), np.sum(np.isfinite(fwd)) + half = 1.96 * sd / np.sqrt(n) + rows.append({"horizon": h, "n_shocks": int(n), "mean_abs_return": m, "ci_low": m - half, + "ci_high": m + half, "baseline_mean_abs_return": baseline, "ratio_to_baseline": m / baseline}) + return pd.DataFrame(rows) + + +def expanding_regimes(signal: pd.Series, low_q: float = 0.2, high_q: float = 0.8, + min_periods: int = 250) -> pd.Series: + """'low' / 'medium' / 'high' using quantiles of the signal's PAST values only.""" + past = signal.shift(1).expanding(min_periods=min_periods) + lo, hi = past.quantile(low_q), past.quantile(high_q) + reg = pd.Series(np.where(signal <= lo, "low", np.where(signal >= hi, "high", "medium")), index=signal.index) + return reg.where(lo.notna() & signal.notna()) + + +def within_spell_ac1(x: pd.Series, regimes: pd.Series, regime: str) -> tuple[float, int]: + """Lag-1 autocorrelation using only pairs (x_{t-1}, x_t) where both days are consecutive rows in `regime`.""" + same = (regimes == regime) & (regimes.shift(1) == regime) + pairs = pd.DataFrame({"x": x, "lag": x.shift(1)})[same].dropna() + if len(pairs) < 10: + return float("nan"), len(pairs) + return float(pairs["x"].corr(pairs["lag"])), len(pairs) diff --git a/pipeline/sentiment.py b/pipeline/sentiment.py new file mode 100644 index 0000000..72a2155 --- /dev/null +++ b/pipeline/sentiment.py @@ -0,0 +1,76 @@ +""" +pipeline/sentiment.py — headline cleaning and FinBERT/VADER scoring. + +Fixes (docs/ISSUES.md): + P0-3 FinBERT score is computed by LABEL NAME via model.config.id2label. + ProsusAI/finbert's order is {0: positive, 1: negative, 2: neutral}; + the original notebook computed probs[2] - probs[0] = P(neutral) - P(positive). + P1-11 cleaning keeps digits, %, $ and basic punctuation ("$450M" used to become "m"), + and non-Latin headlines are flagged/dropped instead of being reduced to + stray English fragments. + +transformers / torch / vaderSentiment are imported lazily so this module can be +imported (and unit-tested) without the heavy NLP stack. +""" +from __future__ import annotations + +import re +import unicodedata +from typing import Mapping, Sequence + +import numpy as np + +_URL = re.compile(r"http\S+|www\.\S+") +_KEEP = re.compile(r"[^\w\s$%.,:;!?'\"()&+\-/]") + + +def latin_share(text: str) -> float: + letters = [c for c in str(text) if c.isalpha()] + if not letters: + return 0.0 + return sum(unicodedata.name(c, "").startswith("LATIN") for c in letters) / len(letters) + + +def clean_text(text) -> str: + if not isinstance(text, str): + return "" + text = _URL.sub("", text) + text = _KEEP.sub(" ", text) + return re.sub(r"\s+", " ", text).strip() + + +def is_english_candidate(text: str, min_latin_share: float = 0.9, min_len: int = 10) -> bool: + """Cheap language gate: FinBERT and VADER are English-only models.""" + return len(text) > min_len and latin_share(text) >= min_latin_share + + +def finbert_polarity(probs: np.ndarray, id2label: Mapping[int, str]) -> np.ndarray: + """P(positive) − P(negative), resolved by label NAME (never by position).""" + probs = np.atleast_2d(np.asarray(probs, dtype="float64")) + label_to_idx = {str(v).lower(): int(k) for k, v in id2label.items()} + try: + pos, neg = label_to_idx["positive"], label_to_idx["negative"] + except KeyError: + raise ValueError(f"model labels {sorted(label_to_idx)} lack 'positive'/'negative'") from None + return probs[:, pos] - probs[:, neg] + + +def score_finbert(texts: Sequence[str], model_name: str = "ProsusAI/finbert", batch_size: int = 32) -> np.ndarray: + import torch + from transformers import AutoModelForSequenceClassification, AutoTokenizer + + tok = AutoTokenizer.from_pretrained(model_name) + model = AutoModelForSequenceClassification.from_pretrained(model_name).eval() + out = [] + with torch.no_grad(): + for i in range(0, len(texts), batch_size): + enc = tok(list(texts[i:i + batch_size]), return_tensors="pt", truncation=True, padding=True, max_length=512) + probs = torch.softmax(model(**enc).logits, dim=1).numpy() + out.append(finbert_polarity(probs, model.config.id2label)) + return np.concatenate(out) if out else np.array([]) + + +def score_vader(texts: Sequence[str]) -> np.ndarray: + from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer + v = SentimentIntensityAnalyzer() + return np.array([v.polarity_scores(t)["compound"] for t in texts]) diff --git a/pipeline/stats.py b/pipeline/stats.py new file mode 100644 index 0000000..30d3b46 --- /dev/null +++ b/pipeline/stats.py @@ -0,0 +1,92 @@ +""" +pipeline/stats.py — significance tests that remain valid for autocorrelated +time series. + +Why this exists: the original placebo test (scripts/validate_gmsi.py, before +the fix) shuffled GMSI i.i.d. A permutation test is only valid if every +reordering is equally likely under H0 (exchangeability). Shuffling a persistent +series destroys its autocorrelation, so the null distribution is far too narrow +and "significant" results appear for unrelated series (57.5% false-positive +rate at AR(1) φ=0.9; docs/MODEL_REPORT.md §D). + +`circular_shift_test` rotates x relative to y instead: each rotation keeps both +series' autocorrelation intact while breaking their alignment. +""" +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np +from scipy import signal, stats + + +def _standardised_ranks(a) -> np.ndarray: + r = stats.rankdata(np.asarray(a, dtype="float64")) + return (r - r.mean()) / r.std() + + +def spearman(x, y) -> float: + return float(np.mean(_standardised_ranks(x) * _standardised_ranks(y))) + + +@dataclass +class PermutationResult: + statistic: float + p_value: float # two-sided: P(|null| >= |statistic|) + null_sd: float + n: int + n_perm: int + method: str + + +def permutation_test(x, y, n_perm: int = 1000, method: str = "circular", min_shift: int = 30, + seed: int = 42) -> PermutationResult: + """Spearman correlation with a permutation null. + + method="circular": rotate x by a random offset in [min_shift, n-min_shift) — valid under autocorrelation. + method="iid": shuffle x i.i.d. — kept only to show how the old test misbehaves. + """ + x = np.asarray(x, dtype="float64"); y = np.asarray(y, dtype="float64") + if x.shape != y.shape or x.ndim != 1: + raise ValueError("x and y must be 1-D arrays of equal length") + mask = np.isfinite(x) & np.isfinite(y) + x, y = x[mask], y[mask] + n = len(x) + if n < 2 * min_shift + 10: + raise ValueError(f"need at least {2 * min_shift + 10} paired observations, got {n}") + rx, ry = _standardised_ranks(x), _standardised_ranks(y) + real = float(np.mean(rx * ry)) + rng = np.random.default_rng(seed) + if method == "circular": + shifts = rng.integers(min_shift, n - min_shift, n_perm) + null = np.array([np.mean(np.roll(rx, s) * ry) for s in shifts]) + elif method == "iid": + null = np.array([np.mean(rng.permutation(rx) * ry) for _ in range(n_perm)]) + else: + raise ValueError("method must be 'circular' or 'iid'") + p = float(np.mean(np.abs(null) >= abs(real))) + return PermutationResult(real, p, float(null.std()), n, n_perm, method) + + +def ar1(n: int, phi: float, rng: np.random.Generator) -> np.ndarray: + """Stationary-start-agnostic AR(1) path x_t = φ x_{t-1} + ε_t (vectorised via lfilter).""" + return signal.lfilter([1.0], [1.0, -phi], rng.standard_normal(n)) + + +def ar1_null(y, statistic: float, phi: float, n_sims: int = 2000, seed: int = 42) -> dict: + """How often does an INDEPENDENT AR(1)(φ) series reach |Spearman| >= |statistic| with y? + + A Monte-Carlo p-value for a correlation between y and a persistent regressor whose + lag-1 autocorrelation is about φ. If the real regressor's ACF decays more slowly than φ^k + the true null is wider still, so this p-value is a lower bound. + """ + y = np.asarray(y, dtype="float64"); y = y[np.isfinite(y)] + ry = _standardised_ranks(y) + rng = np.random.default_rng(seed) + null = np.array([np.mean(_standardised_ranks(ar1(len(y), phi, rng)) * ry) for _ in range(n_sims)]) + iid_sd = 1 / np.sqrt(len(y) - 1) + return {"n": len(y), "statistic": statistic, "phi": phi, "n_sims": n_sims, + "null_sd": float(null.std()), "iid_null_sd": float(iid_sd), + "variance_inflation": float((null.std() / iid_sd) ** 2), + "p_value": float(np.mean(np.abs(null) >= abs(statistic))), + "p_value_if_iid": float(2 * stats.norm.sf(abs(statistic) / iid_sd))} diff --git a/pipeline/train_rf_model.py b/pipeline/train_rf_model.py index 9d3db65..45d602d 100644 --- a/pipeline/train_rf_model.py +++ b/pipeline/train_rf_model.py @@ -1,35 +1,37 @@ -import numpy as np +"""pipeline/train_rf_model.py — fit/score/save the (archived) sentiment Random Forest.""" import joblib -from pathlib import Path +import numpy as np from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error -def train_random_forest(X_train, X_test, y_train, y_test, asset="BTC"): - model = RandomForestRegressor( - n_estimators=600, - max_depth=8, - min_samples_leaf=10, - max_features="sqrt", - random_state=42, - n_jobs=-1 - ) +from pipeline.data import MODELS - model.fit(X_train, y_train) - preds = model.predict(X_test) +RF_PARAMS = dict(n_estimators=600, max_depth=8, min_samples_leaf=10, max_features="sqrt", + random_state=42, n_jobs=-1) - pred_vol = np.exp(preds) - actual_vol = np.exp(y_test) - rmse = np.sqrt(mean_squared_error(actual_vol, pred_vol)) - mae = mean_absolute_error(actual_vol, pred_vol) +class TooLittleDataError(RuntimeError): + pass - print(f"\n📈 {asset} Random Forest Results") - print(f"RMSE : {rmse:.6f}") - print(f"MAE : {mae:.6f}") - model_dir = Path("models") - model_dir.mkdir(exist_ok=True) +def train_random_forest(X_train, X_test, y_train, y_test, asset="BTC"): + # With fewer than 2 * min_samples_leaf rows no tree can split: every tree is a single + # leaf and the "forest" is a constant (this is what produced the old models/rf_btc.pkl). + min_rows = 2 * RF_PARAMS["min_samples_leaf"] + if len(X_train) < min_rows: + raise TooLittleDataError( + f"{len(X_train)} training rows < {min_rows} (= 2 * min_samples_leaf): the forest would be a " + "constant predictor. Collect more sentiment history before training this model.") + + model = RandomForestRegressor(**RF_PARAMS) + model.fit(X_train, y_train) + preds = model.predict(X_test) - joblib.dump(model, model_dir / f"rf_{asset.lower()}.pkl") + pred_vol, actual_vol = np.exp(preds), np.exp(y_test) + rmse = np.sqrt(mean_squared_error(actual_vol, pred_vol)) + mae = mean_absolute_error(actual_vol, pred_vol) + print(f"\n{asset} Random Forest — RMSE {rmse:.6f} MAE {mae:.6f} (n_test={len(y_test)})") + MODELS.mkdir(exist_ok=True) + joblib.dump(model, MODELS / f"legacy_sentiment_rf_{asset.lower()}.pkl") return model, rmse, mae diff --git a/pipeline/volatility.py b/pipeline/volatility.py new file mode 100644 index 0000000..4a5eb23 --- /dev/null +++ b/pipeline/volatility.py @@ -0,0 +1,169 @@ +""" +pipeline/volatility.py — the single source of truth for volatility features, +the forecasting target, and the served model. + +Training (run_pipeline.py) and inference (dashboard/) both call +`price_features()`, so the features a model sees in production are computed by +exactly the same code it was trained on. + +Target: σ_{t+1..t+h} = sample std of the next h daily log returns + (h = 5 → "next-week volatility"), modelled in log space. +Model: HAR-style log-linear regression on trailing 5/22/60-day realised vol + (Corsi 2009, with a quarterly instead of daily component). It beat the + Random Forest out of sample — see docs/MODEL_REPORT.md. + +The model is stored as plain JSON (4 numbers + metadata), so loading it needs +neither scikit-learn nor pickle, and there is no pickle-version mismatch risk. +""" +from __future__ import annotations + +import json +import math +from dataclasses import asdict, dataclass, field +from pathlib import Path + +import numpy as np +import pandas as pd + +EPS = 1e-6 # log floor; daily σ is ~1e-3..1e-1, so it never binds in practice +HORIZON = 5 # forecast window in trading days +WINDOWS = (5, 22, 60) # ~1 week, 1 month, 1 quarter of trading days +MIN_CLOSES = max(WINDOWS) + 1 # 61 closes → 60 returns → one complete feature row +MAX_CLOSES = 10_000 +ANNUALISATION_DAYS = {"BTC": 365, "NIFTY": 252} # BTC trades every calendar day + +HAR_FEATURES = [f"log_vol_{w}" for w in WINDOWS] +RF_FEATURES = ["abs_return", "sq_return"] + [f"vol_{w}" for w in WINDOWS] +TARGET = "log_target_vol" + + +class InputError(ValueError): + """Raised for user-supplied data that cannot produce a forecast; message is user-facing.""" + + +def annualise(daily_vol, asset: str): + try: + return daily_vol * math.sqrt(ANNUALISATION_DAYS[asset.upper()]) + except KeyError: + raise ValueError(f"Unknown asset {asset!r}; expected one of {sorted(ANNUALISATION_DAYS)}") from None + + +def price_features(close: pd.Series, horizon: int = HORIZON, with_target: bool = True) -> pd.DataFrame: + """Features (all trailing, i.e. known at the close of day t) and, optionally, the target. + + Rows are NOT dropped here; callers drop NaNs on exactly the columns they use. + """ + close = pd.Series(close, dtype="float64") + r = np.log(close / close.shift(1)) + out = pd.DataFrame(index=close.index) + out["close"] = close + out["log_return"] = r + out["abs_return"] = r.abs() + out["sq_return"] = r ** 2 + for w in WINDOWS: + out[f"vol_{w}"] = r.rolling(w).std() + out[f"log_vol_{w}"] = np.log(out[f"vol_{w}"] + EPS) + if with_target: + out["target_vol"] = r.rolling(horizon).std().shift(-horizon) # std of r[t+1 .. t+h] + out[TARGET] = np.log(out["target_vol"] + EPS) + return out + + +def training_frame(close: pd.Series, horizon: int = HORIZON) -> pd.DataFrame: + f = price_features(close, horizon=horizon, with_target=True) + return f.dropna(subset=HAR_FEATURES + RF_FEATURES + [TARGET]) + + +@dataclass +class HARModel: + asset: str + intercept: float + coef: dict + horizon: int = HORIZON + windows: tuple = WINDOWS + trained_from: str = "" + trained_through: str = "" + n_train: int = 0 + metrics: dict = field(default_factory=dict) + + @classmethod + def fit(cls, frame: pd.DataFrame, asset: str) -> "HARModel": + X = np.column_stack([np.ones(len(frame))] + [frame[c].to_numpy() for c in HAR_FEATURES]) + beta, *_ = np.linalg.lstsq(X, frame[TARGET].to_numpy(), rcond=None) + idx = frame.index + return cls(asset=asset.upper(), intercept=float(beta[0]), + coef={c: float(b) for c, b in zip(HAR_FEATURES, beta[1:])}, + trained_from=str(idx[0])[:10], trained_through=str(idx[-1])[:10], n_train=len(frame)) + + def predict_log(self, frame: pd.DataFrame) -> np.ndarray: + missing = [c for c in HAR_FEATURES if c not in frame] + if missing: + raise KeyError(f"missing feature columns: {missing}") + return self.intercept + sum(frame[c].to_numpy() * self.coef[c] for c in HAR_FEATURES) + + def predict_vol(self, frame: pd.DataFrame) -> np.ndarray: + # exp of a log forecast is the conditional *median*, not mean; we report it as such. + return np.exp(self.predict_log(frame)) - EPS + + def to_json(self, path: Path) -> None: + d = asdict(self); d["windows"] = list(self.windows); d["model_type"] = "HAR-log-linear" + Path(path).write_text(json.dumps(d, indent=2)) + + @classmethod + def from_json(cls, path: Path) -> "HARModel": + d = json.loads(Path(path).read_text()) + if d.get("model_type") != "HAR-log-linear": + raise ValueError(f"{path} is not a HAR model file") + if set(d["coef"]) != set(HAR_FEATURES) or tuple(d["windows"]) != WINDOWS or d["horizon"] != HORIZON: + raise ValueError(f"{path} was trained with a different feature contract " + f"(coef={sorted(d['coef'])}, windows={d['windows']}, horizon={d['horizon']}); " + "retrain with `python run_pipeline.py`") + d.pop("model_type") + d["windows"] = tuple(d["windows"]) + return cls(**d) + + +def parse_closes(text: str) -> np.ndarray: + """Parse user-pasted closing prices (comma / whitespace / newline separated, oldest first).""" + if text is None or not text.strip(): + raise InputError("Please paste at least %d closing prices (oldest first)." % MIN_CLOSES) + tokens = [t for t in text.replace(",", " ").replace(";", " ").split() if t] + values = [] + for i, t in enumerate(tokens, 1): + try: + values.append(float(t)) + except ValueError: + raise InputError(f"Value #{i} ('{t[:20]}') is not a number.") from None + return validate_closes(values) + + +def validate_closes(values) -> np.ndarray: + a = np.asarray(values, dtype="float64") + if a.ndim != 1: + raise InputError("Closing prices must be a single list of numbers.") + if len(a) < MIN_CLOSES: + raise InputError(f"Need at least {MIN_CLOSES} closing prices (60-day volatility window + 1); got {len(a)}.") + if len(a) > MAX_CLOSES: + raise InputError(f"Too many values ({len(a)}); at most {MAX_CLOSES} are accepted.") + if not np.all(np.isfinite(a)): + raise InputError("Prices must be finite numbers (no NaN / inf).") + if np.any(a <= 0): + raise InputError("Prices must be strictly positive (log returns are undefined otherwise).") + return a + + +def forecast(model: HARModel, close: pd.Series) -> dict: + """Forecast σ for the h days after the last close in `close` (oldest→newest).""" + s = close.astype("float64") if isinstance(close, pd.Series) else pd.Series(np.asarray(close, dtype="float64")) + validate_closes(s.to_numpy()) + f = price_features(s, with_target=False) + last = f.iloc[[-1]] + if last[HAR_FEATURES].isna().any(axis=None): + raise InputError("Not enough consecutive valid prices to compute the 60-day window.") + daily = float(model.predict_vol(last)[0]) + max_abs_ret = float(f["abs_return"].max()) + return {"daily_vol": daily, "annualised_vol": float(annualise(daily, model.asset)), + "horizon_days": model.horizon, + "inputs": {c: float(np.exp(last[c].iloc[0]) - EPS) for c in HAR_FEATURES}, + "warning": (f"Largest daily move in your input is {max_abs_ret:.0%} — check for data errors " + "(splits, typos)." if max_abs_ret > 0.5 else None)} diff --git a/reports/README.md b/reports/README.md new file mode 100644 index 0000000..c250880 --- /dev/null +++ b/reports/README.md @@ -0,0 +1,13 @@ +# reports/ + +| File | Produced by | Data | Status | +|---|---|---|---| +| `figures/fig1_mfi_{btc,nifty}.png`, `fig5_mfi_components_{btc,nifty}.png`, `fig6_shock_decay_comparison.png` | `scripts/08_market_dynamics_analysis.py` | real prices (`data/raw`) | current — regenerate any time | +| `figures/cond_exp_{BTC,NIFTY}.png`, `gmsi_sanity_checks.png` | `scripts/validate_gmsi.py`, `scripts/sanity_check_gmsi.py` | GMSI (GDELT, not committed) | original run; descriptive in-sample quintiles | +| `figures/placebo_test_{BTC,NIFTY}.png` | old `scripts/validate_gmsi.py` | GMSI | **superseded**: shows the invalid i.i.d. placebo. The fixed script overwrites them with circular-shift results when re-run with GMSI data | +| `figures/regime/*.png` | old `scripts/regime_analysis.py` | GMSI | **superseded**: full-sample (look-ahead) regime thresholds | +| `gmsi_validation_walkthrough.md` | original analysis session | — | historical record with a correction banner | + +Earlier versions of this folder contained `fig3_regime_shock_nifty.png` and `fig4_regime_stats_nifty.png`, and +versions of fig1/fig5/fig6 generated from **synthetic** data by a silent fallback in the old script 08. They were +removed or regenerated; see `docs/ISSUES.md` (P0-1). diff --git a/reports/exogenous_vsi_v1_results b/reports/exogenous_vsi_v1_results deleted file mode 100644 index ea2b9b6..0000000 --- a/reports/exogenous_vsi_v1_results +++ /dev/null @@ -1,77 +0,0 @@ -# GMSI Reconstruction and Validation Walkthrough - -The goal of this task was to correct and rebuild the Global Market Stress Index (GMSI) to be a **purely exogenous stress signal**. We aimed to systematically remove any embedded mechanical coupling with market volatility and then subject the new signal to rigorous, causally sound validation. - -As instructed: *"If correlations weaken after correction, that is the correct outcome. The priority is scientific honesty."* - -## What Was Done - -1. **Feature Audit & Purge**: We audited the features and completely stripped out any price-derived metrics (returns, rolling volatility windows, z-scores of volatility). -2. **Pure Exogenous Reconstruction**: The new GMSI was constructed strictly using an equal-weighted compilation of standardized exogenous metrics: - - Global Event Counts - - Negative Event Share - - Avg Goldstein Score (inverted, so lower scores = higher stress) - - Global Core Sentiment via FinBERT (inverted) - - Sentiment Surprise (inverted) - - Attention (Event Intensity) -3. **Validation Suite**: We conducted rigorous sanity checks, lagged component testing against future realized volatility ($t+1$, $t+7$, $t+14$), and a 1000-shuffle empirical Placebo Control. - ---- - -## Part 1: Sanity Checks on New GMSI -First, we confirmed that the new signal was well-behaved and free of leakage: -* **Stationarity**: Passed ADF test strongly ($p < 4.05 \times 10^{-10}$). -* **Same-Day Correlation**: Eliminated the ~0.9+ correlations seen previously. The same-day correlation against 30d volatility dropped to **-0.117** for BTC and **-0.237** for NIFTY, confirming the removal of mechanical coupling. - -![GMSI Sanity Checks](e:/financial-sentiment-research-project/reports/figures/gmsi_sanity_checks.png) - ---- - -## Part 2: Lagged Component Testing & Causality - -When testing whether high GMSI (stress) at time $t$ predicts higher realized volatility in the forward windows ($t \rightarrow t+7$ and $t \rightarrow t+14$), we found **no positive predictive power**. - -In fact, the correlations inverted into a slight negative relationship: - -**BTC Lagged Correlations:** -* Forward 1 Day Vol: -0.0587 (empirical p=0.000) -* Forward 7 Days Vol: -0.0837 (empirical p=0.000) -* Forward 14 Days Vol: -0.0865 (empirical p=0.000) - -**NIFTY Lagged Correlations:** -* Forward 1 Day Vol: -0.0104 (empirical p=0.623) -* Forward 7 Days Vol: -0.0580 (empirical p=0.003) -* Forward 14 Days Vol: -0.0660 (empirical p=0.000) - -### Conditional Expectations (E[Vol | GMSI Quintile]) -When bucketed into quintiles, the highest GMSI quintile (Q5) actually precedes slightly *lower* mean forward volatility compared to the lowest stress quintile (Q1). - -````carousel -![BTC Conditional Expectations](e:/financial-sentiment-research-project/reports/figures/cond_exp_BTC.png) - -![NIFTY Conditional Expectations](e:/financial-sentiment-research-project/reports/figures/cond_exp_NIFTY.png) -```` - -### Tail Event Analysis -When evaluating the top 5% most volatile periods (7-day forward tail events), GMSI values prior to these events were **not significantly elevated** compared to normal periods. -* **BTC KS-Test**: $p = 0.904$ (No difference in distributions) -* **NIFTY KS-Test**: $p = 1.2 \times 10^{-12}$ (Distributions differ, but in the opposite direction—GMSI tended to be lower before volatility spikes). - -## Part 3: Placebo Control - -1000 randomized shuffles of the time series confirmed that the true correlations, while small and negative, were statistically distinct from noise. - -````carousel -![BTC Placebo Test](e:/financial-sentiment-research-project/reports/figures/placebo_test_BTC.png) - -![NIFTY Placebo Test](e:/financial-sentiment-research-project/reports/figures/placebo_test_NIFTY.png) -```` - -## Conclusion & Scientific Assessment - -> [!WARNING] -> Conclusion: The previously observed high performance of the GMSI signal was entirely a consequence of **mechanical coupling and information leakage**. - -By removing the embedded price and volatility inputs, the resulting purely exogenous stress index (derived strictly from sentiment, awareness, and news flow) **does not positively forecast future market volatility** for either BTC or NIFTY. High levels of global exogenous stress as measured by this index correspond to slightly *suppressed* forward volatility. - -**The signal has been successfully corrected. The previous illusions of causality have been dispelled.** diff --git a/reports/figures/fig1_mfi_btc.png b/reports/figures/fig1_mfi_btc.png index 34490be..69f798e 100644 Binary files a/reports/figures/fig1_mfi_btc.png and b/reports/figures/fig1_mfi_btc.png differ diff --git a/reports/figures/fig1_mfi_nifty.png b/reports/figures/fig1_mfi_nifty.png new file mode 100644 index 0000000..b698cea Binary files /dev/null and b/reports/figures/fig1_mfi_nifty.png differ diff --git a/reports/figures/fig3_regime_shock_nifty.png b/reports/figures/fig3_regime_shock_nifty.png deleted file mode 100644 index f203036..0000000 Binary files a/reports/figures/fig3_regime_shock_nifty.png and /dev/null differ diff --git a/reports/figures/fig4_regime_stats_nifty.png b/reports/figures/fig4_regime_stats_nifty.png deleted file mode 100644 index 98d4fdd..0000000 Binary files a/reports/figures/fig4_regime_stats_nifty.png and /dev/null differ diff --git a/reports/figures/fig5_mfi_components_btc.png b/reports/figures/fig5_mfi_components_btc.png index 4d6b487..fe8d179 100644 Binary files a/reports/figures/fig5_mfi_components_btc.png and b/reports/figures/fig5_mfi_components_btc.png differ diff --git a/reports/figures/fig5_mfi_components_nifty.png b/reports/figures/fig5_mfi_components_nifty.png new file mode 100644 index 0000000..655dc94 Binary files /dev/null and b/reports/figures/fig5_mfi_components_nifty.png differ diff --git a/reports/figures/fig6_shock_decay_comparison.png b/reports/figures/fig6_shock_decay_comparison.png index 4711a59..35bd1b8 100644 Binary files a/reports/figures/fig6_shock_decay_comparison.png and b/reports/figures/fig6_shock_decay_comparison.png differ diff --git a/reports/regimes_vsi_results b/reports/gmsi_validation_walkthrough.md similarity index 87% rename from reports/regimes_vsi_results rename to reports/gmsi_validation_walkthrough.md index f22c7aa..eda95d2 100644 --- a/reports/regimes_vsi_results +++ b/reports/gmsi_validation_walkthrough.md @@ -1,3 +1,5 @@ +> **Historical record (pre-audit).** This walkthrough was generated during the original analysis. Several statements below were later found to be wrong or overstated — notably the i.i.d. placebo p-values ("empirical p=0.000"), full-sample regime thresholds, and AR(1) persistence computed across non-contiguous days. Corrected numbers: `docs/MODEL_REPORT.md` and the dashboard. Figure paths were made relative; the `regime/` figures were produced with the old (look-ahead) thresholds. + # GMSI Reconstruction and Validation Walkthrough The goal of this task was to correct and rebuild the Global Market Stress Index (GMSI) to be a **purely exogenous stress signal**. We aimed to systematically remove any embedded mechanical coupling with market volatility and then subject the new signal to rigorous, causally sound validation. @@ -25,7 +27,7 @@ First, we confirmed that the new signal was well-behaved and free of leakage: - **Stationarity**: Passed ADF test strongly ($p < 4.05 \times 10^{-10}$). - **Same-Day Correlation**: Eliminated the ~0.9+ correlations seen previously. The same-day correlation against 30d volatility dropped to **-0.117** for BTC and **-0.237** for NIFTY, confirming the removal of mechanical coupling. -![GMSI Sanity Checks](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/gmsi_sanity_checks.png) +![GMSI Sanity Checks](figures/gmsi_sanity_checks.png) --- @@ -52,9 +54,9 @@ In fact, the correlations inverted into a slight negative relationship: When bucketed into quintiles, the highest GMSI quintile (Q5) actually precedes slightly *lower* mean forward volatility compared to the lowest stress quintile (Q1). ````carousel -![BTC Conditional Expectations](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/cond_exp_BTC.png) +![BTC Conditional Expectations](figures/cond_exp_BTC.png) -![NIFTY Conditional Expectations](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/cond_exp_NIFTY.png) +![NIFTY Conditional Expectations](figures/cond_exp_NIFTY.png) ```` ### Tail Event Analysis @@ -69,9 +71,9 @@ When evaluating the top 5% most volatile periods (7-day forward tail events), GM 1000 randomized shuffles of the time series confirmed that the true correlations, while small and negative, were statistically distinct from noise. ````carousel -![BTC Placebo Test](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/placebo_test_BTC.png) +![BTC Placebo Test](figures/placebo_test_BTC.png) -![NIFTY Placebo Test](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/placebo_test_NIFTY.png) +![NIFTY Placebo Test](figures/placebo_test_NIFTY.png) ```` ## Conclusion & Scientific Assessment @@ -115,7 +117,7 @@ We analyzed how forward volatility evolves $t+1, t+7, t+14$ days following an ex - **NIFTY**: A shock in Low Stress yields $t+7$ volatility of 0.027. In High Stress, it vanishes immediately, settling at 0.010. ````carousel -![BTC Shock Response](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/regime/shock_response.png) +![BTC Shock Response](figures/regime/shock_response.png) ```` ### Tail Risk Conditioning @@ -129,9 +131,9 @@ We calculated the probability of observing a top 5% volatility tail event condit *(Note: KS tests confirm these distributions are statistically fundamentally different, $p < 0.001$)* ````carousel -![Boxplots Vol by Regime](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/regime/boxplot_vol_by_regime.png) +![Boxplots Vol by Regime](figures/regime/boxplot_vol_by_regime.png) -![Heatmaps Regime vs Vol](C:/Users/Dell/.gemini/antigravity/brain/b9f0a65c-a7ae-44dc-951c-061e876e4759/regime/heatmap_regime_vs_vol.png) +![Heatmaps Regime vs Vol](figures/regime/heatmap_regime_vs_vol.png) ```` ### Scientific Interpretation diff --git a/requirements-nlp.txt b/requirements-nlp.txt new file mode 100644 index 0000000..aaef29e --- /dev/null +++ b/requirements-nlp.txt @@ -0,0 +1,6 @@ +# Optional: re-scoring headlines with FinBERT (pipeline/sentiment.py, notebooks/03). +# NOT installed or tested in the audit environment (huggingface.co was unreachable there), +# so these are lower bounds, not tested pins. Pin them once you have run the scoring locally. +-r requirements-research.txt +torch>=2.2 +transformers>=4.40 diff --git a/requirements-research.txt b/requirements-research.txt new file mode 100644 index 0000000..86db96e --- /dev/null +++ b/requirements-research.txt @@ -0,0 +1,15 @@ +# Research / training environment — Python 3.12 or 3.13 (numpy 2.5 needs >= 3.12). +# Exact versions tested together: `python run_pipeline.py` and `pytest` pass with these. +# Deliberately NOT named requirements.txt: Streamlit Cloud must only see dashboard/requirements.txt. +# Dashboard-only deps live in dashboard/requirements.txt; data fetchers in data_pipeline/requirements.txt; +# FinBERT (torch/transformers) in requirements-nlp.txt. +numpy==2.5.3 +pandas==3.0.6 +scipy==1.18.1 +scikit-learn==1.8.0 +joblib==1.6.0 +matplotlib==3.11.2 +seaborn==0.13.2 +statsmodels==0.15.0 +vaderSentiment==3.3.2 +pytest==9.1.1 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 1c66942..0000000 --- a/requirements.txt +++ /dev/null @@ -1,19 +0,0 @@ - -pandas -requests -yfinance -nltk -torch -transformers -vadersentiment -seaborn -matplotlib -numpy -snscrape -scikit-learn -tensorflow -python-dateutil -django-pipeline -joblib -pytrends -plotly \ No newline at end of file diff --git a/run_pipeline.py b/run_pipeline.py index f1e7d15..c7eed22 100644 --- a/run_pipeline.py +++ b/run_pipeline.py @@ -1,29 +1,181 @@ +""" +run_pipeline.py — single entry point that turns the committed raw data into +every model and result the dashboard shows. + + python run_pipeline.py # volatility models + market dynamics + GMSI calibration + python run_pipeline.py --fast # fewer Monte-Carlo draws (for CI / quick checks) + python run_pipeline.py sentiment-rf # archived sentiment RF (needs data/processed/, not committed) + +Outputs + models/har_{btc,nifty}.json served 5-day volatility models (plain JSON) + dashboard/data/metrics.json walk-forward metrics for all candidate models + dashboard/data/oos_{asset}.csv out-of-sample forecasts vs realised vol + dashboard/data/mfi_{asset}.csv Market Fragility Index on real prices + dashboard/data/shocks_{asset}.csv shock propagation on real prices + dashboard/data/gmsi_calibration.json corrected significance for the published GMSI correlations +""" +from __future__ import annotations + +import argparse +import json +import time + +import numpy as np import pandas as pd -from sklearn.model_selection import train_test_split -from pipeline.feature_engineering import build_features -from pipeline.train_rf_model import train_random_forest -from pipeline.evaluate import feature_importance, plot_predictions +from pipeline import market_dynamics as md +from pipeline import stats +from pipeline import volatility as vol +from pipeline.data import ASSETS, DASHBOARD_DATA, MODELS, ROOT, load_close + +N_SPLITS = 5 +SEED = 42 +# Published by scripts/validate_gmsi.py (reports/exogenous_vsi_v1_results): Spearman(GMSI_t, fwd 7d vol). +# The GMSI series itself is not in the repo, so these two numbers are inputs, not recomputed. +PUBLISHED_GMSI_SPEARMAN = {"BTC": -0.0837, "NIFTY": -0.0580} +GMSI_LAG1_ACF = 0.82 # read from reports/figures/gmsi_sanity_checks.png (ACF panel); see docs/MODEL_REPORT.md §E + + +def vol_metrics(y_log, p_log): + a, p = np.exp(y_log), np.exp(p_log) + ratio = a ** 2 / p ** 2 + ss_res, ss_tot = np.sum((y_log - p_log) ** 2), np.sum((y_log - y_log.mean()) ** 2) + return {"rmse_vol": float(np.sqrt(np.mean((a - p) ** 2))), "mae_vol": float(np.mean(np.abs(a - p))), + "r2_log": float(1 - ss_res / ss_tot), "qlike": float(np.mean(ratio - np.log(ratio) - 1))} + +def walk_forward(frame: pd.DataFrame, asset: str): + from sklearn.ensemble import RandomForestRegressor + from sklearn.model_selection import TimeSeriesSplit -def run(asset="BTC"): - path = f"data/processed/{asset.lower()}_sentiment_aligned.csv" - df = pd.read_csv(path, parse_dates=["date"]) + from pipeline.train_rf_model import RF_PARAMS - X, y, features = build_features(df) + y = frame[vol.TARGET].to_numpy() + folds, oos = [], [] + # gap = horizon: drop training rows whose 5-day target window overlaps the test fold (purging) + for k, (tr, te) in enumerate(TimeSeriesSplit(n_splits=N_SPLITS, gap=vol.HORIZON).split(frame)): + ftr, fte = frame.iloc[tr], frame.iloc[te] + har = vol.HARModel.fit(ftr, asset) + rf = RandomForestRegressor(**RF_PARAMS).fit(ftr[vol.RF_FEATURES], y[tr]) + preds = {"HAR (served)": (har.predict_log(fte), har.predict_log(ftr)), + "Random Forest": (rf.predict(fte[vol.RF_FEATURES]), rf.predict(ftr[vol.RF_FEATURES])), + "Persistence (vol_5)": (fte["log_vol_5"].to_numpy(), ftr["log_vol_5"].to_numpy()), + "Mean (dummy)": (np.full(len(te), y[tr].mean()), np.full(len(tr), y[tr].mean()))} + for name, (p_te, p_tr) in preds.items(): + folds.append({"fold": k, "model": name, "test_start": str(fte.index[0])[:10], + "test_end": str(fte.index[-1])[:10], "n_train": len(tr), "n_test": len(te), + **{f"test_{m}": v for m, v in vol_metrics(y[te], p_te).items()}, + **{f"train_{m}": v for m, v in vol_metrics(y[tr], p_tr).items()}}) + oos.append(pd.DataFrame({"date": fte.index, "fold": k, "actual_vol": np.exp(y[te]) - vol.EPS, + "har_vol": np.exp(preds["HAR (served)"][0]) - vol.EPS, + "rf_vol": np.exp(preds["Random Forest"][0]) - vol.EPS, + "mean_vol": np.exp(preds["Mean (dummy)"][0]) - vol.EPS})) + folds = pd.DataFrame(folds) + summary = (folds.groupby("model")[[c for c in folds if c.startswith(("test_", "train_")) + and c not in ("test_start", "test_end")]].mean() + .sort_values("test_qlike")) + return folds, summary, pd.concat(oos, ignore_index=True) - X_train, X_test, y_train, y_test = train_test_split( - X, y, test_size=0.2, shuffle=False - ) - model, rmse, mae = train_random_forest( - X_train, X_test, y_train, y_test, asset=asset - ) +def run_volatility(fast: bool): + DASHBOARD_DATA.mkdir(parents=True, exist_ok=True) + MODELS.mkdir(exist_ok=True) + metrics = {} + for asset in ASSETS: + t0 = time.time() + close = load_close(asset) + frame = vol.training_frame(close) + folds, summary, oos = walk_forward(frame, asset) + model = vol.HARModel.fit(frame, asset) + model.metrics = {k: float(v) for k, v in summary.loc["HAR (served)"].items()} + model.to_json(MODELS / f"har_{asset.lower()}.json") + oos.to_csv(DASHBOARD_DATA / f"oos_{asset.lower()}.csv", index=False, float_format="%.6g") + metrics[asset] = {"summary": json.loads(summary.round(6).to_json(orient="index")), + "folds": json.loads(folds.round(6).to_json(orient="records")), + "n_rows": len(frame), "date_range": [str(frame.index[0])[:10], str(frame.index[-1])[:10]]} + print(f"\n{asset}: {len(frame)} rows, walk-forward ({time.time() - t0:.1f}s)") + print(summary[["test_rmse_vol", "test_mae_vol", "test_r2_log", "test_qlike", "train_r2_log"]].round(5) + .to_string()) + # Market dynamics on REAL prices + r = np.log(close / close.shift(1)) + mfi = md.compute_mfi(r) + mfi[["MFI", "persistence_norm", "vol_of_vol_norm", "tail_freq_norm"]].dropna().to_csv( + DASHBOARD_DATA / f"mfi_{asset.lower()}.csv", float_format="%.5g", index_label="date") + shocks, _ = md.identify_shocks(r) + sp = md.shock_propagation(r, shocks) + sp.to_csv(DASHBOARD_DATA / f"shocks_{asset.lower()}.csv", index=False, float_format="%.6g") + peak = mfi["MFI"].idxmax() + metrics[asset]["market_dynamics"] = { + "n_shocks": int(shocks.sum()), "mfi_max": float(mfi["MFI"].max()), "mfi_max_date": str(peak)[:10], + "mfi_2020_03_max": float(mfi["MFI"].loc["2020-03"].max()), + "mfi_mean_since_2016": float(mfi["MFI"].loc["2016":].mean())} + print(sp.round(5).to_string(index=False)) + (DASHBOARD_DATA / "metrics.json").write_text(json.dumps(metrics, indent=2)) + + +def run_gmsi_calibration(fast: bool): + """Corrected significance for the published GMSI→forward-vol correlations.""" + n_sims = 300 if fast else 2000 + out = {"published_spearman": PUBLISHED_GMSI_SPEARMAN, "assumed_gmsi_lag1_acf": GMSI_LAG1_ACF, "assets": {}, + "false_positive_rate": []} + fwd = {} + for asset in ASSETS: + close = load_close(asset) + r = np.log(close / close.shift(1)) + # forward 7-day vol exactly as scripts/construct_vsi_full.py + scripts/validate_gmsi.py define it + fwd[asset] = r.rolling(7, min_periods=1).std().shift(-7).dropna().to_numpy() + out["assets"][asset] = stats.ar1_null(fwd[asset], PUBLISHED_GMSI_SPEARMAN[asset], GMSI_LAG1_ACF, + n_sims=n_sims, seed=SEED) + out["assets"][asset]["fwd_vol_lag1_acf"] = float(pd.Series(fwd[asset]).autocorr(1)) + print(f"{asset}: {out['assets'][asset]}") + # How often does each placebo method flag an INDEPENDENT persistent series as significant? + rng = np.random.default_rng(SEED) + y = fwd["BTC"] + sims = 40 if fast else 200 + for phi in (0.0, 0.5, 0.9): + hits = {"iid": 0, "circular": 0} + for i in range(sims): + x = stats.ar1(len(y), phi, rng) + for m in hits: + hits[m] += stats.permutation_test(x, y, n_perm=500, method=m, seed=i).p_value < 0.05 + out["false_positive_rate"].append({"phi": phi, "n_sims": sims, + "iid_shuffle": hits["iid"] / sims, "circular_shift": hits["circular"] / sims}) + print(out["false_positive_rate"][-1]) + (DASHBOARD_DATA / "gmsi_calibration.json").write_text(json.dumps(out, indent=2)) + + +def run_sentiment_rf(): + """Archived experiment; kept runnable so its failure mode is explicit, not silent.""" + from pipeline.evaluate import feature_importance, plot_predictions + from pipeline.feature_engineering import build_features + from pipeline.train_rf_model import train_random_forest + + path = ROOT / "data" / "processed" / "btc_sentiment_aligned.csv" + if not path.exists(): + raise SystemExit(f"{path} not found. It is produced by notebooks/02-04 (needs FinBERT) and is not committed.") + X, y, features = build_features(pd.read_csv(path, parse_dates=["date"])) + n_test = int(np.ceil(0.2 * len(X))) + gap = 5 # purge: last training targets would otherwise overlap the test window + X_train, y_train = X.iloc[: len(X) - n_test - gap], y.iloc[: len(X) - n_test - gap] + X_test, y_test = X.iloc[-n_test:], y.iloc[-n_test:] + model, *_ = train_random_forest(X_train, X_test, y_train, y_test, asset="BTC") feature_importance(model, features) - plot_predictions(y_test, model.predict(X_test), asset=asset, n = 100) + plot_predictions(y_test, model.predict(X_test), asset="BTC") + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("command", nargs="?", default="all", choices=["all", "volatility", "gmsi", "sentiment-rf"]) + ap.add_argument("--fast", action="store_true", help="fewer Monte-Carlo draws") + a = ap.parse_args() + if a.command == "sentiment-rf": + return run_sentiment_rf() + if a.command in ("all", "volatility"): + run_volatility(a.fast) + if a.command in ("all", "gmsi"): + run_gmsi_calibration(a.fast) if __name__ == "__main__": - run("BTC") - # run("NIFTY") # enable once ready- \ No newline at end of file + main() diff --git a/scripts/08_market_dynamics_analysis.py b/scripts/08_market_dynamics_analysis.py index be6f5c4..74bedca 100644 --- a/scripts/08_market_dynamics_analysis.py +++ b/scripts/08_market_dynamics_analysis.py @@ -1,911 +1,149 @@ """ -============================================================================= -NOTEBOOK 08: Market Dynamics Analysis -============================================================================= -Objective: - Understand WHY and HOW markets move through: - 1. Market Fragility Index (MFI) - 2. Shock Propagation Analysis - 3. Regime-Conditioned Behavior - -Philosophy: - - No price-derived inputs in GMSI (already corrected) - - No look-ahead / future leakage - - No black-box ML - - Weak but real signals > strong but artificial ones - - Every metric has a clear mathematical definition - -Data Expected (from your project's data/processed/ folder): - - btc_features.csv : BTC daily data with log_returns, vol_7d, vol_14d, vol_30d - - nifty_features.csv: NIFTY daily data with same structure - - gmsi_daily.csv : Pure exogenous GMSI (no price-derived inputs) - -If files are not found, realistic synthetic data is generated for demo purposes. -============================================================================= +scripts/08_market_dynamics_analysis.py — Market Fragility Index (MFI), shock +propagation and (optionally) GMSI-regime statistics on REAL prices. + + python scripts/08_market_dynamics_analysis.py # real BTC + NIFTY prices + python scripts/08_market_dynamics_analysis.py --gmsi data/processed/gmsi_exogenous.csv + python scripts/08_market_dynamics_analysis.py --demo # synthetic, watermarked, separate folder + +History (docs/ISSUES.md P0-1/P0-2): the previous version silently fell back to +seeded synthetic GARCH data whenever its (never-produced) input files were +missing, and those synthetic figures/numbers were published as real results. +This version reads data/raw/*_prices.csv, fails loudly if anything is missing, +and only simulates under an explicit --demo flag. """ +from __future__ import annotations -# ─── 0. Imports ────────────────────────────────────────────────────────────── +import argparse +import sys +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt import numpy as np import pandas as pd -import matplotlib.pyplot as plt -import matplotlib.gridspec as gridspec -from matplotlib.patches import Patch -import warnings -from scipy import stats -from scipy.stats import mannwhitneyu, kruskal -import os - -warnings.filterwarnings("ignore") -np.random.seed(42) - -plt.rcParams.update({ - "figure.facecolor": "#0d1117", - "axes.facecolor": "#161b22", - "axes.edgecolor": "#30363d", - "axes.labelcolor": "#c9d1d9", - "xtick.color": "#8b949e", - "ytick.color": "#8b949e", - "text.color": "#c9d1d9", - "grid.color": "#21262d", - "grid.linewidth": 0.6, - "figure.titlesize": 14, - "axes.titlesize": 12, - "font.family": "monospace", -}) - -COLORS = { - "low": "#3fb950", # green – low stress / healthy - "medium": "#d29922", # yellow – medium - "high": "#f85149", # red – high stress / fragile - "btc": "#f7931a", # bitcoin orange - "nifty": "#0070f3", # blue – nifty - "accent": "#bc8cff", # purple – highlights - "mfi": "#79c0ff", # light blue – MFI -} - -SAVE_DIR = "market_dynamics_output" -os.makedirs(SAVE_DIR, exist_ok=True) - - -# ─── 1. Data Loading / Synthetic Fallback ──────────────────────────────────── - -def load_or_generate_data(): - """ - Attempt to load real project data. - Falls back to realistic synthetic data if files are missing. - - Synthetic data is calibrated to match: - BTC: annualised vol ~80%, fat-tailed returns, volatility clustering - NIFTY: annualised vol ~20%, moderate clustering - GMSI: exogenous, bounded [0,1], slightly AR(1) - """ - DATA_PATHS = { - "btc": ["data/processed/btc_features.csv", - "data/raw/btc_daily.csv", - "notebooks/data/btc_features.csv"], - "nifty": ["data/processed/nifty_features.csv", - "data/raw/nifty_daily.csv", - "notebooks/data/nifty_features.csv"], - "gmsi": ["data/processed/gmsi_daily.csv", - "src/gmsi_daily.csv", - "notebooks/data/gmsi_daily.csv"], - } - - results = {} - for key, paths in DATA_PATHS.items(): - loaded = False - for p in paths: - if os.path.exists(p): - try: - df = pd.read_csv(p, parse_dates=True, index_col=0) - df.index = pd.to_datetime(df.index) - results[key] = df - print(f" ✅ Loaded {key} from: {p} ({len(df)} rows)") - loaded = True - break - except Exception as e: - print(f" ⚠️ Could not parse {p}: {e}") - if not loaded: - print(f" 🔧 Generating synthetic {key} data (demo mode)") - results[key] = None - - return results - - -def simulate_garch_returns(n, omega, alpha, beta, mu=0.0, df_t=5): - """ - Simulate returns from GARCH(1,1) with t-distributed innovations. - This gives realistic volatility clustering and fat tails. - - σ²_t = ω + α·ε²_{t-1} + β·σ²_{t-1} - r_t = μ + σ_t · z_t, z_t ~ t(df) - - Parameters are in daily log-return units: - BTC: ω~1e-4 gives ~σ_daily ≈ 3-5% - NIFTY: ω~2e-5 gives ~σ_daily ≈ 1% - """ - sigma2 = np.zeros(n) - ret = np.zeros(n) - uncond_v = omega / (1 - alpha - beta + 1e-10) - sigma2[0] = uncond_v # unconditional variance (start at steady state) - for t in range(1, n): - eps2 = ret[t-1] ** 2 - sigma2[t] = omega + alpha * eps2 + beta * sigma2[t-1] - sigma2[t] = max(sigma2[t], 1e-10) - # t-distribution scaled so variance = 1: divide by sqrt(df/(df-2)) - scale = np.sqrt(df_t / (df_t - 2)) - z = np.random.standard_t(df_t) / scale - ret[t] = mu + np.sqrt(sigma2[t]) * z +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +from pipeline import market_dynamics as md # noqa: E402 +from pipeline.data import ASSETS, FIGURES, load_close # noqa: E402 +from pipeline.volatility import annualise # noqa: E402 - return ret, np.sqrt(sigma2) +COLORS = {"BTC": "#f7931a", "NIFTY": "#0070f3", "low": "#3fb950", "medium": "#d29922", "high": "#f85149"} +DISPLAY_FROM = "2016-01-01" # earlier rows are burn-in for expanding normalisation / thresholds -def build_features(ret, sigma, dates): - """ - Build log returns + rolling volatility features from simulated data. - All returns and vol are in natural log-return space (e.g., 0.03 = 3%). - """ - df = pd.DataFrame({"log_return": ret, "realized_vol_daily": sigma}, index=dates) - - # Annualised rolling historical volatility (standard in finance) - df["vol_7d"] = df["log_return"].rolling(7).std() * np.sqrt(252) - df["vol_14d"] = df["log_return"].rolling(14).std() * np.sqrt(252) - df["vol_30d"] = df["log_return"].rolling(30).std() * np.sqrt(252) - - # Absolute return in daily log-return units (used for shock detection) - df["abs_return"] = df["log_return"].abs() - - return df.dropna() - - -def generate_synthetic_data(): - """ - Generate 2000 days (~8 years) of realistic synthetic market + GMSI data. - """ - n = 2000 +def synthetic_returns(n=2000, seed=42) -> dict[str, pd.Series]: + """GARCH(1,1)-t returns for --demo ONLY. Never mixed with real outputs.""" + rng = np.random.default_rng(seed) dates = pd.bdate_range("2016-01-01", periods=n) - - # BTC: high vol (~3-5% daily), strong clustering (α+β close to 1), fat tails - # ω = 1e-5, uncond. daily vol = sqrt(1e-5 / (1-0.12-0.85)) = sqrt(0.000333) ≈ 1.8% - btc_ret, btc_sig = simulate_garch_returns( - n, omega=1e-5, alpha=0.12, beta=0.85, mu=0.0003, df_t=4 - ) - btc = build_features(btc_ret, btc_sig, dates) - - # NIFTY: lower vol (~1% daily), moderate clustering - # ω = 3e-6, uncond. daily vol ≈ sqrt(0.0001) = 1% - nifty_ret, nifty_sig = simulate_garch_returns( - n, omega=3e-6, alpha=0.07, beta=0.90, mu=0.0003, df_t=6 - ) - nifty = build_features(nifty_ret, nifty_sig, dates) - - # GMSI: purely exogenous AR(1) with beta regime-shifts - # Slight negative relationship with future vol (as found in research) - gmsi_raw = np.zeros(n) - gmsi_raw[0] = 0.4 - for t in range(1, n): - shock = np.random.normal(0, 0.08) - gmsi_raw[t] = 0.3 + 0.65 * gmsi_raw[t-1] + shock - # Regime jumps (simulate news spikes) - if np.random.rand() < 0.02: - gmsi_raw[t] += np.random.choice([-0.3, 0.3]) - - # Clip to [0,1] and smooth slightly - gmsi_vals = pd.Series(gmsi_raw).clip(0, 1).rolling(3, min_periods=1).mean().values - gmsi = pd.DataFrame({"gmsi": gmsi_vals}, index=dates) - - return btc, nifty, gmsi - - -# ─── 2. Market Fragility Index (MFI) ───────────────────────────────────────── - -def compute_mfi(df, window=30): - """ - Market Fragility Index (MFI) - ───────────────────────────── - A composite, interpretable metric of how sensitive the market is to shocks. - - Components (all computed over a rolling window, no future leakage): - - (A) Volatility Persistence = AC1(|r_t|) - Measured as the lag-1 autocorrelation of absolute returns over [window] days. - High AC1 → shocks do not dissipate quickly → fragile. - - (B) Vol-of-Vol (VoV) - = std(rolling_vol_7d) / mean(rolling_vol_7d) over [window] days - High VoV → volatility regime is unstable → fragile. - - (C) Tail Risk Frequency - = fraction of days in [window] where |r_t| > 2σ (rolling 30d σ) - Captures how often large moves occur, independent of their sign. - - MFI = (A_norm + B_norm + C_norm) / 3 - Each component is min-max normalised over its own full history - (using expanding min/max to avoid look-ahead). - - Interpretation: - MFI → 1 : Market is fragile; shocks tend to amplify - MFI → 0 : Market is resilient; shocks decay quickly - """ - results = pd.DataFrame(index=df.index) - - # ── Component A: Volatility Persistence (AC1 of |returns|) ────────────── - abs_ret = df["log_return"].abs() - - def rolling_ac1(series, w): - """Lag-1 autocorrelation of a rolling window.""" - vals = [] - for i in range(len(series)): - if i < w - 1: - vals.append(np.nan) - else: - chunk = series.iloc[i - w + 1: i + 1].values - if np.std(chunk) < 1e-10: - vals.append(0.0) - else: - corr = np.corrcoef(chunk[:-1], chunk[1:])[0, 1] - vals.append(np.nan_to_num(corr, nan=0.0)) - return pd.Series(vals, index=series.index) - - results["persistence"] = rolling_ac1(abs_ret, window) - - # ── Component B: Vol-of-Vol ────────────────────────────────────────────── - vol7 = df["vol_7d"] - results["vol_of_vol"] = ( - vol7.rolling(window).std() / - vol7.rolling(window).mean().replace(0, np.nan) - ) - - # ── Component C: Tail Risk Frequency ──────────────────────────────────── - # 2σ threshold from 30-day rolling std (pure historical, no leakage) - sigma_30 = df["log_return"].rolling(30).std() - is_tail = (abs_ret > 2 * sigma_30).astype(float) - results["tail_freq"] = is_tail.rolling(window).mean() - - # ── Normalise each component (expanding min-max, no look-ahead) ───────── - for col in ["persistence", "vol_of_vol", "tail_freq"]: - s = results[col] - expanding_min = s.expanding().min() - expanding_max = s.expanding().max() - denom = (expanding_max - expanding_min).replace(0, np.nan) - results[f"{col}_norm"] = (s - expanding_min) / denom - - # ── Composite MFI ──────────────────────────────────────────────────────── - norm_cols = ["persistence_norm", "vol_of_vol_norm", "tail_freq_norm"] - results["MFI"] = results[norm_cols].mean(axis=1) - - return results - - -# ─── 3. Shock Propagation Analysis ─────────────────────────────────────────── - -def identify_shocks(df, quantile=0.95): - """ - Define shocks as days where |log_return| exceeds the [quantile] threshold. - Uses the expanding empirical quantile to avoid look-ahead bias. - - Returns boolean Series: True on shock days. - """ - abs_ret = df["log_return"].abs() - # Expanding quantile: threshold on day t uses only data up to t-1 - threshold = abs_ret.shift(1).expanding().quantile(quantile) - shocks = abs_ret > threshold - return shocks, threshold - - -def compute_shock_propagation(df, shock_mask, horizons=(1, 3, 7, 14, 21)): - """ - For each shock day, measure forward realized volatility at t+h. - - Forward vol at horizon h = abs(log_return at t+h) - (Single-day absolute return as a proxy for instantaneous vol; - rolling average is also computed for smoothness.) - - Returns: - shock_df: DataFrame of shock events with forward vol at each horizon - summary : mean ± std forward vol by horizon - """ - abs_ret = df["log_return"].abs() - shock_idx = np.where(shock_mask.values)[0] - - records = [] - for idx in shock_idx: - row = { - "shock_date": df.index[idx], - "shock_mag": abs_ret.iloc[idx], - "shock_date_idx": idx, - } - for h in horizons: - fwd_idx = idx + h - if fwd_idx < len(df): - row[f"fwd_vol_t{h}"] = abs_ret.iloc[fwd_idx] - # 3-day centred rolling vol around t+h (if available) - lo = max(0, fwd_idx - 1) - hi = min(len(df), fwd_idx + 2) - row[f"fwd_rollingvol_t{h}"] = abs_ret.iloc[lo:hi].mean() - else: - row[f"fwd_vol_t{h}"] = np.nan - row[f"fwd_rollingvol_t{h}"] = np.nan - records.append(row) - - shock_df = pd.DataFrame(records).set_index("shock_date") - - # Summary: mean forward vol by horizon - fwd_cols = [f"fwd_vol_t{h}" for h in horizons] - means = shock_df[fwd_cols].mean() - stds = shock_df[fwd_cols].std() - summary = pd.DataFrame({"horizon": list(horizons), - "mean_fwd_vol": means.values, - "std_fwd_vol": stds.values}) - return shock_df, summary - - -def estimate_shock_halflife(summary): - """ - Approximate shock half-life by fitting an exponential decay to - mean forward vol vs horizon. - - Model: V(h) = V_0 · exp(-λ·h) - Half-life = ln(2) / λ - - Returns: (lambda, half_life_days, R²) - """ - h_vals = np.array(summary["horizon"], dtype=float) - v_vals = np.array(summary["mean_fwd_vol"], dtype=float) - - # Remove NaN - mask = ~np.isnan(v_vals) - h_vals = h_vals[mask] - v_vals = v_vals[mask] - - if len(h_vals) < 3: - return np.nan, np.nan, np.nan - - # Log-linear regression: log(V) = log(V_0) - λ·h - log_v = np.log(v_vals + 1e-10) - slope, intercept, r, p, se = stats.linregress(h_vals, log_v) - lam = -slope - half_life = np.log(2) / lam if lam > 0 else np.inf - r2 = r ** 2 - - return lam, half_life, r2 - - -# ─── 4. Regime Conditioning ────────────────────────────────────────────────── - -def define_regimes(gmsi_series, low_q=0.20, high_q=0.80): - """ - Define market stress regimes from GMSI. - - Regime assignment uses expanding quantiles (no look-ahead): - Low Stress: GMSI ≤ 20th percentile - High Stress: GMSI ≥ 80th percentile - Medium : in between - - Returns: Series of regime labels {'low', 'medium', 'high'} - """ - regimes = pd.Series("medium", index=gmsi_series.index, dtype=str) - - for i in range(1, len(gmsi_series)): - hist = gmsi_series.iloc[:i] - lo = hist.quantile(low_q) - hi = hist.quantile(high_q) - val = gmsi_series.iloc[i] - if val <= lo: - regimes.iloc[i] = "low" - elif val >= hi: - regimes.iloc[i] = "high" - # else stays "medium" - - return regimes - - -def regime_stats(df, regimes, mfi_df): - """ - Compute key statistics within each regime: - - Mean / std of realized volatility - - Mean MFI - - Shock frequency - - Shock persistence (mean AC1 of abs returns) - """ - combined = df[["log_return", "vol_30d", "abs_return"]].copy() - combined["regime"] = regimes - combined["MFI"] = mfi_df["MFI"] - - stats_records = [] - for regime in ["low", "medium", "high"]: - mask = combined["regime"] == regime - sub = combined[mask] - if len(sub) < 10: - continue - - # Volatility persistence within regime (AC1 of abs returns) - ac1 = sub["abs_return"].autocorr(lag=1) - - stats_records.append({ - "regime": regime, - "n_days": len(sub), - "mean_vol30d": sub["vol_30d"].mean(), - "std_vol30d": sub["vol_30d"].std(), - "mean_MFI": sub["MFI"].mean(), - "shock_freq": (sub["abs_return"] > sub["abs_return"].quantile(0.95)).mean(), - "persistence_ac1": ac1, - }) - - return pd.DataFrame(stats_records).set_index("regime") - - -# ─── 5. Plotting Functions ──────────────────────────────────────────────────── - -def fig_mfi_over_time(df, mfi_df, regimes, asset_name): - """Figure 1: MFI time series with regime background shading.""" - fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True, - gridspec_kw={"hspace": 0.08}) - fig.suptitle(f"Market Fragility Index — {asset_name}", y=0.98, fontsize=14, color="#c9d1d9") - - dates = df.index - - # ── Panel 1: Price proxy (cumulative log return) ── - ax1 = axes[0] - cum_ret = df["log_return"].cumsum().values - ax1.plot(dates, cum_ret, color=COLORS["btc"] if "BTC" in asset_name else COLORS["nifty"], - linewidth=0.9, alpha=0.9) - ax1.set_ylabel("Cum. Log Return", fontsize=9) - ax1.set_title("Price Index (Cumulative Log Return)", fontsize=10, pad=4) - ax1.grid(True, alpha=0.3) - - # ── Panel 2: MFI ── - ax2 = axes[1] - mfi = mfi_df["MFI"].reindex(dates) - ax2.plot(dates, mfi, color=COLORS["mfi"], linewidth=1.0, alpha=0.85, label="MFI") - ax2.fill_between(dates, mfi, alpha=0.15, color=COLORS["mfi"]) - ax2.axhline(0.7, color=COLORS["high"], linestyle="--", linewidth=0.8, alpha=0.6, label="High fragility (0.7)") - ax2.axhline(0.3, color=COLORS["low"], linestyle="--", linewidth=0.8, alpha=0.6, label="Low fragility (0.3)") - ax2.set_ylabel("MFI", fontsize=9) - ax2.set_ylim(0, 1) - ax2.legend(fontsize=8, loc="upper left") - ax2.grid(True, alpha=0.3) - - # ── Panel 3: Vol 30d with regime shading ── - ax3 = axes[2] - vol30 = df["vol_30d"].reindex(dates) - ax3.plot(dates, vol30, color="#c9d1d9", linewidth=0.8, alpha=0.85) - - # Regime background shading - reg_colors = {"low": COLORS["low"], "medium": COLORS["medium"], "high": COLORS["high"]} - reg_vals = regimes.reindex(dates).fillna("medium") - prev_regime = None - seg_start = None - for d, r in reg_vals.items(): - if r != prev_regime: - if prev_regime is not None: - ax3.axvspan(seg_start, d, alpha=0.12, color=reg_colors[prev_regime], linewidth=0) - seg_start = d - prev_regime = r - if prev_regime: - ax3.axvspan(seg_start, dates[-1], alpha=0.12, color=reg_colors[prev_regime], linewidth=0) - - ax3.set_ylabel("30d Volatility", fontsize=9) - ax3.set_xlabel("Date", fontsize=9) - patches = [Patch(color=COLORS["low"], alpha=0.5, label="Low Stress"), - Patch(color=COLORS["medium"], alpha=0.5, label="Medium Stress"), - Patch(color=COLORS["high"], alpha=0.5, label="High Stress")] - ax3.legend(handles=patches, fontsize=8, loc="upper right") - ax3.grid(True, alpha=0.3) - - plt.tight_layout() - path = f"{SAVE_DIR}/fig1_mfi_{asset_name.lower()}.png" - plt.savefig(path, dpi=150, bbox_inches="tight") - print(f" Saved: {path}") - return fig - - -def fig_shock_decay(shock_summary_list, labels): - """Figure 2: Shock propagation / decay curves per asset.""" + out = {} + for asset, (omega, alpha, beta, dof) in {"BTC": (1e-5, .12, .85, 4), "NIFTY": (3e-6, .07, .90, 6)}.items(): + s2, r = omega / (1 - alpha - beta), np.zeros(n) + for t in range(1, n): + s2 = omega + alpha * r[t - 1] ** 2 + beta * s2 + r[t] = np.sqrt(s2) * rng.standard_t(dof) / np.sqrt(dof / (dof - 2)) + out[asset] = pd.Series(r, index=dates) + return out + + +def watermark(fig, demo): + if demo: + fig.text(0.5, 0.5, "SYNTHETIC DEMO DATA — NOT A RESULT", ha="center", va="center", fontsize=28, + color="red", alpha=0.25, rotation=20) + + +def fig_mfi(r, mfi, asset, out, demo): + m = mfi.loc[DISPLAY_FROM:] + fig, ax = plt.subplots(3, 1, figsize=(13, 9), sharex=True) + ax[0].plot(r.loc[DISPLAY_FROM:].cumsum(), color=COLORS[asset], lw=.9); ax[0].set_ylabel("cum. log return") + ax[1].plot(m["MFI"], lw=.8); ax[1].set_ylim(0, 1); ax[1].set_ylabel("MFI") + v30 = annualise(r.rolling(30).std(), asset).loc[DISPLAY_FROM:] + ax[2].plot(v30, color="0.3", lw=.8); ax[2].set_ylabel("30d vol (annualised)") + fig.suptitle(f"Market Fragility Index — {asset} ({'SYNTHETIC' if demo else 'real prices'})") + watermark(fig, demo); fig.tight_layout(); fig.savefig(out / f"fig1_mfi_{asset.lower()}.png", dpi=110); plt.close(fig) + + fig, ax = plt.subplots(3, 1, figsize=(13, 7), sharex=True) + for a, (c, lbl) in zip(ax, [("persistence_norm", "A: persistence AC1(|r|)"), ("vol_of_vol_norm", "B: vol-of-vol"), + ("tail_freq_norm", "C: tail frequency")]): + a.plot(m[c], lw=.7); a.set_ylabel(lbl, fontsize=8); a.set_ylim(0, 1) + fig.suptitle(f"MFI components — {asset}"); watermark(fig, demo); fig.tight_layout() + fig.savefig(out / f"fig5_mfi_components_{asset.lower()}.png", dpi=110); plt.close(fig) + + +def fig_shocks(tables, out, demo): fig, ax = plt.subplots(figsize=(10, 5)) - colors = [COLORS["btc"], COLORS["nifty"], COLORS["accent"]] - - for i, (summary, label) in enumerate(zip(shock_summary_list, labels)): - h = summary["horizon"].values - mean = summary["mean_fwd_vol"].values - std = summary["std_fwd_vol"].values - c = colors[i % len(colors)] - ax.plot(h, mean, "o-", color=c, label=label, linewidth=1.5, markersize=5) - ax.fill_between(h, mean - 0.5*std, mean + 0.5*std, alpha=0.15, color=c) - - ax.set_xlabel("Days After Shock", fontsize=10) - ax.set_ylabel("Mean Forward Absolute Return", fontsize=10) - ax.set_title("Shock Propagation: Forward Volatility Decay After Top-5% Events", fontsize=11) - ax.legend(fontsize=9) - ax.grid(True, alpha=0.3) - - path = f"{SAVE_DIR}/fig2_shock_decay.png" - plt.savefig(path, dpi=150, bbox_inches="tight") - print(f" Saved: {path}") - return fig - - -def fig_regime_shock_response(df, shock_df, regimes, asset_name, horizons=(1, 3, 7, 14)): - """ - Figure 3: Shock response separated by regime. - Bar chart: mean forward vol at each horizon, grouped by regime. - """ - # Align regimes to shock events - shock_dates = shock_df.index - shock_regimes = regimes.reindex(shock_dates).fillna("medium") - - fig, axes = plt.subplots(1, len(horizons), figsize=(14, 5), sharey=True) - fig.suptitle(f"Shock Response by Regime — {asset_name}", fontsize=13, color="#c9d1d9") - - regime_order = ["low", "medium", "high"] - regime_colors = [COLORS["low"], COLORS["medium"], COLORS["high"]] - - for i, h in enumerate(horizons): - ax = axes[i] - col = f"fwd_vol_t{h}" - if col not in shock_df.columns: - continue - - means = [] - stds = [] - ns = [] - for r in regime_order: - mask = shock_regimes == r - vals = shock_df.loc[mask, col].dropna() - means.append(vals.mean() if len(vals) > 0 else 0) - stds.append(vals.std() if len(vals) > 1 else 0) - ns.append(len(vals)) - - bars = ax.bar(regime_order, means, color=regime_colors, alpha=0.75, - edgecolor="#30363d", linewidth=0.5) - ax.errorbar(regime_order, means, yerr=[s/2 for s in stds], - fmt="none", color="#c9d1d9", capsize=4, linewidth=1.2) - - # Add N labels - for bar, n in zip(bars, ns): - ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() * 1.02, - f"n={n}", ha="center", va="bottom", fontsize=7.5, color="#8b949e") - - ax.set_title(f"t+{h} days", fontsize=10) - ax.set_xlabel("Regime", fontsize=8) - if i == 0: - ax.set_ylabel("Mean |Return|", fontsize=9) - ax.grid(True, alpha=0.3, axis="y") - - plt.tight_layout() - path = f"{SAVE_DIR}/fig3_regime_shock_{asset_name.lower()}.png" - plt.savefig(path, dpi=150, bbox_inches="tight") - print(f" Saved: {path}") - return fig - - -def fig_mfi_by_regime(regime_stats_df, asset_name): - """Figure 4: MFI distribution across regimes (violin/box-style summary).""" - fig, axes = plt.subplots(1, 3, figsize=(12, 5)) - fig.suptitle(f"Regime Statistics — {asset_name}", fontsize=13, color="#c9d1d9") - - metrics = [ - ("mean_vol30d", "Mean Volatility (30d)"), - ("mean_MFI", "Mean MFI"), - ("persistence_ac1", "Vol Persistence (AC1)"), - ] - - regime_order = [r for r in ["low", "medium", "high"] if r in regime_stats_df.index] - regime_colors = {"low": COLORS["low"], "medium": COLORS["medium"], "high": COLORS["high"]} - - for ax, (col, title) in zip(axes, metrics): - vals = [regime_stats_df.loc[r, col] if r in regime_stats_df.index else 0 - for r in regime_order] - colors = [regime_colors[r] for r in regime_order] - bars = ax.bar(regime_order, vals, color=colors, alpha=0.8, - edgecolor="#30363d", linewidth=0.5) - ax.set_title(title, fontsize=10) - ax.set_xlabel("Regime", fontsize=8) - ax.grid(True, alpha=0.3, axis="y") - - for bar, v in zip(bars, vals): - ax.text(bar.get_x() + bar.get_width()/2, - bar.get_height() * 1.02 if v >= 0 else bar.get_height() - abs(v)*0.05, - f"{v:.3f}", ha="center", va="bottom", fontsize=8.5, color="#c9d1d9") - - plt.tight_layout() - path = f"{SAVE_DIR}/fig4_regime_stats_{asset_name.lower()}.png" - plt.savefig(path, dpi=150, bbox_inches="tight") - print(f" Saved: {path}") - return fig - - -def fig_mfi_components(mfi_df, asset_name): - """Figure 5: Individual MFI component time series (decomposition).""" - fig, axes = plt.subplots(3, 1, figsize=(14, 9), sharex=True, - gridspec_kw={"hspace": 0.08}) - fig.suptitle(f"MFI Component Decomposition — {asset_name}", fontsize=13, color="#c9d1d9") - - components = [ - ("persistence_norm", "A: Volatility Persistence (AC1 of |r|)", COLORS["btc"]), - ("vol_of_vol_norm", "B: Vol-of-Vol (CoV of 7d vol)", COLORS["accent"]), - ("tail_freq_norm", "C: Tail Risk Frequency (|r| > 2σ)", COLORS["high"]), - ] - - for ax, (col, label, color) in zip(axes, components): - if col in mfi_df.columns: - ax.plot(mfi_df.index, mfi_df[col], color=color, linewidth=0.9, alpha=0.85) - ax.fill_between(mfi_df.index, mfi_df[col], alpha=0.12, color=color) - ax.set_ylabel(label, fontsize=8.5) - ax.set_ylim(0, 1) - ax.grid(True, alpha=0.3) - - axes[-1].set_xlabel("Date", fontsize=9) - plt.tight_layout() - path = f"{SAVE_DIR}/fig5_mfi_components_{asset_name.lower()}.png" - plt.savefig(path, dpi=150, bbox_inches="tight") - print(f" Saved: {path}") - return fig - - -# ─── 6. Statistical Tests ───────────────────────────────────────────────────── - -def regime_significance_tests(df, regimes, col="vol_30d"): - """ - Test whether distributions of [col] differ significantly across regimes. - Uses Kruskal-Wallis (non-parametric, appropriate for financial data). - Also reports Mann-Whitney U for pairwise comparisons. - """ - print(f"\n Statistical Significance Tests for '{col}' across regimes:") - print(" " + "─" * 55) - - groups = {} - for r in ["low", "medium", "high"]: - mask = regimes == r - groups[r] = df.loc[mask, col].dropna().values - - # Kruskal-Wallis - try: - stat, p = kruskal(*[groups[r] for r in groups if len(groups[r]) > 0]) - print(f" Kruskal-Wallis H={stat:.3f}, p={p:.4f} " - f"{'✅ Significant' if p < 0.05 else '❌ Not significant'}") - except Exception as e: - print(f" Kruskal-Wallis failed: {e}") - - # Pairwise Mann-Whitney - pairs = [("low", "high"), ("low", "medium"), ("medium", "high")] - for r1, r2 in pairs: - if len(groups.get(r1, [])) < 3 or len(groups.get(r2, [])) < 3: - continue - try: - stat, p = mannwhitneyu(groups[r1], groups[r2], alternative="two-sided") - print(f" Mann-Whitney [{r1} vs {r2}]: U={stat:.0f}, p={p:.4f} " - f"{'✅' if p < 0.05 else '❌'}") - except Exception as e: - print(f" Mann-Whitney [{r1} vs {r2}] failed: {e}") - - -# ─── 7. Main Analysis Pipeline ──────────────────────────────────────────────── - -def run_analysis(df_market, gmsi_df, asset_name): - """ - Full analysis pipeline for one asset. - - Steps: - 1. Align market data with GMSI - 2. Compute MFI - 3. Define regimes - 4. Identify shocks - 5. Shock propagation - 6. Regime conditioning - 7. Statistical tests - 8. Plots - Returns: dict of all computed artifacts - """ - print(f"\n{'='*65}") - print(f" ANALYSIS: {asset_name}") - print(f"{'='*65}") - print(f" Market data: {len(df_market)} rows ({df_market.index[0].date()} → {df_market.index[-1].date()})") - - # ── Step 1: Align ──────────────────────────────────────────────────────── - common_idx = df_market.index.intersection(gmsi_df.index) - if len(common_idx) < 100: - print(f" ⚠️ Only {len(common_idx)} overlapping dates with GMSI — using market-only dates") - # Forward-fill GMSI or use neutral value if no overlap - gmsi_aligned = pd.Series(0.5, index=df_market.index, name="gmsi") + for asset, sp in tables.items(): + ax.plot(sp["horizon"], sp["ratio_to_baseline"], "o-", color=COLORS[asset], label=asset) + lo = sp["ci_low"] / sp["baseline_mean_abs_return"]; hi = sp["ci_high"] / sp["baseline_mean_abs_return"] + ax.fill_between(sp["horizon"], lo, hi, color=COLORS[asset], alpha=.15) + ax.axhline(1, color="k", ls="--", lw=.8, label="unconditional mean |r|") + ax.set_xlabel("days after shock (top-5% |r|, expanding threshold)") + ax.set_ylabel("mean |r| ÷ unconditional mean |r| (95% CI)") + ax.set_title("Shock propagation" + (" — SYNTHETIC" if demo else " — real prices")); ax.legend() + watermark(fig, demo); fig.tight_layout(); fig.savefig(out / "fig6_shock_decay_comparison.png", dpi=110); plt.close(fig) + + +def regime_analysis(r, mfi, gmsi, asset, out, demo): + """Needs a real GMSI series. Expanding (past-only) regime thresholds; AC1 within contiguous spells.""" + g = gmsi.reindex(r.index).ffill() + reg = md.expanding_regimes(g) + rows = [] + for name in ["low", "medium", "high"]: + mask = reg == name + ac1, npairs = md.within_spell_ac1(r.abs(), reg, name) + rows.append({"regime": name, "n_days": int(mask.sum()), + "mean_vol30d_annualised": float(annualise(r.rolling(30).std(), asset)[mask].mean()), + "mean_MFI": float(mfi["MFI"][mask].mean()), "ac1_abs_return_within_spell": ac1, + "n_consecutive_pairs": npairs}) + tab = pd.DataFrame(rows).set_index("regime") + print(f"\n{asset} regime statistics (expanding thresholds, within-spell AC1):\n{tab.round(4)}") + tab.to_csv(out / f"regime_stats_{asset.lower()}.csv") + fig, ax = plt.subplots(1, 3, figsize=(12, 4)) + for a, c in zip(ax, ["mean_vol30d_annualised", "mean_MFI", "ac1_abs_return_within_spell"]): + a.bar(tab.index, tab[c], color=[COLORS[i] for i in tab.index]); a.set_title(c, fontsize=9) + fig.suptitle(f"GMSI regime statistics — {asset}"); watermark(fig, demo); fig.tight_layout() + fig.savefig(out / f"fig4_regime_stats_{asset.lower()}.png", dpi=110); plt.close(fig) + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--gmsi", type=Path, help="CSV with columns date,pure_gmsi (scripts/reconstruct_gmsi.py output)") + ap.add_argument("--demo", action="store_true", help="synthetic GARCH data, written to reports/figures/demo/") + a = ap.parse_args() + + out = FIGURES / "demo" if a.demo else FIGURES + out.mkdir(parents=True, exist_ok=True) + if a.demo: + print("DEMO MODE: synthetic data. Nothing written here is a research result.") + returns = synthetic_returns() else: - gmsi_aligned = gmsi_df["gmsi"].reindex(df_market.index).ffill() - print(f" Aligned: {len(common_idx)} dates") - - # ── Step 2: MFI ────────────────────────────────────────────────────────── - print(f"\n [1/5] Computing Market Fragility Index...") - mfi_df = compute_mfi(df_market, window=30) - print(f" MFI range: [{mfi_df['MFI'].min():.3f}, {mfi_df['MFI'].max():.3f}]") - print(f" Mean MFI : {mfi_df['MFI'].mean():.3f}") - - # ── Step 3: Regimes ────────────────────────────────────────────────────── - print(f"\n [2/5] Defining Regimes from GMSI...") - regimes = define_regimes(gmsi_aligned) - rc = regimes.value_counts() - for r in ["low", "medium", "high"]: - n = rc.get(r, 0) - print(f" {r:8s}: {n:5d} days ({100*n/len(regimes):.1f}%)") - - # ── Step 4: Shocks ──────────────────────────────────────────────────────── - print(f"\n [3/5] Identifying Shocks (top 5% abs returns)...") - shock_mask, threshold = identify_shocks(df_market, quantile=0.95) - n_shocks = shock_mask.sum() - print(f" Shocks identified: {n_shocks} ({100*n_shocks/len(df_market):.1f}% of days)") - - # ── Step 5: Propagation ─────────────────────────────────────────────────── - print(f"\n [4/5] Computing Shock Propagation...") - horizons = (1, 3, 7, 14, 21) - shock_df, summary = compute_shock_propagation(df_market, shock_mask, horizons=horizons) - lam, halflife, r2 = estimate_shock_halflife(summary) - print(f" Shock half-life : {halflife:.1f} days (λ={lam:.4f}, R²={r2:.3f})") - print(f" Forward vol at t+1: {summary.loc[summary.horizon==1,'mean_fwd_vol'].values[0]:.4f}") - print(f" Forward vol at t+14: {summary.loc[summary.horizon==14,'mean_fwd_vol'].values[0]:.4f}") - - # ── Step 6: Regime Stats ────────────────────────────────────────────────── - print(f"\n [5/5] Regime-Conditioned Statistics...") - rstats = regime_stats(df_market, regimes, mfi_df) - print(rstats.to_string()) - - # ── Statistical Tests ────────────────────────────────────────────────────── - df_aligned = df_market.copy() - df_aligned["regime"] = regimes - regime_significance_tests(df_aligned, regimes, col="vol_30d") - regime_significance_tests(df_aligned, regimes, col="abs_return") - - # ── Plots ────────────────────────────────────────────────────────────────── - print(f"\n Generating plots...") - plt.close("all") - fig1 = fig_mfi_over_time(df_market, mfi_df, regimes, asset_name) - fig2 = fig_shock_decay([summary], [asset_name]) # single asset; multi-asset done later - fig3 = fig_regime_shock_response(df_market, shock_df, regimes, asset_name) - fig4 = fig_mfi_by_regime(rstats, asset_name) - fig5 = fig_mfi_components(mfi_df, asset_name) - plt.close("all") - - return { - "asset": asset_name, - "df": df_market, - "mfi_df": mfi_df, - "regimes": regimes, - "shock_df": shock_df, - "summary": summary, - "rstats": rstats, - "halflife": halflife, - "lambda": lam, - } - - -def run_comparative_shock_plot(results_list): - """Figure 6: Side-by-side shock decay for all assets.""" - summaries = [r["summary"] for r in results_list] - labels = [r["asset"] for r in results_list] - fig = fig_shock_decay(summaries, labels) - path = f"{SAVE_DIR}/fig6_shock_decay_comparison.png" - fig.savefig(path, dpi=150, bbox_inches="tight") - print(f" Saved: {path}") - plt.close("all") - - -def print_interpretation(results): - """Print plain-English scientific interpretation of results.""" - r = results - print(f""" -╔══════════════════════════════════════════════════════════════════╗ -║ SCIENTIFIC INTERPRETATION — {r['asset']:<33} ║ -╚══════════════════════════════════════════════════════════════════╝ - -1. MARKET FRAGILITY INDEX (MFI) - ───────────────────────────── - The MFI captures three independent dimensions of fragility: - A. Volatility Persistence: high AC1 of |returns| → shocks self-reinforce - B. Vol-of-Vol: erratic volatility → regime instability - C. Tail Frequency: clustering of large moves → non-Gaussian risk - - Mean MFI = {r['mfi_df']['MFI'].mean():.3f} - → {'Elevated fragility. Market was frequently in states where ' - 'shocks could amplify.' if r['mfi_df']['MFI'].mean() > 0.55 - else 'Moderate fragility. Most of the sample was in recoverable regimes.'} - -2. SHOCK PROPAGATION - ────────────────── - Shock half-life ≈ {r['halflife']:.1f} days - → Shocks {'persist for several weeks — evidence of slow information ' - 'absorption or liquidity constraints.' if r['halflife'] > 10 - else 'decay within roughly 1–2 weeks — markets absorb news relatively fast.'} - - This is NOT prediction — it describes the structural dynamics of how - information and risk flow through the market. - -3. REGIME BEHAVIOR - ───────────────── - Key cross-regime differences: -{r['rstats'][['mean_vol30d','mean_MFI','persistence_ac1']].to_string()} - - Interpretation: - → If MFI is HIGHER in low-stress regimes: markets become complacent - and accumulate hidden fragility during quiet periods. Shocks then - hit hard precisely because participants are under-positioned for risk. - → If MFI is HIGHER in high-stress regimes: markets remain aware of - their fragility and may actually recover faster (vol compression - after risk-off events). - -4. CORE INSIGHT - ───────────── - Markets are not driven directly by stress or news content, but by - how information INTERACTS with current fragility levels, positioning, - and liquidity. A given shock will have very different impact depending - on the structural state the market is in when it arrives. -""") - - -# ─── 8. Entry Point ────────────────────────────────────────────────────────── - -if __name__ == "__main__": - print("\n" + "="*65) - print(" MARKET DYNAMICS ANALYSIS") - print(" Phase 2: Fragility · Shock Propagation · Regime Dynamics") - print("="*65) - - # ── Load data ────────────────────────────────────────────────────────── - print("\n[LOADING DATA]") - raw = load_or_generate_data() - - # ── Resolve: use real data if available, else synthetic ──────────────── - if all(v is None for v in raw.values()): - print("\n All files missing → generating full synthetic dataset") - btc_df, nifty_df, gmsi_df = generate_synthetic_data() + returns = {asset: np.log(c / c.shift(1)) for asset, c in ((x, load_close(x)) for x in ASSETS)} + + gmsi = None + if a.gmsi: + if not a.gmsi.exists(): + raise SystemExit(f"--gmsi file {a.gmsi} not found") + gdf = pd.read_csv(a.gmsi, parse_dates=["date"]) + if "pure_gmsi" not in gdf: + raise SystemExit(f"{a.gmsi} has no 'pure_gmsi' column") + gmsi = gdf.set_index("date")["pure_gmsi"] else: - btc_df, nifty_df, gmsi_df = raw.get("btc"), raw.get("nifty"), raw.get("gmsi") - - if gmsi_df is None: - print(" ⚠️ GMSI not found — generating synthetic GMSI") - n = max(len(btc_df) if btc_df is not None else 0, - len(nifty_df) if nifty_df is not None else 0) - dates = (btc_df if btc_df is not None else nifty_df).index - _, _, gmsi_df = generate_synthetic_data() - gmsi_df = gmsi_df.reindex(dates).ffill().bfill() - - if btc_df is None: - print(" ⚠️ BTC data not found — generating synthetic BTC") - btc_df, _, _ = generate_synthetic_data() - - if nifty_df is None: - print(" ⚠️ NIFTY data not found — generating synthetic NIFTY") - _, nifty_df, _ = generate_synthetic_data() + print("No --gmsi given: skipping regime statistics (the GMSI series is not committed to the repo).") + + tables = {} + for asset, r in returns.items(): + mfi = md.compute_mfi(r) + shocks, _ = md.identify_shocks(r) + tables[asset] = md.shock_propagation(r, shocks) + print(f"\n{asset}: {int(shocks.sum())} shocks; MFI max {mfi['MFI'].max():.3f} on {mfi['MFI'].idxmax():%Y-%m-%d}") + print(tables[asset].round(5).to_string(index=False)) + fig_mfi(r, mfi, asset, out, a.demo) + if gmsi is not None: + regime_analysis(r, mfi, gmsi, asset, out, a.demo) + fig_shocks(tables, out, a.demo) + print(f"\nFigures written to {out}") - # Ensure required columns exist - for df, name in [(btc_df, "BTC"), (nifty_df, "NIFTY")]: - if "log_return" not in df.columns and "Close" in df.columns: - df["log_return"] = np.log(df["Close"] / df["Close"].shift(1)) - print(f" Computed log_return for {name} from Close prices") - if "abs_return" not in df.columns: - df["abs_return"] = df["log_return"].abs() - for w in [7, 14, 30]: - col = f"vol_{w}d" - if col not in df.columns: - df[col] = df["log_return"].rolling(w).std() * np.sqrt(252) - df.dropna(subset=["log_return"], inplace=True) - # ── Run analysis ─────────────────────────────────────────────────────── - print("\n[RUNNING ANALYSIS]") - btc_results = run_analysis(btc_df.copy(), gmsi_df, asset_name="BTC") - nifty_results = run_analysis(nifty_df.copy(), gmsi_df, asset_name="NIFTY") - - # ── Comparative plot ─────────────────────────────────────────────────── - print("\n[COMPARATIVE PLOTS]") - run_comparative_shock_plot([btc_results, nifty_results]) - - # ── Interpretations ──────────────────────────────────────────────────── - print_interpretation(btc_results) - print_interpretation(nifty_results) - - print(f"\n{'='*65}") - print(f" OUTPUT FILES → {SAVE_DIR}/") - print(f" fig1_mfi_*.png : MFI time series + regime background") - print(f" fig2_shock_decay.png : Forward vol decay after shocks") - print(f" fig3_regime_shock_*.png : Shock response by regime") - print(f" fig4_regime_stats_*.png : Regime-level summary statistics") - print(f" fig5_mfi_components_* : MFI component decomposition") - print(f" fig6_shock_decay_*.png : BTC vs NIFTY shock decay comparison") - print(f"{'='*65}\n") +if __name__ == "__main__": + main() diff --git a/scripts/construct_vsi_full.py b/scripts/construct_vsi_full.py index 64746ca..d8f0377 100644 --- a/scripts/construct_vsi_full.py +++ b/scripts/construct_vsi_full.py @@ -1,14 +1,18 @@ import pandas as pd import numpy as np import os +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +PROCESSED = ROOT / "data" / "processed" def create_vsi_dataset(price_path, text_path, events_path, asset_name, output_path): - print(f"\\n{'='*50}") + print(f"\n{'='*50}") print(f"Processing {asset_name} VSI Dataset") print(f"{'='*50}") # Task 1 - Load Base Price Data - print("\\n[Task 1] Loading Base Price Data") + print("\n[Task 1] Loading Base Price Data") df = pd.read_csv(price_path) df['date'] = pd.to_datetime(df['date']) df = df.sort_values('date').reset_index(drop=True) @@ -18,21 +22,21 @@ def create_vsi_dataset(price_path, text_path, events_path, asset_name, output_pa print(f" Row count: {len(df)}") # Task 2 - Compute Returns & Volatility - print("\\n[Task 2] Computing Returns & Volatility") + print("\n[Task 2] Computing Returns & Volatility") # Log return formula: ln(P_t / P_t-1) df['return'] = np.log(df['close'] / df['close'].shift(1)) # Rolling volatility (annualized or just raw std, we'll use raw std of log returns for daily) - df['volatility_7d'] = df['return'].rolling(window=7, min_periods=1).std() - df['volatility_14d'] = df['return'].rolling(window=14, min_periods=1).std() - df['volatility_30d'] = df['return'].rolling(window=30, min_periods=1).std() + df['volatility_7d'] = df['return'].rolling(window=7, min_periods=7).std() + df['volatility_14d'] = df['return'].rolling(window=14, min_periods=14).std() + df['volatility_30d'] = df['return'].rolling(window=30, min_periods=30).std() print(f" NaNs in volatility_7d: {df['volatility_7d'].isna().sum()}") print(f" NaNs in volatility_14d: {df['volatility_14d'].isna().sum()}") print(f" NaNs in volatility_30d: {df['volatility_30d'].isna().sum()}") # Task 3 - Attach Sentiment Data - print("\\n[Task 3] Attaching Sentiment Data") + print("\n[Task 3] Attaching Sentiment Data") rows_before = len(df) # Process text sentiment @@ -90,7 +94,7 @@ def create_vsi_dataset(price_path, text_path, events_path, asset_name, output_pa print(f" Row count after merge: {rows_after}") # Task 4 - Feature Normalization (Z-score expanding to avoid leakage) - print("\\n[Task 4] Feature Normalization") + print("\n[Task 4] Feature Normalization") def expanding_z_score(series, min_periods=30): mean = series.expanding(min_periods=min_periods).mean() std = series.expanding(min_periods=min_periods).std() @@ -113,7 +117,7 @@ def expanding_z_score(series, min_periods=30): df['attention_z'] = np.nan # Task 5 - Construct VSI - print("\\n[Task 5] Constructing VSI") + print("\n[Task 5] Constructing VSI") # Formula: VSI = w1 * vol_z + w2 * sentiment_z + w3 * attention_z # Weights = equal where available. Z-scores already handle scale. # To properly compute without losing rows, we treat NaNs as 0 (neutral) for sentiment/attention, @@ -137,7 +141,7 @@ def expanding_z_score(series, min_periods=30): print(" Calculated VSI using equal weights for available z-score features.") # Task 6 - Final Dataset Integrity Check - print("\\n[Task 6] Final Dataset Integrity Check") + print("\n[Task 6] Final Dataset Integrity Check") # "Drop rows only if VSI cannot be computed" # Actually, if vol_z is NaN (e.g. first 30 days), VSI might be 0 because we filled with 0. # But truly, if 'volatility_30d' is NaN, we probably shouldn't have a VSI. @@ -179,20 +183,20 @@ def expanding_z_score(series, min_periods=30): if __name__ == '__main__': # BTC create_vsi_dataset( - price_path='data/raw/btc_prices.csv', - text_path='data/processed/text_with_sentiment.csv', - events_path='data/processed/daily_events.csv', + price_path=ROOT / 'data/raw/btc_prices.csv', + text_path=PROCESSED / 'text_with_sentiment.csv', + events_path=PROCESSED / 'daily_events.csv', asset_name='BTC', - output_path='data/processed/btc_vsi_full.csv' + output_path=PROCESSED / 'btc_vsi_full.csv' ) # NIFTY create_vsi_dataset( - price_path='data/raw/nifty_prices.csv', - text_path='data/processed/text_with_sentiment.csv', - events_path='data/processed/daily_events.csv', + price_path=ROOT / 'data/raw/nifty_prices.csv', + text_path=PROCESSED / 'text_with_sentiment.csv', + events_path=PROCESSED / 'daily_events.csv', asset_name='NIFTY', - output_path='data/processed/nifty_vsi_full.csv' + output_path=PROCESSED / 'nifty_vsi_full.csv' ) - print("\\nDone!") + print("\nDone!") diff --git a/scripts/data_check.py b/scripts/data_check.py index 3653e07..89eb03f 100644 --- a/scripts/data_check.py +++ b/scripts/data_check.py @@ -1,4 +1,8 @@ import pandas as pd +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +PROCESSED = ROOT / "data" / "processed" def check_file(path, name): print(f'\n--- {name} ---') @@ -13,8 +17,8 @@ def check_file(path, name): except Exception as e: print(f'Error: {e}') -check_file('data/processed/btc_vsi_long_v2.csv', 'BTC Data') -check_file('data/processed/nifty_vsi_long_v2.csv', 'NIFTY Data') -check_file('data/processed/text_with_sentiment.csv', 'Sentiment Data (Text)') -check_file('data/processed/btc_sentiment_aligned.csv', 'BTC Sentiment Data') -check_file('data/processed/daily_events.csv', 'Daily Events Data') +check_file(PROCESSED / 'btc_vsi_long_v2.csv', 'BTC Data') +check_file(PROCESSED / 'nifty_vsi_long_v2.csv', 'NIFTY Data') +check_file(PROCESSED / 'text_with_sentiment.csv', 'Sentiment Data (Text)') +check_file(PROCESSED / 'btc_sentiment_aligned.csv', 'BTC Sentiment Data') +check_file(PROCESSED / 'daily_events.csv', 'Daily Events Data') diff --git a/scripts/download_gdelt.py b/scripts/download_gdelt.py index 64c3e51..5bf75ee 100644 --- a/scripts/download_gdelt.py +++ b/scripts/download_gdelt.py @@ -3,15 +3,18 @@ import io from pathlib import Path +"""Download quarterly GDELT 1.0 event archives: python scripts/download_gdelt.py 2015 1 [2015 2 ...]""" +import sys + BASE_URL = "http://data.gdeltproject.org/events" -RAW_DIR = Path("../data/raw/gdelt/events") -RAW_DIR.mkdir(parents=True, exist_ok=True) +RAW_DIR = Path(__file__).resolve().parents[1] / "data" / "raw" / "gdelt" / "events" def download_quarter(year, quarter): qmap = {1: "Q1", 2: "Q2", 3: "Q3", 4: "Q4"} fname = f"{year}{qmap[quarter]}.zip" url = f"{BASE_URL}/{fname}" + RAW_DIR.mkdir(parents=True, exist_ok=True) print(f"\n📦 Downloading {fname}") try: @@ -28,4 +31,12 @@ def download_quarter(year, quarter): size_mb = out.stat().st_size / 1e6 print(f" → Extracted {file} ({size_mb:.1f} MB)") - print(f"✅ Completed {year} {qmap[quarter]}") \ No newline at end of file + print(f"✅ Completed {year} {qmap[quarter]}") + + +if __name__ == "__main__": + args = sys.argv[1:] + if not args or len(args) % 2: + sys.exit(__doc__) + for y, q in zip(args[::2], args[1::2]): + download_quarter(int(y), int(q)) diff --git a/scripts/filter_gdelt_events.py b/scripts/filter_gdelt_events.py index 4a86663..724f830 100644 --- a/scripts/filter_gdelt_events.py +++ b/scripts/filter_gdelt_events.py @@ -1,9 +1,10 @@ import pandas as pd from pathlib import Path -RAW_DIR = Path("../data/raw/gdelt/events") -OUT_DIR = Path("../data/processed/gdelt_filtered") -OUT_DIR.mkdir(parents=True, exist_ok=True) +"""Keep a column subset of each GDELT event file: python scripts/filter_gdelt_events.py""" +ROOT = Path(__file__).resolve().parents[1] +RAW_DIR = ROOT / "data" / "raw" / "gdelt" / "events" +OUT_DIR = ROOT / "data" / "processed" / "gdelt_filtered" COL_MAP = { "date": 1, @@ -37,7 +38,7 @@ def filter_daily_file(path): max_col = chunk.shape[1] - 1 valid = {k: v for k, v in COL_MAP.items() if v <= max_col} - df = chunk[list(valid.values())] + df = chunk[list(valid.values())].copy() df.columns = list(valid.keys()) df["date"] = pd.to_datetime(df["date"], format="%Y%m%d", errors="coerce") @@ -50,4 +51,13 @@ def filter_daily_file(path): print(f" ✅ Saved {out_file.name}") except Exception as e: - print(f" ❌ Error {date}: {e}") \ No newline at end of file + print(f" ❌ Error {date}: {e}") + + +if __name__ == "__main__": + OUT_DIR.mkdir(parents=True, exist_ok=True) + files = sorted(RAW_DIR.glob("*.CSV")) + sorted(RAW_DIR.glob("*.csv")) + if not files: + raise SystemExit(f"No event files in {RAW_DIR}; run scripts/download_gdelt.py first.") + for f in files: + filter_daily_file(f) diff --git a/scripts/reconstruct_gmsi.py b/scripts/reconstruct_gmsi.py index 346d156..475a83f 100644 --- a/scripts/reconstruct_gmsi.py +++ b/scripts/reconstruct_gmsi.py @@ -1,5 +1,18 @@ -import pandas as pd +""" +scripts/reconstruct_gmsi.py — the exogenous Global Market Stress Index (GMSI). + +GMSI_t = mean of six expanding z-scores (equal weights, NO PCA): event count, +negative-event share, −Goldstein, −sentiment, −sentiment surprise, attention. +Missing components are set to 0 ("neutral") before averaging. Sentiment exists +only for 2024-10 → 2025-01, so on most days three of the six terms are 0 and the +index is effectively a 3-component index scaled by 1/2 (docs/ISSUES.md P1-7). +""" import numpy as np +import pandas as pd +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +PROCESSED = ROOT / "data" / "processed" def expanding_z_score(series, min_periods=30): mean = series.expanding(min_periods=min_periods).mean() @@ -10,11 +23,11 @@ def reconstruct_gmsi(): print("Reconstructing Pure Exogenous GMSI...") # 1. Global Daily Events (Counts & Metrics) - events_daily = pd.read_csv('data/processed/events_daily_2015_2025.csv') + events_daily = pd.read_csv(PROCESSED / 'events_daily_2015_2025.csv') events_daily['date'] = pd.to_datetime(events_daily['date']).dt.normalize() # 2. Text Sentiment (Average globally per day) - text_df = pd.read_csv('data/processed/text_with_sentiment.csv') + text_df = pd.read_csv(PROCESSED / 'text_with_sentiment.csv') text_df['date'] = pd.to_datetime(text_df['timestamp']).dt.tz_localize(None).dt.normalize() # Average finbert and vader daily_sentiment = text_df.groupby('date')[['finbert_score', 'vader_score']].mean().reset_index() @@ -22,7 +35,7 @@ def reconstruct_gmsi(): daily_sentiment['sentiment_core'] = daily_sentiment['finbert_score'].fillna(daily_sentiment['vader_score']) # 3. Attention proxy based on event intensity (btc and nifty) - daily_events = pd.read_csv('data/processed/daily_events.csv') + daily_events = pd.read_csv(PROCESSED / 'daily_events.csv') daily_events['date'] = pd.to_datetime(daily_events['date']).dt.normalize() global_attention = daily_events.groupby('date')['event_intensity'].mean().reset_index() global_attention.rename(columns={'event_intensity': 'attention'}, inplace=True) @@ -62,6 +75,8 @@ def reconstruct_gmsi(): 'sentiment_z_inv', 'sentiment_surprise_z_inv', 'attention_z'] # Only keep the ones fully calculated + coverage = df[z_features].notna().mean() + print("Component coverage (share of days with a value):\n" + coverage.round(3).to_string()) df_scores = df[z_features].fillna(0) # Equal weight sum/average of these stress indicators @@ -87,7 +102,7 @@ def reconstruct_gmsi(): final_df = final_df[[c for c in out_cols if c in final_df]] - output_path = 'data/processed/gmsi_exogenous.csv' + output_path = PROCESSED / 'gmsi_exogenous.csv' final_df.to_csv(output_path, index=False) print(f"Dataset saved to {output_path}") diff --git a/scripts/regime_analysis.py b/scripts/regime_analysis.py index 1cf7bbb..296a1ba 100644 --- a/scripts/regime_analysis.py +++ b/scripts/regime_analysis.py @@ -1,253 +1,135 @@ -import pandas as pd -import numpy as np +""" +scripts/regime_analysis.py — volatility behaviour inside GMSI stress regimes. + + python scripts/regime_analysis.py # needs data/processed/{gmsi_exogenous,btc_vsi_full,nifty_vsi_full}.csv + +Fixes (docs/ISSUES.md): + P1-3 regime cut-offs (20%/80%) and the shock threshold (95%) are EXPANDING, + past-only quantiles — the old full-sample quantiles used future data. + P1-10 persistence is a lag-1 autocorrelation over consecutive days inside the + same regime spell — the old code concatenated non-adjacent days. + KS / Mann-Whitney tests assume independent observations; with autocorrelated + volatility their p-values are far too small, so they are printed as descriptive. +""" +import sys +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") import matplotlib.pyplot as plt +import numpy as np +import pandas as pd import seaborn as sns -from scipy.stats import ks_2samp, mannwhitneyu, skew, kurtosis -from statsmodels.tsa.stattools import acf -import os +from scipy.stats import ks_2samp, kurtosis, mannwhitneyu, skew + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) +from pipeline import market_dynamics as md # noqa: E402 + +PROCESSED = ROOT / "data" / "processed" +OUT = ROOT / "reports" / "figures" / "regime" +REGIMES = ["low", "medium", "high"] + + +def require(path: Path) -> Path: + if not path.exists(): + raise SystemExit(f"{path} not found (built from GDELT data that is not committed to the repo).") + return path + def load_data(): - gmsi = pd.read_csv('data/processed/gmsi_exogenous.csv') - gmsi['date'] = pd.to_datetime(gmsi['date']) - - btc = pd.read_csv('data/processed/btc_vsi_full.csv') - btc['date'] = pd.to_datetime(btc['date']) - - nifty = pd.read_csv('data/processed/nifty_vsi_full.csv') - nifty['date'] = pd.to_datetime(nifty['date']) - + gmsi = pd.read_csv(require(PROCESSED / "gmsi_exogenous.csv"), parse_dates=["date"]) + btc = pd.read_csv(require(PROCESSED / "btc_vsi_full.csv"), parse_dates=["date"]) + nifty = pd.read_csv(require(PROCESSED / "nifty_vsi_full.csv"), parse_dates=["date"]) return gmsi, btc, nifty -def assign_regimes(gmsi): - """ - Step 1: Regime Construction - - Low Stress: bottom 20% - - Medium Stress: 20–80% - - High Stress: top 20% - """ - p20 = gmsi['pure_gmsi'].quantile(0.20) - p80 = gmsi['pure_gmsi'].quantile(0.80) - - conditions = [ - (gmsi['pure_gmsi'] <= p20), - (gmsi['pure_gmsi'] > p20) & (gmsi['pure_gmsi'] <= p80), - (gmsi['pure_gmsi'] > p80) - ] - choices = ['Low Stress', 'Medium Stress', 'High Stress'] - - gmsi['Regime'] = np.select(conditions, choices, default='Medium Stress') - # Ensure ordered categorical for plotting - gmsi['Regime'] = pd.Categorical(gmsi['Regime'], categories=['Low Stress', 'Medium Stress', 'High Stress'], ordered=True) - return gmsi - -def regime_diagnostics(df, asset_name): - """ - Step 2: Regime Diagnostics - """ - print(f"\n{'*'*50}") - print(f"REGIME DIAGNOSTICS: {asset_name}") - print(f"{'*'*50}") - - regimes = ['Low Stress', 'Medium Stress', 'High Stress'] - results = [] - - for r in regimes: - regime_data = df[df['Regime'] == r].copy() - - # Mean & Median - mean_7d = regime_data['volatility_7d'].mean() - med_7d = regime_data['volatility_7d'].median() - mean_14d = regime_data['volatility_14d'].mean() - med_14d = regime_data['volatility_14d'].median() - - # Vol-of-vol (Standard deviation of volatility) - vov_7d = regime_data['volatility_7d'].std() - - # Distribution shape - skew_7d = skew(regime_data['volatility_7d'].dropna()) - kurt_7d = kurtosis(regime_data['volatility_7d'].dropna()) - - # Persistence AR(1) - # To compute AR(1) accurately, we need continuous sequences. - # But for an approximation of persistence *within* a regime, we can compute ACF(1) on the volatility series - # dropping NaNs within that regime slice (though it breaks time continuity, it shows state stickiness). - # A more rigorous way is to calculate ACF on the whole series and just note it, - # but to see if Vol is MORE persistent in high stress, we'll approximate AR(1). - if len(regime_data.dropna(subset=['volatility_7d'])) > 10: - ar1 = acf(regime_data['volatility_7d'].dropna(), nlags=1)[1] - else: - ar1 = np.nan - - results.append({ - 'Regime': r, - 'N_days': len(regime_data), - 'Mean_7d': mean_7d, - 'Median_7d': med_7d, - 'Mean_14d': mean_14d, - 'Median_14d': med_14d, - 'Vol_of_Vol_7d': vov_7d, - 'Skewness_7d': skew_7d, - 'Kurtosis_7d': kurt_7d, - 'AR(1)_7d': ar1 - }) - - res_df = pd.DataFrame(results) - print(res_df.to_string(index=False)) - return res_df - -def shock_response(df, asset_name): - """ - Step 3: Shock Response (Local Projections) - """ - print(f"\n--- Shock Response Analysis: {asset_name} ---") - - # Define a volatility shock as top 5% absolute return days - df['abs_return'] = df['return'].abs() - shock_threshold = df['abs_return'].quantile(0.95) - - # Identify shock days - shock_days = df[df['abs_return'] >= shock_threshold].copy() - print(f"Number of shock days (Top 5% abs return): {len(shock_days)}") - - # We want to condition on the GMSI Regime of the day *prior* (t-1) to the shock to avoid leakage. - # Actually, GMSI(t) is exogenous, but let's just use GMSI(t-1) regime to be safe. - df['Regime_t_minus_1'] = df['Regime'].shift(1) - - # Calculate forward volatility for shocks - results = [] - regimes = ['Low Stress', 'Medium Stress', 'High Stress'] - - for r in regimes: - # Shocks that occurred when prior day was in regime r - regime_shocks = df[(df['abs_return'] >= shock_threshold) & (df['Regime_t_minus_1'] == r)] - - # We want the average of Volatility at t+1, t+7, t+14 relative to t. - # Volatility is usually computed backwards (vol_7d is t-6 to t). - # So forward vol at t+k is vol_7d shifted by -k - fwd_1d_mean = pd.Series((regime_shocks.index + 1).map(lambda x: df.loc[x, 'volatility_7d'] if x in df.index else np.nan)).mean() - fwd_7d_mean = pd.Series((regime_shocks.index + 7).map(lambda x: df.loc[x, 'volatility_7d'] if x in df.index else np.nan)).mean() - fwd_14d_mean = pd.Series((regime_shocks.index + 14).map(lambda x: df.loc[x, 'volatility_7d'] if x in df.index else np.nan)).mean() - - results.append({ - 'Regime': r, - 'Shock_Count': len(regime_shocks), - 'Fwd_Vol_t+1': fwd_1d_mean, - 'Fwd_Vol_t+7': fwd_7d_mean, - 'Fwd_Vol_t+14': fwd_14d_mean - }) - - res_df = pd.DataFrame(results) - print(res_df.to_string(index=False)) - return res_df - -def tail_risk_conditioning(df, asset_name): - """ - Step 4: Tail Risk Conditioning - - Compute P(Volatility in top 5% | GMSI regime). - - Perform KS tests. - """ - print(f"\n--- Tail Risk Conditioning: {asset_name} ---") - - # Define top 5% volatility tail event (looking at forward 7d volatility to test prediction) - # Alternatively, look at concurrent 7d volatility conditional on regime. - # User said: "Compute P(Volatility in top 5% | GMSI regime)." - # Assume contemporaneous or forward state. Let's use contemporaneous for pure regime association. - - vol_tail_threshold = df['volatility_7d'].quantile(0.95) - df['is_tail'] = (df['volatility_7d'] >= vol_tail_threshold).astype(int) - - overall_prob = df['is_tail'].mean() - print(f"Unconditional P(Tail Volatility) = {overall_prob:.4f}") - - regimes = ['Low Stress', 'Medium Stress', 'High Stress'] - - for r in regimes: - regime_data = df[df['Regime'] == r] - prob = regime_data['is_tail'].mean() - print(f"P(Tail Volatility | {r}) = {prob:.4f} (N={len(regime_data)})") - - # Statistical test: Does Volatility distribution differ between High and Low stress? - low_vol = df[df['Regime'] == 'Low Stress']['volatility_7d'].dropna() - high_vol = df[df['Regime'] == 'High Stress']['volatility_7d'].dropna() - - ks_stat, ks_pval = ks_2samp(high_vol, low_vol) - mw_stat, mw_pval = mannwhitneyu(high_vol, low_vol, alternative='two-sided') - - print("\nStatistical Differences in Volatility (High vs Low Stress):") - print(f"KS Test Statistic: {ks_stat:.4f} (p-value: {ks_pval:.4e})") - print(f"Mann-Whitney U Test: {mw_stat:.4f} (p-value: {mw_pval:.4e})") - -def generate_visualizations(df_btc, df_nifty): - print("\nGenerating Visualizations...") - os.makedirs('reports/figures/regime', exist_ok=True) - - # 1. Boxplots of volatility by regime + +def attach_regimes(asset_df, gmsi): + g = gmsi.set_index("date")["pure_gmsi"].sort_index() + reg = md.expanding_regimes(g) # past-only thresholds on the GMSI's own calendar + df = asset_df.merge(pd.DataFrame({"date": g.index, "pure_gmsi": g.values, "Regime": reg.values}), + on="date", how="inner").dropna(subset=["volatility_7d", "Regime"]) + return df.sort_values("date").reset_index(drop=True) + + +def regime_diagnostics(df, asset): + print(f"\n{'*' * 50}\nREGIME DIAGNOSTICS: {asset}\n{'*' * 50}") + rows = [] + for r in REGIMES: + v = df.loc[df["Regime"] == r, "volatility_7d"].dropna() + ac1, npairs = md.within_spell_ac1(df["volatility_7d"], df["Regime"], r) + rows.append({"Regime": r, "N_days": len(v), "Mean_7d": v.mean(), "Median_7d": v.median(), + "Vol_of_Vol_7d": v.std(), "Skewness_7d": skew(v), "Kurtosis_7d": kurtosis(v), + "AC1_within_spell": ac1, "N_pairs": npairs}) + res = pd.DataFrame(rows) + print(res.round(4).to_string(index=False)) + return res + + +def shock_response(df, asset): + print(f"\n--- Shock response: {asset} ---") + r = df["return"] + shocks, _ = md.identify_shocks(r) # expanding 95% threshold, 250-day burn-in + df = df.assign(shock=shocks.values, regime_prev=df["Regime"].shift(1)) + rows = [] + for reg in REGIMES: + idx = df.index[df["shock"] & (df["regime_prev"] == reg)] + row = {"Regime": reg, "Shock_Count": len(idx)} + for h in (1, 7, 14): + row[f"Fwd_Vol_t+{h}"] = df["volatility_7d"].reindex(idx + h).mean() + rows.append(row) + res = pd.DataFrame(rows) + print(res.round(5).to_string(index=False)) + return res + + +def tail_risk_conditioning(df, asset): + print(f"\n--- Tail risk (contemporaneous, descriptive): {asset} ---") + thr = df["volatility_7d"].shift(1).expanding(min_periods=250).quantile(0.95) + tail = (df["volatility_7d"] >= thr) & thr.notna() + print(f"Unconditional P(tail) = {tail[thr.notna()].mean():.4f}") + for r in REGIMES: + m = (df["Regime"] == r) & thr.notna() + print(f"P(tail | {r}) = {tail[m].mean():.4f} (N={int(m.sum())})") + lo = df.loc[df["Regime"] == "low", "volatility_7d"]; hi = df.loc[df["Regime"] == "high", "volatility_7d"] + print(f"KS={ks_2samp(hi, lo).statistic:.4f}, MWU p={mannwhitneyu(hi, lo).pvalue:.3e} " + "(assumes independence — descriptive only)") + + +def visualise(df_btc, df_nifty, shocks): + OUT.mkdir(parents=True, exist_ok=True) fig, axes = plt.subplots(1, 2, figsize=(14, 6)) - sns.boxplot(x='Regime', y='volatility_7d', data=df_btc, ax=axes[0], palette='Blues') - axes[0].set_title('BTC: 7d Volatility by GMSI Regime') - sns.boxplot(x='Regime', y='volatility_7d', data=df_nifty, ax=axes[1], palette='Reds') - axes[1].set_title('NIFTY: 7d Volatility by GMSI Regime') - plt.tight_layout() - plt.savefig('reports/figures/regime/boxplot_vol_by_regime.png') - - # 2. ACF Overlay (We calculate ACF for up to 20 lags for the whole series, but segmented) - # This is tricky because slicing breaks time. A safer plot is Heatmap. - - # 3. Heatmap: GMSI regime x Volatility Percentile + for ax, (df, name) in zip(axes, [(df_btc, "BTC"), (df_nifty, "NIFTY")]): + sns.boxplot(x="Regime", y="volatility_7d", data=df, order=REGIMES, ax=ax) + ax.set_title(f"{name}: 7d volatility by GMSI regime (expanding thresholds)") + plt.tight_layout(); plt.savefig(OUT / "boxplot_vol_by_regime.png"); plt.close() + fig, axes = plt.subplots(1, 2, figsize=(16, 6)) - - def plot_heatmap(df, ax, title, cmap): - # Create quantiles for Volatility - df['Vol_Quintile'] = pd.qcut(df['volatility_7d'], 5, labels=['Q1(Low)', 'Q2', 'Q3', 'Q4', 'Q5(High)']) - crosstab = pd.crosstab(df['Regime'], df['Vol_Quintile'], normalize='index') * 100 - sns.heatmap(crosstab, annot=True, fmt=".1f", cmap=cmap, ax=ax, cbar_kws={'label': '% of Regime'}) - ax.set_title(title) - - plot_heatmap(df_btc, axes[0], 'BTC: GMSI Regime vs Volatility Quintile', 'Blues') - plot_heatmap(df_nifty, axes[1], 'NIFTY: GMSI Regime vs Volatility Quintile', 'Reds') - plt.tight_layout() - plt.savefig('reports/figures/regime/heatmap_regime_vs_vol.png') - - print("Saved plots to reports/figures/regime/") + for ax, (df, name) in zip(axes, [(df_btc, "BTC"), (df_nifty, "NIFTY")]): + q = pd.qcut(df["volatility_7d"], 5, labels=["Q1(Low)", "Q2", "Q3", "Q4", "Q5(High)"]) + ct = pd.crosstab(pd.Categorical(df["Regime"], REGIMES), q, normalize="index") * 100 + sns.heatmap(ct, annot=True, fmt=".1f", ax=ax, cbar_kws={"label": "% of regime"}) + ax.set_title(f"{name}: regime vs volatility quintile") + plt.tight_layout(); plt.savefig(OUT / "heatmap_regime_vs_vol.png"); plt.close() + + fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + for ax, (res, name) in zip(axes, shocks): + res.set_index("Regime")[["Fwd_Vol_t+1", "Fwd_Vol_t+7", "Fwd_Vol_t+14"]].T.plot(marker="o", ax=ax) + ax.set_title(f"{name}: shock response by prior-day regime"); ax.set_ylabel("mean 7d vol") + plt.tight_layout(); plt.savefig(OUT / "shock_response.png"); plt.close() + print(f"Saved plots to {OUT}") + def main(): gmsi, btc, nifty = load_data() - gmsi = assign_regimes(gmsi) - - # Merge regime labels into asset data - df_btc = pd.merge(btc, gmsi[['date', 'Regime', 'pure_gmsi']], on='date', how='inner').dropna(subset=['volatility_7d']) - df_nifty = pd.merge(nifty, gmsi[['date', 'Regime', 'pure_gmsi']], on='date', how='inner').dropna(subset=['volatility_7d']) - - # BTC Analysis - regime_diagnostics(df_btc, "BTC") - shock_df_btc = shock_response(df_btc, "BTC") - tail_risk_conditioning(df_btc, "BTC") - - # NIFTY Analysis - regime_diagnostics(df_nifty, "NIFTY") - shock_df_nifty = shock_response(df_nifty, "NIFTY") - tail_risk_conditioning(df_nifty, "NIFTY") - - # Shock Response Curves Validation (Plotting) - fig, axes = plt.subplots(1, 2, figsize=(14, 6)) - - def plot_shock(ax, shock_df, title): - df_plot = shock_df.set_index('Regime')[['Fwd_Vol_t+1', 'Fwd_Vol_t+7', 'Fwd_Vol_t+14']].T - df_plot.plot(marker='o', ax=ax) - ax.set_title(title) - ax.set_ylabel('Mean Forward 7d Volatility') - ax.set_xlabel('Time Horizon post-Shock') - ax.set_xticks(range(3)) - ax.set_xticklabels(['t+1', 't+7', 't+14']) - - plot_shock(axes[0], shock_df_btc, 'BTC: Shock Response by Regime') - plot_shock(axes[1], shock_df_nifty, 'NIFTY: Shock Response by Regime') - plt.tight_layout() - os.makedirs('reports/figures/regime', exist_ok=True) - plt.savefig('reports/figures/regime/shock_response.png') - - # Visualizations - generate_visualizations(df_btc, df_nifty) - -if __name__ == '__main__': + df_btc, df_nifty = attach_regimes(btc, gmsi), attach_regimes(nifty, gmsi) + shocks = [] + for df, name in [(df_btc, "BTC"), (df_nifty, "NIFTY")]: + regime_diagnostics(df, name) + shocks.append((shock_response(df, name), name)) + tail_risk_conditioning(df, name) + visualise(df_btc, df_nifty, shocks) + + +if __name__ == "__main__": main() diff --git a/scripts/run_events_pipeline.py b/scripts/run_events_pipeline.py index b1953b0..fb63c58 100644 --- a/scripts/run_events_pipeline.py +++ b/scripts/run_events_pipeline.py @@ -8,14 +8,12 @@ # ========================== # CONFIG # ========================== +# Usage: python scripts/run_events_pipeline.py [START YYYY-MM-DD] [END YYYY-MM-DD] START_DATE = "2025-05-30" END_DATE = "2025-12-31" -OUT_DIR = "../data/raw/gdelt/events_filtered" -TMP_DIR = "../data/raw/gdelt/tmp" - -os.makedirs(OUT_DIR, exist_ok=True) -os.makedirs(TMP_DIR, exist_ok=True) +_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +OUT_DIR = os.path.join(_ROOT, "data", "raw", "gdelt", "events_filtered") # ========================== # GDELT EVENTS SCHEMA (2.1) @@ -93,82 +91,89 @@ def daterange(start, end): # ========================== # MAIN PIPELINE # ========================== -for d in daterange(START_DATE, END_DATE): - - day_str = d.strftime("%Y%m%d") - out_csv = os.path.join(OUT_DIR, f"{d.strftime('%Y-%m-%d')}.csv") - - if os.path.exists(out_csv): - continue - - print(f"\n📅 Processing {d.strftime('%Y-%m-%d')}") - - url = f"http://data.gdeltproject.org/events/{day_str}.export.CSV.zip" - - try: - r = requests.get(url, timeout=60) - r.raise_for_status() - except Exception as e: - print(f" ❌ Download failed: {e}") - continue - - try: - z = zipfile.ZipFile(io.BytesIO(r.content)) - csv_name = z.namelist()[0] - except Exception as e: - print(f" ❌ Zip error: {e}") - continue - - rows = [] - - with z.open(csv_name) as f: - for chunk in pd.read_csv( - f, - sep="\t", - names=COLS, - dtype=str, - chunksize=100_000, - on_bad_lines="skip", - low_memory=False - ): - - # Core filters - chunk = chunk[ - chunk["EventRootCode"].isin(KEEP_EVENT_ROOTS) & - ( - chunk["Actor1CountryCode"].isin(IMPORTANT_COUNTRIES) | - chunk["Actor2CountryCode"].isin(IMPORTANT_COUNTRIES) | - chunk["ActionGeo_CountryCode"].isin(IMPORTANT_COUNTRIES) - ) +def main(start=START_DATE, end=END_DATE): + os.makedirs(OUT_DIR, exist_ok=True) + for d in daterange(start, end): + + day_str = d.strftime("%Y%m%d") + out_csv = os.path.join(OUT_DIR, f"{d.strftime('%Y-%m-%d')}.csv") + + if os.path.exists(out_csv): + continue + + print(f"\n📅 Processing {d.strftime('%Y-%m-%d')}") + + url = f"http://data.gdeltproject.org/events/{day_str}.export.CSV.zip" + + try: + r = requests.get(url, timeout=60) + r.raise_for_status() + except Exception as e: + print(f" ❌ Download failed: {e}") + continue + + try: + z = zipfile.ZipFile(io.BytesIO(r.content)) + csv_name = z.namelist()[0] + except Exception as e: + print(f" ❌ Zip error: {e}") + continue + + rows = [] + + with z.open(csv_name) as f: + for chunk in pd.read_csv( + f, + sep="\t", + names=COLS, + dtype=str, + chunksize=100_000, + on_bad_lines="skip", + low_memory=False + ): + + # Core filters + chunk = chunk[ + chunk["EventRootCode"].isin(KEEP_EVENT_ROOTS) & + ( + chunk["Actor1CountryCode"].isin(IMPORTANT_COUNTRIES) | + chunk["Actor2CountryCode"].isin(IMPORTANT_COUNTRIES) | + chunk["ActionGeo_CountryCode"].isin(IMPORTANT_COUNTRIES) + ) + ] + + if not chunk.empty: + rows.append(chunk) + + if not rows: + print(" ⚠️ No relevant events") + continue + + out = pd.concat(rows, ignore_index=True) + + # Reduce size early + out = out[ + [ + "Day", + "EventRootCode", + "EventCode", + "GoldsteinScale", + "AvgTone", + "Actor1Name", + "Actor2Name", + "Actor1CountryCode", + "Actor2CountryCode", + "ActionGeo_CountryCode", + "SOURCEURL" ] - - if not chunk.empty: - rows.append(chunk) - - if not rows: - print(" ⚠️ No relevant events") - continue - - out = pd.concat(rows, ignore_index=True) - - # Reduce size early - out = out[ - [ - "Day", - "EventRootCode", - "EventCode", - "GoldsteinScale", - "AvgTone", - "Actor1Name", - "Actor2Name", - "Actor1CountryCode", - "Actor2CountryCode", - "ActionGeo_CountryCode", - "SOURCEURL" ] - ] - out.to_csv(out_csv, index=False) - print(f" ✅ Saved {len(out)} rows") + out.to_csv(out_csv, index=False) + print(f" ✅ Saved {len(out)} rows") + + print("\n🎯 EVENTS PIPELINE COMPLETE") + -print("\n🎯 EVENTS PIPELINE COMPLETE") \ No newline at end of file +if __name__ == "__main__": + import sys + main(*sys.argv[1:3]) diff --git a/scripts/run_gdelt_pipeline.py b/scripts/run_gdelt_pipeline.py index b9e2133..f775a93 100644 --- a/scripts/run_gdelt_pipeline.py +++ b/scripts/run_gdelt_pipeline.py @@ -1,9 +1,8 @@ -import zipfile -import csv +import io import os -import requests import zipfile -import io + +import requests import pandas as pd from datetime import datetime, timedelta @@ -14,11 +13,8 @@ END_DATE = "2025-12-31" # change later (overnight run) BASE_URL = "http://data.gdeltproject.org/gkg/" -RAW_DIR = "../data/raw/gdelt/gkg_raw" -OUT_DIR = "../data/raw/gdelt/gkg_filtered" - -os.makedirs(RAW_DIR, exist_ok=True) -os.makedirs(OUT_DIR, exist_ok=True) +_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +OUT_DIR = os.path.join(_ROOT, "data", "raw", "gdelt", "gkg_filtered") # ============================== # KEYWORDS @@ -93,65 +89,72 @@ def is_relevant(text): # ============================== # MAIN LOOP # ============================== -start = datetime.strptime(START_DATE, "%Y-%m-%d") -end = datetime.strptime(END_DATE, "%Y-%m-%d") - -current = start - -while current <= end: - date_str = current.strftime("%Y%m%d") - url = f"{BASE_URL}{date_str}.gkg.csv.zip" - - print(f"\n📅 Processing {current.date()}") - - try: - r = requests.get(url, timeout=60) - if r.status_code != 200: - print(" ⚠️ File not found") - current += timedelta(days=1) - continue - - z = zipfile.ZipFile(io.BytesIO(r.content)) - csv_name = z.namelist()[0] - - df = pd.read_csv( - z.open(csv_name), - sep="\t", - header=None, - encoding="latin1", - low_memory=False - ) - - # GKG column positions (stable) - df = df[[0, 1, 3, 4, 8, 9]] - df.columns = [ - "date", - "source", - "themes", - "locations", - "persons", - "organizations" - ] - - # Filter - mask = ( - df["themes"].apply(is_relevant) | - df["organizations"].apply(is_relevant) | - df["persons"].apply(is_relevant) - ) - - filtered = df[mask] - - if filtered.empty: - print(" ➜ No relevant news") - else: - out_path = f"{OUT_DIR}/gkg_{date_str}.csv" - filtered.to_csv(out_path, index=False) - print(f" ✅ Saved {len(filtered)} rows") - - except Exception as e: - print(f" ❌ Error: {e}") - - current += timedelta(days=1) - -print("\n🎯 GKG PIPELINE COMPLETE") \ No newline at end of file +def main(start_date=START_DATE, end_date=END_DATE): + os.makedirs(OUT_DIR, exist_ok=True) + start = datetime.strptime(start_date, "%Y-%m-%d") + end = datetime.strptime(end_date, "%Y-%m-%d") + + current = start + + while current <= end: + date_str = current.strftime("%Y%m%d") + url = f"{BASE_URL}{date_str}.gkg.csv.zip" + + print(f"\n📅 Processing {current.date()}") + + try: + r = requests.get(url, timeout=60) + if r.status_code != 200: + print(" ⚠️ File not found") + current += timedelta(days=1) + continue + + z = zipfile.ZipFile(io.BytesIO(r.content)) + csv_name = z.namelist()[0] + + df = pd.read_csv( + z.open(csv_name), + sep="\t", + header=None, + encoding="latin1", + low_memory=False + ) + + # GKG column positions (stable) + df = df[[0, 1, 3, 4, 8, 9]] + df.columns = [ + "date", + "source", + "themes", + "locations", + "persons", + "organizations" + ] + + # Filter + mask = ( + df["themes"].apply(is_relevant) | + df["organizations"].apply(is_relevant) | + df["persons"].apply(is_relevant) + ) + + filtered = df[mask] + + if filtered.empty: + print(" ➜ No relevant news") + else: + out_path = f"{OUT_DIR}/gkg_{date_str}.csv" + filtered.to_csv(out_path, index=False) + print(f" ✅ Saved {len(filtered)} rows") + + except Exception as e: + print(f" ❌ Error: {e}") + + current += timedelta(days=1) + + print("\n🎯 GKG PIPELINE COMPLETE") + + +if __name__ == "__main__": + import sys + main(*sys.argv[1:3]) diff --git a/scripts/sanity_check_gmsi.py b/scripts/sanity_check_gmsi.py index 08aa794..d928118 100644 --- a/scripts/sanity_check_gmsi.py +++ b/scripts/sanity_check_gmsi.py @@ -5,16 +5,20 @@ from statsmodels.tsa.stattools import adfuller import seaborn as sns import os +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +PROCESSED = ROOT / "data" / "processed" def sanity_check(): print("Loading datasets...") - gmsi = pd.read_csv('data/processed/gmsi_exogenous.csv') + gmsi = pd.read_csv(PROCESSED / 'gmsi_exogenous.csv') gmsi['date'] = pd.to_datetime(gmsi['date']) - btc = pd.read_csv('data/processed/btc_vsi_full.csv') + btc = pd.read_csv(PROCESSED / 'btc_vsi_full.csv') btc['date'] = pd.to_datetime(btc['date']) - nifty = pd.read_csv('data/processed/nifty_vsi_full.csv') + nifty = pd.read_csv(PROCESSED / 'nifty_vsi_full.csv') nifty['date'] = pd.to_datetime(nifty['date']) # Merge for correlation checking @@ -44,7 +48,7 @@ def sanity_check(): # Plotting print("\nGenerating plots...") - os.makedirs('reports/figures', exist_ok=True) + os.makedirs(ROOT / 'reports' / 'figures', exist_ok=True) fig, axes = plt.subplots(2, 2, figsize=(15, 10)) @@ -69,7 +73,7 @@ def sanity_check(): axes[1, 1].set_title('GMSI vs BTC Volatility (Time Series)') plt.tight_layout() - plt.savefig('reports/figures/gmsi_sanity_checks.png') + plt.savefig(ROOT / 'reports' / 'figures' / 'gmsi_sanity_checks.png') print("Saved plots to reports/figures/gmsi_sanity_checks.png") if __name__ == '__main__': diff --git a/scripts/validate_gmsi.py b/scripts/validate_gmsi.py index 96a3048..0005107 100644 --- a/scripts/validate_gmsi.py +++ b/scripts/validate_gmsi.py @@ -1,125 +1,94 @@ -import pandas as pd -import numpy as np +""" +scripts/validate_gmsi.py — does GMSI(t) relate to forward realised volatility? + + python scripts/validate_gmsi.py # needs data/processed/{gmsi_exogenous,btc_vsi_full,nifty_vsi_full}.csv + +Fix (docs/ISSUES.md P1-1): significance now comes from a CIRCULAR-SHIFT +permutation test, which preserves the autocorrelation of both series. The old +i.i.d. shuffle is still printed for comparison only — it is anti-conservative +for persistent series (57.5% false positives at AR(1) φ=0.9, MODEL_REPORT §D). +Conditional expectations are full-sample quintiles: an in-sample DESCRIPTION, +not a forecast (P1-3). +""" +import sys +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") import matplotlib.pyplot as plt +import pandas as pd import seaborn as sns -from scipy.stats import ks_2samp, mannwhitneyu, spearmanr -import os +from scipy.stats import ks_2samp, mannwhitneyu + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) +from pipeline.stats import permutation_test # noqa: E402 + +PROCESSED = ROOT / "data" / "processed" +FIGURES = ROOT / "reports" / "figures" +N_PERM = 1000 + + +def require(path: Path) -> Path: + if not path.exists(): + raise SystemExit(f"{path} not found. It is produced by scripts/reconstruct_gmsi.py / " + "scripts/construct_vsi_full.py from GDELT data that is not committed to the repo.") + return path + def validate_asset(gmsi, asset_df, asset_name): - print(f"\n{'='*50}") - print(f"Validating GMSI against {asset_name} Volatility") - print(f"{'='*50}") - - # Merge on date - df = pd.merge(gmsi[['date', 'pure_gmsi']], - asset_df[['date', 'return', 'volatility_7d', 'volatility_14d', 'volatility_30d']], - on='date', how='inner').dropna() - - # Define Forward Targets - # Forward 1d 'volatility' proxy is absolute return of the next day - df['fwd_vol_1d'] = df['return'].abs().shift(-1) - - # Forward 7d volatility is the 7d rolling volatility 7 days from now - df['fwd_vol_7d'] = df['volatility_7d'].shift(-7) - - # Forward 14d volatility is the 14d rolling volatility 14 days from now - df['fwd_vol_14d'] = df['volatility_14d'].shift(-14) - + print(f"\n{'=' * 50}\nValidating GMSI against {asset_name} volatility\n{'=' * 50}") + df = pd.merge(gmsi[["date", "pure_gmsi"]], + asset_df[["date", "return", "volatility_7d", "volatility_14d", "volatility_30d"]], + on="date", how="inner").dropna() + df["fwd_vol_1d"] = df["return"].abs().shift(-1) # |r_{t+1}| + df["fwd_vol_7d"] = df["volatility_7d"].shift(-7) # std r[t+1..t+7] + df["fwd_vol_14d"] = df["volatility_14d"].shift(-14) # std r[t+1..t+14] df = df.dropna() - - # 1. Lagged Correlations (Spearman to handle non-linearity and outliers) - targets = {'1 Day': 'fwd_vol_1d', '7 Days': 'fwd_vol_7d', '14 Days': 'fwd_vol_14d'} - - print("\n--- 1. Lagged Correlations (GMSI(t) vs Forward Volatility) ---") - real_corrs = {} + targets = {"1 Day": "fwd_vol_1d", "7 Days": "fwd_vol_7d", "14 Days": "fwd_vol_14d"} + + print("\n--- Spearman(GMSI_t, forward vol) with permutation p-values ---") + print(f"{'horizon':8s} {'rho':>8s} {'p_circular (valid)':>20s} {'p_iid (invalid, ref)':>22s}") + circ = {} for label, col in targets.items(): - corr, pval = spearmanr(df['pure_gmsi'], df[col]) - real_corrs[label] = corr - print(f"GMSI vs Forward {label} Vol: {corr:.4f} (p-value: {pval:.4e})") - - # 2. Conditional Expectations (Quintiles) - print("\n--- 2. Conditional Expectations ---") - df['gmsi_quintile'] = pd.qcut(df['pure_gmsi'], 5, labels=['Q1(Low)', 'Q2', 'Q3', 'Q4', 'Q5(High)']) - - cond_exp = df.groupby('gmsi_quintile', observed=True)[['fwd_vol_7d', 'fwd_vol_14d']].mean() - print("Mean Forward Volatility by GMSI Quintile:") - print(cond_exp) - - # Plot Conditional Expectations + c = permutation_test(df["pure_gmsi"], df[col], n_perm=N_PERM, method="circular") + i = permutation_test(df["pure_gmsi"], df[col], n_perm=N_PERM, method="iid") + circ[label] = c + print(f"{label:8s} {c.statistic:8.4f} {c.p_value:20.4f} {i.p_value:22.4f}") + + print("\n--- Conditional expectations (full-sample quintiles: descriptive, in-sample) ---") + df["gmsi_quintile"] = pd.qcut(df["pure_gmsi"], 5, labels=["Q1(Low)", "Q2", "Q3", "Q4", "Q5(High)"]) + cond = df.groupby("gmsi_quintile", observed=True)[["fwd_vol_7d", "fwd_vol_14d"]].mean() + print(cond) fig, axes = plt.subplots(1, 2, figsize=(12, 5)) - cond_exp['fwd_vol_7d'].plot(kind='bar', ax=axes[0], color='skyblue') - axes[0].set_title(f'{asset_name}: E[7d Vol | GMSI Quintile]') - axes[0].set_ylabel('Mean Forward 7d Volatility') - - cond_exp['fwd_vol_14d'].plot(kind='bar', ax=axes[1], color='salmon') - axes[1].set_title(f'{asset_name}: E[14d Vol | GMSI Quintile]') - axes[1].set_ylabel('Mean Forward 14d Volatility') - plt.tight_layout() - plt.savefig(f'reports/figures/cond_exp_{asset_name}.png') - - # 3. Tail Event Analysis - print("\n--- 3. Tail Event Analysis (Top 5% Volatility Days) ---") - # Define top 5% most volatile 7d periods - threshold_7d = df['fwd_vol_7d'].quantile(0.95) - tail_events = df[df['fwd_vol_7d'] >= threshold_7d] - normal_events = df[df['fwd_vol_7d'] < threshold_7d] - - print(f"Top 5% threshold for 7d vol: {threshold_7d:.4f} (N={len(tail_events)})") - - # Does GMSI predict these tail events? Compare GMSI(t) for tail vs normal - ks_stat, ks_pval = ks_2samp(tail_events['pure_gmsi'], normal_events['pure_gmsi']) - mw_stat, mw_pval = mannwhitneyu(tail_events['pure_gmsi'], normal_events['pure_gmsi'], alternative='two-sided') - - print(f"KS Test (Distributions differ) - Stat: {ks_stat:.4f}, p-value: {ks_pval:.4e}") - print(f"Mann-Whitney U Test (Median shift) - Stat: {mw_stat:.4f}, p-value: {mw_pval:.4e}") - - # 4. Placebo Control (Empirical P-values) - print("\n--- 4. Placebo Control (1000 Shuffles) ---") - n_iterations = 1000 - np.random.seed(42) - - placebo_corrs = {label: [] for label in targets.keys()} - - for _ in range(n_iterations): - shuffled_gmsi = np.random.permutation(df['pure_gmsi'].values) - for label, col in targets.items(): - corr, _ = spearmanr(shuffled_gmsi, df[col]) - placebo_corrs[label].append(corr) - - # Compute Empirical P-values - for label in targets.keys(): - real_c = real_corrs[label] - placebo_dist = np.array(placebo_corrs[label]) - - # Two-tailed empirical p-value - empirical_pval = np.sum(np.abs(placebo_dist) >= np.abs(real_c)) / n_iterations - print(f"{label} - Real Corr: {real_c:.4f} | Empirical p-value: {empirical_pval:.4f}") - - # Plot Placebo Distribution for 7 Days + cond["fwd_vol_7d"].plot(kind="bar", ax=axes[0], color="skyblue", title=f"{asset_name}: E[7d vol | GMSI quintile]") + cond["fwd_vol_14d"].plot(kind="bar", ax=axes[1], color="salmon", title=f"{asset_name}: E[14d vol | GMSI quintile]") + plt.tight_layout(); plt.savefig(FIGURES / f"cond_exp_{asset_name}.png"); plt.close() + + print("\n--- Tail events (top 5% forward 7d vol) ---") + thr = df["fwd_vol_7d"].quantile(0.95) + tail, normal = df[df["fwd_vol_7d"] >= thr], df[df["fwd_vol_7d"] < thr] + print(f"threshold {thr:.4f} (N={len(tail)}); KS p={ks_2samp(tail['pure_gmsi'], normal['pure_gmsi']).pvalue:.3e}; " + f"MWU p={mannwhitneyu(tail['pure_gmsi'], normal['pure_gmsi']).pvalue:.3e} " + "(both assume independent observations — treat as descriptive)") + + c7 = circ["7 Days"] plt.figure(figsize=(8, 5)) - sns.histplot(placebo_corrs['7 Days'], bins=50, kde=True, color='gray', stat='density') - plt.axvline(real_corrs['7 Days'], color='red', linestyle='dashed', linewidth=2, label=f"Real Corr: {real_corrs['7 Days']:.4f}") - plt.title(f'Placebo Test Distribution vs True Correlation (7d Forward) - {asset_name}') - plt.xlabel('Spearman Correlation') - plt.legend() - plt.savefig(f'reports/figures/placebo_test_{asset_name}.png') + plt.axvline(c7.statistic, color="red", ls="--", lw=2, label=f"real ρ = {c7.statistic:.4f}") + plt.axvspan(-1.96 * c7.null_sd, 1.96 * c7.null_sd, color="gray", alpha=.3, + label=f"95% circular-shift null (sd {c7.null_sd:.4f})") + plt.xlim(-max(0.15, abs(c7.statistic) * 1.5), max(0.15, abs(c7.statistic) * 1.5)) + plt.title(f"{asset_name}: GMSI vs forward 7d vol — circular-shift placebo (p = {c7.p_value:.3f})") + plt.legend(); plt.savefig(FIGURES / f"placebo_test_{asset_name}.png"); plt.close() + def main(): - os.makedirs('reports/figures', exist_ok=True) - - # Load Pure GMSI - gmsi = pd.read_csv('data/processed/gmsi_exogenous.csv') - gmsi['date'] = pd.to_datetime(gmsi['date']) - - # Run for BTC - btc = pd.read_csv('data/processed/btc_vsi_full.csv') - btc['date'] = pd.to_datetime(btc['date']) - validate_asset(gmsi, btc, 'BTC') - - # Run for NIFTY - nifty = pd.read_csv('data/processed/nifty_vsi_full.csv') - nifty['date'] = pd.to_datetime(nifty['date']) - validate_asset(gmsi, nifty, 'NIFTY') - -if __name__ == '__main__': + FIGURES.mkdir(parents=True, exist_ok=True) + gmsi = pd.read_csv(require(PROCESSED / "gmsi_exogenous.csv"), parse_dates=["date"]) + for asset in ["BTC", "NIFTY"]: + df = pd.read_csv(require(PROCESSED / f"{asset.lower()}_vsi_full.csv"), parse_dates=["date"]) + validate_asset(gmsi, df, asset) + + +if __name__ == "__main__": main() diff --git a/src/correlation.py b/src/correlation.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/fetch_data.py b/src/fetch_data.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/preprocess.py b/src/preprocess.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/sentiment.py b/src/sentiment.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/utils.py b/src/utils.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..94bf69b --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,5 @@ +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) diff --git a/tests/e2e/browser_smoke.py b/tests/e2e/browser_smoke.py new file mode 100644 index 0000000..d31bfaa --- /dev/null +++ b/tests/e2e/browser_smoke.py @@ -0,0 +1,66 @@ +""" +Browser smoke test against a RUNNING dashboard (not collected by pytest). + + streamlit run dashboard/app.py --server.headless true --server.port 8501 & + pip install playwright && python tests/e2e/browser_smoke.py [URL] +Env: CHROMIUM=/path/to/chrome to use a preinstalled browser instead of `playwright install chromium`. +""" +import os +import sys +import time + +from playwright.sync_api import sync_playwright + +URL = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:8501" +PAGES = ["Overview", "Volatility forecast", "GMSI & volatility", "Market fragility (MFI)", + "Shock propagation", "Methodology & limitations"] + + +def main() -> int: + failures = 0 + with sync_playwright() as p: + kw = {"executable_path": os.environ["CHROMIUM"]} if os.environ.get("CHROMIUM") else {} + browser = p.chromium.launch(**kw) + page = browser.new_page(viewport={"width": 1400, "height": 1000}) + console_errors = [] + page.on("console", lambda m: console_errors.append(m.text) if m.type == "error" else None) + t0 = time.time() + page.goto(URL, wait_until="networkidle") + page.get_by_text("What the data actually shows").wait_for(timeout=60_000) + print(f"first paint: {time.time() - t0:.1f}s") + sidebar = page.locator("section[data-testid='stSidebar']") + for name in PAGES: + t0 = time.time() + sidebar.get_by_text(name, exact=True).click() + page.wait_for_timeout(1500) + exc = page.locator("[data-testid='stException']").count() + err = page.locator("[data-testid='stAlertContentError']").count() + charts = page.locator(".js-plotly-plot").count() + failures += exc + err + print(f"{name:28s} {time.time() - t0:4.1f}s h1={page.locator('h1').first.inner_text()!r} " + f"charts={charts} exceptions={exc} errors={err}") + if name == "Volatility forecast": + print(" historical:", page.locator(".kcard").first.inner_text().replace("\n", " | ")) + page.get_by_text("Paste your own closing prices").click() + page.wait_for_timeout(800) + box = page.locator("textarea").first + box.fill("100 101 abc") + page.get_by_role("button", name="Forecast").click() + page.wait_for_timeout(1500) + msg = page.locator("[data-testid='stAlertContentError']").first.inner_text() + print(" bad input ->", msg) + failures += "not a number" not in msg + box.fill("\n".join(str(100 + (i % 7) * 0.5) for i in range(80))) + page.get_by_role("button", name="Forecast").click() + page.wait_for_timeout(1500) + print(" good input ->", page.locator(".kcard").first.inner_text().replace("\n", " | ")) + failures += page.locator("[data-testid='stAlertContentError']").count() + print(f"browser console errors: {len(console_errors)}") + failures += len(console_errors) + browser.close() + print("PASS" if not failures else f"FAIL ({failures})") + return 1 if failures else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/test_dashboard.py b/tests/test_dashboard.py new file mode 100644 index 0000000..44b0c4b --- /dev/null +++ b/tests/test_dashboard.py @@ -0,0 +1,66 @@ +"""End-to-end tests of the Streamlit app with streamlit.testing (no browser needed).""" +import time +from pathlib import Path + +import pytest + +pytest.importorskip("streamlit") +from streamlit.testing.v1 import AppTest # noqa: E402 + +APP = str(Path(__file__).resolve().parents[1] / "dashboard" / "app.py") +PAGES = ["Overview", "Volatility forecast", "GMSI & volatility", "Market fragility (MFI)", + "Shock propagation", "Methodology & limitations"] + + +def _run(page=None): + at = AppTest.from_file(APP, default_timeout=60) + at.run() + if page: + at.sidebar.radio[0].set_value(page).run() + return at + + +@pytest.mark.parametrize("page", PAGES) +def test_every_page_renders_fast_without_errors(page): + t0 = time.time() + at = _run(page) + assert time.time() - t0 < 20, "page render too slow" + assert not at.exception, [e.message for e in at.exception] + assert not at.error, [e.value for e in at.error] + + +def _forecast_page(): + at = _run("Volatility forecast") + return at + + +def test_historical_forecast_shows_result(): + at = _forecast_page() + html = " ".join(m.value for m in at.markdown) + assert "Forecast daily σ" in html and "Annualised" in html + + +def test_pasted_prices_validation_errors_are_friendly(): + at = _forecast_page() + at.main.radio[0].set_value("Paste your own closing prices").run() + at.text_area[0].input("100 101 abc").run() + at.button[0].click().run() + assert at.error and "not a number" in at.error[0].value + at.text_area[0].input("100 101 102").run() + at.button[0].click().run() + assert at.error and "at least 61" in at.error[0].value + + +def test_pasted_prices_produce_forecast(): + at = _forecast_page() + at.main.radio[0].set_value("Paste your own closing prices").run() + at.text_area[0].input("\n".join(str(100 + (i % 7)) for i in range(80))).run() + at.button[0].click().run() + assert not at.error and not at.exception + assert "Forecast daily σ" in " ".join(m.value for m in at.markdown) + + +def test_switching_asset_works(): + at = _forecast_page() + at.selectbox[0].set_value("NIFTY").run() + assert not at.exception and not at.error diff --git a/tests/test_market_dynamics.py b/tests/test_market_dynamics.py new file mode 100644 index 0000000..1b09320 --- /dev/null +++ b/tests/test_market_dynamics.py @@ -0,0 +1,62 @@ +import numpy as np +import pandas as pd + +from pipeline import market_dynamics as md + + +def _returns(n=800, seed=0): + rng = np.random.default_rng(seed) + return pd.Series(rng.standard_t(4, n) * 0.02, index=pd.date_range("2018-01-01", periods=n)) + + +def test_mfi_bounded_and_past_only(): + r = _returns() + m = md.compute_mfi(r)["MFI"] + assert m.dropna().between(0, 1).all() + t = 500 + r2 = r.copy(); r2.iloc[t + 1:] *= 5 + pd.testing.assert_series_equal(m.iloc[: t + 1], md.compute_mfi(r2)["MFI"].iloc[: t + 1]) + + +def test_persistence_matches_original_definition(): + r = _returns(200) + a = r.abs() + i, w = 150, md.MFI_WINDOW + chunk = a.iloc[i - w + 1: i + 1].to_numpy() + expected = np.corrcoef(chunk[:-1], chunk[1:])[0, 1] + assert abs(md.compute_mfi(r)["persistence"].iloc[i] - expected) < 1e-10 + + +def test_shocks_need_burn_in_and_use_past_threshold(): + r = _returns() + shocks, thr = md.identify_shocks(r, burn_in=250) + assert not shocks.iloc[:251].any() + t = 400 + assert thr.iloc[t] == r.abs().iloc[:t].quantile(0.95) + + +def test_shock_propagation_reports_baseline(): + r = _returns() + shocks, _ = md.identify_shocks(r) + sp = md.shock_propagation(r, shocks) + assert list(sp["horizon"]) == list(md.HORIZONS) + assert (sp["ci_low"] <= sp["mean_abs_return"]).all() + assert sp["baseline_mean_abs_return"].nunique() == 1 + + +def test_within_spell_ac1_ignores_pairs_across_spells(): + # x alternates high/low between spells; inside spells it is i.i.d. noise + rng = np.random.default_rng(1) + x = pd.Series(rng.normal(size=600)) + reg = pd.Series((["low"] * 10 + ["high"] * 10) * 30) + ac, n = md.within_spell_ac1(x, reg, "low") + assert n == 30 * 9 # 9 consecutive pairs per 10-day spell + assert abs(ac) < 0.2 + + +def test_expanding_regimes_are_past_only(): + s = pd.Series(np.random.default_rng(2).normal(size=600)) + reg = md.expanding_regimes(s, min_periods=100) + assert reg.iloc[:100].isna().all() + s2 = s.copy(); s2.iloc[400:] += 10 + pd.testing.assert_series_equal(reg.iloc[:400], md.expanding_regimes(s2, min_periods=100).iloc[:400]) diff --git a/tests/test_sentiment.py b/tests/test_sentiment.py new file mode 100644 index 0000000..4f7f72d --- /dev/null +++ b/tests/test_sentiment.py @@ -0,0 +1,34 @@ +import numpy as np +import pytest + +from pipeline import sentiment as s + +PROSUS = {0: "positive", 1: "negative", 2: "neutral"} # ProsusAI/finbert id2label + + +def test_finbert_polarity_uses_label_names(): + probs = np.array([[0.1, 0.8, 0.1]]) # clearly negative headline + assert s.finbert_polarity(probs, PROSUS)[0] == pytest.approx(-0.7) + # the original notebook computed probs[2] - probs[0] = 0.0 for this headline + assert probs[0, 2] - probs[0, 0] == pytest.approx(0.0) + + +def test_finbert_polarity_is_order_independent(): + probs = np.array([[0.8, 0.1, 0.1]]) + shuffled = {0: "NEUTRAL", 1: "Positive", 2: "negative"} + assert s.finbert_polarity(probs, shuffled)[0] == pytest.approx(0.0) + + +def test_missing_labels_raise(): + with pytest.raises(ValueError): + s.finbert_polarity(np.ones((1, 2)) / 2, {0: "up", 1: "down"}) + + +def test_clean_text_keeps_numbers_and_symbols(): + t = s.clean_text("Bitcoin Price Decline Forces $450M in Long Liquidations https://x.y/z") + assert "$450M" in t and "http" not in t + + +def test_language_gate(): + assert s.is_english_candidate("Nifty 50, Sensex today: What to expect") + assert not s.is_english_candidate("शेयर बाजार में बड़ी गिरावट आज") diff --git a/tests/test_stats.py b/tests/test_stats.py new file mode 100644 index 0000000..08371a4 --- /dev/null +++ b/tests/test_stats.py @@ -0,0 +1,50 @@ +import numpy as np +import pytest + +pytest.importorskip("scipy") +from pipeline import stats # noqa: E402 + + +def _fpr(method, phi=0.95, n=600, sims=80): + rng = np.random.default_rng(123) + hits = 0 + for i in range(sims): + x, y = stats.ar1(n, phi, rng), stats.ar1(n, phi, rng) # independent by construction + hits += stats.permutation_test(x, y, n_perm=200, method=method, seed=i).p_value < 0.05 + return hits / sims + + +def test_iid_shuffle_is_anticonservative_but_circular_shift_is_not(): + iid, circ = _fpr("iid"), _fpr("circular") + assert iid > 0.3 # the old test "finds" relationships between independent series + assert circ < 0.15 # nominal 5%, allowing Monte-Carlo error + + +def test_detects_a_real_relationship(): + rng = np.random.default_rng(0) + x = stats.ar1(800, 0.5, rng) + y = x + rng.normal(0, 1, 800) + res = stats.permutation_test(x, y, n_perm=300) + assert res.statistic > 0.4 and res.p_value < 0.01 + + +def test_spearman_matches_scipy(): + from scipy.stats import spearmanr + rng = np.random.default_rng(2) + x, y = rng.normal(size=300), rng.normal(size=300) + assert stats.spearman(x, y) == pytest.approx(spearmanr(x, y).statistic, abs=1e-12) + + +def test_ar1_null_inflates_variance_for_persistent_series(): + rng = np.random.default_rng(3) + y = stats.ar1(1500, 0.95, rng) + out = stats.ar1_null(y, statistic=0.05, phi=0.9, n_sims=200) + assert out["variance_inflation"] > 3 + assert out["p_value"] > out["p_value_if_iid"] + + +def test_input_validation(): + with pytest.raises(ValueError): + stats.permutation_test([1, 2, 3], [1, 2, 3]) + with pytest.raises(ValueError): + stats.permutation_test(np.arange(100.0), np.arange(100.0), method="bogus") diff --git a/tests/test_volatility.py b/tests/test_volatility.py new file mode 100644 index 0000000..accbbdb --- /dev/null +++ b/tests/test_volatility.py @@ -0,0 +1,98 @@ +import numpy as np +import pandas as pd +import pytest + +from pipeline import volatility as v + + +def _closes(n=400, seed=0): + rng = np.random.default_rng(seed) + return pd.Series(100 * np.exp(np.cumsum(rng.normal(0, 0.02, n))), + index=pd.date_range("2020-01-01", periods=n, freq="D")) + + +def test_features_use_only_past_data(): + c = _closes() + base = v.price_features(c) + t = 200 + bumped = c.copy() + bumped.iloc[t + 1:] *= 3.0 # change only the future + after = v.price_features(bumped) + feat_cols = v.HAR_FEATURES + v.RF_FEATURES + pd.testing.assert_frame_equal(base.iloc[: t + 1][feat_cols], after.iloc[: t + 1][feat_cols]) + # target at t-5 covers r[t-4..t] -> unchanged; target at t covers r[t+1..t+5] -> changed + assert base["target_vol"].iloc[t - 5] == pytest.approx(after["target_vol"].iloc[t - 5]) + assert base["target_vol"].iloc[t] != pytest.approx(after["target_vol"].iloc[t]) + + +def test_target_is_std_of_next_horizon_log_returns(): + c = _closes() + f = v.price_features(c) + r = np.log(c / c.shift(1)) + t = 100 + assert f["target_vol"].iloc[t] == pytest.approx(r.iloc[t + 1: t + 1 + v.HORIZON].std()) + + +def test_har_fit_recovers_known_coefficients(): + rng = np.random.default_rng(1) + n = 2000 + X = pd.DataFrame(rng.normal(-4, 0.5, (n, 3)), columns=v.HAR_FEATURES) + X[v.TARGET] = -0.5 + 0.2 * X.iloc[:, 0] + 0.5 * X.iloc[:, 1] + 0.1 * X.iloc[:, 2] + rng.normal(0, 0.01, n) + X.index = pd.date_range("2000-01-01", periods=n) + m = v.HARModel.fit(X, "btc") + assert m.intercept == pytest.approx(-0.5, abs=0.02) + assert [m.coef[c] for c in v.HAR_FEATURES] == pytest.approx([0.2, 0.5, 0.1], abs=0.01) + assert m.asset == "BTC" and m.n_train == n + + +def test_model_json_roundtrip_and_contract_check(tmp_path): + f = v.training_frame(_closes(800)) + m = v.HARModel.fit(f, "NIFTY") + p = tmp_path / "m.json" + m.to_json(p) + m2 = v.HARModel.from_json(p) + np.testing.assert_allclose(m.predict_log(f), m2.predict_log(f)) + bad = p.read_text().replace('"horizon": 5', '"horizon": 7') + p.write_text(bad) + with pytest.raises(ValueError, match="different feature contract"): + v.HARModel.from_json(p) + + +@pytest.mark.parametrize("text,msg", [ + ("", "at least"), + ("1 2 3", "at least"), + ("abc " * 70, "not a number"), + (" ".join(["100"] * 60 + ["-1"]), "strictly positive"), + (" ".join(["100"] * 60 + ["nan"]), "finite"), +]) +def test_parse_closes_rejects_bad_input(text, msg): + with pytest.raises(v.InputError, match=msg): + v.parse_closes(text) + + +def test_parse_closes_accepts_mixed_separators(): + vals = v.parse_closes("\n".join(f"{100 + i},{101 + i};" for i in range(31))) + assert len(vals) == 62 and vals[0] == 100 + + +def test_forecast_matches_model_on_training_features(): + c = _closes(600) + f = v.training_frame(c) + m = v.HARModel.fit(f, "BTC") + out = v.forecast(m, c) + expected = m.predict_vol(v.price_features(c, with_target=False).iloc[[-1]])[0] + assert out["daily_vol"] == pytest.approx(expected) + assert out["annualised_vol"] == pytest.approx(expected * np.sqrt(365)) + assert out["warning"] is None + + +def test_forecast_warns_on_suspicious_jump(): + c = _closes(100).to_numpy(copy=True) + c[-1] = c[-2] * 3 + m = v.HARModel(asset="NIFTY", intercept=0.0, coef={k: 1 / 3 for k in v.HAR_FEATURES}) + assert "check for data errors" in v.forecast(m, c)["warning"] + + +def test_annualise_unknown_asset(): + with pytest.raises(ValueError): + v.annualise(0.01, "ETH")