Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa755363dc | ||
|
|
7874a45e3b | ||
|
|
9e6d00c674 | ||
|
|
04cd07eb6a | ||
|
|
25bf12cb92 | ||
|
|
27cb8aa2a2 | ||
|
|
947cd4420c | ||
|
|
fd3965ad92 | ||
|
|
bf94ae937b | ||
|
|
496d238bfa | ||
|
|
ce4c07be1f | ||
|
|
f984876b35 | ||
|
|
8d6188c926 | ||
|
|
12e1951f80 | ||
|
|
47a8f64ff7 | ||
|
|
0f1d091ac8 | ||
|
|
42411d44df | ||
|
|
b0e855e7ec | ||
|
|
ea455c16a5 | ||
|
|
3e33a75230 | ||
|
|
0df671b566 | ||
|
|
03ec05d286 | ||
|
|
5c7b41d510 | ||
|
|
d12c4b3c8c | ||
|
|
d1c69e1d38 | ||
|
|
6d07669ba1 | ||
|
|
bed8959381 | ||
|
|
7fba9cff58 | ||
|
|
b0cae4dce1 | ||
|
|
a6e26a8802 | ||
|
|
906d6f12c3 | ||
|
|
d1aa6befe2 | ||
|
|
7ce5bab562 | ||
|
|
fcb951bf71 | ||
|
|
0e157d5928 | ||
|
|
50bf706ce8 | ||
|
|
5d9f73222f | ||
|
|
4f38ecfea0 | ||
|
|
d2ebd0e642 | ||
|
|
39c2f76c1a | ||
|
|
428919b701 | ||
|
|
70d9b44af9 | ||
|
|
ec5f1c2470 | ||
|
|
ebdfbb7d18 | ||
|
|
3d92f04f47 | ||
|
|
f484539920 | ||
|
|
01c9bd13d8 | ||
|
|
d48230938d | ||
|
|
146a2a3957 | ||
|
|
fc0bde214a | ||
|
|
173ab2d811 | ||
|
|
8cca819fd6 | ||
|
|
bc67252d4b | ||
|
|
f2d617b948 | ||
|
|
4e4b0af3ef | ||
|
|
04ba66083e | ||
|
|
bd327694c5 | ||
|
|
99b2db69e0 | ||
|
|
5a6efdf773 | ||
|
|
4ff80a57d4 | ||
|
|
441ae8d677 | ||
|
|
8b71e6cc05 | ||
|
|
bc40e84461 | ||
|
|
ead4ed7ee7 | ||
|
|
2e0ad642c1 | ||
|
|
54b37a403c | ||
|
|
a04a4ea475 | ||
|
|
9f0d3fd12d | ||
|
|
3596924fe2 | ||
|
|
4259760bea | ||
|
|
9a6c82aea6 | ||
|
|
bdb2fecf1e | ||
|
|
0b0b60e535 | ||
|
|
733091ad6c | ||
|
|
ea4dc2d22a | ||
|
|
b29cc269c6 | ||
|
|
8db46f2b12 | ||
|
|
f8e75b3aaf | ||
|
|
8f04f91e2b | ||
|
|
4a1e1a9fb2 | ||
|
|
a05a759852 | ||
|
|
9b7f53689b | ||
|
|
31109b2a2a | ||
|
|
8e88aec77d | ||
|
|
068e6b04db | ||
|
|
90575a029f | ||
|
|
5dbc2950e8 | ||
|
|
4707bc035e | ||
|
|
81011a7a75 | ||
|
|
14ec3df9a4 | ||
|
|
1056487183 | ||
|
|
b7a425d683 | ||
|
|
a61e0a07b5 | ||
|
|
e2150daf18 | ||
|
|
69dbf74292 | ||
|
|
b5c2160837 | ||
|
|
b8ab067caa | ||
|
|
c6429482ab | ||
|
|
4f9b6d6e9f | ||
|
|
5bbd3d096c | ||
|
|
b8b04b5345 |
12
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
12
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -18,7 +18,15 @@ body:
|
||||
|
||||
Are you spelling symbol *exactly* same as Yahoo?
|
||||
|
||||
Then visit `finance.yahoo.com` and confirm they have the data you want. Maybe your symbol was delisted, or your expectations of `yfinance` are wrong.
|
||||
Then visit `finance.yahoo.com` and confirm they have the data you want. Maybe your symbol was delisted.
|
||||
|
||||
### Data is wrong
|
||||
|
||||
**yfinance is not affiliated with Yahoo**. If Yahoo Finance website data is bad, tell Yahoo: https://help.yahoo.com/kb/finance-for-web/report-problems-feedback-ideas-yahoo-finance-sln28397.html.
|
||||
|
||||
But if yfinance is creating error during processing, then finish this form.
|
||||
|
||||
For price errors, try price repair: https://ranaroussi.github.io/yfinance/advanced/price_repair.html
|
||||
|
||||
### Are you spamming Yahoo?
|
||||
|
||||
@@ -63,7 +71,7 @@ body:
|
||||
id: bad-data-proof
|
||||
attributes:
|
||||
label: "Bad data proof"
|
||||
description: "If `yfinance` returning bad data, show proof of good data here. Best proof is screenshot of finance.yahoo.com"
|
||||
description: "If yfinance returning bad data, show proof of good data on Yahoo Finance website here."
|
||||
validations:
|
||||
required: false
|
||||
|
||||
|
||||
6
.github/dependabot.yml
vendored
6
.github/dependabot.yml
vendored
@@ -1,7 +1,13 @@
|
||||
version: 2
|
||||
updates:
|
||||
|
||||
- package-ecosystem: pip
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: daily
|
||||
open-pull-requests-limit: 10
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
42
.github/workflows/auto_close_default_issues.yml
vendored
Normal file
42
.github/workflows/auto_close_default_issues.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Auto-close issues using default template
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
check-template:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check if issue uses custom template
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
const issue = context.payload.issue;
|
||||
const body = issue.body || '';
|
||||
const title = issue.title || '';
|
||||
const textToCheck = (title + ' ' + body).toLowerCase();
|
||||
|
||||
// Check for specific fields from your custom form
|
||||
const hasCustomFields = body.includes('### Describe bug') ||
|
||||
body.includes('### Simple code that reproduces');
|
||||
|
||||
// Check for bug-related keywords
|
||||
const bugKeywords = ['bug', 'problem', 'broken'];
|
||||
const looksBugReport = bugKeywords.some(keyword => textToCheck.includes(keyword));
|
||||
|
||||
// Only close if it looks like a bug report but doesn't use the template
|
||||
if (!hasCustomFields && looksBugReport) {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
body: 'This issue appears to be a bug report but doesn\'t use our bug report template. Resubmit with our custom bug report form..'
|
||||
});
|
||||
|
||||
await github.rest.issues.update({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
state: 'closed'
|
||||
});
|
||||
}
|
||||
4
.github/workflows/deploy_doc.yml
vendored
4
.github/workflows/deploy_doc.yml
vendored
@@ -13,10 +13,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Check out the repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
|
||||
4
.github/workflows/pyright.yml
vendored
4
.github/workflows/pyright.yml
vendored
@@ -13,10 +13,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
uses: actions/setup-python@v6
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
|
||||
4
.github/workflows/python-publish.yml
vendored
4
.github/workflows/python-publish.yml
vendored
@@ -13,9 +13,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: Install dependencies
|
||||
|
||||
4
.github/workflows/ruff.yml
vendored
4
.github/workflows/ruff.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
||||
ruff:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: astral-sh/ruff-action@v3
|
||||
with:
|
||||
args: check . --exclude yfinance/pricing_pb2.py
|
||||
args: check --ignore E702 . --exclude yfinance/pricing_pb2.py
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -9,7 +9,6 @@ yfinance.egg-info
|
||||
build/
|
||||
*.html
|
||||
*.css
|
||||
*.png
|
||||
test.ipynb
|
||||
|
||||
# Environments
|
||||
@@ -24,4 +23,4 @@ ENV/
|
||||
/doc/_build/
|
||||
/doc/source/reference/api
|
||||
!yfinance.css
|
||||
!/doc/source/development/assets/branches.png
|
||||
!/doc/source/development/assets/branches.png
|
||||
|
||||
@@ -1,6 +1,61 @@
|
||||
Change Log
|
||||
===========
|
||||
|
||||
1.1.0
|
||||
-----
|
||||
Features:
|
||||
- New price repair: capital gains double-counting #2667
|
||||
Fixes:
|
||||
- Fix Saudi Arabia MIC Code #2665 @salsugair
|
||||
- Add config to __all__ #2673 @kbluck
|
||||
- Fix Python 3.9 compatibility regression in calendars.py #2674 @orionnelson
|
||||
- Improve stock-split repair false-positives #2668
|
||||
- Docs for capital-gains repair; Fix warnings in price-repair 27cb8aa
|
||||
Already in main:
|
||||
- Upgrade to Pandas 3.0 (Fixes #2679) #2683
|
||||
|
||||
1.0
|
||||
---
|
||||
yfinance been stable a long time now, time to grow up
|
||||
|
||||
No breaking changes, but some deprecation warnings.
|
||||
|
||||
Features:
|
||||
- New config class yf.config / Improve exception handling #2524
|
||||
- Feature: Earning Calendar (& other calendars) #2615 @ianmihura
|
||||
- Add optional retry mechanism for transient network errors #2627 @axisrow
|
||||
Fixes:
|
||||
- 'Industry' column names #2613 @danchev
|
||||
- Correct 30m interval alignment and filtering for NSE/early-open markets #2642 @biplavbarua
|
||||
- Screener's sector industry mapping #2648 @ericpien
|
||||
- Set period default to None in multi #2650 @evanreynolds9
|
||||
- price-div-repair dropping NaN rows #2651
|
||||
- Block curl_cffi version 0.14 #2653
|
||||
|
||||
|
||||
0.2.66
|
||||
------
|
||||
Screener: add Swiss exchange and industry field
|
||||
Support MIC #2579
|
||||
Fixes:
|
||||
- parse epoch dt #2573
|
||||
- earnings_dates #2591
|
||||
- merge intraday prices with divs/splits #2595
|
||||
- exceptions missing detail #2599
|
||||
|
||||
0.2.65
|
||||
------
|
||||
Financials: ensure dtype float #2563
|
||||
Prices: fix handling arguments start/end/period #2561 #2562
|
||||
Price repair: when changing FX, update metadata #2558
|
||||
|
||||
0.2.64
|
||||
------
|
||||
Prices:
|
||||
- handle dividends with FX, convert if repair=True #2549
|
||||
- fix 'period' arg when start or end set #2550
|
||||
earnings_dates: handle 'Event Type' properly #2555
|
||||
|
||||
0.2.63
|
||||
------
|
||||
Fix download(ISIN) # 2531
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
<a target="new" href="https://pypi.python.org/pypi/yfinance"><img border=0 src="https://img.shields.io/badge/python-2.7,%203.6+-blue.svg?style=flat" alt="Python version"></a>
|
||||
<a target="new" href="https://pypi.python.org/pypi/yfinance"><img border=0 src="https://img.shields.io/pypi/v/yfinance.svg?maxAge=60%" alt="PyPi version"></a>
|
||||
<a target="new" href="https://pypi.python.org/pypi/yfinance"><img border=0 src="https://img.shields.io/pypi/status/yfinance.svg?maxAge=60" alt="PyPi status"></a>
|
||||
<a target="new" href="https://pypi.python.org/pypi/yfinance"><img border=0 src="https://img.shields.io/pypi/dm/yfinance.svg?maxAge=2592000&label=installs&color=%2327B1FF" alt="PyPi downloads"></a>
|
||||
<a target="new" href="https://pypi.python.org/pypi/yfinance"><img border=0 src="https://img.shields.io/pypi/dm/yfinance.svg?maxAge=86400&label=installs&color=%2327B1FF" alt="PyPi downloads"></a>
|
||||
<a target="new" href="https://github.com/ranaroussi/yfinance"><img border=0 src="https://img.shields.io/github/stars/ranaroussi/yfinance.svg?style=social&label=Star&maxAge=60" alt="Star this repo"></a>
|
||||
<a target="new" href="https://x.com/intent/follow?screen_name=aroussi"><img border=0 src="https://img.shields.io/twitter/follow/aroussi.svg?style=social&label=Follow&maxAge=60" alt="Follow me on twitter"></a>
|
||||
|
||||
|
||||
<a href="https://trendshift.io/repositories/4578" target="_blank"><img src="https://trendshift.io/api/badge/repositories/4578" alt="ranaroussi%2Fyfinance | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||
|
||||
**yfinance** offers a Pythonic way to fetch financial & market data from [Yahoo!Ⓡ finance](https://finance.yahoo.com).
|
||||
|
||||
@@ -53,7 +53,7 @@ Install `yfinance` from PYPI using `pip`:
|
||||
$ pip install yfinance
|
||||
```
|
||||
|
||||
### [yfinance relies on the community to investigate bugs and contribute code. Here's how you can help.](CONTRIBUTING.md)
|
||||
### [yfinance relies on the community to investigate bugs and contribute code. Here's how you can help.](https://github.com/ranaroussi/yfinance/blob/main/CONTRIBUTING.md)
|
||||
|
||||
---
|
||||
|
||||
@@ -64,7 +64,7 @@ $ pip install yfinance
|
||||
### Legal Stuff
|
||||
|
||||
**yfinance** is distributed under the **Apache Software License**. See
|
||||
the [LICENSE.txt](./LICENSE.txt) file in the release for details.
|
||||
the [LICENSE.txt](https://github.com/ranaroussi/yfinance/blob/main/LICENSE.txt) file in the release for details.
|
||||
|
||||
AGAIN - yfinance is **not** affiliated, endorsed, or vetted by Yahoo, Inc. It's
|
||||
an open-source tool that uses Yahoo's publicly available APIs, and is
|
||||
|
||||
BIN
doc/source/_static/images/repair-prices-100x.png
Normal file
BIN
doc/source/_static/images/repair-prices-100x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
doc/source/_static/images/repair-prices-missing-div-adjust.png
Normal file
BIN
doc/source/_static/images/repair-prices-missing-div-adjust.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
doc/source/_static/images/repair-prices-missing-row.png
Normal file
BIN
doc/source/_static/images/repair-prices-missing-row.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
doc/source/_static/images/repair-prices-missing-split-adjust.png
Normal file
BIN
doc/source/_static/images/repair-prices-missing-split-adjust.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
BIN
doc/source/_static/images/repair-prices-missing-volume-daily.png
Normal file
BIN
doc/source/_static/images/repair-prices-missing-volume-daily.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
@@ -5,6 +5,7 @@
|
||||
.. currentmodule:: {{ module }}
|
||||
|
||||
.. autoclass:: {{ objname }}
|
||||
:exclude-members: {% for item in attributes %}{{ item }}{% if not loop.last %}, {% endif %}{% endfor %}
|
||||
|
||||
{% block attributes %}
|
||||
{% if attributes %}
|
||||
|
||||
@@ -2,14 +2,55 @@
|
||||
Config
|
||||
******
|
||||
|
||||
`yfinance` has a new global config for sharing common values.
|
||||
|
||||
Proxy
|
||||
-----
|
||||
|
||||
Set proxy once in config, affects all yfinance data fetches.
|
||||
`yfinance` has a new global config for sharing common values:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import yfinance as yf
|
||||
yf.set_config(proxy="PROXY_SERVER")
|
||||
>>> import yfinance as yf
|
||||
>>> yf.config
|
||||
{
|
||||
"network": {
|
||||
"proxy": null,
|
||||
"retries": 0
|
||||
},
|
||||
"debug": {
|
||||
"hide_exceptions": true,
|
||||
"logging": false
|
||||
}
|
||||
}
|
||||
>>> yf.config.network
|
||||
{
|
||||
"proxy": null,
|
||||
"retries": 0
|
||||
}
|
||||
|
||||
|
||||
Network
|
||||
-------
|
||||
|
||||
* **proxy** - Set proxy for all yfinance data fetches.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
yf.config.network.proxy = "PROXY_SERVER"
|
||||
|
||||
* **retries** - Configure automatic retry for transient network errors. The retry mechanism uses exponential backoff (1s, 2s, 4s...).
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
yf.config.network.retries = 2
|
||||
|
||||
Debug
|
||||
-----
|
||||
|
||||
* **hide_exceptions** - Set to `False` to stop yfinance hiding exceptions.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
yf.config.debug.hide_exceptions = False
|
||||
|
||||
* **logging** - Set to `True` to enable verbose debug logging.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
yf.config.debug.logging = True
|
||||
|
||||
@@ -8,4 +8,5 @@ Advanced
|
||||
logging
|
||||
config
|
||||
caching
|
||||
multi_level_columns
|
||||
multi_level_columns
|
||||
price_repair
|
||||
302
doc/source/advanced/price_repair.rst
Normal file
302
doc/source/advanced/price_repair.rst
Normal file
@@ -0,0 +1,302 @@
|
||||
************
|
||||
Price Repair
|
||||
************
|
||||
|
||||
The new argument ``repair=True`` in ``history()`` and ``download()`` will attempt to fix a variety of price errors caused by Yahoo. Only US market data appears perfect, I guess Yahoo doesn't care much about rest of world?
|
||||
|
||||
The returned table will have a new column ``Repaired?`` that specifies if row was repaired.
|
||||
|
||||
Price repair
|
||||
============
|
||||
|
||||
Missing dividend adjustment
|
||||
---------------------------
|
||||
|
||||
If dividend in data but preceding ``Adj Close`` = ``Close``, then manually apply dividend-adjustment to ``Adj Close``.
|
||||
Note: ``Repaired?`` is NOT set to ``True`` because fix only changes ``Adj Close``
|
||||
|
||||
.. figure:: /_static/images/repair-prices-missing-div-adjust.png
|
||||
:alt: 8TRA.DE: repair missing dividend adjustment
|
||||
:width: 80%
|
||||
:align: left
|
||||
|
||||
8TRA.DE
|
||||
|
||||
.. container:: clearer
|
||||
|
||||
..
|
||||
|
||||
Missing split adjustment
|
||||
------------------------
|
||||
|
||||
If stock split in data but preceding price data is not adjusted, then manually apply stock split.
|
||||
Requires date range include 1 day after stock split for calibration - sometimes Yahoo fails to adjust prices on stock split day.
|
||||
|
||||
.. figure:: /_static/images/repair-prices-missing-split-adjust.png
|
||||
:alt: MOB.ST: repair missing split adjustment
|
||||
:width: 80%
|
||||
:align: left
|
||||
|
||||
MOB.ST
|
||||
|
||||
.. container:: clearer
|
||||
|
||||
..
|
||||
|
||||
Missing data
|
||||
------------
|
||||
|
||||
If price data is clearly missing or corrupt, then reconstructed using smaller interval e.g. ``1h`` to fix ``1d`` data.
|
||||
|
||||
.. figure:: /_static/images/repair-prices-missing-row.png
|
||||
:alt: 1COV.DE: repair missing row
|
||||
:width: 80%
|
||||
:align: left
|
||||
|
||||
1COV.DE missing row
|
||||
|
||||
.. container:: clearer
|
||||
|
||||
..
|
||||
|
||||
.. figure:: /_static/images/repair-prices-missing-volume-intraday.png
|
||||
:alt: 1COV.DE: repair missing Volume, but intraday price changed
|
||||
:width: 80%
|
||||
:align: left
|
||||
|
||||
1COV.DE missing Volume, but intraday price changed
|
||||
|
||||
.. container:: clearer
|
||||
|
||||
..
|
||||
|
||||
.. figure:: /_static/images/repair-prices-missing-volume-daily.png
|
||||
:alt: 0316.HK: repair missing Volume, but daily price changed
|
||||
:width: 80%
|
||||
:align: left
|
||||
|
||||
0316.HK missing Volume, but daily price changed
|
||||
|
||||
.. container:: clearer
|
||||
|
||||
..
|
||||
|
||||
100x errors
|
||||
-----------
|
||||
|
||||
Sometimes Yahoo mixes up currencies e.g. $/cents or £/pence. So some prices are 100x wrong.
|
||||
Sometimes they are spread randomly through data - these detected with ``scipy`` module.
|
||||
Other times they are in a block, because Yahoo decided one day to permanently switch currency.
|
||||
|
||||
.. figure:: /_static/images/repair-prices-100x.png
|
||||
:alt: AET.L: repair 100x
|
||||
:width: 80%
|
||||
:align: left
|
||||
|
||||
AET.L
|
||||
|
||||
Price reconstruction - algorithm notes
|
||||
--------------------------------------
|
||||
|
||||
Spam minimised by grouping fetches. Tries to be aware of data limits e.g. ``1h`` cannot be fetched beyond 2 years.
|
||||
|
||||
If Yahoo eventually does fix the bad data that required reconstruction, you will see it's slightly different to reconstructed prices and volume often significantly different. Best I can do, and beats missing data.
|
||||
|
||||
Dividend repair (new)
|
||||
=====================
|
||||
|
||||
Fix errors in dividends:
|
||||
|
||||
1. adjustment missing or 100x too small/big for the dividend
|
||||
2. duplicate dividend (within 7 days)
|
||||
3. dividend 100x too big/small for the ex-dividend price drop
|
||||
4. ex-div date wrong (price drop is few days/weeks after)
|
||||
5. **NEW: capital gains double-counted**
|
||||
|
||||
Most errors I've seen are on London stock exchange (£/pence mixup), but no exchange is safe.
|
||||
|
||||
IMPORTANT - false positives
|
||||
---------------------------
|
||||
|
||||
Because fixing (3) relies on price action, there is a chance of a "false positive" (FP) - thinking an error exists when data is good.
|
||||
FP rate increases with longer intervals, so only 1d intervals are repaired. If you request repair on multiday intervals (weekly etc), then: 1d is fetched from Yahoo, repaired, then resampled - **this has nice side-effect of solving Yahoo's flawed way of div-adjusting multiday intervals.**
|
||||
|
||||
FP rate on 1d is tiny. They tend to happen with tiny dividends e.g. 0.5%, mistaking normal price volatility for an ex-div drop 100x bigger than the dividend, causing repair of the "too small" dividend (repair logic already tries to account for normal volatility by subtracting median). Either accept the risk, or fetch 6-12 months of prices with at least 2 dividends - then can analyse the dividends together to identify false positives.
|
||||
|
||||
Adjustment missing
|
||||
------------------
|
||||
|
||||
1398.HK
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Dividends
|
||||
2024-07-08 00:00:00+08:00 4.33 4.33 0.335715
|
||||
2024-07-04 00:00:00+08:00 4.83 4.83 0.000000
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# REPAIRED:
|
||||
Close Adj Close Dividends
|
||||
2024-07-08 00:00:00+08:00 4.33 4.330000 0.335715
|
||||
2024-07-04 00:00:00+08:00 4.83 4.494285 0.000000
|
||||
|
||||
Adjustment too small
|
||||
--------------------
|
||||
|
||||
3IN.L
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Dividends
|
||||
2024-06-13 00:00:00+01:00 3.185 3.185000 0.05950
|
||||
2024-06-12 00:00:00+01:00 3.270 3.269405 0.00000
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# REPAIRED:
|
||||
Close Adj Close Dividends
|
||||
2024-06-13 00:00:00+01:00 3.185 3.185000 0.05950
|
||||
2024-06-12 00:00:00+01:00 3.270 3.210500 0.00000
|
||||
|
||||
Duplicate (within 7 days)
|
||||
-------------------------
|
||||
|
||||
ALC.SW
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Dividends
|
||||
2023-05-10 00:00:00+02:00 70.580002 70.352142 0.21
|
||||
2023-05-09 00:00:00+02:00 65.739998 65.318443 0.21
|
||||
2023-05-08 00:00:00+02:00 66.379997 65.745682 0.00
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# REPAIRED:
|
||||
Close Adj Close Dividends
|
||||
2023-05-10 00:00:00+02:00 70.580002 70.352142 0.00
|
||||
2023-05-09 00:00:00+02:00 65.739998 65.527764 0.21
|
||||
2023-05-08 00:00:00+02:00 66.379997 65.956371 0.00
|
||||
|
||||
Dividend too big
|
||||
----------------
|
||||
|
||||
HLCL.L
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Dividends
|
||||
2024-06-27 00:00:00+01:00 2.360 2.3600 1.78
|
||||
2024-06-26 00:00:00+01:00 2.375 2.3572 0.00
|
||||
|
||||
# REPAIRED:
|
||||
Close Adj Close Dividends
|
||||
2024-06-27 00:00:00+01:00 2.360 2.3600 0.0178
|
||||
2024-06-26 00:00:00+01:00 2.375 2.3572 0.0000
|
||||
|
||||
Dividend & adjust too big
|
||||
-------------------------
|
||||
|
||||
LTI.L
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Adj Dividends
|
||||
2024-08-08 00:00:00+01:00 768.0 768.0 1.0000 5150.0
|
||||
2024-08-07 00:00:00+01:00 819.0 -4331.0 -5.2882 0.0
|
||||
Close Adj Close Adj Dividends
|
||||
2024-08-08 00:00:00+01:00 768.0 768.0 1.0000 51.5
|
||||
2024-08-07 00:00:00+01:00 819.0 767.5 0.9371 0.0
|
||||
|
||||
Dividend too small
|
||||
------------------
|
||||
|
||||
BVT.L
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Adj Dividends
|
||||
2022-02-03 00:00:00+00:00 0.7534 0.675197 0.8962 0.00001
|
||||
2022-02-01 00:00:00+00:00 0.7844 0.702970 0.8962 0.00000
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# REPAIRED:
|
||||
Close Adj Close Adj Dividends
|
||||
2022-02-03 00:00:00+00:00 0.7534 0.675197 0.8962 0.001
|
||||
2022-02-01 00:00:00+00:00 0.7844 0.702075 0.8950 0.000
|
||||
|
||||
Adjusted 2x on day before
|
||||
-------------------------
|
||||
|
||||
clue: Close < Low
|
||||
|
||||
2020.OL
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Low Close Adj Close Dividends
|
||||
2023-12-21 00:00:00+01:00 120.199997 121.099998 118.868782 0.18
|
||||
2023-12-20 00:00:00+01:00 122.000000 121.900002 119.477371 0.00
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# REPAIRED:
|
||||
Low Close Adj Close Dividends
|
||||
2023-12-21 00:00:00+01:00 120.199997 121.099998 118.868782 0.18
|
||||
2023-12-20 00:00:00+01:00 122.000000 122.080002 119.654045 0.00
|
||||
|
||||
ex-div date wrong
|
||||
-----------------
|
||||
|
||||
TETY.ST
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Dividends
|
||||
2022-06-22 00:00:00+02:00 66.699997 60.085415 0.0
|
||||
2022-06-21 00:00:00+02:00 71.599998 64.499489 0.0
|
||||
2022-06-20 00:00:00+02:00 71.800003 64.679657 5.0
|
||||
2022-06-17 00:00:00+02:00 71.000000 59.454838 0.0
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# REPAIRED:
|
||||
Close Adj Close Dividends
|
||||
2022-06-22 00:00:00+02:00 66.699997 60.085415 5.0
|
||||
2022-06-21 00:00:00+02:00 71.599998 60.007881 0.0
|
||||
2022-06-20 00:00:00+02:00 71.800003 60.175503 0.0
|
||||
2022-06-17 00:00:00+02:00 71.000000 59.505021 0.0
|
||||
|
||||
|
||||
Capital-gains double-counted
|
||||
----------------------------
|
||||
|
||||
Clue: price drop matches dividend better than dividend+capital gains.
|
||||
|
||||
DODFX
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# ORIGINAL:
|
||||
Close Adj Close Dividends Capital Gains
|
||||
Date
|
||||
2025-12-18 00:00:00-05:00 16.219999 16.219999 0.837 0.417
|
||||
2025-12-17 00:00:00-05:00 16.920000 15.665999 0.000 0.000
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
# REPAIRED:
|
||||
Close Adj Close Dividends Capital Gains
|
||||
Date
|
||||
2025-12-18 00:00:00-05:00 16.219999 16.219999 0.42 0.417
|
||||
2025-12-17 00:00:00-05:00 16.920000 16.083000 0.00 0.000
|
||||
38
doc/source/reference/examples/calendars.py
Normal file
38
doc/source/reference/examples/calendars.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import yfinance as yf
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
# Default init (today + 7 days)
|
||||
calendar = yf.Calendars()
|
||||
|
||||
# Today's events: calendar of 1 day
|
||||
tomorrow = datetime.now() + timedelta(days=1)
|
||||
calendar = yf.Calendars(end=tomorrow)
|
||||
|
||||
# Default calendar queries - accessing the properties will fetch the data from YF
|
||||
calendar.earnings_calendar
|
||||
calendar.ipo_info_calendar
|
||||
calendar.splits_calendar
|
||||
calendar.economic_events_calendar
|
||||
|
||||
# Manual queries
|
||||
calendar.get_earnings_calendar()
|
||||
calendar.get_ipo_info_calendar()
|
||||
calendar.get_splits_calendar()
|
||||
calendar.get_economic_events_calendar()
|
||||
|
||||
# Earnings calendar custom filters
|
||||
calendar.get_earnings_calendar(
|
||||
market_cap=100_000_000, # filter out small-cap
|
||||
filter_most_active=True, # show only actively traded. Uses: `screen(query="MOST_ACTIVES")`
|
||||
)
|
||||
|
||||
# Example of real use case:
|
||||
# Get inminent unreported earnings events
|
||||
today = datetime.now()
|
||||
is_friday = today.weekday() == 4
|
||||
day_after_tomorrow = today + timedelta(days=4 if is_friday else 2)
|
||||
|
||||
calendar = yf.Calendars(today, day_after_tomorrow)
|
||||
df = calendar.get_earnings_calendar(limit=100)
|
||||
|
||||
unreported_df = df[df["Reported EPS"].isnull()]
|
||||
@@ -16,6 +16,7 @@ The following are the publicly available classes, and functions exposed by the `
|
||||
- :attr:`Ticker <yfinance.Ticker>`: Class for accessing single ticker data.
|
||||
- :attr:`Tickers <yfinance.Tickers>`: Class for handling multiple tickers.
|
||||
- :attr:`Market <yfinance.Market>`: Class for accessing market summary.
|
||||
- :attr:`Calendars <yfinance.Calendars>`: Class for accessing calendar events data.
|
||||
- :attr:`download <yfinance.download>`: Function to download market data for multiple tickers.
|
||||
- :attr:`Search <yfinance.Search>`: Class for accessing search results.
|
||||
- :attr:`Lookup <yfinance.Lookup>`: Class for looking up tickers.
|
||||
@@ -23,7 +24,6 @@ The following are the publicly available classes, and functions exposed by the `
|
||||
- :class:`AsyncWebSocket <yfinance.AsyncWebSocket>`: Class for asynchronously streaming live market data.
|
||||
- :attr:`Sector <yfinance.Sector>`: Domain class for accessing sector information.
|
||||
- :attr:`Industry <yfinance.Industry>`: Domain class for accessing industry information.
|
||||
- :attr:`Market <yfinance.Market>`: Class for accessing market status & summary.
|
||||
- :attr:`EquityQuery <yfinance.EquityQuery>`: Class to build equity query filters.
|
||||
- :attr:`FundQuery <yfinance.FundQuery>`: Class to build fund query filters.
|
||||
- :attr:`screen <yfinance.screen>`: Run equity/fund queries.
|
||||
@@ -38,9 +38,9 @@ The following are the publicly available classes, and functions exposed by the `
|
||||
yfinance.ticker_tickers
|
||||
yfinance.stock
|
||||
yfinance.market
|
||||
yfinance.calendars
|
||||
yfinance.financials
|
||||
yfinance.analysis
|
||||
yfinance.market
|
||||
yfinance.search
|
||||
yfinance.lookup
|
||||
yfinance.websocket
|
||||
|
||||
21
doc/source/reference/yfinance.calendars.rst
Normal file
21
doc/source/reference/yfinance.calendars.rst
Normal file
@@ -0,0 +1,21 @@
|
||||
=====================
|
||||
Calendars
|
||||
=====================
|
||||
|
||||
.. currentmodule:: yfinance
|
||||
|
||||
|
||||
Class
|
||||
------------
|
||||
The `Calendars` class allows you to get information about upcoming events, for example, earning events.
|
||||
|
||||
.. autosummary::
|
||||
:toctree: api/
|
||||
|
||||
Calendars
|
||||
|
||||
Sample Code
|
||||
------------------
|
||||
|
||||
.. literalinclude:: examples/calendars.py
|
||||
:language: python
|
||||
@@ -20,6 +20,9 @@ Ticker stock methods
|
||||
:meth:`yfinance.scrapers.history.PriceHistory.history`
|
||||
Documentation for history
|
||||
|
||||
:doc:`../advanced/price_repair`
|
||||
Documentation for price repair
|
||||
|
||||
.. autosummary::
|
||||
:toctree: api/
|
||||
:recursive:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% set name = "yfinance" %}
|
||||
{% set version = "0.2.63" %}
|
||||
{% set version = "1.1.0" %}
|
||||
|
||||
package:
|
||||
name: "{{ name|lower }}"
|
||||
@@ -15,6 +15,7 @@ build:
|
||||
script: "{{ PYTHON }} -m pip install . --no-deps --ignore-installed -vv "
|
||||
|
||||
requirements:
|
||||
# curl_cffi 0.14 has major problems, see their Github
|
||||
host:
|
||||
- pandas >=1.3.0
|
||||
- numpy >=1.16.5
|
||||
@@ -26,7 +27,7 @@ requirements:
|
||||
- frozendict >=2.3.4
|
||||
- beautifulsoup4 >=4.11.1
|
||||
- html5lib >=1.1
|
||||
- curl_cffi >=0.7
|
||||
- curl_cffi >=0.7,<0.14
|
||||
- peewee >=3.16.2
|
||||
- pip
|
||||
- python
|
||||
@@ -42,7 +43,7 @@ requirements:
|
||||
- frozendict >=2.3.4
|
||||
- beautifulsoup4 >=4.11.1
|
||||
- html5lib >=1.1
|
||||
- curl_cffi >=0.7
|
||||
- curl_cffi >=0.7,<0.14
|
||||
- peewee >=3.16.2
|
||||
- python
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ peewee>=3.16.2
|
||||
requests_cache>=1.0
|
||||
requests_ratelimiter>=0.3.1
|
||||
scipy>=1.6.3
|
||||
curl_cffi>=0.7
|
||||
# curl_cffi 0.14 has major problems, see their Github
|
||||
curl_cffi>=0.7,<0.14
|
||||
protobuf>=3.19.0
|
||||
websockets>=13.0
|
||||
|
||||
3
setup.py
3
setup.py
@@ -59,11 +59,12 @@ setup(
|
||||
platforms=['any'],
|
||||
keywords='pandas, yahoo finance, pandas datareader',
|
||||
packages=find_packages(exclude=['contrib', 'docs', 'tests', 'examples']),
|
||||
# curl_cffi 0.14 has major problems, see their Github
|
||||
install_requires=['pandas>=1.3.0', 'numpy>=1.16.5',
|
||||
'requests>=2.31', 'multitasking>=0.0.7',
|
||||
'platformdirs>=2.0.0', 'pytz>=2022.5',
|
||||
'frozendict>=2.3.4', 'peewee>=3.16.2',
|
||||
'beautifulsoup4>=4.11.1', 'curl_cffi>=0.7',
|
||||
'beautifulsoup4>=4.11.1', 'curl_cffi>=0.7,<0.14',
|
||||
'protobuf>=3.19.0', 'websockets>=13.0'],
|
||||
extras_require={
|
||||
'nospam': ['requests_cache>=1.0', 'requests_ratelimiter>=0.3.1'],
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
|
||||
2022-05-30 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-05-23 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-05-16 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,532454,0,0
|
||||
2022-05-09 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-05-02 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-04-25 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-04-18 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-04-11 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-04-04 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-03-28 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-03-21 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-03-14 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-03-07 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-02-28 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-02-21 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-02-14 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-02-07 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-01-31 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-01-24 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-01-17 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-01-10 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2022-01-03 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-12-27 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-12-20 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-12-13 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-12-06 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-11-29 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-11-22 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-11-15 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-11-08 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-11-01 00:00:00+00:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-10-25 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-10-18 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-10-11 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
|
||||
2021-10-04 00:00:00+01:00,14.8000,15.3400,14.4000,14.5500,14.5500,2171373,0,0
|
||||
2021-09-27 00:00:00+01:00,15.6000,16.0000,14.9000,15.0500,15.0500,3860549,0,0
|
||||
|
@@ -1,37 +0,0 @@
|
||||
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
|
||||
2022-05-30 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-05-23 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-05-16 00:00:00+01:00,14.550000190734863,14.550000190734863,0.14550000429153442,0.14550000429153442,0.14550000429153442,532454,0.0,0.0
|
||||
2022-05-09 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
|
||||
2022-05-02 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-04-25 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-04-18 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-04-11 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-04-04 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-03-28 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-03-21 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-03-14 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-03-07 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-02-28 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-02-21 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-02-14 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-02-07 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-01-31 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-01-24 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-01-17 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-01-10 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2022-01-03 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-12-27 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-12-20 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-12-13 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-12-06 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-11-29 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-11-22 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-11-15 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-11-08 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-11-01 00:00:00+00:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-10-25 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-10-18 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-10-11 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
|
||||
2021-10-04 00:00:00+01:00,14.800000190734863,15.34000015258789,0.14399999380111694,0.14550000429153442,0.14550000429153442,2171373,0.0,0.0
|
||||
2021-09-27 00:00:00+01:00,15.600000381469727,16.0,14.899999618530273,15.050000190734863,15.050000190734863,3860549,0.0,0.0
|
||||
|
503
tests/data/DODFX-1d-cg-double-count-fixed.csv
Normal file
503
tests/data/DODFX-1d-cg-double-count-fixed.csv
Normal file
@@ -0,0 +1,503 @@
|
||||
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits,Capital Gains
|
||||
2024-01-10 00:00:00-05:00,12.147500038147,12.147500038147,12.147500038147,12.147500038147,11.2976727169889,0,0,0,0
|
||||
2024-01-11 00:00:00-05:00,12.1350002288818,12.1350002288818,12.1350002288818,12.1350002288818,11.2860473822568,0,0,0,0
|
||||
2024-01-12 00:00:00-05:00,12.1400003433228,12.1400003433228,12.1400003433228,12.1400003433228,11.2906976935409,0,0,0,0
|
||||
2024-01-16 00:00:00-05:00,11.9300003051758,11.9300003051758,11.9300003051758,11.9300003051758,11.0953890543897,0,0,0,0
|
||||
2024-01-17 00:00:00-05:00,11.7924995422363,11.7924995422363,11.7924995422363,11.7924995422363,10.9675077114674,0,0,0,0
|
||||
2024-01-18 00:00:00-05:00,11.8400001525879,11.8400001525879,11.8400001525879,11.8400001525879,11.0116852251883,0,0,0,0
|
||||
2024-01-19 00:00:00-05:00,11.9025001525879,11.9025001525879,11.9025001525879,11.9025001525879,11.0698127858052,0,0,0,0
|
||||
2024-01-22 00:00:00-05:00,11.9075002670288,11.9075002670288,11.9075002670288,11.9075002670288,11.0744630970893,0,0,0,0
|
||||
2024-01-23 00:00:00-05:00,11.9224996566772,11.9224996566772,11.9224996566772,11.9224996566772,11.0884131439854,0,0,0,0
|
||||
2024-01-24 00:00:00-05:00,11.9925003051758,11.9925003051758,11.9925003051758,11.9925003051758,11.1535166150066,0,0,0,0
|
||||
2024-01-25 00:00:00-05:00,11.9575004577637,11.9575004577637,11.9575004577637,11.9575004577637,11.1209653229741,0,0,0,0
|
||||
2024-01-26 00:00:00-05:00,12.0325002670288,12.0325002670288,12.0325002670288,12.0325002670288,11.1907182183232,0,0,0,0
|
||||
2024-01-29 00:00:00-05:00,12.0749998092651,12.0749998092651,12.0749998092651,12.0749998092651,11.2302445338038,0,0,0,0
|
||||
2024-01-30 00:00:00-05:00,12.0299997329712,12.0299997329712,12.0299997329712,12.0299997329712,11.1883926192031,0,0,0,0
|
||||
2024-01-31 00:00:00-05:00,11.9324998855591,11.9324998855591,11.9324998855591,11.9324998855591,11.0977137665536,0,0,0,0
|
||||
2024-02-01 00:00:00-05:00,11.9825000762939,11.9825000762939,11.9825000762939,11.9825000762939,11.1442159924384,0,0,0,0
|
||||
2024-02-02 00:00:00-05:00,11.9125003814697,11.9125003814697,11.9125003814697,11.9125003814697,11.0791134083734,0,0,0,0
|
||||
2024-02-05 00:00:00-05:00,11.8400001525879,11.8400001525879,11.8400001525879,11.8400001525879,11.0116852251883,0,0,0,0
|
||||
2024-02-06 00:00:00-05:00,11.9274997711182,11.9274997711182,11.9274997711182,11.9274997711182,11.0930634552695,0,0,0,0
|
||||
2024-02-07 00:00:00-05:00,11.8699998855591,11.8699998855591,11.8699998855591,11.8699998855591,11.0395862059367,0,0,0,0
|
||||
2024-02-08 00:00:00-05:00,11.7974996566772,11.7974996566772,11.7974996566772,11.7974996566772,10.9721580227515,0,0,0,0
|
||||
2024-02-09 00:00:00-05:00,11.8050003051758,11.8050003051758,11.8050003051758,11.8050003051758,10.9791339331558,0,0,0,0
|
||||
2024-02-12 00:00:00-05:00,11.875,11.875,11.875,11.875,11.0442365172208,0,0,0,0
|
||||
2024-02-13 00:00:00-05:00,11.727499961853,11.727499961853,11.727499961853,11.727499961853,10.9070554386865,0,0,0,0
|
||||
2024-02-14 00:00:00-05:00,11.7974996566772,11.7974996566772,11.7974996566772,11.7974996566772,10.9721580227515,0,0,0,0
|
||||
2024-02-15 00:00:00-05:00,11.9049997329712,11.9049997329712,11.9049997329712,11.9049997329712,11.0721374979692,0,0,0,0
|
||||
2024-02-16 00:00:00-05:00,11.9624996185303,11.9624996185303,11.9624996185303,11.9624996185303,11.125614747302,0,0,0,0
|
||||
2024-02-20 00:00:00-05:00,12.0349998474121,12.0349998474121,12.0349998474121,12.0349998474121,11.1930429304872,0,0,0,0
|
||||
2024-02-21 00:00:00-05:00,12.0550003051758,12.0550003051758,12.0550003051758,12.0550003051758,11.2116441756236,0,0,0,0
|
||||
2024-02-22 00:00:00-05:00,12.1800003051758,12.1800003051758,12.1800003051758,12.1800003051758,11.3278992968575,0,0,0,0
|
||||
2024-02-23 00:00:00-05:00,12.1774997711182,12.1774997711182,12.1774997711182,12.1774997711182,11.3255736977373,0,0,0,0
|
||||
2024-02-26 00:00:00-05:00,12.1525001525879,12.1525001525879,12.1525001525879,12.1525001525879,11.302323028273,0,0,0,0
|
||||
2024-02-27 00:00:00-05:00,12.1724996566772,12.1724996566772,12.1724996566772,12.1724996566772,11.3209233864532,0,0,0,0
|
||||
2024-02-28 00:00:00-05:00,12.1175003051758,12.1175003051758,12.1175003051758,12.1175003051758,11.2697717362405,0,0,0,0
|
||||
2024-02-29 00:00:00-05:00,12.0900001525879,12.0900001525879,12.0900001525879,12.0900001525879,11.2441954676561,0,0,0,0
|
||||
2024-03-01 00:00:00-05:00,12.2150001525879,12.2150001525879,12.2150001525879,12.2150001525879,11.36045058889,0,0,0,0
|
||||
2024-03-04 00:00:00-05:00,12.1549997329712,12.1549997329712,12.1549997329712,12.1549997329712,11.304647740437,0,0,0,0
|
||||
2024-03-05 00:00:00-05:00,12.1374998092651,12.1374998092651,12.1374998092651,12.1374998092651,11.2883720944207,0,0,0,0
|
||||
2024-03-06 00:00:00-05:00,12.2674999237061,12.2674999237061,12.2674999237061,12.2674999237061,11.4092775269387,0,0,0,0
|
||||
2024-03-07 00:00:00-05:00,12.3699998855591,12.3699998855591,12.3699998855591,12.3699998855591,11.5046066908723,0,0,0,0
|
||||
2024-03-08 00:00:00-05:00,12.3874998092651,12.3874998092651,12.3874998092651,12.3874998092651,11.5208823368885,0,0,0,0
|
||||
2024-03-11 00:00:00-04:00,12.4174995422363,12.4174995422363,12.4174995422363,12.4174995422363,11.5487833176369,0,0,0,0
|
||||
2024-03-12 00:00:00-04:00,12.5299997329712,12.5299997329712,12.5299997329712,12.5299997329712,11.6534131041387,0,0,0,0
|
||||
2024-03-13 00:00:00-04:00,12.5775003433228,12.5775003433228,12.5775003433228,12.5775003433228,11.6975906178595,0,0,0,0
|
||||
2024-03-14 00:00:00-04:00,12.4875001907349,12.4875001907349,12.4875001907349,12.4875001907349,11.6138867886581,0,0,0,0
|
||||
2024-03-15 00:00:00-04:00,12.4549999237061,12.4549999237061,12.4549999237061,12.4549999237061,11.5836602087896,0,0,0,0
|
||||
2024-03-18 00:00:00-04:00,12.4700002670288,12.4700002670288,12.4700002670288,12.4700002670288,11.5976111426419,0,0,0,0
|
||||
2024-03-19 00:00:00-04:00,12.477499961853,12.477499961853,12.477499961853,12.477499961853,11.6045861660899,0,0,0,0
|
||||
2024-03-20 00:00:00-04:00,12.5825004577637,12.5825004577637,12.5825004577637,12.5825004577637,11.7022409291436,0,0,0,0
|
||||
2024-03-21 00:00:00-04:00,12.5749998092651,12.5749998092651,12.5749998092651,12.5749998092651,11.6952650187394,0,0,0,0
|
||||
2024-03-22 00:00:00-04:00,12.5325002670288,12.5325002670288,12.5325002670288,12.5325002670288,11.6557387032588,0,0,0,0
|
||||
2024-03-25 00:00:00-04:00,12.5524997711182,12.5524997711182,12.5524997711182,12.5524997711182,11.674339061439,0,0,0,0
|
||||
2024-03-26 00:00:00-04:00,12.5749998092651,12.5749998092651,12.5749998092651,12.5749998092651,11.6952650187394,0,0,0,0
|
||||
2024-03-27 00:00:00-04:00,12.6800003051758,12.6800003051758,12.6800003051758,12.6800003051758,11.7929197817931,0,0,0,0
|
||||
2024-03-28 00:00:00-04:00,12.6750001907349,12.6750001907349,12.6750001907349,12.6750001907349,11.788269470509,0,0,0,0
|
||||
2024-04-01 00:00:00-04:00,12.625,12.625,12.625,12.625,11.7417672446242,0,0,0,0
|
||||
2024-04-02 00:00:00-04:00,12.5874996185303,12.5874996185303,12.5874996185303,12.5874996185303,11.7068903534715,0,0,0,0
|
||||
2024-04-03 00:00:00-04:00,12.6724996566772,12.6724996566772,12.6724996566772,12.6724996566772,11.7859438713888,0,0,0,0
|
||||
2024-04-04 00:00:00-04:00,12.6199998855591,12.6199998855591,12.6199998855591,12.6199998855591,11.7371169333401,0,0,0,0
|
||||
2024-04-05 00:00:00-04:00,12.6225004196167,12.6225004196167,12.6225004196167,12.6225004196167,11.7394425324602,0,0,0,0
|
||||
2024-04-08 00:00:00-04:00,12.6750001907349,12.6750001907349,12.6750001907349,12.6750001907349,11.788269470509,0,0,0,0
|
||||
2024-04-09 00:00:00-04:00,12.7124996185303,12.7124996185303,12.7124996185303,12.7124996185303,11.8231454747054,0,0,0,0
|
||||
2024-04-10 00:00:00-04:00,12.5900001525879,12.5900001525879,12.5900001525879,12.5900001525879,11.7092159525917,0,0,0,0
|
||||
2024-04-11 00:00:00-04:00,12.5574998855591,12.5574998855591,12.5574998855591,12.5574998855591,11.6789893727231,0,0,0,0
|
||||
2024-04-12 00:00:00-04:00,12.3474998474121,12.3474998474121,12.3474998474121,12.3474998474121,11.4836807335719,0,0,0,0
|
||||
2024-04-15 00:00:00-04:00,12.2799997329712,12.2799997329712,12.2799997329712,12.2799997329712,11.4209028616709,0,0,0,0
|
||||
2024-04-16 00:00:00-04:00,12.1625003814697,12.1625003814697,12.1625003814697,12.1625003814697,11.3116236508412,0,0,0,0
|
||||
2024-04-17 00:00:00-04:00,12.1850004196167,12.1850004196167,12.1850004196167,12.1850004196167,11.3325496081416,0,0,0,0
|
||||
2024-04-18 00:00:00-04:00,12.1999998092651,12.1999998092651,12.1999998092651,12.1999998092651,11.3464996550377,0,0,0,0
|
||||
2024-04-19 00:00:00-04:00,12.2349996566772,12.2349996566772,12.2349996566772,12.2349996566772,11.3790509470702,0,0,0,0
|
||||
2024-04-22 00:00:00-04:00,12.4125003814697,12.4125003814697,12.4125003814697,12.4125003814697,11.544133893309,0,0,0,0
|
||||
2024-04-23 00:00:00-04:00,12.5124998092651,12.5124998092651,12.5124998092651,12.5124998092651,11.6371374581224,0,0,0,0
|
||||
2024-04-24 00:00:00-04:00,12.5074996948242,12.5074996948242,12.5074996948242,12.5074996948242,11.6324871468383,0,0,0,0
|
||||
2024-04-25 00:00:00-04:00,12.5699996948242,12.5699996948242,12.5699996948242,12.5699996948242,11.6906147074553,0,0,0,0
|
||||
2024-04-26 00:00:00-04:00,12.6149997711182,12.6149997711182,12.6149997711182,12.6149997711182,11.732466622056,0,0,0,0
|
||||
2024-04-29 00:00:00-04:00,12.6999998092651,12.6999998092651,12.6999998092651,12.6999998092651,11.8115201399733,0,0,0,0
|
||||
2024-04-30 00:00:00-04:00,12.5050001144409,12.5050001144409,12.5050001144409,12.5050001144409,11.6301624346744,0,0,0,0
|
||||
2024-05-01 00:00:00-04:00,12.4949998855591,12.4949998855591,12.4949998855591,12.4949998855591,11.6208618121062,0,0,0,0
|
||||
2024-05-02 00:00:00-04:00,12.6674995422363,12.6674995422363,12.6674995422363,12.6674995422363,11.7812935601047,0,0,0,0
|
||||
2024-05-03 00:00:00-04:00,12.7524995803833,12.7524995803833,12.7524995803833,12.7524995803833,11.860347078022,0,0,0,0
|
||||
2024-05-06 00:00:00-04:00,12.852499961853,12.852499961853,12.852499961853,12.852499961853,11.9533515297916,0,0,0,0
|
||||
2024-05-07 00:00:00-04:00,12.914999961853,12.914999961853,12.914999961853,12.914999961853,12.0114790904086,0,0,0,0
|
||||
2024-05-08 00:00:00-04:00,12.9350004196167,12.9350004196167,12.9350004196167,12.9350004196167,12.030080335545,0,0,0,0
|
||||
2024-05-09 00:00:00-04:00,13.0249996185303,13.0249996185303,13.0249996185303,13.0249996185303,12.1137832777902,0,0,0,0
|
||||
2024-05-10 00:00:00-04:00,13.1075000762939,13.1075000762939,13.1075000762939,13.1075000762939,12.1905120835435,0,0,0,0
|
||||
2024-05-13 00:00:00-04:00,13.1824998855591,13.1824998855591,13.1824998855591,13.1824998855591,12.2602649788926,0,0,0,0
|
||||
2024-05-14 00:00:00-04:00,13.2399997711182,13.2399997711182,13.2399997711182,13.2399997711182,12.3137422282255,0,0,0,0
|
||||
2024-05-15 00:00:00-04:00,13.3649997711182,13.3649997711182,13.3649997711182,13.3649997711182,12.4299973494594,0,0,0,0
|
||||
2024-05-16 00:00:00-04:00,13.3500003814697,13.3500003814697,13.3500003814697,13.3500003814697,12.4160473025633,0,0,0,0
|
||||
2024-05-17 00:00:00-04:00,13.3675003051758,13.3675003051758,13.3675003051758,13.3675003051758,12.4323229485795,0,0,0,0
|
||||
2024-05-20 00:00:00-04:00,13.397500038147,13.397500038147,13.397500038147,13.397500038147,12.4602239293279,0,0,0,0
|
||||
2024-05-21 00:00:00-04:00,13.3474998474121,13.3474998474121,13.3474998474121,13.3474998474121,12.4137217034432,0,0,0,0
|
||||
2024-05-22 00:00:00-04:00,13.2224998474121,13.2224998474121,13.2224998474121,13.2224998474121,12.2974665822092,0,0,0,0
|
||||
2024-05-23 00:00:00-04:00,13.125,13.125,13.125,13.125,12.2067877295598,0,0,0,0
|
||||
2024-05-24 00:00:00-04:00,13.2049999237061,13.2049999237061,13.2049999237061,13.2049999237061,12.281190936193,0,0,0,0
|
||||
2024-05-28 00:00:00-04:00,13.1899995803833,13.1899995803833,13.1899995803833,13.1899995803833,12.2672400023407,0,0,0,0
|
||||
2024-05-29 00:00:00-04:00,12.9674997329712,12.9674997329712,12.9674997329712,12.9674997329712,12.0603060284573,0,0,0,0
|
||||
2024-05-30 00:00:00-04:00,13.0699996948242,13.0699996948242,13.0699996948242,13.0699996948242,12.1556351923909,0,0,0,0
|
||||
2024-05-31 00:00:00-04:00,13.1925001144409,13.1925001144409,13.1925001144409,13.1925001144409,12.2695656014608,0,0,0,0
|
||||
2024-06-03 00:00:00-04:00,13.1774997711182,13.1774997711182,13.1774997711182,13.1774997711182,12.2556146676085,0,0,0,0
|
||||
2024-06-04 00:00:00-04:00,13.0550003051758,13.0550003051758,13.0550003051758,13.0550003051758,12.1416851454948,0,0,0,0
|
||||
2024-06-05 00:00:00-04:00,13.1549997329712,13.1549997329712,13.1549997329712,13.1549997329712,12.2346887103082,0,0,0,0
|
||||
2024-06-06 00:00:00-04:00,13.1975002288818,13.1975002288818,13.1975002288818,13.1975002288818,12.2742159127449,0,0,0,0
|
||||
2024-06-07 00:00:00-04:00,13.085000038147,13.085000038147,13.085000038147,13.085000038147,12.1695861262432,0,0,0,0
|
||||
2024-06-10 00:00:00-04:00,13.039999961853,13.039999961853,13.039999961853,13.039999961853,12.1277342116425,0,0,0,0
|
||||
2024-06-11 00:00:00-04:00,12.9025001525879,12.9025001525879,12.9025001525879,12.9025001525879,11.9998537556764,0,0,0,0
|
||||
2024-06-12 00:00:00-04:00,13.0074996948242,13.0074996948242,13.0074996948242,13.0074996948242,12.0975076317739,0,0,0,0
|
||||
2024-06-13 00:00:00-04:00,12.8275003433228,12.8275003433228,12.8275003433228,12.8275003433228,11.9301008603273,0,0,0,0
|
||||
2024-06-14 00:00:00-04:00,12.7049999237061,12.7049999237061,12.7049999237061,12.7049999237061,11.8161704512574,0,0,0,0
|
||||
2024-06-17 00:00:00-04:00,12.7574996948242,12.7574996948242,12.7574996948242,12.7574996948242,11.8649973893061,0,0,0,0
|
||||
2024-06-18 00:00:00-04:00,12.7849998474121,12.7849998474121,12.7849998474121,12.7849998474121,11.8905736578906,0,0,0,0
|
||||
2024-06-20 00:00:00-04:00,12.8325004577637,12.8325004577637,12.8325004577637,12.8325004577637,11.9347511716114,0,0,0,0
|
||||
2024-06-21 00:00:00-04:00,12.7200002670288,12.7200002670288,12.7200002670288,12.7200002670288,11.8301213851097,0,0,0,0
|
||||
2024-06-24 00:00:00-04:00,12.8675003051758,12.8675003051758,12.8675003051758,12.8675003051758,11.9673024636439,0,0,0,0
|
||||
2024-06-25 00:00:00-04:00,12.8249998092651,12.8249998092651,12.8249998092651,12.8249998092651,11.9277752612072,0,0,0,0
|
||||
2024-06-26 00:00:00-04:00,12.7399997711182,12.7399997711182,12.7399997711182,12.7399997711182,11.8487217432899,0,0,0,0
|
||||
2024-06-27 00:00:00-04:00,12.7025003433228,12.7025003433228,12.7025003433228,12.7025003433228,11.8138457390934,0,0,0,0
|
||||
2024-06-28 00:00:00-04:00,12.6774997711182,12.6774997711182,12.6774997711182,12.6774997711182,11.7905941826729,0,0,0,0
|
||||
2024-07-01 00:00:00-04:00,12.727499961853,12.727499961853,12.727499961853,12.727499961853,11.8370964085577,0,0,0,0
|
||||
2024-07-02 00:00:00-04:00,12.727499961853,12.727499961853,12.727499961853,12.727499961853,11.8370964085577,0,0,0,0
|
||||
2024-07-03 00:00:00-04:00,12.8999996185303,12.8999996185303,12.8999996185303,12.8999996185303,11.9975281565563,0,0,0,0
|
||||
2024-07-05 00:00:00-04:00,12.960000038147,12.960000038147,12.960000038147,12.960000038147,12.0533310050093,0,0,0,0
|
||||
2024-07-08 00:00:00-04:00,12.9499998092651,12.9499998092651,12.9499998092651,12.9499998092651,12.0440303824411,0,0,0,0
|
||||
2024-07-09 00:00:00-04:00,12.9075002670288,12.9075002670288,12.9075002670288,12.9075002670288,12.0045040669605,0,0,0,0
|
||||
2024-07-10 00:00:00-04:00,13.0649995803833,13.0649995803833,13.0649995803833,13.0649995803833,12.1509848811068,0,0,0,0
|
||||
2024-07-11 00:00:00-04:00,13.1724996566772,13.1724996566772,13.1724996566772,13.1724996566772,12.2509643563244,0,0,0,0
|
||||
2024-07-12 00:00:00-04:00,13.2950000762939,13.2950000762939,13.2950000762939,13.2950000762939,12.3648947653944,0,0,0,0
|
||||
2024-07-15 00:00:00-04:00,13.2049999237061,13.2049999237061,13.2049999237061,13.2049999237061,12.281190936193,0,0,0,0
|
||||
2024-07-16 00:00:00-04:00,13.2200002670288,13.2200002670288,13.2200002670288,13.2200002670288,12.2951418700453,0,0,0,0
|
||||
2024-07-17 00:00:00-04:00,13.289999961853,13.289999961853,13.289999961853,13.289999961853,12.3602444541103,0,0,0,0
|
||||
2024-07-18 00:00:00-04:00,13.1499996185303,13.1499996185303,13.1499996185303,13.1499996185303,12.2300383990241,0,0,0,0
|
||||
2024-07-19 00:00:00-04:00,13.0500001907349,13.0500001907349,13.0500001907349,13.0500001907349,12.1370348342107,0,0,0,0
|
||||
2024-07-22 00:00:00-04:00,13.1949996948242,13.1949996948242,13.1949996948242,13.1949996948242,12.2718903136248,0,0,0,0
|
||||
2024-07-23 00:00:00-04:00,13.0874996185303,13.0874996185303,13.0874996185303,13.0874996185303,12.1719108384071,0,0,0,0
|
||||
2024-07-24 00:00:00-04:00,12.9624996185303,12.9624996185303,12.9624996185303,12.9624996185303,12.0556557171732,0,0,0,0
|
||||
2024-07-25 00:00:00-04:00,12.9300003051758,12.9300003051758,12.9300003051758,12.9300003051758,12.0254300242609,0,0,0,0
|
||||
2024-07-26 00:00:00-04:00,13.0325002670288,13.0325002670288,13.0325002670288,13.0325002670288,12.1207591881944,0,0,0,0
|
||||
2024-07-29 00:00:00-04:00,13.0150003433228,13.0150003433228,13.0150003433228,13.0150003433228,12.1044835421782,0,0,0,0
|
||||
2024-07-30 00:00:00-04:00,12.9825000762939,12.9825000762939,12.9825000762939,12.9825000762939,12.0742569623096,0,0,0,0
|
||||
2024-07-31 00:00:00-04:00,13.0799999237061,13.0799999237061,13.0799999237061,13.0799999237061,12.1649358149591,0,0,0,0
|
||||
2024-08-01 00:00:00-04:00,12.8299999237061,12.8299999237061,12.8299999237061,12.8299999237061,11.9324255724913,0,0,0,0
|
||||
2024-08-02 00:00:00-04:00,12.6400003433228,12.6400003433228,12.6400003433228,12.6400003433228,11.7557181784765,0,0,0,0
|
||||
2024-08-05 00:00:00-04:00,12.3599996566772,12.3599996566772,12.3599996566772,12.3599996566772,11.4953060683041,0,0,0,0
|
||||
2024-08-06 00:00:00-04:00,12.3649997711182,12.3649997711182,12.3649997711182,12.3649997711182,11.4999563795882,0,0,0,0
|
||||
2024-08-07 00:00:00-04:00,12.4475002288818,12.4475002288818,12.4475002288818,12.4475002288818,11.5766851853415,0,0,0,0
|
||||
2024-08-08 00:00:00-04:00,12.6575002670288,12.6575002670288,12.6575002670288,12.6575002670288,11.7719938244927,0,0,0,0
|
||||
2024-08-09 00:00:00-04:00,12.6899995803833,12.6899995803833,12.6899995803833,12.6899995803833,11.8022195174051,0,0,0,0
|
||||
2024-08-12 00:00:00-04:00,12.6949996948242,12.6949996948242,12.6949996948242,12.6949996948242,11.8068698286892,0,0,0,0
|
||||
2024-08-13 00:00:00-04:00,12.8474998474121,12.8474998474121,12.8474998474121,12.8474998474121,11.9487012185075,0,0,0,0
|
||||
2024-08-14 00:00:00-04:00,12.875,12.875,12.875,12.875,11.974277487092,0,0,0,0
|
||||
2024-08-15 00:00:00-04:00,13.0450000762939,13.0450000762939,13.0450000762939,13.0450000762939,12.1323845229266,0,0,0,0
|
||||
2024-08-16 00:00:00-04:00,13.1350002288818,13.1350002288818,13.1350002288818,13.1350002288818,12.216088352128,0,0,0,0
|
||||
2024-08-19 00:00:00-04:00,13.2849998474121,13.2849998474121,13.2849998474121,13.2849998474121,12.3555941428262,0,0,0,0
|
||||
2024-08-20 00:00:00-04:00,13.2124996185303,13.2124996185303,13.2124996185303,13.2124996185303,12.2881659596411,0,0,0,0
|
||||
2024-08-21 00:00:00-04:00,13.2749996185303,13.2749996185303,13.2749996185303,13.2749996185303,12.346293520258,0,0,0,0
|
||||
2024-08-22 00:00:00-04:00,13.2049999237061,13.2049999237061,13.2049999237061,13.2049999237061,12.281190936193,0,0,0,0
|
||||
2024-08-23 00:00:00-04:00,13.4025001525879,13.4025001525879,13.4025001525879,13.4025001525879,12.464874240612,0,0,0,0
|
||||
2024-08-26 00:00:00-04:00,13.3774995803833,13.3774995803833,13.3774995803833,13.3774995803833,12.4416226841916,0,0,0,0
|
||||
2024-08-27 00:00:00-04:00,13.4449996948242,13.4449996948242,13.4449996948242,13.4449996948242,12.5044005560926,0,0,0,0
|
||||
2024-08-28 00:00:00-04:00,13.3649997711182,13.3649997711182,13.3649997711182,13.3649997711182,12.4299973494594,0,0,0,0
|
||||
2024-08-29 00:00:00-04:00,13.4049997329712,13.4049997329712,13.4049997329712,13.4049997329712,12.467198952776,0,0,0,0
|
||||
2024-08-30 00:00:00-04:00,13.4650001525879,13.4650001525879,13.4650001525879,13.4650001525879,12.523001801229,0,0,0,0
|
||||
2024-09-03 00:00:00-04:00,13.2550001144409,13.2550001144409,13.2550001144409,13.2550001144409,12.3276931620778,0,0,0,0
|
||||
2024-09-04 00:00:00-04:00,13.2700004577637,13.2700004577637,13.2700004577637,13.2700004577637,12.3416440959301,0,0,0,0
|
||||
2024-09-05 00:00:00-04:00,13.3024997711182,13.3024997711182,13.3024997711182,13.3024997711182,12.3718697888425,0,0,0,0
|
||||
2024-09-06 00:00:00-04:00,13.0924997329712,13.0924997329712,13.0924997329712,13.0924997329712,12.1765611496912,0,0,0,0
|
||||
2024-09-09 00:00:00-04:00,13.1850004196167,13.1850004196167,13.1850004196167,13.1850004196167,12.2625905780128,0,0,0,0
|
||||
2024-09-10 00:00:00-04:00,13.1324996948242,13.1324996948242,13.1324996948242,13.1324996948242,12.2137627530078,0,0,0,0
|
||||
2024-09-11 00:00:00-04:00,13.1599998474121,13.1599998474121,13.1599998474121,13.1599998474121,12.2393390215923,0,0,0,0
|
||||
2024-09-12 00:00:00-04:00,13.2550001144409,13.2550001144409,13.2550001144409,13.2550001144409,12.3276931620778,0,0,0,0
|
||||
2024-09-13 00:00:00-04:00,13.3249998092651,13.3249998092651,13.3249998092651,13.3249998092651,12.3927957461428,0,0,0,0
|
||||
2024-09-16 00:00:00-04:00,13.3675003051758,13.3675003051758,13.3675003051758,13.3675003051758,12.4323229485795,0,0,0,0
|
||||
2024-09-17 00:00:00-04:00,13.4300003051758,13.4300003051758,13.4300003051758,13.4300003051758,12.4904505091965,0,0,0,0
|
||||
2024-09-18 00:00:00-04:00,13.4075002670288,13.4075002670288,13.4075002670288,13.4075002670288,12.4695245518961,0,0,0,0
|
||||
2024-09-19 00:00:00-04:00,13.625,13.625,13.625,13.625,12.6718082144954,0,0,0,0
|
||||
2024-09-20 00:00:00-04:00,13.5150003433228,13.5150003433228,13.5150003433228,13.5150003433228,12.5695040271138,0,0,0,0
|
||||
2024-09-23 00:00:00-04:00,13.5574998855591,13.5574998855591,13.5574998855591,13.5574998855591,12.6090303425944,0,0,0,0
|
||||
2024-09-24 00:00:00-04:00,13.7600002288818,13.7600002288818,13.7600002288818,13.7600002288818,12.7973639582975,0,0,0,0
|
||||
2024-09-25 00:00:00-04:00,13.6949996948242,13.6949996948242,13.6949996948242,13.6949996948242,12.7369107985604,0,0,0,0
|
||||
2024-09-26 00:00:00-04:00,14.0024995803833,14.0024995803833,14.0024995803833,14.0024995803833,13.0228982903611,0,0,0,0
|
||||
2024-09-27 00:00:00-04:00,14.1674995422363,14.1674995422363,14.1674995422363,14.1674995422363,13.1763550149116,0,0,0,0
|
||||
2024-09-30 00:00:00-04:00,13.9425001144409,13.9425001144409,13.9425001144409,13.9425001144409,12.9670963288643,0,0,0,0
|
||||
2024-10-01 00:00:00-04:00,13.9174995422363,13.9174995422363,13.9174995422363,13.9174995422363,12.9438447724438,0,0,0,0
|
||||
2024-10-02 00:00:00-04:00,13.9549999237061,13.9549999237061,13.9549999237061,13.9549999237061,12.9787216635964,0,0,0,0
|
||||
2024-10-03 00:00:00-04:00,13.7950000762939,13.7950000762939,13.7950000762939,13.7950000762939,12.82991525033,0,0,0,0
|
||||
2024-10-04 00:00:00-04:00,13.9274997711182,13.9274997711182,13.9274997711182,13.9274997711182,12.953145395012,0,0,0,0
|
||||
2024-10-07 00:00:00-04:00,13.8924999237061,13.8924999237061,13.8924999237061,13.8924999237061,12.9205941029795,0,0,0,0
|
||||
2024-10-08 00:00:00-04:00,13.7749996185303,13.7749996185303,13.7749996185303,13.7749996185303,12.8113140051936,0,0,0,0
|
||||
2024-10-09 00:00:00-04:00,13.8125,13.8125,13.8125,13.8125,12.8461908963463,0,0,0,0
|
||||
2024-10-10 00:00:00-04:00,13.789999961853,13.789999961853,13.789999961853,13.789999961853,12.8252649390459,0,0,0,0
|
||||
2024-10-11 00:00:00-04:00,13.8199996948242,13.8199996948242,13.8199996948242,13.8199996948242,12.8531659197943,0,0,0,0
|
||||
2024-10-14 00:00:00-04:00,13.8249998092651,13.8249998092651,13.8249998092651,13.8249998092651,12.8578162310784,0,0,0,0
|
||||
2024-10-15 00:00:00-04:00,13.6274995803833,13.6274995803833,13.6274995803833,13.6274995803833,12.6741329266594,0,0,0,0
|
||||
2024-10-16 00:00:00-04:00,13.6674995422363,13.6674995422363,13.6674995422363,13.6674995422363,12.711334529976,0,0,0,0
|
||||
2024-10-17 00:00:00-04:00,13.6975002288818,13.6975002288818,13.6975002288818,13.6975002288818,12.7392363976806,0,0,0,0
|
||||
2024-10-18 00:00:00-04:00,13.7875003814697,13.7875003814697,13.7875003814697,13.7875003814697,12.822940226882,0,0,0,0
|
||||
2024-10-21 00:00:00-04:00,13.664999961853,13.664999961853,13.664999961853,13.664999961853,12.709009817812,0,0,0,0
|
||||
2024-10-22 00:00:00-04:00,13.6125001907349,13.6125001907349,13.6125001907349,13.6125001907349,12.6601828797633,0,0,0,0
|
||||
2024-10-23 00:00:00-04:00,13.5299997329712,13.5299997329712,13.5299997329712,13.5299997329712,12.5834540740099,0,0,0,0
|
||||
2024-10-24 00:00:00-04:00,13.585000038147,13.585000038147,13.585000038147,13.585000038147,12.6346066111788,0,0,0,0
|
||||
2024-10-25 00:00:00-04:00,13.5625,13.5625,13.5625,13.5625,12.6136806538785,0,0,0,0
|
||||
2024-10-28 00:00:00-04:00,13.6724996566772,13.6724996566772,13.6724996566772,13.6724996566772,12.7159848412601,0,0,0,0
|
||||
2024-10-29 00:00:00-04:00,13.5900001525879,13.5900001525879,13.5900001525879,13.5900001525879,12.6392569224629,0,0,0,0
|
||||
2024-10-30 00:00:00-04:00,13.4875001907349,13.4875001907349,13.4875001907349,13.4875001907349,12.5439277585293,0,0,0,0
|
||||
2024-10-31 00:00:00-04:00,13.3649997711182,13.3649997711182,13.3649997711182,13.3649997711182,12.4299973494594,0,0,0,0
|
||||
2024-11-01 00:00:00-04:00,13.4274997711182,13.4274997711182,13.4274997711182,13.4274997711182,12.4881249100764,0,0,0,0
|
||||
2024-11-04 00:00:00-05:00,13.4700002670288,13.4700002670288,13.4700002670288,13.4700002670288,12.5276521125131,0,0,0,0
|
||||
2024-11-05 00:00:00-05:00,13.602499961853,13.602499961853,13.602499961853,13.602499961853,12.6508822571951,0,0,0,0
|
||||
2024-11-06 00:00:00-05:00,13.5074996948242,13.5074996948242,13.5074996948242,13.5074996948242,12.5625281167096,0,0,0,0
|
||||
2024-11-07 00:00:00-05:00,13.602499961853,13.602499961853,13.602499961853,13.602499961853,12.6508822571951,0,0,0,0
|
||||
2024-11-08 00:00:00-05:00,13.4525003433228,13.4525003433228,13.4525003433228,13.4525003433228,12.5113764664968,0,0,0,0
|
||||
2024-11-11 00:00:00-05:00,13.477499961853,13.477499961853,13.477499961853,13.477499961853,12.5346271359612,0,0,0,0
|
||||
2024-11-12 00:00:00-05:00,13.1850004196167,13.1850004196167,13.1850004196167,13.1850004196167,12.2625905780128,0,0,0,0
|
||||
2024-11-13 00:00:00-05:00,13.1199998855591,13.1199998855591,13.1199998855591,13.1199998855591,12.2021374182757,0,0,0,0
|
||||
2024-11-14 00:00:00-05:00,13.1499996185303,13.1499996185303,13.1499996185303,13.1499996185303,12.2300383990241,0,0,0,0
|
||||
2024-11-15 00:00:00-05:00,13.1175003051758,13.1175003051758,13.1175003051758,13.1175003051758,12.1998127061117,0,0,0,0
|
||||
2024-11-18 00:00:00-05:00,13.2075004577637,13.2075004577637,13.2075004577637,13.2075004577637,12.2835165353131,0,0,0,0
|
||||
2024-11-19 00:00:00-05:00,13.1625003814697,13.1625003814697,13.1625003814697,13.1625003814697,12.2416646207124,0,0,0,0
|
||||
2024-11-20 00:00:00-05:00,13.125,13.125,13.125,13.125,12.2067877295598,0,0,0,0
|
||||
2024-11-21 00:00:00-05:00,13.1225004196167,13.1225004196167,13.1225004196167,13.1225004196167,12.2044630173958,0,0,0,0
|
||||
2024-11-22 00:00:00-05:00,13.1225004196167,13.1225004196167,13.1225004196167,13.1225004196167,12.2044630173958,0,0,0,0
|
||||
2024-11-25 00:00:00-05:00,13.210000038147,13.210000038147,13.210000038147,13.210000038147,12.2858412474771,0,0,0,0
|
||||
2024-11-26 00:00:00-05:00,13.1099996566772,13.1099996566772,13.1099996566772,13.1099996566772,12.1928367957075,0,0,0,0
|
||||
2024-11-27 00:00:00-05:00,13.164999961853,13.164999961853,13.164999961853,13.164999961853,12.2439893328764,0,0,0,0
|
||||
2024-11-29 00:00:00-05:00,13.2075004577637,13.2075004577637,13.2075004577637,13.2075004577637,12.2835165353131,0,0,0,0
|
||||
2024-12-02 00:00:00-05:00,13.1975002288818,13.1975002288818,13.1975002288818,13.1975002288818,12.2742159127449,0,0,0,0
|
||||
2024-12-03 00:00:00-05:00,13.2650003433228,13.2650003433228,13.2650003433228,13.2650003433228,12.336993784646,0,0,0,0
|
||||
2024-12-04 00:00:00-05:00,13.25,13.25,13.25,13.25,12.3230428507937,0,0,0,0
|
||||
2024-12-05 00:00:00-05:00,13.3824996948242,13.3824996948242,13.3824996948242,13.3824996948242,12.4462729954757,0,0,0,0
|
||||
2024-12-06 00:00:00-05:00,13.3774995803833,13.3774995803833,13.3774995803833,13.3774995803833,12.4416226841916,0,0,0,0
|
||||
2024-12-09 00:00:00-05:00,13.4425001144409,13.4425001144409,13.4425001144409,13.4425001144409,12.5020758439286,0,0,0,0
|
||||
2024-12-10 00:00:00-05:00,13.3175001144409,13.3175001144409,13.3175001144409,13.3175001144409,12.3858207226947,0,0,0,0
|
||||
2024-12-11 00:00:00-05:00,13.3024997711182,13.3024997711182,13.3024997711182,13.3024997711182,12.3718697888425,0,0,0,0
|
||||
2024-12-12 00:00:00-05:00,13.2624998092651,13.2624998092651,13.2624998092651,13.2624998092651,12.3346681855259,0,0,0,0
|
||||
2024-12-13 00:00:00-05:00,13.1875,13.1875,13.1875,13.1875,12.2649152901767,0,0,0,0
|
||||
2024-12-16 00:00:00-05:00,13.1075000762939,13.1075000762939,13.1075000762939,13.1075000762939,12.1905120835435,0,0,0,0
|
||||
2024-12-17 00:00:00-05:00,13.0349998474121,13.0349998474121,13.0349998474121,13.0349998474121,12.1230839003584,0,0,0,0
|
||||
2024-12-18 00:00:00-05:00,12.4525003433228,12.4525003433228,12.4525003433228,12.4525003433228,11.8364989993296,0,0.281,0,0
|
||||
2024-12-19 00:00:00-05:00,12.3850002288818,12.3850002288818,12.3850002288818,12.3850002288818,11.7723379862795,0,0,0,0
|
||||
2024-12-20 00:00:00-05:00,12.4250001907349,12.4250001907349,12.4250001907349,12.4250001907349,11.8103592266242,0,0,0,0
|
||||
2024-12-23 00:00:00-05:00,12.5024995803833,12.5024995803833,12.5024995803833,12.5024995803833,11.8840248698871,0,0,0,0
|
||||
2024-12-24 00:00:00-05:00,12.5349998474121,12.5349998474121,12.5349998474121,12.5349998474121,11.9149174109478,0,0,0,0
|
||||
2024-12-26 00:00:00-05:00,12.5349998474121,12.5349998474121,12.5349998474121,12.5349998474121,11.9149174109478,0,0,0,0
|
||||
2024-12-27 00:00:00-05:00,12.5450000762939,12.5450000762939,12.5450000762939,12.5450000762939,11.9244229476585,0,0,0,0
|
||||
2024-12-30 00:00:00-05:00,12.4825000762939,12.4825000762939,12.4825000762939,12.4825000762939,11.8650147029637,0,0,0,0
|
||||
2024-12-31 00:00:00-05:00,12.4750003814697,12.4750003814697,12.4750003814697,12.4750003814697,11.8578860036797,0,0,0,0
|
||||
2025-01-02 00:00:00-05:00,12.4300003051758,12.4300003051758,12.4300003051758,12.4300003051758,11.8151119949796,0,0,0,0
|
||||
2025-01-03 00:00:00-05:00,12.4624996185303,12.4624996185303,12.4624996185303,12.4624996185303,11.8460036295424,0,0,0,0
|
||||
2025-01-06 00:00:00-05:00,12.602499961853,12.602499961853,12.602499961853,12.602499961853,11.979078423998,0,0,0,0
|
||||
2025-01-07 00:00:00-05:00,12.6149997711182,12.6149997711182,12.6149997711182,12.6149997711182,11.9909598916373,0,0,0,0
|
||||
2025-01-08 00:00:00-05:00,12.5574998855591,12.5574998855591,12.5574998855591,12.5574998855591,11.9363044152979,0,0,0,0
|
||||
2025-01-10 00:00:00-05:00,12.3299999237061,12.3299999237061,12.3299999237061,12.3299999237061,11.7200584408688,0,0,0,0
|
||||
2025-01-13 00:00:00-05:00,12.3024997711182,12.3024997711182,12.3024997711182,12.3024997711182,11.6939186681634,0,0,0,0
|
||||
2025-01-14 00:00:00-05:00,12.3800001144409,12.3800001144409,12.3800001144409,12.3800001144409,11.7675852179242,0,0,0,0
|
||||
2025-01-15 00:00:00-05:00,12.539999961853,12.539999961853,12.539999961853,12.539999961853,11.9196701793032,0,0,0,0
|
||||
2025-01-16 00:00:00-05:00,12.6125001907349,12.6125001907349,12.6125001907349,12.6125001907349,11.9885839607086,0,0,0,0
|
||||
2025-01-17 00:00:00-05:00,12.7049999237061,12.7049999237061,12.7049999237061,12.7049999237061,12.0765079090375,0,0,0,0
|
||||
2025-01-21 00:00:00-05:00,12.8625001907349,12.8625001907349,12.8625001907349,12.8625001907349,12.2262169394878,0,0,0,0
|
||||
2025-01-22 00:00:00-05:00,12.8725004196167,12.8725004196167,12.8725004196167,12.8725004196167,12.2357224761984,0,0,0,0
|
||||
2025-01-23 00:00:00-05:00,12.9674997329712,12.9674997329712,12.9674997329712,12.9674997329712,12.3260223554561,0,0,0,0
|
||||
2025-01-24 00:00:00-05:00,13.0249996185303,13.0249996185303,13.0249996185303,13.0249996185303,12.3806778317955,0,0,0,0
|
||||
2025-01-27 00:00:00-05:00,13.0024995803833,13.0024995803833,13.0024995803833,13.0024995803833,12.3592908274455,0,0,0,0
|
||||
2025-01-28 00:00:00-05:00,13.0150003433228,13.0150003433228,13.0150003433228,13.0150003433228,12.3711732015827,0,0,0,0
|
||||
2025-01-29 00:00:00-05:00,13.0200004577637,13.0200004577637,13.0200004577637,13.0200004577637,12.3759259699381,0,0,0,0
|
||||
2025-01-30 00:00:00-05:00,13.1525001525879,13.1525001525879,13.1525001525879,13.1525001525879,12.5018711586117,0,0,0,0
|
||||
2025-01-31 00:00:00-05:00,13.0649995803833,13.0649995803833,13.0649995803833,13.0649995803833,12.4186990721403,0,0,0,0
|
||||
2025-02-03 00:00:00-05:00,12.8924999237061,12.8924999237061,12.8924999237061,12.8924999237061,12.2547326431219,0,0,0,0
|
||||
2025-02-04 00:00:00-05:00,13.0600004196167,13.0600004196167,13.0600004196167,13.0600004196167,12.4139472102828,0,0,0,0
|
||||
2025-02-05 00:00:00-05:00,13.1999998092651,13.1999998092651,13.1999998092651,13.1999998092651,12.5470210982405,0,0,0,0
|
||||
2025-02-06 00:00:00-05:00,13.352499961853,13.352499961853,13.352499961853,13.352499961853,12.6919773603355,0,0,0,0
|
||||
2025-02-07 00:00:00-05:00,13.2624998092651,13.2624998092651,13.2624998092651,13.2624998092651,12.6064293429353,0,0,0,0
|
||||
2025-02-10 00:00:00-05:00,13.3675003051758,13.3675003051758,13.3675003051758,13.3675003051758,12.7062356654015,0,0,0,0
|
||||
2025-02-11 00:00:00-05:00,13.3950004577637,13.3950004577637,13.3950004577637,13.3950004577637,12.7323754381068,0,0,0,0
|
||||
2025-02-12 00:00:00-05:00,13.477499961853,13.477499961853,13.477499961853,13.477499961853,12.8107938497251,0,0,0,0
|
||||
2025-02-13 00:00:00-05:00,13.5924997329712,13.5924997329712,13.5924997329712,13.5924997329712,12.920104802404,0,0,0,0
|
||||
2025-02-14 00:00:00-05:00,13.6374998092651,13.6374998092651,13.6374998092651,13.6374998092651,12.9628788111041,0,0,0,0
|
||||
2025-02-18 00:00:00-05:00,13.7425003051758,13.7425003051758,13.7425003051758,13.7425003051758,13.0626851335702,0,0,0,0
|
||||
2025-02-19 00:00:00-05:00,13.6049995422363,13.6049995422363,13.6049995422363,13.6049995422363,12.9319862700434,0,0,0,0
|
||||
2025-02-20 00:00:00-05:00,13.6724996566772,13.6724996566772,13.6724996566772,13.6724996566772,12.9961472830935,0,0,0,0
|
||||
2025-02-21 00:00:00-05:00,13.647500038147,13.647500038147,13.647500038147,13.647500038147,12.9723843478147,0,0,0,0
|
||||
2025-02-24 00:00:00-05:00,13.5349998474121,13.5349998474121,13.5349998474121,13.5349998474121,12.8654493260645,0,0,0,0
|
||||
2025-02-25 00:00:00-05:00,13.647500038147,13.647500038147,13.647500038147,13.647500038147,12.9723843478147,0,0,0,0
|
||||
2025-02-26 00:00:00-05:00,13.7299995422363,13.7299995422363,13.7299995422363,13.7299995422363,13.0508027594329,0,0,0,0
|
||||
2025-02-27 00:00:00-05:00,13.5900001525879,13.5900001525879,13.5900001525879,13.5900001525879,12.9177288714753,0,0,0,0
|
||||
2025-02-28 00:00:00-05:00,13.6549997329712,13.6549997329712,13.6549997329712,13.6549997329712,12.9795130470988,0,0,0,0
|
||||
2025-03-03 00:00:00-05:00,13.6700000762939,13.6700000762939,13.6700000762939,13.6700000762939,12.9937713521648,0,0,0,0
|
||||
2025-03-04 00:00:00-05:00,13.5900001525879,13.5900001525879,13.5900001525879,13.5900001525879,12.9177288714753,0,0,0,0
|
||||
2025-03-05 00:00:00-05:00,13.9575004577637,13.9575004577637,13.9575004577637,13.9575004577637,13.26704964036,0,0,0,0
|
||||
2025-03-06 00:00:00-05:00,13.9650001525879,13.9650001525879,13.9650001525879,13.9650001525879,13.274178339644,0,0,0,0
|
||||
2025-03-07 00:00:00-05:00,14.0675001144409,14.0675001144409,14.0675001144409,14.0675001144409,13.3716078246835,0,0,0,0
|
||||
2025-03-10 00:00:00-04:00,13.7775001525879,13.7775001525879,13.7775001525879,13.7775001525879,13.0959536055596,0,0,0,0
|
||||
2025-03-11 00:00:00-04:00,13.710000038147,13.710000038147,13.710000038147,13.710000038147,13.0317925925095,0,0,0,0
|
||||
2025-03-12 00:00:00-04:00,13.7674999237061,13.7674999237061,13.7674999237061,13.7674999237061,13.086448068849,0,0,0,0
|
||||
2025-03-13 00:00:00-04:00,13.6875,13.6875,13.6875,13.6875,13.0104055881595,0,0,0,0
|
||||
2025-03-14 00:00:00-04:00,13.9350004196167,13.9350004196167,13.9350004196167,13.9350004196167,13.2456626360099,0,0,0,0
|
||||
2025-03-17 00:00:00-04:00,14.1674995422363,14.1674995422363,14.1674995422363,14.1674995422363,13.4666604722965,0,0,0,0
|
||||
2025-03-18 00:00:00-04:00,14.2124996185303,14.2124996185303,14.2124996185303,14.2124996185303,13.5094344809966,0,0,0,0
|
||||
2025-03-19 00:00:00-04:00,14.227499961853,14.227499961853,14.227499961853,14.227499961853,13.5236927860626,0,0,0,0
|
||||
2025-03-20 00:00:00-04:00,14.1149997711182,14.1149997711182,14.1149997711182,14.1149997711182,13.4167577643124,0,0,0,0
|
||||
2025-03-21 00:00:00-04:00,14.0124998092651,14.0124998092651,14.0124998092651,14.0124998092651,13.3193282792728,0,0,0,0
|
||||
2025-03-24 00:00:00-04:00,14.0150003433228,14.0150003433228,14.0150003433228,14.0150003433228,13.3217051166994,0,0,0,0
|
||||
2025-03-25 00:00:00-04:00,14.0775003433228,14.0775003433228,14.0775003433228,14.0775003433228,13.3811133613942,0,0,0,0
|
||||
2025-03-26 00:00:00-04:00,13.9575004577637,13.9575004577637,13.9575004577637,13.9575004577637,13.26704964036,0,0,0,0
|
||||
2025-03-27 00:00:00-04:00,13.9549999237061,13.9549999237061,13.9549999237061,13.9549999237061,13.2646728029333,0,0,0,0
|
||||
2025-03-28 00:00:00-04:00,13.8000001907349,13.8000001907349,13.8000001907349,13.8000001907349,13.1173406099097,0,0,0,0
|
||||
2025-03-31 00:00:00-04:00,13.6824998855591,13.6824998855591,13.6824998855591,13.6824998855591,13.0056528198041,0,0,0,0
|
||||
2025-04-01 00:00:00-04:00,13.727499961853,13.727499961853,13.727499961853,13.727499961853,13.0484268285042,0,0,0,0
|
||||
2025-04-02 00:00:00-04:00,13.7475004196167,13.7475004196167,13.7475004196167,13.7475004196167,13.0674379019255,0,0,0,0
|
||||
2025-04-03 00:00:00-04:00,13.4674997329712,13.4674997329712,13.4674997329712,13.4674997329712,12.8012883130144,0,0,0,0
|
||||
2025-04-04 00:00:00-04:00,12.6424999237061,12.6424999237061,12.6424999237061,12.6424999237061,12.0170996643427,0,0,0,0
|
||||
2025-04-07 00:00:00-04:00,12.2799997329712,12.2799997329712,12.2799997329712,12.2799997329712,11.6725316638133,0,0,0,0
|
||||
2025-04-08 00:00:00-04:00,12.1774997711182,12.1774997711182,12.1774997711182,12.1774997711182,11.5751021787738,0,0,0,0
|
||||
2025-04-09 00:00:00-04:00,12.7574996948242,12.7574996948242,12.7574996948242,12.7574996948242,12.1264106170216,0,0,0,0
|
||||
2025-04-10 00:00:00-04:00,12.6899995803833,12.6899995803833,12.6899995803833,12.6899995803833,12.0622496039715,0,0,0,0
|
||||
2025-04-11 00:00:00-04:00,12.9399995803833,12.9399995803833,12.9399995803833,12.9399995803833,12.2998825827507,0,0,0,0
|
||||
2025-04-14 00:00:00-04:00,13.1350002288818,13.1350002288818,13.1350002288818,13.1350002288818,12.485236922617,0,0,0,0
|
||||
2025-04-15 00:00:00-04:00,13.2425003051758,13.2425003051758,13.2425003051758,13.2425003051758,12.5874191760119,0,0,0,0
|
||||
2025-04-16 00:00:00-04:00,13.1674995422363,13.1674995422363,13.1674995422363,13.1674995422363,12.5161285571798,0,0,0,0
|
||||
2025-04-17 00:00:00-04:00,13.289999961853,13.289999961853,13.289999961853,13.289999961853,12.6325691156407,0,0,0,0
|
||||
2025-04-21 00:00:00-04:00,13.2174997329712,13.2174997329712,13.2174997329712,13.2174997329712,12.5636553342352,0,0,0,0
|
||||
2025-04-22 00:00:00-04:00,13.4949998855591,13.4949998855591,13.4949998855591,13.4949998855591,12.8274280857198,0,0,0,0
|
||||
2025-04-23 00:00:00-04:00,13.6125001907349,13.6125001907349,13.6125001907349,13.6125001907349,12.9391158758253,0,0,0,0
|
||||
2025-04-24 00:00:00-04:00,13.7924995422363,13.7924995422363,13.7924995422363,13.7924995422363,13.1102110041277,0,0,0,0
|
||||
2025-04-25 00:00:00-04:00,13.835000038147,13.835000038147,13.835000038147,13.835000038147,13.1506090818991,0,0,0,0
|
||||
2025-04-28 00:00:00-04:00,13.9575004577637,13.9575004577637,13.9575004577637,13.9575004577637,13.26704964036,0,0,0,0
|
||||
2025-04-29 00:00:00-04:00,13.9624996185303,13.9624996185303,13.9624996185303,13.9624996185303,13.2718015022174,0,0,0,0
|
||||
2025-04-30 00:00:00-04:00,13.9650001525879,13.9650001525879,13.9650001525879,13.9650001525879,13.274178339644,0,0,0,0
|
||||
2025-05-01 00:00:00-04:00,13.9399995803833,13.9399995803833,13.9399995803833,13.9399995803833,13.2504144978674,0,0,0,0
|
||||
2025-05-02 00:00:00-04:00,14.1549997329712,14.1549997329712,14.1549997329712,14.1549997329712,13.4547790046571,0,0,0,0
|
||||
2025-05-05 00:00:00-04:00,14.1674995422363,14.1674995422363,14.1674995422363,14.1674995422363,13.4666604722965,0,0,0,0
|
||||
2025-05-06 00:00:00-04:00,14.2049999237061,14.2049999237061,14.2049999237061,14.2049999237061,13.5023057817125,0,0,0,0
|
||||
2025-05-07 00:00:00-04:00,14.1125001907349,14.1125001907349,14.1125001907349,14.1125001907349,13.4143818333836,0,0,0,0
|
||||
2025-05-08 00:00:00-04:00,14.1199998855591,14.1199998855591,14.1199998855591,14.1199998855591,13.4215105326677,0,0,0,0
|
||||
2025-05-09 00:00:00-04:00,14.2399997711182,14.2399997711182,14.2399997711182,14.2399997711182,13.5355742537019,0,0,0,0
|
||||
2025-05-12 00:00:00-04:00,14.4324998855591,14.4324998855591,14.4324998855591,14.4324998855591,13.7185517561416,0,0,0,0
|
||||
2025-05-13 00:00:00-04:00,14.4849996566772,14.4849996566772,14.4849996566772,14.4849996566772,13.7684544641258,0,0,0,0
|
||||
2025-05-14 00:00:00-04:00,14.4700002670288,14.4700002670288,14.4700002670288,14.4700002670288,13.7541970655577,0,0,0,0
|
||||
2025-05-15 00:00:00-04:00,14.5524997711182,14.5524997711182,14.5524997711182,14.5524997711182,13.8326154771759,0,0,0,0
|
||||
2025-05-16 00:00:00-04:00,14.6000003814697,14.6000003814697,14.6000003814697,14.6000003814697,13.8777663233026,0,0,0,0
|
||||
2025-05-19 00:00:00-04:00,14.710000038147,14.710000038147,14.710000038147,14.710000038147,13.9823245076262,0,0,0,0
|
||||
2025-05-20 00:00:00-04:00,14.772500038147,14.772500038147,14.772500038147,14.772500038147,14.041732752321,0,0,0,0
|
||||
2025-05-21 00:00:00-04:00,14.6925001144409,14.6925001144409,14.6925001144409,14.6925001144409,13.9656902716315,0,0,0,0
|
||||
2025-05-22 00:00:00-04:00,14.6899995803833,14.6899995803833,14.6899995803833,14.6899995803833,13.9633134342049,0,0,0,0
|
||||
2025-05-23 00:00:00-04:00,14.7075004577637,14.7075004577637,14.7075004577637,14.7075004577637,13.9799485766975,0,0,0,0
|
||||
2025-05-27 00:00:00-04:00,14.8649997711182,14.8649997711182,14.8649997711182,14.8649997711182,14.1296567006499,0,0,0,0
|
||||
2025-05-28 00:00:00-04:00,14.7174997329712,14.7174997329712,14.7174997329712,14.7174997329712,13.9894532069102,0,0,0,0
|
||||
2025-05-29 00:00:00-04:00,14.8199996948242,14.8199996948242,14.8199996948242,14.8199996948242,14.0868826919498,0,0,0,0
|
||||
2025-05-30 00:00:00-04:00,14.7799997329712,14.7799997329712,14.7799997329712,14.7799997329712,14.048861451605,0,0,0,0
|
||||
2025-06-02 00:00:00-04:00,14.8950004577637,14.8950004577637,14.8950004577637,14.8950004577637,14.1581733107818,0,0,0,0
|
||||
2025-06-03 00:00:00-04:00,14.8450002670288,14.8450002670288,14.8450002670288,14.8450002670288,14.1106465337264,0,0,0,0
|
||||
2025-06-04 00:00:00-04:00,14.9300003051758,14.9300003051758,14.9300003051758,14.9300003051758,14.1914417827713,0,0,0,0
|
||||
2025-06-05 00:00:00-04:00,14.9700002670288,14.9700002670288,14.9700002670288,14.9700002670288,14.229463023116,0,0,0,0
|
||||
2025-06-06 00:00:00-04:00,15.0275001525879,15.0275001525879,15.0275001525879,15.0275001525879,14.2841184994555,0,0,0,0
|
||||
2025-06-09 00:00:00-04:00,15.0775003433228,15.0775003433228,15.0775003433228,15.0775003433228,14.3316452765109,0,0,0,0
|
||||
2025-06-10 00:00:00-04:00,15.0775003433228,15.0775003433228,15.0775003433228,15.0775003433228,14.3316452765109,0,0,0,0
|
||||
2025-06-11 00:00:00-04:00,15.1300001144409,15.1300001144409,15.1300001144409,15.1300001144409,14.381547984495,0,0,0,0
|
||||
2025-06-12 00:00:00-04:00,15.1925001144409,15.1925001144409,15.1925001144409,15.1925001144409,14.4409562291898,0,0,0,0
|
||||
2025-06-13 00:00:00-04:00,14.9899997711182,14.9899997711182,14.9899997711182,14.9899997711182,14.2484731900394,0,0,0,0
|
||||
2025-06-16 00:00:00-04:00,15.1149997711182,15.1149997711182,15.1149997711182,15.1149997711182,14.367289679429,0,0,0,0
|
||||
2025-06-17 00:00:00-04:00,14.960000038147,14.960000038147,14.960000038147,14.960000038147,14.2199574864054,0,0,0,0
|
||||
2025-06-18 00:00:00-04:00,14.897500038147,14.897500038147,14.897500038147,14.897500038147,14.1605492417106,0,0,0,0
|
||||
2025-06-20 00:00:00-04:00,14.7974996566772,14.7974996566772,14.7974996566772,14.7974996566772,14.0654956875997,0,0,0,0
|
||||
2025-06-23 00:00:00-04:00,14.8675003051758,14.8675003051758,14.8675003051758,14.8675003051758,14.1320335380765,0,0,0,0
|
||||
2025-06-24 00:00:00-04:00,15.0900001525879,15.0900001525879,15.0900001525879,15.0900001525879,14.3435267441503,0,0,0,0
|
||||
2025-06-25 00:00:00-04:00,15.0249996185303,15.0249996185303,15.0249996185303,15.0249996185303,14.2817416620289,0,0,0,0
|
||||
2025-06-26 00:00:00-04:00,15.1424999237061,15.1424999237061,15.1424999237061,15.1424999237061,14.3934294521344,0,0,0,0
|
||||
2025-06-27 00:00:00-04:00,15.2650003433228,15.2650003433228,15.2650003433228,15.2650003433228,14.5098700105953,0,0,0,0
|
||||
2025-06-30 00:00:00-04:00,15.2674999237061,15.2674999237061,15.2674999237061,15.2674999237061,14.512245941524,0,0,0,0
|
||||
2025-07-01 00:00:00-04:00,15.3149995803833,15.3149995803833,15.3149995803833,15.3149995803833,14.5573958811528,0,0,0,0
|
||||
2025-07-02 00:00:00-04:00,15.3850002288818,15.3850002288818,15.3850002288818,15.3850002288818,14.6239337316295,0,0,0,0
|
||||
2025-07-03 00:00:00-04:00,15.3850002288818,15.3850002288818,15.3850002288818,15.3850002288818,14.6239337316295,0,0,0,0
|
||||
2025-07-07 00:00:00-04:00,15.2600002288818,15.2600002288818,15.2600002288818,15.2600002288818,14.5051172422399,0,0,0,0
|
||||
2025-07-08 00:00:00-04:00,15.3374996185303,15.3374996185303,15.3374996185303,15.3374996185303,14.5787828855028,0,0,0,0
|
||||
2025-07-09 00:00:00-04:00,15.3800001144409,15.3800001144409,15.3800001144409,15.3800001144409,14.6191809632742,0,0,0,0
|
||||
2025-07-10 00:00:00-04:00,15.4300003051758,15.4300003051758,15.4300003051758,15.4300003051758,14.6667077403296,0,0,0,0
|
||||
2025-07-11 00:00:00-04:00,15.3149995803833,15.3149995803833,15.3149995803833,15.3149995803833,14.5573958811528,0,0,0,0
|
||||
2025-07-14 00:00:00-04:00,15.2875003814697,15.2875003814697,15.2875003814697,15.2875003814697,14.5312570149453,0,0,0,0
|
||||
2025-07-15 00:00:00-04:00,15.2299995422363,15.2299995422363,15.2299995422363,15.2299995422363,14.476600632108,0,0,0,0
|
||||
2025-07-16 00:00:00-04:00,15.2700004577637,15.2700004577637,15.2700004577637,15.2700004577637,14.5146227789506,0,0,0,0
|
||||
2025-07-17 00:00:00-04:00,15.3125,15.3125,15.3125,15.3125,14.5550199502241,0,0,0,0
|
||||
2025-07-18 00:00:00-04:00,15.3199996948242,15.3199996948242,15.3199996948242,15.3199996948242,14.5621486495081,0,0,0,0
|
||||
2025-07-21 00:00:00-04:00,15.3774995803833,15.3774995803833,15.3774995803833,15.3774995803833,14.6168041258476,0,0,0,0
|
||||
2025-07-22 00:00:00-04:00,15.4350004196167,15.4350004196167,15.4350004196167,15.4350004196167,14.6714605086849,0,0,0,0
|
||||
2025-07-23 00:00:00-04:00,15.6975002288818,15.6975002288818,15.6975002288818,15.6975002288818,14.9209749551035,0,0,0,0
|
||||
2025-07-24 00:00:00-04:00,15.7174997329712,15.7174997329712,15.7174997329712,15.7174997329712,14.9399851220269,0,0,0,0
|
||||
2025-07-25 00:00:00-04:00,15.6674995422363,15.6674995422363,15.6674995422363,15.6674995422363,14.8924583449715,0,0,0,0
|
||||
2025-07-28 00:00:00-04:00,15.539999961853,15.539999961853,15.539999961853,15.539999961853,14.7712659246532,0,0,0,0
|
||||
2025-07-29 00:00:00-04:00,15.5200004577637,15.5200004577637,15.5200004577637,15.5200004577637,14.7522557577298,0,0,0,0
|
||||
2025-07-30 00:00:00-04:00,15.4350004196167,15.4350004196167,15.4350004196167,15.4350004196167,14.6714605086849,0,0,0,0
|
||||
2025-07-31 00:00:00-04:00,15.2624998092651,15.2624998092651,15.2624998092651,15.2624998092651,14.5074931731687,0,0,0,0
|
||||
2025-08-01 00:00:00-04:00,15.1774997711182,15.1774997711182,15.1774997711182,15.1774997711182,14.4266979241238,0,0,0,0
|
||||
2025-08-04 00:00:00-04:00,15.3424997329712,15.3424997329712,15.3424997329712,15.3424997329712,14.5835356538582,0,0,0,0
|
||||
2025-08-05 00:00:00-04:00,15.352499961853,15.352499961853,15.352499961853,15.352499961853,14.5930411905688,0,0,0,0
|
||||
2025-08-06 00:00:00-04:00,15.3374996185303,15.3374996185303,15.3374996185303,15.3374996185303,14.5787828855028,0,0,0,0
|
||||
2025-08-07 00:00:00-04:00,15.4875001907349,15.4875001907349,15.4875001907349,15.4875001907349,14.7213632166691,0,0,0,0
|
||||
2025-08-08 00:00:00-04:00,15.5299997329712,15.5299997329712,15.5299997329712,15.5299997329712,14.7617603879425,0,0,0,0
|
||||
2025-08-11 00:00:00-04:00,15.5100002288818,15.5100002288818,15.5100002288818,15.5100002288818,14.7427502210191,0,0,0,0
|
||||
2025-08-12 00:00:00-04:00,15.6925001144409,15.6925001144409,15.6925001144409,15.6925001144409,14.9162221867481,0,0,0,0
|
||||
2025-08-13 00:00:00-04:00,15.8299999237061,15.8299999237061,15.8299999237061,15.8299999237061,15.0469201437771,0,0,0,0
|
||||
2025-08-14 00:00:00-04:00,15.7775001525879,15.7775001525879,15.7775001525879,15.7775001525879,14.997017435793,0,0,0,0
|
||||
2025-08-15 00:00:00-04:00,15.835000038147,15.835000038147,15.835000038147,15.835000038147,15.0516729121324,0,0,0,0
|
||||
2025-08-18 00:00:00-04:00,15.8100004196167,15.8100004196167,15.8100004196167,15.8100004196167,15.0279099768537,0,0,0,0
|
||||
2025-08-19 00:00:00-04:00,15.8575000762939,15.8575000762939,15.8575000762939,15.8575000762939,15.0730599164825,0,0,0,0
|
||||
2025-08-20 00:00:00-04:00,15.8824996948242,15.8824996948242,15.8824996948242,15.8824996948242,15.0968228517612,0,0,0,0
|
||||
2025-08-21 00:00:00-04:00,15.8549995422363,15.8549995422363,15.8549995422363,15.8549995422363,15.0706830790559,0,0,0,0
|
||||
2025-08-22 00:00:00-04:00,16.0849990844727,16.0849990844727,16.0849990844727,16.0849990844727,15.2893049844137,0,0,0,0
|
||||
2025-08-25 00:00:00-04:00,15.9624996185303,15.9624996185303,15.9624996185303,15.9624996185303,15.1728653324508,0,0,0,0
|
||||
2025-08-26 00:00:00-04:00,15.8924999237061,15.8924999237061,15.8924999237061,15.8924999237061,15.1063283884719,0,0,0,0
|
||||
2025-08-27 00:00:00-04:00,15.8800001144409,15.8800001144409,15.8800001144409,15.8800001144409,15.0944469208325,0,0,0,0
|
||||
2025-08-28 00:00:00-04:00,15.9099998474121,15.9099998474121,15.9099998474121,15.9099998474121,15.1229626244666,0,0,0,0
|
||||
2025-08-29 00:00:00-04:00,15.8900003433228,15.8900003433228,15.8900003433228,15.8900003433228,15.1039524575432,0,0,0,0
|
||||
2025-09-02 00:00:00-04:00,15.7550001144409,15.7550001144409,15.7550001144409,15.7550001144409,14.9756304314429,0,0,0,0
|
||||
2025-09-03 00:00:00-04:00,15.7550001144409,15.7550001144409,15.7550001144409,15.7550001144409,14.9756304314429,0,0,0,0
|
||||
2025-09-04 00:00:00-04:00,15.7849998474121,15.7849998474121,15.7849998474121,15.7849998474121,15.004146135077,0,0,0,0
|
||||
2025-09-05 00:00:00-04:00,15.9250001907349,15.9250001907349,15.9250001907349,15.9250001907349,15.1372209295326,0,0,0,0
|
||||
2025-09-08 00:00:00-04:00,16.0249996185303,16.0249996185303,16.0249996185303,16.0249996185303,15.2322735771455,0,0,0,0
|
||||
2025-09-09 00:00:00-04:00,16.0575008392334,16.0575008392334,16.0575008392334,16.0575008392334,15.2631670247041,0,0,0,0
|
||||
2025-09-10 00:00:00-04:00,16.0750007629395,16.0750007629395,16.0750007629395,16.0750007629395,15.2798012606988,0,0,0,0
|
||||
2025-09-11 00:00:00-04:00,16.2900009155273,16.2900009155273,16.2900009155273,16.2900009155273,15.4841657674886,0,0,0,0
|
||||
2025-09-12 00:00:00-04:00,16.2299995422363,16.2299995422363,16.2299995422363,16.2299995422363,15.4271325472246,0,0,0,0
|
||||
2025-09-15 00:00:00-04:00,16.3075008392334,16.3075008392334,16.3075008392334,16.3075008392334,15.5008000034833,0,0,0,0
|
||||
2025-09-16 00:00:00-04:00,16.3024997711182,16.3024997711182,16.3024997711182,16.3024997711182,15.4960463286301,0,0,0,0
|
||||
2025-09-17 00:00:00-04:00,16.3474998474121,16.3474998474121,16.3474998474121,16.3474998474121,15.5388203373302,0,0,0,0
|
||||
2025-09-18 00:00:00-04:00,16.3125,16.3125,16.3125,16.3125,15.5055518653407,0,0,0,0
|
||||
2025-09-19 00:00:00-04:00,16.2749996185303,16.2749996185303,16.2749996185303,16.2749996185303,15.4699065559247,0,0,0,0
|
||||
2025-09-22 00:00:00-04:00,16.3199996948242,16.3199996948242,16.3199996948242,16.3199996948242,15.5126805646248,0,0,0,0
|
||||
2025-09-23 00:00:00-04:00,16.3250007629395,16.3250007629395,16.3250007629395,16.3250007629395,15.517434239478,0,0,0,0
|
||||
2025-09-24 00:00:00-04:00,16.2900009155273,16.2900009155273,16.2900009155273,16.2900009155273,15.4841657674886,0,0,0,0
|
||||
2025-09-25 00:00:00-04:00,16.1324996948242,16.1324996948242,16.1324996948242,16.1324996948242,15.3344558305404,0,0,0,0
|
||||
2025-09-26 00:00:00-04:00,16.2124996185303,16.2124996185303,16.2124996185303,16.2124996185303,15.4104983112299,0,0,0,0
|
||||
2025-09-29 00:00:00-04:00,16.3274993896484,16.3274993896484,16.3274993896484,16.3274993896484,15.5198092639088,0,0,0,0
|
||||
2025-09-30 00:00:00-04:00,16.4500007629395,16.4500007629395,16.4500007629395,16.4500007629395,15.6362507288676,0,0,0,0
|
||||
2025-10-01 00:00:00-04:00,16.5550003051758,16.5550003051758,16.5550003051758,16.5550003051758,15.7360561448359,0,0,0,0
|
||||
2025-10-02 00:00:00-04:00,16.5349998474121,16.5349998474121,16.5349998474121,16.5349998474121,15.7170450714145,0,0,0,0
|
||||
2025-10-03 00:00:00-04:00,16.625,16.625,16.625,16.625,15.8025930888147,0,0,0,0
|
||||
2025-10-06 00:00:00-04:00,16.6224994659424,16.6224994659424,16.6224994659424,16.6224994659424,15.8002162513881,0,0,0,0
|
||||
2025-10-07 00:00:00-04:00,16.4825000762939,16.4825000762939,16.4825000762939,16.4825000762939,15.6671423634304,0,0,0,0
|
||||
2025-10-08 00:00:00-04:00,16.5300006866455,16.5300006866455,16.5300006866455,16.5300006866455,15.7122932095571,0,0,0,0
|
||||
2025-10-09 00:00:00-04:00,16.4274997711182,16.4274997711182,16.4274997711182,16.4274997711182,15.6148628180197,0,0,0,0
|
||||
2025-10-10 00:00:00-04:00,16.1149997711182,16.1149997711182,16.1149997711182,16.1149997711182,15.3178215945457,0,0,0,0
|
||||
2025-10-13 00:00:00-04:00,16.2775001525879,16.2775001525879,16.2775001525879,16.2775001525879,15.4722833933513,0,0,0,0
|
||||
2025-10-14 00:00:00-04:00,16.2975006103516,16.2975006103516,16.2975006103516,16.2975006103516,15.4912944667726,0,0,0,0
|
||||
2025-10-15 00:00:00-04:00,16.3675003051758,16.3675003051758,16.3675003051758,16.3675003051758,15.5578314107515,0,0,0,0
|
||||
2025-10-16 00:00:00-04:00,16.3875007629395,16.3875007629395,16.3875007629395,16.3875007629395,15.5768424841728,0,0,0,0
|
||||
2025-10-17 00:00:00-04:00,16.3999996185303,16.3999996185303,16.3999996185303,16.3999996185303,15.5887230453143,0,0,0,0
|
||||
2025-10-20 00:00:00-04:00,16.4750003814697,16.4750003814697,16.4750003814697,16.4750003814697,15.6600136641463,0,0,0,0
|
||||
2025-10-21 00:00:00-04:00,16.4099998474121,16.4099998474121,16.4099998474121,16.4099998474121,15.598228582025,0,0,0,0
|
||||
2025-10-22 00:00:00-04:00,16.4074993133545,16.4074993133545,16.4074993133545,16.4074993133545,15.5958517445984,0,0,0,0
|
||||
2025-10-23 00:00:00-04:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,15.6457544525825,0,0,0,0
|
||||
2025-10-24 00:00:00-04:00,16.5025005340576,16.5025005340576,16.5025005340576,16.5025005340576,15.6861534368517,0,0,0,0
|
||||
2025-10-27 00:00:00-04:00,16.6000003814697,16.6000003814697,16.6000003814697,16.6000003814697,15.7788301535359,0,0,4,0
|
||||
2025-10-28 00:00:00-04:00,16.5599994659424,16.5599994659424,16.5599994659424,16.5599994659424,15.7408080066933,0,0,0,0
|
||||
2025-10-29 00:00:00-04:00,16.5900001525879,16.5900001525879,16.5900001525879,16.5900001525879,15.7693246168253,0,0,0,0
|
||||
2025-10-30 00:00:00-04:00,16.4400005340576,16.4400005340576,16.4400005340576,16.4400005340576,15.6267451921569,0,0,0,0
|
||||
2025-10-31 00:00:00-04:00,16.4400005340576,16.4400005340576,16.4400005340576,16.4400005340576,15.6267451921569,0,0,0,0
|
||||
2025-11-03 00:00:00-05:00,16.4300003051758,16.4300003051758,16.4300003051758,16.4300003051758,15.6172396554463,0,0,0,0
|
||||
2025-11-04 00:00:00-05:00,16.3199996948242,16.3199996948242,16.3199996948242,16.3199996948242,15.5126805646248,0,0,0,0
|
||||
2025-11-05 00:00:00-05:00,16.3899993896484,16.3899993896484,16.3899993896484,16.3899993896484,15.5792175086036,0,0,0,0
|
||||
2025-11-06 00:00:00-05:00,16.4400005340576,16.4400005340576,16.4400005340576,16.4400005340576,15.6267451921569,0,0,0,0
|
||||
2025-11-07 00:00:00-05:00,16.4899997711182,16.4899997711182,16.4899997711182,16.4899997711182,15.6742710627145,0,0,0,0
|
||||
2025-11-10 00:00:00-05:00,16.6800003051758,16.6800003051758,16.6800003051758,16.6800003051758,15.8548726342254,0,0,0,0
|
||||
2025-11-11 00:00:00-05:00,16.8400001525879,16.8400001525879,16.8400001525879,16.8400001525879,16.0069575956044,0,0,0,0
|
||||
2025-11-12 00:00:00-05:00,16.9599990844727,16.9599990844727,16.9599990844727,16.9599990844727,16.1210204101408,0,0,0,0
|
||||
2025-11-13 00:00:00-05:00,16.8199996948242,16.8199996948242,16.8199996948242,16.8199996948242,15.9879465221831,0,0,0,0
|
||||
2025-11-14 00:00:00-05:00,16.6599998474121,16.6599998474121,16.6599998474121,16.6599998474121,15.8358615608041,0,0,0,0
|
||||
2025-11-17 00:00:00-05:00,16.4899997711182,16.4899997711182,16.4899997711182,16.4899997711182,15.6742710627145,0,0,0,0
|
||||
2025-11-18 00:00:00-05:00,16.3299999237061,16.3299999237061,16.3299999237061,16.3299999237061,15.5221861013354,0,0,0,0
|
||||
2025-11-19 00:00:00-05:00,16.2299995422363,16.2299995422363,16.2299995422363,16.2299995422363,15.4271325472246,0,0,0,0
|
||||
2025-11-20 00:00:00-05:00,16.0699996948242,16.0699996948242,16.0699996948242,16.0699996948242,15.2750475858456,0,0,0,0
|
||||
2025-11-21 00:00:00-05:00,16.25,16.25,16.25,16.25,15.4461436206459,0,0,0,0
|
||||
2025-11-24 00:00:00-05:00,16.3099994659424,16.3099994659424,16.3099994659424,16.3099994659424,15.5031750279141,0,0,0,0
|
||||
2025-11-25 00:00:00-05:00,16.5100002288818,16.5100002288818,16.5100002288818,16.5100002288818,15.6932821361358,0,0,0,0
|
||||
2025-11-26 00:00:00-05:00,16.6599998474121,16.6599998474121,16.6599998474121,16.6599998474121,15.8358615608041,0,0,0,0
|
||||
2025-11-28 00:00:00-05:00,16.7299995422363,16.7299995422363,16.7299995422363,16.7299995422363,15.902398504783,0,0,0,0
|
||||
2025-12-01 00:00:00-05:00,16.6900005340576,16.6900005340576,16.6900005340576,16.6900005340576,15.8643781709361,0,0,0,0
|
||||
2025-12-02 00:00:00-05:00,16.7700004577637,16.7700004577637,16.7700004577637,16.7700004577637,15.9404206516256,0,0,0,0
|
||||
2025-12-03 00:00:00-05:00,16.8199996948242,16.8199996948242,16.8199996948242,16.8199996948242,15.9879465221831,0,0,0,0
|
||||
2025-12-04 00:00:00-05:00,16.8799991607666,16.8799991607666,16.8799991607666,16.8799991607666,16.0449779294513,0,0,0,0
|
||||
2025-12-05 00:00:00-05:00,16.8400001525879,16.8400001525879,16.8400001525879,16.8400001525879,16.0069575956044,0,0,0,0
|
||||
2025-12-08 00:00:00-05:00,16.8600006103516,16.8600006103516,16.8600006103516,16.8600006103516,16.0259686690258,0,0,0,0
|
||||
2025-12-09 00:00:00-05:00,16.8299999237061,16.8299999237061,16.8299999237061,16.8299999237061,15.9974520588938,0,0,0,0
|
||||
2025-12-10 00:00:00-05:00,16.9500007629395,16.9500007629395,16.9500007629395,16.9500007629395,16.1115166864259,0,0,0,0
|
||||
2025-12-11 00:00:00-05:00,17.0799999237061,17.0799999237061,17.0799999237061,17.0799999237061,16.235085037673,0,0,0,0
|
||||
2025-12-12 00:00:00-05:00,17.0200004577637,17.0200004577637,17.0200004577637,17.0200004577637,16.1780536304048,0,0,0,0
|
||||
2025-12-15 00:00:00-05:00,17.0900001525879,17.0900001525879,17.0900001525879,17.0900001525879,16.2445905743836,0,0,0,0
|
||||
2025-12-16 00:00:00-05:00,16.9899997711182,16.9899997711182,16.9899997711182,16.9899997711182,16.1495370202728,0,0,0,0
|
||||
2025-12-17 00:00:00-05:00,16.9200000762939,16.9200000762939,16.9200000762939,16.9200000762939,16.0830000762939,0,0,0,0
|
||||
2025-12-18 00:00:00-05:00,16.2199993133545,16.2199993133545,16.2199993133545,16.2199993133545,16.2199993133545,0,0.837,0,0.417
|
||||
2025-12-19 00:00:00-05:00,16.2999992370605,16.2999992370605,16.2999992370605,16.2999992370605,16.2999992370605,0,0,0,0
|
||||
2025-12-22 00:00:00-05:00,16.3700008392334,16.3700008392334,16.3700008392334,16.3700008392334,16.3700008392334,0,0,0,0
|
||||
2025-12-23 00:00:00-05:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,0,0,0,0
|
||||
2025-12-24 00:00:00-05:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,0,0,0,0
|
||||
2025-12-26 00:00:00-05:00,16.5300006866455,16.5300006866455,16.5300006866455,16.5300006866455,16.5300006866455,0,0,0,0
|
||||
2025-12-29 00:00:00-05:00,16.5100002288818,16.5100002288818,16.5100002288818,16.5100002288818,16.5100002288818,0,0,0,0
|
||||
2025-12-30 00:00:00-05:00,16.5400009155273,16.5400009155273,16.5400009155273,16.5400009155273,16.5400009155273,0,0,0,0
|
||||
2025-12-31 00:00:00-05:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,0,0,0,0
|
||||
2026-01-02 00:00:00-05:00,16.6299991607666,16.6299991607666,16.6299991607666,16.6299991607666,16.6299991607666,0,0,0,0
|
||||
2026-01-05 00:00:00-05:00,16.7900009155273,16.7900009155273,16.7900009155273,16.7900009155273,16.7900009155273,0,0,0,0
|
||||
2026-01-06 00:00:00-05:00,16.8299999237061,16.8299999237061,16.8299999237061,16.8299999237061,16.8299999237061,0,0,0,0
|
||||
2026-01-07 00:00:00-05:00,16.6900005340576,16.6900005340576,16.6900005340576,16.6900005340576,16.6900005340576,0,0,0,0
|
||||
2026-01-08 00:00:00-05:00,16.7600002288818,16.7600002288818,16.7600002288818,16.7600002288818,16.7600002288818,0,0,0,0
|
||||
2026-01-09 00:00:00-05:00,16.8099994659424,16.8099994659424,16.8099994659424,16.8099994659424,16.8099994659424,0,0,0,0
|
||||
|
503
tests/data/DODFX-1d-cg-double-count.csv
Normal file
503
tests/data/DODFX-1d-cg-double-count.csv
Normal file
@@ -0,0 +1,503 @@
|
||||
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits,Capital Gains
|
||||
2024-01-10 00:00:00-05:00,12.147500038147,12.147500038147,12.147500038147,12.147500038147,11.0047464370728,0,0,0,0
|
||||
2024-01-11 00:00:00-05:00,12.1350002288818,12.1350002288818,12.1350002288818,12.1350002288818,10.9934225082397,0,0,0,0
|
||||
2024-01-12 00:00:00-05:00,12.1400003433228,12.1400003433228,12.1400003433228,12.1400003433228,10.9979524612427,0,0,0,0
|
||||
2024-01-16 00:00:00-05:00,11.9300003051758,11.9300003051758,11.9300003051758,11.9300003051758,10.8077077865601,0,0,0,0
|
||||
2024-01-17 00:00:00-05:00,11.7924995422363,11.7924995422363,11.7924995422363,11.7924995422363,10.683141708374,0,0,0,0
|
||||
2024-01-18 00:00:00-05:00,11.8400001525879,11.8400001525879,11.8400001525879,11.8400001525879,10.7261743545532,0,0,0,0
|
||||
2024-01-19 00:00:00-05:00,11.9025001525879,11.9025001525879,11.9025001525879,11.9025001525879,10.7827949523926,0,0,0,0
|
||||
2024-01-22 00:00:00-05:00,11.9075002670288,11.9075002670288,11.9075002670288,11.9075002670288,10.7873249053955,0,0,0,0
|
||||
2024-01-23 00:00:00-05:00,11.9224996566772,11.9224996566772,11.9224996566772,11.9224996566772,10.8009128570557,0,0,0,0
|
||||
2024-01-24 00:00:00-05:00,11.9925003051758,11.9925003051758,11.9925003051758,11.9925003051758,10.8643283843994,0,0,0,0
|
||||
2024-01-25 00:00:00-05:00,11.9575004577637,11.9575004577637,11.9575004577637,11.9575004577637,10.8326215744019,0,0,0,0
|
||||
2024-01-26 00:00:00-05:00,12.0325002670288,12.0325002670288,12.0325002670288,12.0325002670288,10.9005651473999,0,0,0,0
|
||||
2024-01-29 00:00:00-05:00,12.0749998092651,12.0749998092651,12.0749998092651,12.0749998092651,10.9390668869019,0,0,0,0
|
||||
2024-01-30 00:00:00-05:00,12.0299997329712,12.0299997329712,12.0299997329712,12.0299997329712,10.8983001708984,0,0,0,0
|
||||
2024-01-31 00:00:00-05:00,11.9324998855591,11.9324998855591,11.9324998855591,11.9324998855591,10.8099727630615,0,0,0,0
|
||||
2024-02-01 00:00:00-05:00,11.9825000762939,11.9825000762939,11.9825000762939,11.9825000762939,10.8552694320679,0,0,0,0
|
||||
2024-02-02 00:00:00-05:00,11.9125003814697,11.9125003814697,11.9125003814697,11.9125003814697,10.7918539047241,0,0,0,0
|
||||
2024-02-05 00:00:00-05:00,11.8400001525879,11.8400001525879,11.8400001525879,11.8400001525879,10.7261743545532,0,0,0,0
|
||||
2024-02-06 00:00:00-05:00,11.9274997711182,11.9274997711182,11.9274997711182,11.9274997711182,10.8054428100586,0,0,0,0
|
||||
2024-02-07 00:00:00-05:00,11.8699998855591,11.8699998855591,11.8699998855591,11.8699998855591,10.7533521652222,0,0,0,0
|
||||
2024-02-08 00:00:00-05:00,11.7974996566772,11.7974996566772,11.7974996566772,11.7974996566772,10.687671661377,0,0,0,0
|
||||
2024-02-09 00:00:00-05:00,11.8050003051758,11.8050003051758,11.8050003051758,11.8050003051758,10.6944675445557,0,0,0,0
|
||||
2024-02-12 00:00:00-05:00,11.875,11.875,11.875,11.875,10.7578821182251,0,0,0,0
|
||||
2024-02-13 00:00:00-05:00,11.727499961853,11.727499961853,11.727499961853,11.727499961853,10.6242580413818,0,0,0,0
|
||||
2024-02-14 00:00:00-05:00,11.7974996566772,11.7974996566772,11.7974996566772,11.7974996566772,10.687671661377,0,0,0,0
|
||||
2024-02-15 00:00:00-05:00,11.9049997329712,11.9049997329712,11.9049997329712,11.9049997329712,10.7850589752197,0,0,0,0
|
||||
2024-02-16 00:00:00-05:00,11.9624996185303,11.9624996185303,11.9624996185303,11.9624996185303,10.8371505737305,0,0,0,0
|
||||
2024-02-20 00:00:00-05:00,12.0349998474121,12.0349998474121,12.0349998474121,12.0349998474121,10.9028301239014,0,0,0,0
|
||||
2024-02-21 00:00:00-05:00,12.0550003051758,12.0550003051758,12.0550003051758,12.0550003051758,10.9209489822388,0,0,0,0
|
||||
2024-02-22 00:00:00-05:00,12.1800003051758,12.1800003051758,12.1800003051758,12.1800003051758,11.0341892242432,0,0,0,0
|
||||
2024-02-23 00:00:00-05:00,12.1774997711182,12.1774997711182,12.1774997711182,12.1774997711182,11.0319242477417,0,0,0,0
|
||||
2024-02-26 00:00:00-05:00,12.1525001525879,12.1525001525879,12.1525001525879,12.1525001525879,11.0092763900757,0,0,0,0
|
||||
2024-02-27 00:00:00-05:00,12.1724996566772,12.1724996566772,12.1724996566772,12.1724996566772,11.0273942947388,0,0,0,0
|
||||
2024-02-28 00:00:00-05:00,12.1175003051758,12.1175003051758,12.1175003051758,12.1175003051758,10.9775695800781,0,0,0,0
|
||||
2024-02-29 00:00:00-05:00,12.0900001525879,12.0900001525879,12.0900001525879,12.0900001525879,10.9526567459106,0,0,0,0
|
||||
2024-03-01 00:00:00-05:00,12.2150001525879,12.2150001525879,12.2150001525879,12.2150001525879,11.065896987915,0,0,0,0
|
||||
2024-03-04 00:00:00-05:00,12.1549997329712,12.1549997329712,12.1549997329712,12.1549997329712,11.0115404129028,0,0,0,0
|
||||
2024-03-05 00:00:00-05:00,12.1374998092651,12.1374998092651,12.1374998092651,12.1374998092651,10.9956874847412,0,0,0,0
|
||||
2024-03-06 00:00:00-05:00,12.2674999237061,12.2674999237061,12.2674999237061,12.2674999237061,11.1134576797485,0,0,0,0
|
||||
2024-03-07 00:00:00-05:00,12.3699998855591,12.3699998855591,12.3699998855591,12.3699998855591,11.2063150405884,0,0,0,0
|
||||
2024-03-08 00:00:00-05:00,12.3874998092651,12.3874998092651,12.3874998092651,12.3874998092651,11.2221689224243,0,0,0,0
|
||||
2024-03-11 00:00:00-04:00,12.4174995422363,12.4174995422363,12.4174995422363,12.4174995422363,11.2493467330933,0,0,0,0
|
||||
2024-03-12 00:00:00-04:00,12.5299997329712,12.5299997329712,12.5299997329712,12.5299997329712,11.351263999939,0,0,0,0
|
||||
2024-03-13 00:00:00-04:00,12.5775003433228,12.5775003433228,12.5775003433228,12.5775003433228,11.3942956924438,0,0,0,0
|
||||
2024-03-14 00:00:00-04:00,12.4875001907349,12.4875001907349,12.4875001907349,12.4875001907349,11.3127613067627,0,0,0,0
|
||||
2024-03-15 00:00:00-04:00,12.4549999237061,12.4549999237061,12.4549999237061,12.4549999237061,11.2833194732666,0,0,0,0
|
||||
2024-03-18 00:00:00-04:00,12.4700002670288,12.4700002670288,12.4700002670288,12.4700002670288,11.2969083786011,0,0,0,0
|
||||
2024-03-19 00:00:00-04:00,12.477499961853,12.477499961853,12.477499961853,12.477499961853,11.3037023544312,0,0,0,0
|
||||
2024-03-20 00:00:00-04:00,12.5825004577637,12.5825004577637,12.5825004577637,12.5825004577637,11.3988256454468,0,0,0,0
|
||||
2024-03-21 00:00:00-04:00,12.5749998092651,12.5749998092651,12.5749998092651,12.5749998092651,11.3920297622681,0,0,0,0
|
||||
2024-03-22 00:00:00-04:00,12.5325002670288,12.5325002670288,12.5325002670288,12.5325002670288,11.3535289764404,0,0,0,0
|
||||
2024-03-25 00:00:00-04:00,12.5524997711182,12.5524997711182,12.5524997711182,12.5524997711182,11.3716468811035,0,0,0,0
|
||||
2024-03-26 00:00:00-04:00,12.5749998092651,12.5749998092651,12.5749998092651,12.5749998092651,11.3920297622681,0,0,0,0
|
||||
2024-03-27 00:00:00-04:00,12.6800003051758,12.6800003051758,12.6800003051758,12.6800003051758,11.4871530532837,0,0,0,0
|
||||
2024-03-28 00:00:00-04:00,12.6750001907349,12.6750001907349,12.6750001907349,12.6750001907349,11.4826231002808,0,0,0,0
|
||||
2024-04-01 00:00:00-04:00,12.625,12.625,12.625,12.625,11.4373264312744,0,0,0,0
|
||||
2024-04-02 00:00:00-04:00,12.5874996185303,12.5874996185303,12.5874996185303,12.5874996185303,11.4033546447754,0,0,0,0
|
||||
2024-04-03 00:00:00-04:00,12.6724996566772,12.6724996566772,12.6724996566772,12.6724996566772,11.480357170105,0,0,0,0
|
||||
2024-04-04 00:00:00-04:00,12.6199998855591,12.6199998855591,12.6199998855591,12.6199998855591,11.4327964782715,0,0,0,0
|
||||
2024-04-05 00:00:00-04:00,12.6225004196167,12.6225004196167,12.6225004196167,12.6225004196167,11.4350624084473,0,0,0,0
|
||||
2024-04-08 00:00:00-04:00,12.6750001907349,12.6750001907349,12.6750001907349,12.6750001907349,11.4826231002808,0,0,0,0
|
||||
2024-04-09 00:00:00-04:00,12.7124996185303,12.7124996185303,12.7124996185303,12.7124996185303,11.5165948867798,0,0,0,0
|
||||
2024-04-10 00:00:00-04:00,12.5900001525879,12.5900001525879,12.5900001525879,12.5900001525879,11.4056186676025,0,0,0,0
|
||||
2024-04-11 00:00:00-04:00,12.5574998855591,12.5574998855591,12.5574998855591,12.5574998855591,11.3761768341064,0,0,0,0
|
||||
2024-04-12 00:00:00-04:00,12.3474998474121,12.3474998474121,12.3474998474121,12.3474998474121,11.1859321594238,0,0,0,0
|
||||
2024-04-15 00:00:00-04:00,12.2799997329712,12.2799997329712,12.2799997329712,12.2799997329712,11.1247816085815,0,0,0,0
|
||||
2024-04-16 00:00:00-04:00,12.1625003814697,12.1625003814697,12.1625003814697,12.1625003814697,11.0183362960815,0,0,0,0
|
||||
2024-04-17 00:00:00-04:00,12.1850004196167,12.1850004196167,12.1850004196167,12.1850004196167,11.0387191772461,0,0,0,0
|
||||
2024-04-18 00:00:00-04:00,12.1999998092651,12.1999998092651,12.1999998092651,12.1999998092651,11.0523071289063,0,0,0,0
|
||||
2024-04-19 00:00:00-04:00,12.2349996566772,12.2349996566772,12.2349996566772,12.2349996566772,11.0840148925781,0,0,0,0
|
||||
2024-04-22 00:00:00-04:00,12.4125003814697,12.4125003814697,12.4125003814697,12.4125003814697,11.2448177337646,0,0,0,0
|
||||
2024-04-23 00:00:00-04:00,12.5124998092651,12.5124998092651,12.5124998092651,12.5124998092651,11.3354091644287,0,0,0,0
|
||||
2024-04-24 00:00:00-04:00,12.5074996948242,12.5074996948242,12.5074996948242,12.5074996948242,11.3308801651001,0,0,0,0
|
||||
2024-04-25 00:00:00-04:00,12.5699996948242,12.5699996948242,12.5699996948242,12.5699996948242,11.3874998092651,0,0,0,0
|
||||
2024-04-26 00:00:00-04:00,12.6149997711182,12.6149997711182,12.6149997711182,12.6149997711182,11.4282674789429,0,0,0,0
|
||||
2024-04-29 00:00:00-04:00,12.6999998092651,12.6999998092651,12.6999998092651,12.6999998092651,11.5052709579468,0,0,0,0
|
||||
2024-04-30 00:00:00-04:00,12.5050001144409,12.5050001144409,12.5050001144409,12.5050001144409,11.328616142273,0,0,0,0
|
||||
2024-05-01 00:00:00-04:00,12.4949998855591,12.4949998855591,12.4949998855591,12.4949998855591,11.3195562362671,0,0,0,0
|
||||
2024-05-02 00:00:00-04:00,12.6674995422363,12.6674995422363,12.6674995422363,12.6674995422363,11.4758281707764,0,0,0,0
|
||||
2024-05-03 00:00:00-04:00,12.7524995803833,12.7524995803833,12.7524995803833,12.7524995803833,11.5528316497803,0,0,0,0
|
||||
2024-05-06 00:00:00-04:00,12.852499961853,12.852499961853,12.852499961853,12.852499961853,11.643424987793,0,0,0,0
|
||||
2024-05-07 00:00:00-04:00,12.914999961853,12.914999961853,12.914999961853,12.914999961853,11.7000455856323,0,0,0,0
|
||||
2024-05-08 00:00:00-04:00,12.9350004196167,12.9350004196167,12.9350004196167,12.9350004196167,11.7181644439697,0,0,0,0
|
||||
2024-05-09 00:00:00-04:00,13.0249996185303,13.0249996185303,13.0249996185303,13.0249996185303,11.7996969223022,0,0,0,0
|
||||
2024-05-10 00:00:00-04:00,13.1075000762939,13.1075000762939,13.1075000762939,13.1075000762939,11.8744373321533,0,0,0,0
|
||||
2024-05-13 00:00:00-04:00,13.1824998855591,13.1824998855591,13.1824998855591,13.1824998855591,11.9423809051514,0,0,0,0
|
||||
2024-05-14 00:00:00-04:00,13.2399997711182,13.2399997711182,13.2399997711182,13.2399997711182,11.9944715499878,0,0,0,0
|
||||
2024-05-15 00:00:00-04:00,13.3649997711182,13.3649997711182,13.3649997711182,13.3649997711182,12.1077127456665,0,0,0,0
|
||||
2024-05-16 00:00:00-04:00,13.3500003814697,13.3500003814697,13.3500003814697,13.3500003814697,12.094123840332,0,0,0,0
|
||||
2024-05-17 00:00:00-04:00,13.3675003051758,13.3675003051758,13.3675003051758,13.3675003051758,12.109977722168,0,0,0,0
|
||||
2024-05-20 00:00:00-04:00,13.397500038147,13.397500038147,13.397500038147,13.397500038147,12.1371555328369,0,0,0,0
|
||||
2024-05-21 00:00:00-04:00,13.3474998474121,13.3474998474121,13.3474998474121,13.3474998474121,12.0918579101563,0,0,0,0
|
||||
2024-05-22 00:00:00-04:00,13.2224998474121,13.2224998474121,13.2224998474121,13.2224998474121,11.9786176681519,0,0,0,0
|
||||
2024-05-23 00:00:00-04:00,13.125,13.125,13.125,13.125,11.8902902603149,0,0,0,0
|
||||
2024-05-24 00:00:00-04:00,13.2049999237061,13.2049999237061,13.2049999237061,13.2049999237061,11.9627647399902,0,0,0,0
|
||||
2024-05-28 00:00:00-04:00,13.1899995803833,13.1899995803833,13.1899995803833,13.1899995803833,11.9491748809814,0,0,0,0
|
||||
2024-05-29 00:00:00-04:00,12.9674997329712,12.9674997329712,12.9674997329712,12.9674997329712,11.7476062774658,0,0,0,0
|
||||
2024-05-30 00:00:00-04:00,13.0699996948242,13.0699996948242,13.0699996948242,13.0699996948242,11.8404636383057,0,0,0,0
|
||||
2024-05-31 00:00:00-04:00,13.1925001144409,13.1925001144409,13.1925001144409,13.1925001144409,11.9514398574829,0,0,0,0
|
||||
2024-06-03 00:00:00-04:00,13.1774997711182,13.1774997711182,13.1774997711182,13.1774997711182,11.9378509521484,0,0,0,0
|
||||
2024-06-04 00:00:00-04:00,13.0550003051758,13.0550003051758,13.0550003051758,13.0550003051758,11.8268756866455,0,0,0,0
|
||||
2024-06-05 00:00:00-04:00,13.1549997329712,13.1549997329712,13.1549997329712,13.1549997329712,11.9174680709839,0,0,0,0
|
||||
2024-06-06 00:00:00-04:00,13.1975002288818,13.1975002288818,13.1975002288818,13.1975002288818,11.9559698104858,0,0,0,0
|
||||
2024-06-07 00:00:00-04:00,13.085000038147,13.085000038147,13.085000038147,13.085000038147,11.8540534973145,0,0,0,0
|
||||
2024-06-10 00:00:00-04:00,13.039999961853,13.039999961853,13.039999961853,13.039999961853,11.8132858276367,0,0,0,0
|
||||
2024-06-11 00:00:00-04:00,12.9025001525879,12.9025001525879,12.9025001525879,12.9025001525879,11.6887216567993,0,0,0,0
|
||||
2024-06-12 00:00:00-04:00,13.0074996948242,13.0074996948242,13.0074996948242,13.0074996948242,11.7838430404663,0,0,0,0
|
||||
2024-06-13 00:00:00-04:00,12.8275003433228,12.8275003433228,12.8275003433228,12.8275003433228,11.620777130127,0,0,0,0
|
||||
2024-06-14 00:00:00-04:00,12.7049999237061,12.7049999237061,12.7049999237061,12.7049999237061,11.5098009109497,0,0,0,0
|
||||
2024-06-17 00:00:00-04:00,12.7574996948242,12.7574996948242,12.7574996948242,12.7574996948242,11.5573616027832,0,0,0,0
|
||||
2024-06-18 00:00:00-04:00,12.7849998474121,12.7849998474121,12.7849998474121,12.7849998474121,11.5822744369507,0,0,0,0
|
||||
2024-06-20 00:00:00-04:00,12.8325004577637,12.8325004577637,12.8325004577637,12.8325004577637,11.6253070831299,0,0,0,0
|
||||
2024-06-21 00:00:00-04:00,12.7200002670288,12.7200002670288,12.7200002670288,12.7200002670288,11.5233898162842,0,0,0,0
|
||||
2024-06-24 00:00:00-04:00,12.8675003051758,12.8675003051758,12.8675003051758,12.8675003051758,11.6570148468018,0,0,0,0
|
||||
2024-06-25 00:00:00-04:00,12.8249998092651,12.8249998092651,12.8249998092651,12.8249998092651,11.6185111999512,0,0,0,0
|
||||
2024-06-26 00:00:00-04:00,12.7399997711182,12.7399997711182,12.7399997711182,12.7399997711182,11.5415086746216,0,0,0,0
|
||||
2024-06-27 00:00:00-04:00,12.7025003433228,12.7025003433228,12.7025003433228,12.7025003433228,11.5075359344482,0,0,0,0
|
||||
2024-06-28 00:00:00-04:00,12.6774997711182,12.6774997711182,12.6774997711182,12.6774997711182,11.4848871231079,0,0,0,0
|
||||
2024-07-01 00:00:00-04:00,12.727499961853,12.727499961853,12.727499961853,12.727499961853,11.5301837921143,0,0,0,0
|
||||
2024-07-02 00:00:00-04:00,12.727499961853,12.727499961853,12.727499961853,12.727499961853,11.5301837921143,0,0,0,0
|
||||
2024-07-03 00:00:00-04:00,12.8999996185303,12.8999996185303,12.8999996185303,12.8999996185303,11.6864566802979,0,0,0,0
|
||||
2024-07-05 00:00:00-04:00,12.960000038147,12.960000038147,12.960000038147,12.960000038147,11.7408123016357,0,0,0,0
|
||||
2024-07-08 00:00:00-04:00,12.9499998092651,12.9499998092651,12.9499998092651,12.9499998092651,11.7317533493042,0,0,0,0
|
||||
2024-07-09 00:00:00-04:00,12.9075002670288,12.9075002670288,12.9075002670288,12.9075002670288,11.6932506561279,0,0,0,0
|
||||
2024-07-10 00:00:00-04:00,13.0649995803833,13.0649995803833,13.0649995803833,13.0649995803833,11.8359336853027,0,0,0,0
|
||||
2024-07-11 00:00:00-04:00,13.1724996566772,13.1724996566772,13.1724996566772,13.1724996566772,11.9333209991455,0,0,0,0
|
||||
2024-07-12 00:00:00-04:00,13.2950000762939,13.2950000762939,13.2950000762939,13.2950000762939,12.0442972183228,0,0,0,0
|
||||
2024-07-15 00:00:00-04:00,13.2049999237061,13.2049999237061,13.2049999237061,13.2049999237061,11.9627647399902,0,0,0,0
|
||||
2024-07-16 00:00:00-04:00,13.2200002670288,13.2200002670288,13.2200002670288,13.2200002670288,11.9763536453247,0,0,0,0
|
||||
2024-07-17 00:00:00-04:00,13.289999961853,13.289999961853,13.289999961853,13.289999961853,12.0397682189941,0,0,0,0
|
||||
2024-07-18 00:00:00-04:00,13.1499996185303,13.1499996185303,13.1499996185303,13.1499996185303,11.912938117981,0,0,0,0
|
||||
2024-07-19 00:00:00-04:00,13.0500001907349,13.0500001907349,13.0500001907349,13.0500001907349,11.8223457336426,0,0,0,0
|
||||
2024-07-22 00:00:00-04:00,13.1949996948242,13.1949996948242,13.1949996948242,13.1949996948242,11.9537048339844,0,0,0,0
|
||||
2024-07-23 00:00:00-04:00,13.0874996185303,13.0874996185303,13.0874996185303,13.0874996185303,11.8563175201416,0,0,0,0
|
||||
2024-07-24 00:00:00-04:00,12.9624996185303,12.9624996185303,12.9624996185303,12.9624996185303,11.7430763244629,0,0,0,0
|
||||
2024-07-25 00:00:00-04:00,12.9300003051758,12.9300003051758,12.9300003051758,12.9300003051758,11.7136344909668,0,0,0,0
|
||||
2024-07-26 00:00:00-04:00,13.0325002670288,13.0325002670288,13.0325002670288,13.0325002670288,11.8064918518066,0,0,0,0
|
||||
2024-07-29 00:00:00-04:00,13.0150003433228,13.0150003433228,13.0150003433228,13.0150003433228,11.7906379699707,0,0,0,0
|
||||
2024-07-30 00:00:00-04:00,12.9825000762939,12.9825000762939,12.9825000762939,12.9825000762939,11.7611951828003,0,0,0,0
|
||||
2024-07-31 00:00:00-04:00,13.0799999237061,13.0799999237061,13.0799999237061,13.0799999237061,11.8495235443115,0,0,0,0
|
||||
2024-08-01 00:00:00-04:00,12.8299999237061,12.8299999237061,12.8299999237061,12.8299999237061,11.6230411529541,0,0,0,0
|
||||
2024-08-02 00:00:00-04:00,12.6400003433228,12.6400003433228,12.6400003433228,12.6400003433228,11.4509162902832,0,0,0,0
|
||||
2024-08-05 00:00:00-04:00,12.3599996566772,12.3599996566772,12.3599996566772,12.3599996566772,11.1972551345825,0,0,0,0
|
||||
2024-08-06 00:00:00-04:00,12.3649997711182,12.3649997711182,12.3649997711182,12.3649997711182,11.2017850875855,0,0,0,0
|
||||
2024-08-07 00:00:00-04:00,12.4475002288818,12.4475002288818,12.4475002288818,12.4475002288818,11.2765245437622,0,0,0,0
|
||||
2024-08-08 00:00:00-04:00,12.6575002670288,12.6575002670288,12.6575002670288,12.6575002670288,11.4667701721191,0,0,0,0
|
||||
2024-08-09 00:00:00-04:00,12.6899995803833,12.6899995803833,12.6899995803833,12.6899995803833,11.4962120056152,0,0,0,0
|
||||
2024-08-12 00:00:00-04:00,12.6949996948242,12.6949996948242,12.6949996948242,12.6949996948242,11.5007410049438,0,0,0,0
|
||||
2024-08-13 00:00:00-04:00,12.8474998474121,12.8474998474121,12.8474998474121,12.8474998474121,11.6388959884644,0,0,0,0
|
||||
2024-08-14 00:00:00-04:00,12.875,12.875,12.875,12.875,11.6638088226318,0,0,0,0
|
||||
2024-08-15 00:00:00-04:00,13.0450000762939,13.0450000762939,13.0450000762939,13.0450000762939,11.8178157806396,0,0,0,0
|
||||
2024-08-16 00:00:00-04:00,13.1350002288818,13.1350002288818,13.1350002288818,13.1350002288818,11.8993501663208,0,0,0,0
|
||||
2024-08-19 00:00:00-04:00,13.2849998474121,13.2849998474121,13.2849998474121,13.2849998474121,12.0352382659912,0,0,0,0
|
||||
2024-08-20 00:00:00-04:00,13.2124996185303,13.2124996185303,13.2124996185303,13.2124996185303,11.9695587158203,0,0,0,0
|
||||
2024-08-21 00:00:00-04:00,13.2749996185303,13.2749996185303,13.2749996185303,13.2749996185303,12.0261783599854,0,0,0,0
|
||||
2024-08-22 00:00:00-04:00,13.2049999237061,13.2049999237061,13.2049999237061,13.2049999237061,11.9627647399902,0,0,0,0
|
||||
2024-08-23 00:00:00-04:00,13.4025001525879,13.4025001525879,13.4025001525879,13.4025001525879,12.1416845321655,0,0,0,0
|
||||
2024-08-26 00:00:00-04:00,13.3774995803833,13.3774995803833,13.3774995803833,13.3774995803833,12.1190357208252,0,0,0,0
|
||||
2024-08-27 00:00:00-04:00,13.4449996948242,13.4449996948242,13.4449996948242,13.4449996948242,12.1801872253418,0,0,0,0
|
||||
2024-08-28 00:00:00-04:00,13.3649997711182,13.3649997711182,13.3649997711182,13.3649997711182,12.1077127456665,0,0,0,0
|
||||
2024-08-29 00:00:00-04:00,13.4049997329712,13.4049997329712,13.4049997329712,13.4049997329712,12.143949508667,0,0,0,0
|
||||
2024-08-30 00:00:00-04:00,13.4650001525879,13.4650001525879,13.4650001525879,13.4650001525879,12.1983051300049,0,0,0,0
|
||||
2024-09-03 00:00:00-04:00,13.2550001144409,13.2550001144409,13.2550001144409,13.2550001144409,12.0080604553223,0,0,0,0
|
||||
2024-09-04 00:00:00-04:00,13.2700004577637,13.2700004577637,13.2700004577637,13.2700004577637,12.0216493606567,0,0,0,0
|
||||
2024-09-05 00:00:00-04:00,13.3024997711182,13.3024997711182,13.3024997711182,13.3024997711182,12.0510921478271,0,0,0,0
|
||||
2024-09-06 00:00:00-04:00,13.0924997329712,13.0924997329712,13.0924997329712,13.0924997329712,11.8608474731445,0,0,0,0
|
||||
2024-09-09 00:00:00-04:00,13.1850004196167,13.1850004196167,13.1850004196167,13.1850004196167,11.9446468353271,0,0,0,0
|
||||
2024-09-10 00:00:00-04:00,13.1324996948242,13.1324996948242,13.1324996948242,13.1324996948242,11.897084236145,0,0,0,0
|
||||
2024-09-11 00:00:00-04:00,13.1599998474121,13.1599998474121,13.1599998474121,13.1599998474121,11.9219980239868,0,0,0,0
|
||||
2024-09-12 00:00:00-04:00,13.2550001144409,13.2550001144409,13.2550001144409,13.2550001144409,12.0080604553223,0,0,0,0
|
||||
2024-09-13 00:00:00-04:00,13.3249998092651,13.3249998092651,13.3249998092651,13.3249998092651,12.0714750289917,0,0,0,0
|
||||
2024-09-16 00:00:00-04:00,13.3675003051758,13.3675003051758,13.3675003051758,13.3675003051758,12.109977722168,0,0,0,0
|
||||
2024-09-17 00:00:00-04:00,13.4300003051758,13.4300003051758,13.4300003051758,13.4300003051758,12.1665983200073,0,0,0,0
|
||||
2024-09-18 00:00:00-04:00,13.4075002670288,13.4075002670288,13.4075002670288,13.4075002670288,12.1462144851685,0,0,0,0
|
||||
2024-09-19 00:00:00-04:00,13.625,13.625,13.625,13.625,12.3432540893555,0,0,0,0
|
||||
2024-09-20 00:00:00-04:00,13.5150003433228,13.5150003433228,13.5150003433228,13.5150003433228,12.2436017990112,0,0,0,0
|
||||
2024-09-23 00:00:00-04:00,13.5574998855591,13.5574998855591,13.5574998855591,13.5574998855591,12.2821025848389,0,0,0,0
|
||||
2024-09-24 00:00:00-04:00,13.7600002288818,13.7600002288818,13.7600002288818,13.7600002288818,12.4655542373657,0,0,0,0
|
||||
2024-09-25 00:00:00-04:00,13.6949996948242,13.6949996948242,13.6949996948242,13.6949996948242,12.4066677093506,0,0,0,0
|
||||
2024-09-26 00:00:00-04:00,14.0024995803833,14.0024995803833,14.0024995803833,14.0024995803833,12.6852397918701,0,0,0,0
|
||||
2024-09-27 00:00:00-04:00,14.1674995422363,14.1674995422363,14.1674995422363,14.1674995422363,12.8347187042236,0,0,0,0
|
||||
2024-09-30 00:00:00-04:00,13.9425001144409,13.9425001144409,13.9425001144409,13.9425001144409,12.6308860778809,0,0,0,0
|
||||
2024-10-01 00:00:00-04:00,13.9174995422363,13.9174995422363,13.9174995422363,13.9174995422363,12.6082372665405,0,0,0,0
|
||||
2024-10-02 00:00:00-04:00,13.9549999237061,13.9549999237061,13.9549999237061,13.9549999237061,12.6422090530396,0,0,0,0
|
||||
2024-10-03 00:00:00-04:00,13.7950000762939,13.7950000762939,13.7950000762939,13.7950000762939,12.4972610473633,0,0,0,0
|
||||
2024-10-04 00:00:00-04:00,13.9274997711182,13.9274997711182,13.9274997711182,13.9274997711182,12.6172962188721,0,0,0,0
|
||||
2024-10-07 00:00:00-04:00,13.8924999237061,13.8924999237061,13.8924999237061,13.8924999237061,12.5855894088745,0,0,0,0
|
||||
2024-10-08 00:00:00-04:00,13.7749996185303,13.7749996185303,13.7749996185303,13.7749996185303,12.4791421890259,0,0,0,0
|
||||
2024-10-09 00:00:00-04:00,13.8125,13.8125,13.8125,13.8125,12.5131149291992,0,0,0,0
|
||||
2024-10-10 00:00:00-04:00,13.789999961853,13.789999961853,13.789999961853,13.789999961853,12.4927310943604,0,0,0,0
|
||||
2024-10-11 00:00:00-04:00,13.8199996948242,13.8199996948242,13.8199996948242,13.8199996948242,12.5199089050293,0,0,0,0
|
||||
2024-10-14 00:00:00-04:00,13.8249998092651,13.8249998092651,13.8249998092651,13.8249998092651,12.5244388580322,0,0,0,0
|
||||
2024-10-15 00:00:00-04:00,13.6274995803833,13.6274995803833,13.6274995803833,13.6274995803833,12.3455181121826,0,0,0,0
|
||||
2024-10-16 00:00:00-04:00,13.6674995422363,13.6674995422363,13.6674995422363,13.6674995422363,12.3817548751831,0,0,0,0
|
||||
2024-10-17 00:00:00-04:00,13.6975002288818,13.6975002288818,13.6975002288818,13.6975002288818,12.4089336395264,0,0,0,0
|
||||
2024-10-18 00:00:00-04:00,13.7875003814697,13.7875003814697,13.7875003814697,13.7875003814697,12.4904670715332,0,0,0,0
|
||||
2024-10-21 00:00:00-04:00,13.664999961853,13.664999961853,13.664999961853,13.664999961853,12.379490852356,0,0,0,0
|
||||
2024-10-22 00:00:00-04:00,13.6125001907349,13.6125001907349,13.6125001907349,13.6125001907349,12.3319292068481,0,0,0,0
|
||||
2024-10-23 00:00:00-04:00,13.5299997329712,13.5299997329712,13.5299997329712,13.5299997329712,12.2571897506714,0,0,0,0
|
||||
2024-10-24 00:00:00-04:00,13.585000038147,13.585000038147,13.585000038147,13.585000038147,12.3070163726807,0,0,0,0
|
||||
2024-10-25 00:00:00-04:00,13.5625,13.5625,13.5625,13.5625,12.2866325378418,0,0,0,0
|
||||
2024-10-28 00:00:00-04:00,13.6724996566772,13.6724996566772,13.6724996566772,13.6724996566772,12.386284828186,0,0,0,0
|
||||
2024-10-29 00:00:00-04:00,13.5900001525879,13.5900001525879,13.5900001525879,13.5900001525879,12.3115463256836,0,0,0,0
|
||||
2024-10-30 00:00:00-04:00,13.4875001907349,13.4875001907349,13.4875001907349,13.4875001907349,12.2186889648438,0,0,0,0
|
||||
2024-10-31 00:00:00-04:00,13.3649997711182,13.3649997711182,13.3649997711182,13.3649997711182,12.1077127456665,0,0,0,0
|
||||
2024-11-01 00:00:00-04:00,13.4274997711182,13.4274997711182,13.4274997711182,13.4274997711182,12.1643323898315,0,0,0,0
|
||||
2024-11-04 00:00:00-05:00,13.4700002670288,13.4700002670288,13.4700002670288,13.4700002670288,12.2028350830078,0,0,0,0
|
||||
2024-11-05 00:00:00-05:00,13.602499961853,13.602499961853,13.602499961853,13.602499961853,12.3228702545166,0,0,0,0
|
||||
2024-11-06 00:00:00-05:00,13.5074996948242,13.5074996948242,13.5074996948242,13.5074996948242,12.2368068695068,0,0,0,0
|
||||
2024-11-07 00:00:00-05:00,13.602499961853,13.602499961853,13.602499961853,13.602499961853,12.3228702545166,0,0,0,0
|
||||
2024-11-08 00:00:00-05:00,13.4525003433228,13.4525003433228,13.4525003433228,13.4525003433228,12.1869812011719,0,0,0,0
|
||||
2024-11-11 00:00:00-05:00,13.477499961853,13.477499961853,13.477499961853,13.477499961853,12.2096290588379,0,0,0,0
|
||||
2024-11-12 00:00:00-05:00,13.1850004196167,13.1850004196167,13.1850004196167,13.1850004196167,11.9446468353271,0,0,0,0
|
||||
2024-11-13 00:00:00-05:00,13.1199998855591,13.1199998855591,13.1199998855591,13.1199998855591,11.885760307312,0,0,0,0
|
||||
2024-11-14 00:00:00-05:00,13.1499996185303,13.1499996185303,13.1499996185303,13.1499996185303,11.912938117981,0,0,0,0
|
||||
2024-11-15 00:00:00-05:00,13.1175003051758,13.1175003051758,13.1175003051758,13.1175003051758,11.8834953308105,0,0,0,0
|
||||
2024-11-18 00:00:00-05:00,13.2075004577637,13.2075004577637,13.2075004577637,13.2075004577637,11.9650297164917,0,0,0,0
|
||||
2024-11-19 00:00:00-05:00,13.1625003814697,13.1625003814697,13.1625003814697,13.1625003814697,11.9242630004883,0,0,0,0
|
||||
2024-11-20 00:00:00-05:00,13.125,13.125,13.125,13.125,11.8902902603149,0,0,0,0
|
||||
2024-11-21 00:00:00-05:00,13.1225004196167,13.1225004196167,13.1225004196167,13.1225004196167,11.8880252838135,0,0,0,0
|
||||
2024-11-22 00:00:00-05:00,13.1225004196167,13.1225004196167,13.1225004196167,13.1225004196167,11.8880252838135,0,0,0,0
|
||||
2024-11-25 00:00:00-05:00,13.210000038147,13.210000038147,13.210000038147,13.210000038147,11.9672946929932,0,0,0,0
|
||||
2024-11-26 00:00:00-05:00,13.1099996566772,13.1099996566772,13.1099996566772,13.1099996566772,11.8767013549805,0,0,0,0
|
||||
2024-11-27 00:00:00-05:00,13.164999961853,13.164999961853,13.164999961853,13.164999961853,11.9265270233154,0,0,0,0
|
||||
2024-11-29 00:00:00-05:00,13.2075004577637,13.2075004577637,13.2075004577637,13.2075004577637,11.9650297164917,0,0,0,0
|
||||
2024-12-02 00:00:00-05:00,13.1975002288818,13.1975002288818,13.1975002288818,13.1975002288818,11.9559698104858,0,0,0,0
|
||||
2024-12-03 00:00:00-05:00,13.2650003433228,13.2650003433228,13.2650003433228,13.2650003433228,12.0171203613281,0,0,0,0
|
||||
2024-12-04 00:00:00-05:00,13.25,13.25,13.25,13.25,12.0035305023193,0,0,0,0
|
||||
2024-12-05 00:00:00-05:00,13.3824996948242,13.3824996948242,13.3824996948242,13.3824996948242,12.1235656738281,0,0,0,0
|
||||
2024-12-06 00:00:00-05:00,13.3774995803833,13.3774995803833,13.3774995803833,13.3774995803833,12.1190357208252,0,0,0,0
|
||||
2024-12-09 00:00:00-05:00,13.4425001144409,13.4425001144409,13.4425001144409,13.4425001144409,12.1779222488403,0,0,0,0
|
||||
2024-12-10 00:00:00-05:00,13.3175001144409,13.3175001144409,13.3175001144409,13.3175001144409,12.0646820068359,0,0,0,0
|
||||
2024-12-11 00:00:00-05:00,13.3024997711182,13.3024997711182,13.3024997711182,13.3024997711182,12.0510921478271,0,0,0,0
|
||||
2024-12-12 00:00:00-05:00,13.2624998092651,13.2624998092651,13.2624998092651,13.2624998092651,12.0148553848267,0,0,0,0
|
||||
2024-12-13 00:00:00-05:00,13.1875,13.1875,13.1875,13.1875,11.9469108581543,0,0,0,0
|
||||
2024-12-16 00:00:00-05:00,13.1075000762939,13.1075000762939,13.1075000762939,13.1075000762939,11.8744373321533,0,0,0,0
|
||||
2024-12-17 00:00:00-05:00,13.0349998474121,13.0349998474121,13.0349998474121,13.0349998474121,11.8087558746338,0,0,0,0
|
||||
2024-12-18 00:00:00-05:00,12.4525003433228,12.4525003433228,12.4525003433228,12.4525003433228,11.5296020507813,0,0.281,0,0
|
||||
2024-12-19 00:00:00-05:00,12.3850002288818,12.3850002288818,12.3850002288818,12.3850002288818,11.4671049118042,0,0,0,0
|
||||
2024-12-20 00:00:00-05:00,12.4250001907349,12.4250001907349,12.4250001907349,12.4250001907349,11.5041399002075,0,0,0,0
|
||||
2024-12-23 00:00:00-05:00,12.5024995803833,12.5024995803833,12.5024995803833,12.5024995803833,11.5758953094482,0,0,0,0
|
||||
2024-12-24 00:00:00-05:00,12.5349998474121,12.5349998474121,12.5349998474121,12.5349998474121,11.6059875488281,0,0,0,0
|
||||
2024-12-26 00:00:00-05:00,12.5349998474121,12.5349998474121,12.5349998474121,12.5349998474121,11.6059875488281,0,0,0,0
|
||||
2024-12-27 00:00:00-05:00,12.5450000762939,12.5450000762939,12.5450000762939,12.5450000762939,11.6152467727661,0,0,0,0
|
||||
2024-12-30 00:00:00-05:00,12.4825000762939,12.4825000762939,12.4825000762939,12.4825000762939,11.5573787689209,0,0,0,0
|
||||
2024-12-31 00:00:00-05:00,12.4750003814697,12.4750003814697,12.4750003814697,12.4750003814697,11.5504341125488,0,0,0,0
|
||||
2025-01-02 00:00:00-05:00,12.4300003051758,12.4300003051758,12.4300003051758,12.4300003051758,11.5087699890137,0,0,0,0
|
||||
2025-01-03 00:00:00-05:00,12.4624996185303,12.4624996185303,12.4624996185303,12.4624996185303,11.5388603210449,0,0,0,0
|
||||
2025-01-06 00:00:00-05:00,12.602499961853,12.602499961853,12.602499961853,12.602499961853,11.6684846878052,0,0,0,0
|
||||
2025-01-07 00:00:00-05:00,12.6149997711182,12.6149997711182,12.6149997711182,12.6149997711182,11.6800584793091,0,0,0,0
|
||||
2025-01-08 00:00:00-05:00,12.5574998855591,12.5574998855591,12.5574998855591,12.5574998855591,11.6268196105957,0,0,0,0
|
||||
2025-01-10 00:00:00-05:00,12.3299999237061,12.3299999237061,12.3299999237061,12.3299999237061,11.4161806106567,0,0,0,0
|
||||
2025-01-13 00:00:00-05:00,12.3024997711182,12.3024997711182,12.3024997711182,12.3024997711182,11.390718460083,0,0,0,0
|
||||
2025-01-14 00:00:00-05:00,12.3800001144409,12.3800001144409,12.3800001144409,12.3800001144409,11.462474822998,0,0,0,0
|
||||
2025-01-15 00:00:00-05:00,12.539999961853,12.539999961853,12.539999961853,12.539999961853,11.61061668396,0,0,0,0
|
||||
2025-01-16 00:00:00-05:00,12.6125001907349,12.6125001907349,12.6125001907349,12.6125001907349,11.6777439117432,0,0,0,0
|
||||
2025-01-17 00:00:00-05:00,12.7049999237061,12.7049999237061,12.7049999237061,12.7049999237061,11.7633876800537,0,0,0,0
|
||||
2025-01-21 00:00:00-05:00,12.8625001907349,12.8625001907349,12.8625001907349,12.8625001907349,11.9092149734497,0,0,0,0
|
||||
2025-01-22 00:00:00-05:00,12.8725004196167,12.8725004196167,12.8725004196167,12.8725004196167,11.9184741973877,0,0,0,0
|
||||
2025-01-23 00:00:00-05:00,12.9674997329712,12.9674997329712,12.9674997329712,12.9674997329712,12.0064334869385,0,0,0,0
|
||||
2025-01-24 00:00:00-05:00,13.0249996185303,13.0249996185303,13.0249996185303,13.0249996185303,12.0596714019775,0,0,0,0
|
||||
2025-01-27 00:00:00-05:00,13.0024995803833,13.0024995803833,13.0024995803833,13.0024995803833,12.03883934021,0,0,0,0
|
||||
2025-01-28 00:00:00-05:00,13.0150003433228,13.0150003433228,13.0150003433228,13.0150003433228,12.0504131317139,0,0,0,0
|
||||
2025-01-29 00:00:00-05:00,13.0200004577637,13.0200004577637,13.0200004577637,13.0200004577637,12.05504322052,0,0,0,0
|
||||
2025-01-30 00:00:00-05:00,13.1525001525879,13.1525001525879,13.1525001525879,13.1525001525879,12.1777229309082,0,0,0,0
|
||||
2025-01-31 00:00:00-05:00,13.0649995803833,13.0649995803833,13.0649995803833,13.0649995803833,12.0967073440552,0,0,0,0
|
||||
2025-02-03 00:00:00-05:00,12.8924999237061,12.8924999237061,12.8924999237061,12.8924999237061,11.9369916915894,0,0,0,0
|
||||
2025-02-04 00:00:00-05:00,13.0600004196167,13.0600004196167,13.0600004196167,13.0600004196167,12.0920782089233,0,0,0,0
|
||||
2025-02-05 00:00:00-05:00,13.1999998092651,13.1999998092651,13.1999998092651,13.1999998092651,12.2217016220093,0,0,0,0
|
||||
2025-02-06 00:00:00-05:00,13.352499961853,13.352499961853,13.352499961853,13.352499961853,12.3628997802734,0,0,0,0
|
||||
2025-02-07 00:00:00-05:00,13.2624998092651,13.2624998092651,13.2624998092651,13.2624998092651,12.2795696258545,0,0,0,0
|
||||
2025-02-10 00:00:00-05:00,13.3675003051758,13.3675003051758,13.3675003051758,13.3675003051758,12.3767881393433,0,0,0,0
|
||||
2025-02-11 00:00:00-05:00,13.3950004577637,13.3950004577637,13.3950004577637,13.3950004577637,12.402250289917,0,0,0,0
|
||||
2025-02-12 00:00:00-05:00,13.477499961853,13.477499961853,13.477499961853,13.477499961853,12.4786357879639,0,0,0,0
|
||||
2025-02-13 00:00:00-05:00,13.5924997329712,13.5924997329712,13.5924997329712,13.5924997329712,12.5851125717163,0,0,0,0
|
||||
2025-02-14 00:00:00-05:00,13.6374998092651,13.6374998092651,13.6374998092651,13.6374998092651,12.6267766952515,0,0,0,0
|
||||
2025-02-18 00:00:00-05:00,13.7425003051758,13.7425003051758,13.7425003051758,13.7425003051758,12.7239952087402,0,0,0,0
|
||||
2025-02-19 00:00:00-05:00,13.6049995422363,13.6049995422363,13.6049995422363,13.6049995422363,12.5966854095459,0,0,0,0
|
||||
2025-02-20 00:00:00-05:00,13.6724996566772,13.6724996566772,13.6724996566772,13.6724996566772,12.659182548523,0,0,0,0
|
||||
2025-02-21 00:00:00-05:00,13.647500038147,13.647500038147,13.647500038147,13.647500038147,12.6360359191895,0,0,0,0
|
||||
2025-02-24 00:00:00-05:00,13.5349998474121,13.5349998474121,13.5349998474121,13.5349998474121,12.5318737030029,0,0,0,0
|
||||
2025-02-25 00:00:00-05:00,13.647500038147,13.647500038147,13.647500038147,13.647500038147,12.6360359191895,0,0,0,0
|
||||
2025-02-26 00:00:00-05:00,13.7299995422363,13.7299995422363,13.7299995422363,13.7299995422363,12.7124214172363,0,0,0,0
|
||||
2025-02-27 00:00:00-05:00,13.5900001525879,13.5900001525879,13.5900001525879,13.5900001525879,12.5827980041504,0,0,0,0
|
||||
2025-02-28 00:00:00-05:00,13.6549997329712,13.6549997329712,13.6549997329712,13.6549997329712,12.6429796218872,0,0,0,0
|
||||
2025-03-03 00:00:00-05:00,13.6700000762939,13.6700000762939,13.6700000762939,13.6700000762939,12.6568689346313,0,0,0,0
|
||||
2025-03-04 00:00:00-05:00,13.5900001525879,13.5900001525879,13.5900001525879,13.5900001525879,12.5827980041504,0,0,0,0
|
||||
2025-03-05 00:00:00-05:00,13.9575004577637,13.9575004577637,13.9575004577637,13.9575004577637,12.9230613708496,0,0,0,0
|
||||
2025-03-06 00:00:00-05:00,13.9650001525879,13.9650001525879,13.9650001525879,13.9650001525879,12.9300050735474,0,0,0,0
|
||||
2025-03-07 00:00:00-05:00,14.0675001144409,14.0675001144409,14.0675001144409,14.0675001144409,13.0249090194702,0,0,0,0
|
||||
2025-03-10 00:00:00-04:00,13.7775001525879,13.7775001525879,13.7775001525879,13.7775001525879,12.756402015686,0,0,0,0
|
||||
2025-03-11 00:00:00-04:00,13.710000038147,13.710000038147,13.710000038147,13.710000038147,12.6939039230347,0,0,0,0
|
||||
2025-03-12 00:00:00-04:00,13.7674999237061,13.7674999237061,13.7674999237061,13.7674999237061,12.747142791748,0,0,0,0
|
||||
2025-03-13 00:00:00-04:00,13.6875,13.6875,13.6875,13.6875,12.6730718612671,0,0,0,0
|
||||
2025-03-14 00:00:00-04:00,13.9350004196167,13.9350004196167,13.9350004196167,13.9350004196167,12.902229309082,0,0,0,0
|
||||
2025-03-17 00:00:00-04:00,14.1674995422363,14.1674995422363,14.1674995422363,14.1674995422363,13.1174964904785,0,0,0,0
|
||||
2025-03-18 00:00:00-04:00,14.2124996185303,14.2124996185303,14.2124996185303,14.2124996185303,13.159161567688,0,0,0,0
|
||||
2025-03-19 00:00:00-04:00,14.227499961853,14.227499961853,14.227499961853,14.227499961853,13.1730499267578,0,0,0,0
|
||||
2025-03-20 00:00:00-04:00,14.1149997711182,14.1149997711182,14.1149997711182,14.1149997711182,13.0688877105713,0,0,0,0
|
||||
2025-03-21 00:00:00-04:00,14.0124998092651,14.0124998092651,14.0124998092651,14.0124998092651,12.9739847183228,0,0,0,0
|
||||
2025-03-24 00:00:00-04:00,14.0150003433228,14.0150003433228,14.0150003433228,14.0150003433228,12.976300239563,0,0,0,0
|
||||
2025-03-25 00:00:00-04:00,14.0775003433228,14.0775003433228,14.0775003433228,14.0775003433228,13.0341672897339,0,0,0,0
|
||||
2025-03-26 00:00:00-04:00,13.9575004577637,13.9575004577637,13.9575004577637,13.9575004577637,12.9230613708496,0,0,0,0
|
||||
2025-03-27 00:00:00-04:00,13.9549999237061,13.9549999237061,13.9549999237061,13.9549999237061,12.9207458496094,0,0,0,0
|
||||
2025-03-28 00:00:00-04:00,13.8000001907349,13.8000001907349,13.8000001907349,13.8000001907349,12.7772340774536,0,0,0,0
|
||||
2025-03-31 00:00:00-04:00,13.6824998855591,13.6824998855591,13.6824998855591,13.6824998855591,12.6684417724609,0,0,0,0
|
||||
2025-04-01 00:00:00-04:00,13.727499961853,13.727499961853,13.727499961853,13.727499961853,12.7101068496704,0,0,0,0
|
||||
2025-04-02 00:00:00-04:00,13.7475004196167,13.7475004196167,13.7475004196167,13.7475004196167,12.7286252975464,0,0,0,0
|
||||
2025-04-03 00:00:00-04:00,13.4674997329712,13.4674997329712,13.4674997329712,13.4674997329712,12.4693765640259,0,0,0,0
|
||||
2025-04-04 00:00:00-04:00,12.6424999237061,12.6424999237061,12.6424999237061,12.6424999237061,11.7055206298828,0,0,0,0
|
||||
2025-04-07 00:00:00-04:00,12.2799997329712,12.2799997329712,12.2799997329712,12.2799997329712,11.3698863983154,0,0,0,0
|
||||
2025-04-08 00:00:00-04:00,12.1774997711182,12.1774997711182,12.1774997711182,12.1774997711182,11.2749824523926,0,0,0,0
|
||||
2025-04-09 00:00:00-04:00,12.7574996948242,12.7574996948242,12.7574996948242,12.7574996948242,11.8119964599609,0,0,0,0
|
||||
2025-04-10 00:00:00-04:00,12.6899995803833,12.6899995803833,12.6899995803833,12.6899995803833,11.7494993209839,0,0,0,0
|
||||
2025-04-11 00:00:00-04:00,12.9399995803833,12.9399995803833,12.9399995803833,12.9399995803833,11.9809713363647,0,0,0,0
|
||||
2025-04-14 00:00:00-04:00,13.1350002288818,13.1350002288818,13.1350002288818,13.1350002288818,12.1615200042725,0,0,0,0
|
||||
2025-04-15 00:00:00-04:00,13.2425003051758,13.2425003051758,13.2425003051758,13.2425003051758,12.2610521316528,0,0,0,0
|
||||
2025-04-16 00:00:00-04:00,13.1674995422363,13.1674995422363,13.1674995422363,13.1674995422363,12.1916103363037,0,0,0,0
|
||||
2025-04-17 00:00:00-04:00,13.289999961853,13.289999961853,13.289999961853,13.289999961853,12.3050317764282,0,0,0,0
|
||||
2025-04-21 00:00:00-04:00,13.2174997329712,13.2174997329712,13.2174997329712,13.2174997329712,12.237904548645,0,0,0,0
|
||||
2025-04-22 00:00:00-04:00,13.4949998855591,13.4949998855591,13.4949998855591,13.4949998855591,12.4948387145996,0,0,0,0
|
||||
2025-04-23 00:00:00-04:00,13.6125001907349,13.6125001907349,13.6125001907349,13.6125001907349,12.603630065918,0,0,0,0
|
||||
2025-04-24 00:00:00-04:00,13.7924995422363,13.7924995422363,13.7924995422363,13.7924995422363,12.7702894210815,0,0,0,0
|
||||
2025-04-25 00:00:00-04:00,13.835000038147,13.835000038147,13.835000038147,13.835000038147,12.8096399307251,0,0,0,0
|
||||
2025-04-28 00:00:00-04:00,13.9575004577637,13.9575004577637,13.9575004577637,13.9575004577637,12.9230613708496,0,0,0,0
|
||||
2025-04-29 00:00:00-04:00,13.9624996185303,13.9624996185303,13.9624996185303,13.9624996185303,12.9276905059814,0,0,0,0
|
||||
2025-04-30 00:00:00-04:00,13.9650001525879,13.9650001525879,13.9650001525879,13.9650001525879,12.9300050735474,0,0,0,0
|
||||
2025-05-01 00:00:00-04:00,13.9399995803833,13.9399995803833,13.9399995803833,13.9399995803833,12.9068574905396,0,0,0,0
|
||||
2025-05-02 00:00:00-04:00,14.1549997329712,14.1549997329712,14.1549997329712,14.1549997329712,13.1059236526489,0,0,0,0
|
||||
2025-05-05 00:00:00-04:00,14.1674995422363,14.1674995422363,14.1674995422363,14.1674995422363,13.1174964904785,0,0,0,0
|
||||
2025-05-06 00:00:00-04:00,14.2049999237061,14.2049999237061,14.2049999237061,14.2049999237061,13.1522178649902,0,0,0,0
|
||||
2025-05-07 00:00:00-04:00,14.1125001907349,14.1125001907349,14.1125001907349,14.1125001907349,13.0665731430054,0,0,0,0
|
||||
2025-05-08 00:00:00-04:00,14.1199998855591,14.1199998855591,14.1199998855591,14.1199998855591,13.0735177993774,0,0,0,0
|
||||
2025-05-09 00:00:00-04:00,14.2399997711182,14.2399997711182,14.2399997711182,14.2399997711182,13.1846237182617,0,0,0,0
|
||||
2025-05-12 00:00:00-04:00,14.4324998855591,14.4324998855591,14.4324998855591,14.4324998855591,13.3628568649292,0,0,0,0
|
||||
2025-05-13 00:00:00-04:00,14.4849996566772,14.4849996566772,14.4849996566772,14.4849996566772,13.4114656448364,0,0,0,0
|
||||
2025-05-14 00:00:00-04:00,14.4700002670288,14.4700002670288,14.4700002670288,14.4700002670288,13.3975782394409,0,0,0,0
|
||||
2025-05-15 00:00:00-04:00,14.5524997711182,14.5524997711182,14.5524997711182,14.5524997711182,13.4739627838135,0,0,0,0
|
||||
2025-05-16 00:00:00-04:00,14.6000003814697,14.6000003814697,14.6000003814697,14.6000003814697,13.5179433822632,0,0,0,0
|
||||
2025-05-19 00:00:00-04:00,14.710000038147,14.710000038147,14.710000038147,14.710000038147,13.6197910308838,0,0,0,0
|
||||
2025-05-20 00:00:00-04:00,14.772500038147,14.772500038147,14.772500038147,14.772500038147,13.6776580810547,0,0,0,0
|
||||
2025-05-21 00:00:00-04:00,14.6925001144409,14.6925001144409,14.6925001144409,14.6925001144409,13.603588104248,0,0,0,0
|
||||
2025-05-22 00:00:00-04:00,14.6899995803833,14.6899995803833,14.6899995803833,14.6899995803833,13.6012725830078,0,0,0,0
|
||||
2025-05-23 00:00:00-04:00,14.7075004577637,14.7075004577637,14.7075004577637,14.7075004577637,13.6174764633179,0,0,0,0
|
||||
2025-05-27 00:00:00-04:00,14.8649997711182,14.8649997711182,14.8649997711182,14.8649997711182,13.7633028030396,0,0,0,0
|
||||
2025-05-28 00:00:00-04:00,14.7174997329712,14.7174997329712,14.7174997329712,14.7174997329712,13.6267347335815,0,0,0,0
|
||||
2025-05-29 00:00:00-04:00,14.8199996948242,14.8199996948242,14.8199996948242,14.8199996948242,13.7216377258301,0,0,0,0
|
||||
2025-05-30 00:00:00-04:00,14.7799997329712,14.7799997329712,14.7799997329712,14.7799997329712,13.6846027374268,0,0,0,0
|
||||
2025-06-02 00:00:00-04:00,14.8950004577637,14.8950004577637,14.8950004577637,14.8950004577637,13.7910804748535,0,0,0,0
|
||||
2025-06-03 00:00:00-04:00,14.8450002670288,14.8450002670288,14.8450002670288,14.8450002670288,13.7447853088379,0,0,0,0
|
||||
2025-06-04 00:00:00-04:00,14.9300003051758,14.9300003051758,14.9300003051758,14.9300003051758,13.823486328125,0,0,0,0
|
||||
2025-06-05 00:00:00-04:00,14.9700002670288,14.9700002670288,14.9700002670288,14.9700002670288,13.8605213165283,0,0,0,0
|
||||
2025-06-06 00:00:00-04:00,15.0275001525879,15.0275001525879,15.0275001525879,15.0275001525879,13.9137592315674,0,0,0,0
|
||||
2025-06-09 00:00:00-04:00,15.0775003433228,15.0775003433228,15.0775003433228,15.0775003433228,13.960054397583,0,0,0,0
|
||||
2025-06-10 00:00:00-04:00,15.0775003433228,15.0775003433228,15.0775003433228,15.0775003433228,13.960054397583,0,0,0,0
|
||||
2025-06-11 00:00:00-04:00,15.1300001144409,15.1300001144409,15.1300001144409,15.1300001144409,14.0086631774902,0,0,0,0
|
||||
2025-06-12 00:00:00-04:00,15.1925001144409,15.1925001144409,15.1925001144409,15.1925001144409,14.0665311813355,0,0,0,0
|
||||
2025-06-13 00:00:00-04:00,14.9899997711182,14.9899997711182,14.9899997711182,14.9899997711182,13.87903881073,0,0,0,0
|
||||
2025-06-16 00:00:00-04:00,15.1149997711182,15.1149997711182,15.1149997711182,15.1149997711182,13.9947748184204,0,0,0,0
|
||||
2025-06-17 00:00:00-04:00,14.960000038147,14.960000038147,14.960000038147,14.960000038147,13.8512620925903,0,0,0,0
|
||||
2025-06-18 00:00:00-04:00,14.897500038147,14.897500038147,14.897500038147,14.897500038147,13.7933940887451,0,0,0,0
|
||||
2025-06-20 00:00:00-04:00,14.7974996566772,14.7974996566772,14.7974996566772,14.7974996566772,13.7008056640625,0,0,0,0
|
||||
2025-06-23 00:00:00-04:00,14.8675003051758,14.8675003051758,14.8675003051758,14.8675003051758,13.7656183242798,0,0,0,0
|
||||
2025-06-24 00:00:00-04:00,15.0900001525879,15.0900001525879,15.0900001525879,15.0900001525879,13.9716272354126,0,0,0,0
|
||||
2025-06-25 00:00:00-04:00,15.0249996185303,15.0249996185303,15.0249996185303,15.0249996185303,13.9114446640015,0,0,0,0
|
||||
2025-06-26 00:00:00-04:00,15.1424999237061,15.1424999237061,15.1424999237061,15.1424999237061,14.0202360153198,0,0,0,0
|
||||
2025-06-27 00:00:00-04:00,15.2650003433228,15.2650003433228,15.2650003433228,15.2650003433228,14.1336574554443,0,0,0,0
|
||||
2025-06-30 00:00:00-04:00,15.2674999237061,15.2674999237061,15.2674999237061,15.2674999237061,14.1359720230103,0,0,0,0
|
||||
2025-07-01 00:00:00-04:00,15.3149995803833,15.3149995803833,15.3149995803833,15.3149995803833,14.1799516677856,0,0,0,0
|
||||
2025-07-02 00:00:00-04:00,15.3850002288818,15.3850002288818,15.3850002288818,15.3850002288818,14.2447643280029,0,0,0,0
|
||||
2025-07-03 00:00:00-04:00,15.3850002288818,15.3850002288818,15.3850002288818,15.3850002288818,14.2447643280029,0,0,0,0
|
||||
2025-07-07 00:00:00-04:00,15.2600002288818,15.2600002288818,15.2600002288818,15.2600002288818,14.1290283203125,0,0,0,0
|
||||
2025-07-08 00:00:00-04:00,15.3374996185303,15.3374996185303,15.3374996185303,15.3374996185303,14.2007837295532,0,0,0,0
|
||||
2025-07-09 00:00:00-04:00,15.3800001144409,15.3800001144409,15.3800001144409,15.3800001144409,14.2401342391968,0,0,0,0
|
||||
2025-07-10 00:00:00-04:00,15.4300003051758,15.4300003051758,15.4300003051758,15.4300003051758,14.2864294052124,0,0,0,0
|
||||
2025-07-11 00:00:00-04:00,15.3149995803833,15.3149995803833,15.3149995803833,15.3149995803833,14.1799516677856,0,0,0,0
|
||||
2025-07-14 00:00:00-04:00,15.2875003814697,15.2875003814697,15.2875003814697,15.2875003814697,14.1544904708862,0,0,0,0
|
||||
2025-07-15 00:00:00-04:00,15.2299995422363,15.2299995422363,15.2299995422363,15.2299995422363,14.1012516021729,0,0,0,0
|
||||
2025-07-16 00:00:00-04:00,15.2700004577637,15.2700004577637,15.2700004577637,15.2700004577637,14.1382875442505,0,0,0,0
|
||||
2025-07-17 00:00:00-04:00,15.3125,15.3125,15.3125,15.3125,14.1776371002197,0,0,0,0
|
||||
2025-07-18 00:00:00-04:00,15.3199996948242,15.3199996948242,15.3199996948242,15.3199996948242,14.1845808029175,0,0,0,0
|
||||
2025-07-21 00:00:00-04:00,15.3774995803833,15.3774995803833,15.3774995803833,15.3774995803833,14.2378196716309,0,0,0,0
|
||||
2025-07-22 00:00:00-04:00,15.4350004196167,15.4350004196167,15.4350004196167,15.4350004196167,14.2910585403442,0,0,0,0
|
||||
2025-07-23 00:00:00-04:00,15.6975002288818,15.6975002288818,15.6975002288818,15.6975002288818,14.5341033935547,0,0,0,0
|
||||
2025-07-24 00:00:00-04:00,15.7174997329712,15.7174997329712,15.7174997329712,15.7174997329712,14.5526208877563,0,0,0,0
|
||||
2025-07-25 00:00:00-04:00,15.6674995422363,15.6674995422363,15.6674995422363,15.6674995422363,14.506326675415,0,0,0,0
|
||||
2025-07-28 00:00:00-04:00,15.539999961853,15.539999961853,15.539999961853,15.539999961853,14.3882761001587,0,0,0,0
|
||||
2025-07-29 00:00:00-04:00,15.5200004577637,15.5200004577637,15.5200004577637,15.5200004577637,14.3697595596313,0,0,0,0
|
||||
2025-07-30 00:00:00-04:00,15.4350004196167,15.4350004196167,15.4350004196167,15.4350004196167,14.2910585403442,0,0,0,0
|
||||
2025-07-31 00:00:00-04:00,15.2624998092651,15.2624998092651,15.2624998092651,15.2624998092651,14.1313428878784,0,0,0,0
|
||||
2025-08-01 00:00:00-04:00,15.1774997711182,15.1774997711182,15.1774997711182,15.1774997711182,14.0526418685913,0,0,0,0
|
||||
2025-08-04 00:00:00-04:00,15.3424997329712,15.3424997329712,15.3424997329712,15.3424997329712,14.2054138183594,0,0,0,0
|
||||
2025-08-05 00:00:00-04:00,15.352499961853,15.352499961853,15.352499961853,15.352499961853,14.2146730422974,0,0,0,0
|
||||
2025-08-06 00:00:00-04:00,15.3374996185303,15.3374996185303,15.3374996185303,15.3374996185303,14.2007837295532,0,0,0,0
|
||||
2025-08-07 00:00:00-04:00,15.4875001907349,15.4875001907349,15.4875001907349,15.4875001907349,14.3396673202515,0,0,0,0
|
||||
2025-08-08 00:00:00-04:00,15.5299997329712,15.5299997329712,15.5299997329712,15.5299997329712,14.3790168762207,0,0,0,0
|
||||
2025-08-11 00:00:00-04:00,15.5100002288818,15.5100002288818,15.5100002288818,15.5100002288818,14.3605003356934,0,0,0,0
|
||||
2025-08-12 00:00:00-04:00,15.6925001144409,15.6925001144409,15.6925001144409,15.6925001144409,14.5294742584229,0,0,0,0
|
||||
2025-08-13 00:00:00-04:00,15.8299999237061,15.8299999237061,15.8299999237061,15.8299999237061,14.6567831039429,0,0,0,0
|
||||
2025-08-14 00:00:00-04:00,15.7775001525879,15.7775001525879,15.7775001525879,15.7775001525879,14.6081743240356,0,0,0,0
|
||||
2025-08-15 00:00:00-04:00,15.835000038147,15.835000038147,15.835000038147,15.835000038147,14.661413192749,0,0,0,0
|
||||
2025-08-18 00:00:00-04:00,15.8100004196167,15.8100004196167,15.8100004196167,15.8100004196167,14.6382665634155,0,0,0,0
|
||||
2025-08-19 00:00:00-04:00,15.8575000762939,15.8575000762939,15.8575000762939,15.8575000762939,14.6822452545166,0,0,0,0
|
||||
2025-08-20 00:00:00-04:00,15.8824996948242,15.8824996948242,15.8824996948242,15.8824996948242,14.7053918838501,0,0,0,0
|
||||
2025-08-21 00:00:00-04:00,15.8549995422363,15.8549995422363,15.8549995422363,15.8549995422363,14.6799306869507,0,0,0,0
|
||||
2025-08-22 00:00:00-04:00,16.0849990844727,16.0849990844727,16.0849990844727,16.0849990844727,14.8928833007813,0,0,0,0
|
||||
2025-08-25 00:00:00-04:00,15.9624996185303,15.9624996185303,15.9624996185303,15.9624996185303,14.7794628143311,0,0,0,0
|
||||
2025-08-26 00:00:00-04:00,15.8924999237061,15.8924999237061,15.8924999237061,15.8924999237061,14.7146511077881,0,0,0,0
|
||||
2025-08-27 00:00:00-04:00,15.8800001144409,15.8800001144409,15.8800001144409,15.8800001144409,14.7030782699585,0,0,0,0
|
||||
2025-08-28 00:00:00-04:00,15.9099998474121,15.9099998474121,15.9099998474121,15.9099998474121,14.7308540344238,0,0,0,0
|
||||
2025-08-29 00:00:00-04:00,15.8900003433228,15.8900003433228,15.8900003433228,15.8900003433228,14.7123365402222,0,0,0,0
|
||||
2025-09-02 00:00:00-04:00,15.7550001144409,15.7550001144409,15.7550001144409,15.7550001144409,14.5873422622681,0,0,0,0
|
||||
2025-09-03 00:00:00-04:00,15.7550001144409,15.7550001144409,15.7550001144409,15.7550001144409,14.5873422622681,0,0,0,0
|
||||
2025-09-04 00:00:00-04:00,15.7849998474121,15.7849998474121,15.7849998474121,15.7849998474121,14.6151180267334,0,0,0,0
|
||||
2025-09-05 00:00:00-04:00,15.9250001907349,15.9250001907349,15.9250001907349,15.9250001907349,14.744743347168,0,0,0,0
|
||||
2025-09-08 00:00:00-04:00,16.0249996185303,16.0249996185303,16.0249996185303,16.0249996185303,14.8373308181763,0,0,0,0
|
||||
2025-09-09 00:00:00-04:00,16.0575008392334,16.0575008392334,16.0575008392334,16.0575008392334,14.8674230575562,0,0,0,0
|
||||
2025-09-10 00:00:00-04:00,16.0750007629395,16.0750007629395,16.0750007629395,16.0750007629395,14.8836259841919,0,0,0,0
|
||||
2025-09-11 00:00:00-04:00,16.2900009155273,16.2900009155273,16.2900009155273,16.2900009155273,15.0826921463013,0,0,0,0
|
||||
2025-09-12 00:00:00-04:00,16.2299995422363,16.2299995422363,16.2299995422363,16.2299995422363,15.0271377563477,0,0,0,0
|
||||
2025-09-15 00:00:00-04:00,16.3075008392334,16.3075008392334,16.3075008392334,16.3075008392334,15.098895072937,0,0,0,0
|
||||
2025-09-16 00:00:00-04:00,16.3024997711182,16.3024997711182,16.3024997711182,16.3024997711182,15.0942649841309,0,0,0,0
|
||||
2025-09-17 00:00:00-04:00,16.3474998474121,16.3474998474121,16.3474998474121,16.3474998474121,15.1359300613403,0,0,0,0
|
||||
2025-09-18 00:00:00-04:00,16.3125,16.3125,16.3125,16.3125,15.1035232543945,0,0,0,0
|
||||
2025-09-19 00:00:00-04:00,16.2749996185303,16.2749996185303,16.2749996185303,16.2749996185303,15.0688028335571,0,0,0,0
|
||||
2025-09-22 00:00:00-04:00,16.3199996948242,16.3199996948242,16.3199996948242,16.3199996948242,15.1104679107666,0,0,0,0
|
||||
2025-09-23 00:00:00-04:00,16.3250007629395,16.3250007629395,16.3250007629395,16.3250007629395,15.1150979995728,0,0,0,0
|
||||
2025-09-24 00:00:00-04:00,16.2900009155273,16.2900009155273,16.2900009155273,16.2900009155273,15.0826921463013,0,0,0,0
|
||||
2025-09-25 00:00:00-04:00,16.1324996948242,16.1324996948242,16.1324996948242,16.1324996948242,14.936863899231,0,0,0,0
|
||||
2025-09-26 00:00:00-04:00,16.2124996185303,16.2124996185303,16.2124996185303,16.2124996185303,15.0109348297119,0,0,0,0
|
||||
2025-09-29 00:00:00-04:00,16.3274993896484,16.3274993896484,16.3274993896484,16.3274993896484,15.1174116134644,0,0,0,0
|
||||
2025-09-30 00:00:00-04:00,16.4500007629395,16.4500007629395,16.4500007629395,16.4500007629395,15.2308340072632,0,0,0,0
|
||||
2025-10-01 00:00:00-04:00,16.5550003051758,16.5550003051758,16.5550003051758,16.5550003051758,15.3280515670776,0,0,0,0
|
||||
2025-10-02 00:00:00-04:00,16.5349998474121,16.5349998474121,16.5349998474121,16.5349998474121,15.3095331192017,0,0,0,0
|
||||
2025-10-03 00:00:00-04:00,16.625,16.625,16.625,16.625,15.3928632736206,0,0,0,0
|
||||
2025-10-06 00:00:00-04:00,16.6224994659424,16.6224994659424,16.6224994659424,16.6224994659424,15.3905477523804,0,0,0,0
|
||||
2025-10-07 00:00:00-04:00,16.4825000762939,16.4825000762939,16.4825000762939,16.4825000762939,15.2609243392944,0,0,0,0
|
||||
2025-10-08 00:00:00-04:00,16.5300006866455,16.5300006866455,16.5300006866455,16.5300006866455,15.3049049377441,0,0,0,0
|
||||
2025-10-09 00:00:00-04:00,16.4274997711182,16.4274997711182,16.4274997711182,16.4274997711182,15.210000038147,0,0,0,0
|
||||
2025-10-10 00:00:00-04:00,16.1149997711182,16.1149997711182,16.1149997711182,16.1149997711182,14.9206609725952,0,0,0,0
|
||||
2025-10-13 00:00:00-04:00,16.2775001525879,16.2775001525879,16.2775001525879,16.2775001525879,15.071117401123,0,0,0,0
|
||||
2025-10-14 00:00:00-04:00,16.2975006103516,16.2975006103516,16.2975006103516,16.2975006103516,15.089635848999,0,0,0,0
|
||||
2025-10-15 00:00:00-04:00,16.3675003051758,16.3675003051758,16.3675003051758,16.3675003051758,15.154447555542,0,0,0,0
|
||||
2025-10-16 00:00:00-04:00,16.3875007629395,16.3875007629395,16.3875007629395,16.3875007629395,15.172966003418,0,0,0,0
|
||||
2025-10-17 00:00:00-04:00,16.3999996185303,16.3999996185303,16.3999996185303,16.3999996185303,15.1845388412476,0,0,0,0
|
||||
2025-10-20 00:00:00-04:00,16.4750003814697,16.4750003814697,16.4750003814697,16.4750003814697,15.2539806365967,0,0,0,0
|
||||
2025-10-21 00:00:00-04:00,16.4099998474121,16.4099998474121,16.4099998474121,16.4099998474121,15.1937971115112,0,0,0,0
|
||||
2025-10-22 00:00:00-04:00,16.4074993133545,16.4074993133545,16.4074993133545,16.4074993133545,15.1914825439453,0,0,0,0
|
||||
2025-10-23 00:00:00-04:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,15.2400913238525,0,0,0,0
|
||||
2025-10-24 00:00:00-04:00,16.5025005340576,16.5025005340576,16.5025005340576,16.5025005340576,15.2794427871704,0,0,0,0
|
||||
2025-10-27 00:00:00-04:00,16.6000003814697,16.6000003814697,16.6000003814697,16.6000003814697,15.3697166442871,0,0,4,0
|
||||
2025-10-28 00:00:00-04:00,16.5599994659424,16.5599994659424,16.5599994659424,16.5599994659424,15.3326797485352,0,0,0,0
|
||||
2025-10-29 00:00:00-04:00,16.5900001525879,16.5900001525879,16.5900001525879,16.5900001525879,15.3604574203491,0,0,0,0
|
||||
2025-10-30 00:00:00-04:00,16.4400005340576,16.4400005340576,16.4400005340576,16.4400005340576,15.2215747833252,0,0,0,0
|
||||
2025-10-31 00:00:00-04:00,16.4400005340576,16.4400005340576,16.4400005340576,16.4400005340576,15.2215747833252,0,0,0,0
|
||||
2025-11-03 00:00:00-05:00,16.4300003051758,16.4300003051758,16.4300003051758,16.4300003051758,15.2123155593872,0,0,0,0
|
||||
2025-11-04 00:00:00-05:00,16.3199996948242,16.3199996948242,16.3199996948242,16.3199996948242,15.1104679107666,0,0,0,0
|
||||
2025-11-05 00:00:00-05:00,16.3899993896484,16.3899993896484,16.3899993896484,16.3899993896484,15.1752796173096,0,0,0,0
|
||||
2025-11-06 00:00:00-05:00,16.4400005340576,16.4400005340576,16.4400005340576,16.4400005340576,15.2215747833252,0,0,0,0
|
||||
2025-11-07 00:00:00-05:00,16.4899997711182,16.4899997711182,16.4899997711182,16.4899997711182,15.2678680419922,0,0,0,0
|
||||
2025-11-10 00:00:00-05:00,16.6800003051758,16.6800003051758,16.6800003051758,16.6800003051758,15.4437875747681,0,0,0,0
|
||||
2025-11-11 00:00:00-05:00,16.8400001525879,16.8400001525879,16.8400001525879,16.8400001525879,15.59192943573,0,0,0,0
|
||||
2025-11-12 00:00:00-05:00,16.9599990844727,16.9599990844727,16.9599990844727,16.9599990844727,15.7030344009399,0,0,0,0
|
||||
2025-11-13 00:00:00-05:00,16.8199996948242,16.8199996948242,16.8199996948242,16.8199996948242,15.573410987854,0,0,0,0
|
||||
2025-11-14 00:00:00-05:00,16.6599998474121,16.6599998474121,16.6599998474121,16.6599998474121,15.4252691268921,0,0,0,0
|
||||
2025-11-17 00:00:00-05:00,16.4899997711182,16.4899997711182,16.4899997711182,16.4899997711182,15.2678680419922,0,0,0,0
|
||||
2025-11-18 00:00:00-05:00,16.3299999237061,16.3299999237061,16.3299999237061,16.3299999237061,15.1197271347046,0,0,0,0
|
||||
2025-11-19 00:00:00-05:00,16.2299995422363,16.2299995422363,16.2299995422363,16.2299995422363,15.0271377563477,0,0,0,0
|
||||
2025-11-20 00:00:00-05:00,16.0699996948242,16.0699996948242,16.0699996948242,16.0699996948242,14.8789958953857,0,0,0,0
|
||||
2025-11-21 00:00:00-05:00,16.25,16.25,16.25,16.25,15.0456562042236,0,0,0,0
|
||||
2025-11-24 00:00:00-05:00,16.3099994659424,16.3099994659424,16.3099994659424,16.3099994659424,15.1012086868286,0,0,0,0
|
||||
2025-11-25 00:00:00-05:00,16.5100002288818,16.5100002288818,16.5100002288818,16.5100002288818,15.2863864898682,0,0,0,0
|
||||
2025-11-26 00:00:00-05:00,16.6599998474121,16.6599998474121,16.6599998474121,16.6599998474121,15.4252691268921,0,0,0,0
|
||||
2025-11-28 00:00:00-05:00,16.7299995422363,16.7299995422363,16.7299995422363,16.7299995422363,15.4900808334351,0,0,0,0
|
||||
2025-12-01 00:00:00-05:00,16.6900005340576,16.6900005340576,16.6900005340576,16.6900005340576,15.4530467987061,0,0,0,0
|
||||
2025-12-02 00:00:00-05:00,16.7700004577637,16.7700004577637,16.7700004577637,16.7700004577637,15.5271167755127,0,0,0,0
|
||||
2025-12-03 00:00:00-05:00,16.8199996948242,16.8199996948242,16.8199996948242,16.8199996948242,15.573410987854,0,0,0,0
|
||||
2025-12-04 00:00:00-05:00,16.8799991607666,16.8799991607666,16.8799991607666,16.8799991607666,15.628963470459,0,0,0,0
|
||||
2025-12-05 00:00:00-05:00,16.8400001525879,16.8400001525879,16.8400001525879,16.8400001525879,15.59192943573,0,0,0,0
|
||||
2025-12-08 00:00:00-05:00,16.8600006103516,16.8600006103516,16.8600006103516,16.8600006103516,15.6104469299316,0,0,0,0
|
||||
2025-12-09 00:00:00-05:00,16.8299999237061,16.8299999237061,16.8299999237061,16.8299999237061,15.582670211792,0,0,0,0
|
||||
2025-12-10 00:00:00-05:00,16.9500007629395,16.9500007629395,16.9500007629395,16.9500007629395,15.6937770843506,0,0,0,0
|
||||
2025-12-11 00:00:00-05:00,17.0799999237061,17.0799999237061,17.0799999237061,17.0799999237061,15.8141412734985,0,0,0,0
|
||||
2025-12-12 00:00:00-05:00,17.0200004577637,17.0200004577637,17.0200004577637,17.0200004577637,15.7585887908936,0,0,0,0
|
||||
2025-12-15 00:00:00-05:00,17.0900001525879,17.0900001525879,17.0900001525879,17.0900001525879,15.8234004974365,0,0,0,0
|
||||
2025-12-16 00:00:00-05:00,16.9899997711182,16.9899997711182,16.9899997711182,16.9899997711182,15.7308120727539,0,0,0,0
|
||||
2025-12-17 00:00:00-05:00,16.9200000762939,16.9200000762939,16.9200000762939,16.9200000762939,15.6659994125366,0,0,0,0
|
||||
2025-12-18 00:00:00-05:00,16.2199993133545,16.2199993133545,16.2199993133545,16.2199993133545,16.2199993133545,0,0.837,0,0.417
|
||||
2025-12-19 00:00:00-05:00,16.2999992370605,16.2999992370605,16.2999992370605,16.2999992370605,16.2999992370605,0,0,0,0
|
||||
2025-12-22 00:00:00-05:00,16.3700008392334,16.3700008392334,16.3700008392334,16.3700008392334,16.3700008392334,0,0,0,0
|
||||
2025-12-23 00:00:00-05:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,0,0,0,0
|
||||
2025-12-24 00:00:00-05:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,0,0,0,0
|
||||
2025-12-26 00:00:00-05:00,16.5300006866455,16.5300006866455,16.5300006866455,16.5300006866455,16.5300006866455,0,0,0,0
|
||||
2025-12-29 00:00:00-05:00,16.5100002288818,16.5100002288818,16.5100002288818,16.5100002288818,16.5100002288818,0,0,0,0
|
||||
2025-12-30 00:00:00-05:00,16.5400009155273,16.5400009155273,16.5400009155273,16.5400009155273,16.5400009155273,0,0,0,0
|
||||
2025-12-31 00:00:00-05:00,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,16.4599990844727,0,0,0,0
|
||||
2026-01-02 00:00:00-05:00,16.6299991607666,16.6299991607666,16.6299991607666,16.6299991607666,16.6299991607666,0,0,0,0
|
||||
2026-01-05 00:00:00-05:00,16.7900009155273,16.7900009155273,16.7900009155273,16.7900009155273,16.7900009155273,0,0,0,0
|
||||
2026-01-06 00:00:00-05:00,16.8299999237061,16.8299999237061,16.8299999237061,16.8299999237061,16.8299999237061,0,0,0,0
|
||||
2026-01-07 00:00:00-05:00,16.6900005340576,16.6900005340576,16.6900005340576,16.6900005340576,16.6900005340576,0,0,0,0
|
||||
2026-01-08 00:00:00-05:00,16.7600002288818,16.7600002288818,16.7600002288818,16.7600002288818,16.7600002288818,0,0,0,0
|
||||
2026-01-09 00:00:00-05:00,16.8099994659424,16.8099994659424,16.8099994659424,16.8099994659424,16.8099994659424,0,0,0,0
|
||||
|
1257
tests/data/JENYX-1d-cg-double-count-fixed.csv
Normal file
1257
tests/data/JENYX-1d-cg-double-count-fixed.csv
Normal file
File diff suppressed because it is too large
Load Diff
1257
tests/data/JENYX-1d-cg-double-count.csv
Normal file
1257
tests/data/JENYX-1d-cg-double-count.csv
Normal file
File diff suppressed because it is too large
Load Diff
503
tests/data/VWILX-1d-cg-double-count-fixed.csv
Normal file
503
tests/data/VWILX-1d-cg-double-count-fixed.csv
Normal file
@@ -0,0 +1,503 @@
|
||||
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits,Capital Gains
|
||||
2024-01-10 00:00:00-05:00,100.029998779297,100.029998779297,100.029998779297,100.029998779297,85.4241455239785,0,0,0,0
|
||||
2024-01-11 00:00:00-05:00,100.25,100.25,100.25,100.25,85.6120233258593,0,0,0,0
|
||||
2024-01-12 00:00:00-05:00,100.440002441406,100.440002441406,100.440002441406,100.440002441406,85.7742826121002,0,0,0,0
|
||||
2024-01-16 00:00:00-05:00,98.7099990844727,98.7099990844727,98.7099990844727,98.7099990844727,84.2968852280841,0,0,0,0
|
||||
2024-01-17 00:00:00-05:00,97.0599975585938,97.0599975585938,97.0599975585938,97.0599975585938,82.8878082293684,0,0,0,0
|
||||
2024-01-18 00:00:00-05:00,98.0299987792969,98.0299987792969,98.0299987792969,98.0299987792969,83.7161749838117,0,0,0,0
|
||||
2024-01-19 00:00:00-05:00,98.7699966430664,98.7699966430664,98.7699966430664,98.7699966430664,84.3481222593641,0,0,0,0
|
||||
2024-01-22 00:00:00-05:00,98.7600021362305,98.7600021362305,98.7600021362305,98.7600021362305,84.3395870977445,0,0,0,0
|
||||
2024-01-23 00:00:00-05:00,99.370002746582,99.370002746582,99.370002746582,99.370002746582,84.8605186337266,0,0,0,0
|
||||
2024-01-24 00:00:00-05:00,100.410003662109,100.410003662109,100.410003662109,100.410003662109,85.7486640964602,0,0,0,0
|
||||
2024-01-25 00:00:00-05:00,100.349998474121,100.349998474121,100.349998474121,100.349998474121,85.6974205497896,0,0,0,0
|
||||
2024-01-26 00:00:00-05:00,100.839996337891,100.839996337891,100.839996337891,100.839996337891,86.1158715078211,0,0,0,0
|
||||
2024-01-29 00:00:00-05:00,101.190002441406,101.190002441406,101.190002441406,101.190002441406,86.4147715646627,0,0,0,0
|
||||
2024-01-30 00:00:00-05:00,100.410003662109,100.410003662109,100.410003662109,100.410003662109,85.7486640964602,0,0,0,0
|
||||
2024-01-31 00:00:00-05:00,99.2799987792969,99.2799987792969,99.2799987792969,99.2799987792969,84.783656571416,0,0,0,0
|
||||
2024-02-01 00:00:00-05:00,100.800003051758,100.800003051758,100.800003051758,100.800003051758,86.0817178305614,0,0,0,0
|
||||
2024-02-02 00:00:00-05:00,100.120002746582,100.120002746582,100.120002746582,100.120002746582,85.5010075862891,0,0,0,0
|
||||
2024-02-05 00:00:00-05:00,100.269996643066,100.269996643066,100.269996643066,100.269996643066,85.6291001644892,0,0,0,0
|
||||
2024-02-06 00:00:00-05:00,101.080001831055,101.080001831055,101.080001831055,101.080001831055,86.3208326637223,0,0,0,0
|
||||
2024-02-07 00:00:00-05:00,101.860000610352,101.860000610352,101.860000610352,101.860000610352,86.9869401319248,0,0,0,0
|
||||
2024-02-08 00:00:00-05:00,102.720001220703,102.720001220703,102.720001220703,102.720001220703,87.7213679854278,0,0,0,0
|
||||
2024-02-09 00:00:00-05:00,103.440002441406,103.440002441406,103.440002441406,103.440002441406,88.3362384223503,0,0,0,0
|
||||
2024-02-12 00:00:00-05:00,103.540000915527,103.540000915527,103.540000915527,103.540000915527,88.4216356462806,0,0,0,0
|
||||
2024-02-13 00:00:00-05:00,101.23999786377,101.23999786377,101.23999786377,101.23999786377,86.4574669189325,0,0,0,0
|
||||
2024-02-14 00:00:00-05:00,103.01000213623,103.01000213623,103.01000213623,103.01000213623,87.9690244955988,0,0,0,0
|
||||
2024-02-15 00:00:00-05:00,104.330001831055,104.330001831055,104.330001831055,104.330001831055,89.0962847914933,0,0,0,0
|
||||
2024-02-16 00:00:00-05:00,104.349998474121,104.349998474121,104.349998474121,104.349998474121,89.1133616301231,0,0,0,0
|
||||
2024-02-20 00:00:00-05:00,103.480003356934,103.480003356934,103.480003356934,103.480003356934,88.3703986150005,0,0,0,0
|
||||
2024-02-21 00:00:00-05:00,103.75,103.75,103.75,103.75,88.6009717711512,0,0,0,0
|
||||
2024-02-22 00:00:00-05:00,106.080001831055,106.080001831055,106.080001831055,106.080001831055,90.5907590141392,0,0,0,0
|
||||
2024-02-23 00:00:00-05:00,105.269996643066,105.269996643066,105.269996643066,105.269996643066,89.8990265149061,0,0,0,0
|
||||
2024-02-26 00:00:00-05:00,105.349998474121,105.349998474121,105.349998474121,105.349998474121,89.9673469002065,0,0,0,0
|
||||
2024-02-27 00:00:00-05:00,105.930000305176,105.930000305176,105.930000305176,105.930000305176,90.4626599205486,0,0,0,0
|
||||
2024-02-28 00:00:00-05:00,105.209999084473,105.209999084473,105.209999084473,105.209999084473,89.8477894836261,0,0,0,0
|
||||
2024-02-29 00:00:00-05:00,105.519996643066,105.519996643066,105.519996643066,105.519996643066,90.112522832427,0,0,0,0
|
||||
2024-03-01 00:00:00-05:00,107.01000213623,107.01000213623,107.01000213623,107.01000213623,91.3849655759324,0,0,0,0
|
||||
2024-03-04 00:00:00-05:00,106.449996948242,106.449996948242,106.449996948242,106.449996948242,90.9067293942201,0,0,0,0
|
||||
2024-03-05 00:00:00-05:00,105.23999786377,105.23999786377,105.23999786377,105.23999786377,89.8734079992661,0,0,0,0
|
||||
2024-03-06 00:00:00-05:00,106.629997253418,106.629997253418,106.629997253418,106.629997253418,91.0604470034508,0,0,0,0
|
||||
2024-03-07 00:00:00-05:00,108.180000305176,108.180000305176,108.180000305176,108.180000305176,92.3841267782362,0,0,0,0
|
||||
2024-03-08 00:00:00-05:00,106.98999786377,106.98999786377,106.98999786377,106.98999786377,91.367882221912,0,0,0,0
|
||||
2024-03-11 00:00:00-04:00,107.110000610352,107.110000610352,107.110000610352,107.110000610352,91.4703627998626,0,0,0,0
|
||||
2024-03-12 00:00:00-04:00,108.73999786377,108.73999786377,108.73999786377,108.73999786377,92.8623564445579,0,0,0,0
|
||||
2024-03-13 00:00:00-04:00,108.550003051758,108.550003051758,108.550003051758,108.550003051758,92.7001036737077,0,0,0,0
|
||||
2024-03-14 00:00:00-04:00,107.199996948242,107.199996948242,107.199996948242,107.199996948242,91.5472183467827,0,0,0,0
|
||||
2024-03-15 00:00:00-04:00,106.120002746582,106.120002746582,106.120002746582,106.120002746582,90.6249192067894,0,0,0,0
|
||||
2024-03-18 00:00:00-04:00,106.389999389648,106.389999389648,106.389999389648,106.389999389648,90.8554923629401,0,0,0,0
|
||||
2024-03-19 00:00:00-04:00,106.459999084473,106.459999084473,106.459999084473,106.459999084473,90.9152710712303,0,0,0,0
|
||||
2024-03-20 00:00:00-04:00,107.76000213623,107.76000213623,107.76000213623,107.76000213623,92.0254545284949,0,0,0,0
|
||||
2024-03-21 00:00:00-04:00,108.040000915527,108.040000915527,108.040000915527,108.040000915527,92.2645693616558,0,0,0,0
|
||||
2024-03-22 00:00:00-04:00,107.949996948242,107.949996948242,107.949996948242,107.949996948242,92.1877072993452,0,0,0,0
|
||||
2024-03-25 00:00:00-04:00,107.790000915527,107.790000915527,107.790000915527,107.790000915527,92.0510730441349,0,0,0,0
|
||||
2024-03-26 00:00:00-04:00,107.559997558594,107.559997558594,107.559997558594,107.559997558594,91.8546535652439,0,0,0,0
|
||||
2024-03-27 00:00:00-04:00,107.650001525879,107.650001525879,107.650001525879,107.650001525879,91.9315156275545,0,0,0,0
|
||||
2024-03-28 00:00:00-04:00,107.199996948242,107.199996948242,107.199996948242,107.199996948242,91.5472183467827,0,0,0,0
|
||||
2024-04-01 00:00:00-04:00,107.290000915527,107.290000915527,107.290000915527,107.290000915527,91.6240804090932,0,0,0,0
|
||||
2024-04-02 00:00:00-04:00,106.790000915527,106.790000915527,106.790000915527,106.790000915527,91.1970877740516,0,0,0,0
|
||||
2024-04-03 00:00:00-04:00,107.290000915527,107.290000915527,107.290000915527,107.290000915527,91.6240804090932,0,0,0,0
|
||||
2024-04-04 00:00:00-04:00,106.400001525879,106.400001525879,106.400001525879,106.400001525879,90.8640340399503,0,0,0,0
|
||||
2024-04-05 00:00:00-04:00,106.959999084473,106.959999084473,106.959999084473,106.959999084473,91.342263706272,0,0,0,0
|
||||
2024-04-08 00:00:00-04:00,107.470001220703,107.470001220703,107.470001220703,107.470001220703,91.7777980183239,0,0,0,0
|
||||
2024-04-09 00:00:00-04:00,107.879997253418,107.879997253418,107.879997253418,107.879997253418,92.127928591055,0,0,0,0
|
||||
2024-04-10 00:00:00-04:00,106.569999694824,106.569999694824,106.569999694824,106.569999694824,91.0092099721707,0,0,0,0
|
||||
2024-04-11 00:00:00-04:00,107.400001525879,107.400001525879,107.400001525879,107.400001525879,91.7180193100337,0,0,0,0
|
||||
2024-04-12 00:00:00-04:00,105.080001831055,105.080001831055,105.080001831055,105.080001831055,89.7367737440558,0,0,0,0
|
||||
2024-04-15 00:00:00-04:00,104.309997558594,104.309997558594,104.309997558594,104.309997558594,89.0792014374729,0,0,0,0
|
||||
2024-04-16 00:00:00-04:00,103.980003356934,103.980003356934,103.980003356934,103.980003356934,88.7973912500422,0,0,0,0
|
||||
2024-04-17 00:00:00-04:00,103.279998779297,103.279998779297,103.279998779297,103.279998779297,88.1995976517495,0,0,0,0
|
||||
2024-04-18 00:00:00-04:00,102.480003356934,102.480003356934,102.480003356934,102.480003356934,87.5164133449171,0,0,0,0
|
||||
2024-04-19 00:00:00-04:00,101.139999389648,101.139999389648,101.139999389648,101.139999389648,86.3720696950023,0,0,0,0
|
||||
2024-04-22 00:00:00-04:00,102.580001831055,102.580001831055,102.580001831055,102.580001831055,87.6018105688474,0,0,0,0
|
||||
2024-04-23 00:00:00-04:00,104.879997253418,104.879997253418,104.879997253418,104.879997253418,89.5659727808048,0,0,0,0
|
||||
2024-04-24 00:00:00-04:00,104.660003662109,104.660003662109,104.660003662109,104.660003662109,89.3781014943145,0,0,0,0
|
||||
2024-04-25 00:00:00-04:00,103.930000305176,103.930000305176,103.930000305176,103.930000305176,88.7546893803818,0,0,0,0
|
||||
2024-04-26 00:00:00-04:00,105.23999786377,105.23999786377,105.23999786377,105.23999786377,89.8734079992661,0,0,0,0
|
||||
2024-04-29 00:00:00-04:00,105.75,105.75,105.75,105.75,90.308942311318,0,0,0,0
|
||||
2024-04-30 00:00:00-04:00,103.949996948242,103.949996948242,103.949996948242,103.949996948242,88.7717662190117,0,0,0,0
|
||||
2024-05-01 00:00:00-04:00,103.779998779297,103.779998779297,103.779998779297,103.779998779297,88.6265902867912,0,0,0,0
|
||||
2024-05-02 00:00:00-04:00,106.279998779297,106.279998779297,106.279998779297,106.279998779297,90.7615534619997,0,0,0,0
|
||||
2024-05-03 00:00:00-04:00,107.970001220703,107.970001220703,107.970001220703,107.970001220703,92.2047906533656,0,0,0,0
|
||||
2024-05-06 00:00:00-04:00,108.73999786377,108.73999786377,108.73999786377,108.73999786377,92.8623564445579,0,0,0,0
|
||||
2024-05-07 00:00:00-04:00,108.669998168945,108.669998168945,108.669998168945,108.669998168945,92.8025777362677,0,0,0,0
|
||||
2024-05-08 00:00:00-04:00,108.230003356934,108.230003356934,108.230003356934,108.230003356934,92.4268286478966,0,0,0,0
|
||||
2024-05-09 00:00:00-04:00,108.639999389648,108.639999389648,108.639999389648,108.639999389648,92.7769592206277,0,0,0,0
|
||||
2024-05-10 00:00:00-04:00,108.819999694824,108.819999694824,108.819999694824,108.819999694824,92.9306768298583,0,0,0,0
|
||||
2024-05-13 00:00:00-04:00,109.089996337891,109.089996337891,109.089996337891,109.089996337891,93.161249986009,0,0,0,0
|
||||
2024-05-14 00:00:00-04:00,110.180000305176,110.180000305176,110.180000305176,110.180000305176,94.092097318403,0,0,0,0
|
||||
2024-05-15 00:00:00-04:00,111.889999389648,111.889999389648,111.889999389648,111.889999389648,95.5524113483987,0,0,0,0
|
||||
2024-05-16 00:00:00-04:00,111.449996948242,111.449996948242,111.449996948242,111.449996948242,95.176655744637,0,0,0,0
|
||||
2024-05-17 00:00:00-04:00,111.470001220703,111.470001220703,111.470001220703,111.470001220703,95.1937390986574,0,0,0,0
|
||||
2024-05-20 00:00:00-04:00,112.150001525879,112.150001525879,112.150001525879,112.150001525879,95.7744493429297,0,0,0,0
|
||||
2024-05-21 00:00:00-04:00,111.660003662109,111.660003662109,111.660003662109,111.660003662109,95.3559983848982,0,0,0,0
|
||||
2024-05-22 00:00:00-04:00,111.459999084473,111.459999084473,111.459999084473,111.459999084473,95.1851974216472,0,0,0,0
|
||||
2024-05-23 00:00:00-04:00,111.360000610352,111.360000610352,111.360000610352,111.360000610352,95.099800197717,0,0,0,0
|
||||
2024-05-24 00:00:00-04:00,112.25,112.25,112.25,112.25,95.85984656686,0,0,0,0
|
||||
2024-05-28 00:00:00-04:00,112.25,112.25,112.25,112.25,95.85984656686,0,0,0,0
|
||||
2024-05-29 00:00:00-04:00,110.459999084473,110.459999084473,110.459999084473,110.459999084473,94.3312121515638,0,0,0,0
|
||||
2024-05-30 00:00:00-04:00,110.680000305176,110.680000305176,110.680000305176,110.680000305176,94.5190899534447,0,0,0,0
|
||||
2024-05-31 00:00:00-04:00,110.790000915527,110.790000915527,110.790000915527,110.790000915527,94.6130288543851,0,0,0,0
|
||||
2024-06-03 00:00:00-04:00,111.580001831055,111.580001831055,111.580001831055,111.580001831055,95.2876779995978,0,0,0,0
|
||||
2024-06-04 00:00:00-04:00,111.139999389648,111.139999389648,111.139999389648,111.139999389648,94.9119223958362,0,0,0,0
|
||||
2024-06-05 00:00:00-04:00,113.23999786377,113.23999786377,113.23999786377,113.23999786377,96.7052901599332,0,0,0,0
|
||||
2024-06-06 00:00:00-04:00,113.720001220703,113.720001220703,113.720001220703,113.720001220703,97.115205956345,0,0,0,0
|
||||
2024-06-07 00:00:00-04:00,112.059997558594,112.059997558594,112.059997558594,112.059997558594,95.6975872806192,0,0,0,0
|
||||
2024-06-10 00:00:00-04:00,112.379997253418,112.379997253418,112.379997253418,112.379997253418,95.9708623064302,0,0,0,0
|
||||
2024-06-11 00:00:00-04:00,111.599998474121,111.599998474121,111.599998474121,111.599998474121,95.3047548382277,0,0,0,0
|
||||
2024-06-12 00:00:00-04:00,113.059997558594,113.059997558594,113.059997558594,113.059997558594,96.5515725507025,0,0,0,0
|
||||
2024-06-13 00:00:00-04:00,111.959999084473,111.959999084473,111.959999084473,111.959999084473,95.6121900566889,0,0,0,0
|
||||
2024-06-14 00:00:00-04:00,111.040000915527,111.040000915527,111.040000915527,111.040000915527,94.8265251719059,0,0,0,0
|
||||
2024-06-17 00:00:00-04:00,111.150001525879,111.150001525879,111.150001525879,111.150001525879,94.9204640728464,0,0,0,0
|
||||
2024-06-18 00:00:00-04:00,111.220001220703,111.220001220703,111.220001220703,111.220001220703,94.9802427811366,0,0,0,0
|
||||
2024-06-20 00:00:00-04:00,111.019996643066,111.019996643066,111.019996643066,111.019996643066,94.8094418178856,0,0,0,0
|
||||
2024-06-21 00:00:00-04:00,110.389999389648,110.389999389648,110.389999389648,110.389999389648,94.2714334432736,0,0,0,0
|
||||
2024-06-24 00:00:00-04:00,110.51000213623,110.51000213623,110.51000213623,110.51000213623,94.3739140212242,0,0,0,0
|
||||
2024-06-25 00:00:00-04:00,111.389999389648,111.389999389648,111.389999389648,111.389999389648,95.125418713357,0,0,0,0
|
||||
2024-06-26 00:00:00-04:00,110.73999786377,110.73999786377,110.73999786377,110.73999786377,94.5703269847247,0,0,0,0
|
||||
2024-06-27 00:00:00-04:00,110.25,110.25,110.25,110.25,94.1518760266932,0,0,0,0
|
||||
2024-06-28 00:00:00-04:00,109.720001220703,109.720001220703,109.720001220703,109.720001220703,93.6992648760115,0,0,0,0
|
||||
2024-07-01 00:00:00-04:00,109.650001525879,109.650001525879,109.650001525879,109.650001525879,93.6394861677213,0,0,0,0
|
||||
2024-07-02 00:00:00-04:00,110.069999694824,110.069999694824,110.069999694824,110.069999694824,93.9981584174626,0,0,0,0
|
||||
2024-07-03 00:00:00-04:00,111.51000213623,111.51000213623,111.51000213623,111.51000213623,95.2278992913076,0,0,0,0
|
||||
2024-07-05 00:00:00-04:00,112.48999786377,112.48999786377,112.48999786377,112.48999786377,96.0648012073706,0,0,0,0
|
||||
2024-07-08 00:00:00-04:00,112.169998168945,112.169998168945,112.169998168945,112.169998168945,95.7915261815596,0,0,0,0
|
||||
2024-07-09 00:00:00-04:00,112.389999389648,112.389999389648,112.389999389648,112.389999389648,95.9794039834404,0,0,0,0
|
||||
2024-07-10 00:00:00-04:00,113.769996643066,113.769996643066,113.769996643066,113.769996643066,97.1579013106149,0,0,0,0
|
||||
2024-07-11 00:00:00-04:00,113.860000610352,113.860000610352,113.860000610352,113.860000610352,97.2347633729255,0,0,0,0
|
||||
2024-07-12 00:00:00-04:00,115.230003356934,115.230003356934,115.230003356934,115.230003356934,98.4047255384803,0,0,0,0
|
||||
2024-07-15 00:00:00-04:00,113.779998779297,113.779998779297,113.779998779297,113.779998779297,97.1664429876251,0,0,0,0
|
||||
2024-07-16 00:00:00-04:00,114.279998779297,114.279998779297,114.279998779297,114.279998779297,97.5934356226668,0,0,0,0
|
||||
2024-07-17 00:00:00-04:00,111.639999389648,111.639999389648,111.639999389648,111.639999389648,95.3389150308779,0,0,0,0
|
||||
2024-07-18 00:00:00-04:00,110.540000915527,110.540000915527,110.540000915527,110.540000915527,94.3995325368642,0,0,0,0
|
||||
2024-07-19 00:00:00-04:00,109.949996948242,109.949996948242,109.949996948242,109.949996948242,93.895677839512,0,0,0,0
|
||||
2024-07-22 00:00:00-04:00,111.51000213623,111.51000213623,111.51000213623,111.51000213623,95.2278992913076,0,0,0,0
|
||||
2024-07-23 00:00:00-04:00,111.459999084473,111.459999084473,111.459999084473,111.459999084473,95.1851974216472,0,0,0,0
|
||||
2024-07-24 00:00:00-04:00,108.900001525879,108.900001525879,108.900001525879,108.900001525879,92.9989972151587,0,0,0,0
|
||||
2024-07-25 00:00:00-04:00,108.080001831055,108.080001831055,108.080001831055,108.080001831055,92.298729554306,0,0,0,0
|
||||
2024-07-26 00:00:00-04:00,109.48999786377,109.48999786377,109.48999786377,109.48999786377,93.5028453971205,0,0,0,0
|
||||
2024-07-29 00:00:00-04:00,108.769996643066,108.769996643066,108.769996643066,108.769996643066,92.8879749601979,0,0,0,0
|
||||
2024-07-30 00:00:00-04:00,108.5,108.5,108.5,108.5,92.6574018040473,0,0,0,0
|
||||
2024-07-31 00:00:00-04:00,111.089996337891,111.089996337891,111.089996337891,111.089996337891,94.8692205261758,0,0,0,0
|
||||
2024-08-01 00:00:00-04:00,107.879997253418,107.879997253418,107.879997253418,107.879997253418,92.127928591055,0,0,0,0
|
||||
2024-08-02 00:00:00-04:00,105.830001831055,105.830001831055,105.830001831055,105.830001831055,90.3772626966184,0,0,0,0
|
||||
2024-08-05 00:00:00-04:00,103.870002746582,103.870002746582,103.870002746582,103.870002746582,88.7034523491018,0,0,0,0
|
||||
2024-08-06 00:00:00-04:00,104.76000213623,104.76000213623,104.76000213623,104.76000213623,89.4634987182448,0,0,0,0
|
||||
2024-08-07 00:00:00-04:00,105.199996948242,105.199996948242,105.199996948242,105.199996948242,89.8392478066159,0,0,0,0
|
||||
2024-08-08 00:00:00-04:00,107.900001525879,107.900001525879,107.900001525879,107.900001525879,92.1450119450754,0,0,0,0
|
||||
2024-08-09 00:00:00-04:00,108.180000305176,108.180000305176,108.180000305176,108.180000305176,92.3841267782362,0,0,0,0
|
||||
2024-08-12 00:00:00-04:00,108.069999694824,108.069999694824,108.069999694824,108.069999694824,92.2901878772958,0,0,0,0
|
||||
2024-08-13 00:00:00-04:00,109.900001525879,109.900001525879,109.900001525879,109.900001525879,93.8529824852421,0,0,0,0
|
||||
2024-08-14 00:00:00-04:00,109.779998779297,109.779998779297,109.779998779297,109.779998779297,93.7505019072915,0,0,0,0
|
||||
2024-08-15 00:00:00-04:00,112.300003051758,112.300003051758,112.300003051758,112.300003051758,95.9025484365204,0,0,0,0
|
||||
2024-08-16 00:00:00-04:00,113,113,113,113,96.5003355194225,0,0,0,0
|
||||
2024-08-19 00:00:00-04:00,114.830001831055,114.830001831055,114.830001831055,114.830001831055,98.0631301273688,0,0,0,0
|
||||
2024-08-20 00:00:00-04:00,113.830001831055,113.830001831055,113.830001831055,113.830001831055,97.2091448572854,0,0,0,0
|
||||
2024-08-21 00:00:00-04:00,114.959999084473,114.959999084473,114.959999084473,114.959999084473,98.1741458669391,0,0,0,0
|
||||
2024-08-22 00:00:00-04:00,113.819999694824,113.819999694824,113.819999694824,113.819999694824,97.2006031802753,0,0,0,0
|
||||
2024-08-23 00:00:00-04:00,115.139999389648,115.139999389648,115.139999389648,115.139999389648,98.3278634761697,0,0,0,0
|
||||
2024-08-26 00:00:00-04:00,113.629997253418,113.629997253418,113.629997253418,113.629997253418,97.0383438940344,0,0,0,0
|
||||
2024-08-27 00:00:00-04:00,113.970001220703,113.970001220703,113.970001220703,113.970001220703,97.3287022738659,0,0,0,0
|
||||
2024-08-28 00:00:00-04:00,112.879997253418,112.879997253418,112.879997253418,112.879997253418,96.3978549414719,0,0,0,0
|
||||
2024-08-29 00:00:00-04:00,113.629997253418,113.629997253418,113.629997253418,113.629997253418,97.0383438940344,0,0,0,0
|
||||
2024-08-30 00:00:00-04:00,113.870002746582,113.870002746582,113.870002746582,113.870002746582,97.2433050499356,0,0,0,0
|
||||
2024-09-03 00:00:00-04:00,110.930000305176,110.930000305176,110.930000305176,110.930000305176,94.7325862709655,0,0,0,0
|
||||
2024-09-04 00:00:00-04:00,110.569999694824,110.569999694824,110.569999694824,110.569999694824,94.4251510525043,0,0,0,0
|
||||
2024-09-05 00:00:00-04:00,110.690002441406,110.690002441406,110.690002441406,110.690002441406,94.5276316304549,0,0,0,0
|
||||
2024-09-06 00:00:00-04:00,108.099998474121,108.099998474121,108.099998474121,108.099998474121,92.3158063929358,0,0,0,0
|
||||
2024-09-09 00:00:00-04:00,109.610000610352,109.610000610352,109.610000610352,109.610000610352,93.6053259750711,0,0,0,0
|
||||
2024-09-10 00:00:00-04:00,109.330001831055,109.330001831055,109.330001831055,109.330001831055,93.3662111419102,0,0,0,0
|
||||
2024-09-11 00:00:00-04:00,111.069999694824,111.069999694824,111.069999694824,111.069999694824,94.852143687546,0,0,0,0
|
||||
2024-09-12 00:00:00-04:00,111.970001220703,111.970001220703,111.970001220703,111.970001220703,95.6207317336991,0,0,0,0
|
||||
2024-09-13 00:00:00-04:00,112.319999694824,112.319999694824,112.319999694824,112.319999694824,95.9196252751502,0,0,0,0
|
||||
2024-09-16 00:00:00-04:00,112.449996948242,112.449996948242,112.449996948242,112.449996948242,96.0306410147204,0,0,0,0
|
||||
2024-09-17 00:00:00-04:00,112.650001525879,112.650001525879,112.650001525879,112.650001525879,96.2014419779714,0,0,0,0
|
||||
2024-09-18 00:00:00-04:00,112.360000610352,112.360000610352,112.360000610352,112.360000610352,95.9537854678004,0,0,0,0
|
||||
2024-09-19 00:00:00-04:00,115.370002746582,115.370002746582,115.370002746582,115.370002746582,98.5242829550607,0,0,0,0
|
||||
2024-09-20 00:00:00-04:00,114.089996337891,114.089996337891,114.089996337891,114.089996337891,97.4311763364259,0,0,0,0
|
||||
2024-09-23 00:00:00-04:00,114.589996337891,114.589996337891,114.589996337891,114.589996337891,97.8581689714676,0,0,0,0
|
||||
2024-09-24 00:00:00-04:00,116.519996643066,116.519996643066,116.519996643066,116.519996643066,99.5063608033442,0,0,0,0
|
||||
2024-09-25 00:00:00-04:00,116.199996948242,116.199996948242,116.199996948242,116.199996948242,99.2330857775331,0,0,0,0
|
||||
2024-09-26 00:00:00-04:00,118.980003356934,118.980003356934,118.980003356934,118.980003356934,101.607170301293,0,0,0,0
|
||||
2024-09-27 00:00:00-04:00,118.51000213623,118.51000213623,118.51000213623,118.51000213623,101.205796181891,0,0,0,0
|
||||
2024-09-30 00:00:00-04:00,117.870002746582,117.870002746582,117.870002746582,117.870002746582,100.659246130269,0,0,0,0
|
||||
2024-10-01 00:00:00-04:00,117.5,117.5,117.5,117.5,100.343269234798,0,0,0,0
|
||||
2024-10-02 00:00:00-04:00,118.050003051758,118.050003051758,118.050003051758,118.050003051758,100.8129637395,0,0,0,0
|
||||
2024-10-03 00:00:00-04:00,117.230003356934,117.230003356934,117.230003356934,117.230003356934,100.112696078647,0,0,0,0
|
||||
2024-10-04 00:00:00-04:00,118.379997253418,118.379997253418,118.379997253418,118.379997253418,101.094773926931,0,0,0,0
|
||||
2024-10-07 00:00:00-04:00,118.180000305176,118.180000305176,118.180000305176,118.180000305176,100.92397947907,0,0,0,0
|
||||
2024-10-08 00:00:00-04:00,117.589996337891,117.589996337891,117.589996337891,117.589996337891,100.420124781718,0,0,0,0
|
||||
2024-10-09 00:00:00-04:00,118,118,118,118,100.770261869839,0,0,0,0
|
||||
2024-10-10 00:00:00-04:00,117.830001831055,117.830001831055,117.830001831055,117.830001831055,100.625085937619,0,0,0,0
|
||||
2024-10-11 00:00:00-04:00,118.660003662109,118.660003662109,118.660003662109,118.660003662109,101.333895275482,0,0,0,0
|
||||
2024-10-14 00:00:00-04:00,118.800003051758,118.800003051758,118.800003051758,118.800003051758,101.453452692062,0,0,0,0
|
||||
2024-10-15 00:00:00-04:00,115.360000610352,115.360000610352,115.360000610352,115.360000610352,98.5157412780505,0,0,0,0
|
||||
2024-10-16 00:00:00-04:00,115.660003662109,115.660003662109,115.660003662109,115.660003662109,98.7719394652318,0,0,0,0
|
||||
2024-10-17 00:00:00-04:00,115.839996337891,115.839996337891,115.839996337891,115.839996337891,98.9256505590719,0,0,0,0
|
||||
2024-10-18 00:00:00-04:00,117.300003051758,117.300003051758,117.300003051758,117.300003051758,100.172474786937,0,0,0,0
|
||||
2024-10-21 00:00:00-04:00,116.569999694824,116.569999694824,116.569999694824,116.569999694824,99.5490626730046,0,0,0,0
|
||||
2024-10-22 00:00:00-04:00,116.370002746582,116.370002746582,116.370002746582,116.370002746582,99.3782682251441,0,0,0,0
|
||||
2024-10-23 00:00:00-04:00,115.430000305176,115.430000305176,115.430000305176,115.430000305176,98.5755199863408,0,0,0,0
|
||||
2024-10-24 00:00:00-04:00,115.830001831055,115.830001831055,115.830001831055,115.830001831055,98.9171153974522,0,0,0,0
|
||||
2024-10-25 00:00:00-04:00,116,116,116,116,99.0622913296727,0,0,0,0
|
||||
2024-10-28 00:00:00-04:00,116.669998168945,116.669998168945,116.669998168945,116.669998168945,99.6344598969348,0,0,0,0
|
||||
2024-10-29 00:00:00-04:00,116.73999786377,116.73999786377,116.73999786377,116.73999786377,99.694238605225,0,0,0,0
|
||||
2024-10-30 00:00:00-04:00,115.720001220703,115.720001220703,115.720001220703,115.720001220703,98.8231764965118,0,0,0,0
|
||||
2024-10-31 00:00:00-04:00,114.519996643066,114.519996643066,114.519996643066,114.519996643066,97.7983902631774,0,0,0,0
|
||||
2024-11-01 00:00:00-04:00,115.129997253418,115.129997253418,115.129997253418,115.129997253418,98.3193217991595,0,0,0,0
|
||||
2024-11-04 00:00:00-05:00,115.180000305176,115.180000305176,115.180000305176,115.180000305176,98.3620236688199,0,0,0,0
|
||||
2024-11-05 00:00:00-05:00,116.449996948242,116.449996948242,116.449996948242,116.449996948242,99.446582095054,0,0,0,0
|
||||
2024-11-06 00:00:00-05:00,115.25,115.25,115.25,115.25,98.4218023771101,0,0,0,0
|
||||
2024-11-07 00:00:00-05:00,116.370002746582,116.370002746582,116.370002746582,116.370002746582,99.3782682251441,0,0,0,0
|
||||
2024-11-08 00:00:00-05:00,114.830001831055,114.830001831055,114.830001831055,114.830001831055,98.0631301273688,0,0,0,0
|
||||
2024-11-11 00:00:00-05:00,115.480003356934,115.480003356934,115.480003356934,115.480003356934,98.6182218560011,0,0,0,0
|
||||
2024-11-12 00:00:00-05:00,114.48999786377,114.48999786377,114.48999786377,114.48999786377,97.7727717475374,0,0,0,0
|
||||
2024-11-13 00:00:00-05:00,114.610000610352,114.610000610352,114.610000610352,114.610000610352,97.875252325488,0,0,0,0
|
||||
2024-11-14 00:00:00-05:00,114.180000305176,114.180000305176,114.180000305176,114.180000305176,97.5080383987365,0,0,0,0
|
||||
2024-11-15 00:00:00-05:00,112.25,112.25,112.25,112.25,95.85984656686,0,0,0,0
|
||||
2024-11-18 00:00:00-05:00,112.879997253418,112.879997253418,112.879997253418,112.879997253418,96.3978549414719,0,0,0,0
|
||||
2024-11-19 00:00:00-05:00,113.290000915527,113.290000915527,113.290000915527,113.290000915527,96.7479920295936,0,0,0,0
|
||||
2024-11-20 00:00:00-05:00,113.379997253418,113.379997253418,113.379997253418,113.379997253418,96.8248475765136,0,0,0,0
|
||||
2024-11-21 00:00:00-05:00,113.709999084473,113.709999084473,113.709999084473,113.709999084473,97.1066642793348,0,0,0,0
|
||||
2024-11-22 00:00:00-05:00,114.160003662109,114.160003662109,114.160003662109,114.160003662109,97.4909615601067,0,0,0,0
|
||||
2024-11-25 00:00:00-05:00,115.160003662109,115.160003662109,115.160003662109,115.160003662109,98.3449468301901,0,0,0,0
|
||||
2024-11-26 00:00:00-05:00,114.76000213623,114.76000213623,114.76000213623,114.76000213623,98.0033514190786,0,0,0,0
|
||||
2024-11-27 00:00:00-05:00,114.970001220703,114.970001220703,114.970001220703,114.970001220703,98.1826875439493,0,0,0,0
|
||||
2024-11-29 00:00:00-05:00,115.339996337891,115.339996337891,115.339996337891,115.339996337891,98.4986579240302,0,0,0,0
|
||||
2024-12-02 00:00:00-05:00,116.040000915527,116.040000915527,116.040000915527,116.040000915527,99.0964515223229,0,0,0,0
|
||||
2024-12-03 00:00:00-05:00,116.110000610352,116.110000610352,116.110000610352,116.110000610352,99.1562302306131,0,0,0,0
|
||||
2024-12-04 00:00:00-05:00,117.160003662109,117.160003662109,117.160003662109,117.160003662109,100.052917370357,0,0,0,0
|
||||
2024-12-05 00:00:00-05:00,117.360000610352,117.360000610352,117.360000610352,117.360000610352,100.223711818217,0,0,0,0
|
||||
2024-12-06 00:00:00-05:00,117.779998779297,117.779998779297,117.779998779297,117.779998779297,100.582384067959,0,0,0,0
|
||||
2024-12-09 00:00:00-05:00,117.75,117.75,117.75,117.75,100.556765552319,0,0,0,0
|
||||
2024-12-10 00:00:00-05:00,116.059997558594,116.059997558594,116.059997558594,116.059997558594,99.1135283609527,0,0,0,0
|
||||
2024-12-11 00:00:00-05:00,117.069999694824,117.069999694824,117.069999694824,117.069999694824,99.9760553080463,0,0,0,0
|
||||
2024-12-12 00:00:00-05:00,116.620002746582,116.620002746582,116.620002746582,116.620002746582,99.591764542665,0,0,0,0
|
||||
2024-12-13 00:00:00-05:00,116.26000213623,116.26000213623,116.26000213623,116.26000213623,99.2843293242037,0,0,0,0
|
||||
2024-12-16 00:00:00-05:00,115.830001831055,115.830001831055,115.830001831055,115.830001831055,98.9171153974522,0,0,0,0
|
||||
2024-12-17 00:00:00-05:00,115.589996337891,115.589996337891,115.589996337891,115.589996337891,98.712154241551,0,0,0,0
|
||||
2024-12-18 00:00:00-05:00,102.330001831055,102.330001831055,102.330001831055,102.330001831055,95.6355236078943,0,9.968,0,8.999
|
||||
2024-12-19 00:00:00-05:00,102.040000915527,102.040000915527,102.040000915527,102.040000915527,95.3644946925522,0,0,0,0
|
||||
2024-12-20 00:00:00-05:00,102.330001831055,102.330001831055,102.330001831055,102.330001831055,95.6355236078943,0,0,0,0
|
||||
2024-12-23 00:00:00-05:00,103.139999389648,103.139999389648,103.139999389648,103.139999389648,96.3925307343588,0,0,0,0
|
||||
2024-12-24 00:00:00-05:00,103.589996337891,103.589996337891,103.589996337891,103.589996337891,96.8130886645555,0,0,0,0
|
||||
2024-12-26 00:00:00-05:00,103.410003662109,103.410003662109,103.410003662109,103.410003662109,96.6448711966975,0,0,0,0
|
||||
2024-12-27 00:00:00-05:00,102.849998474121,102.849998474121,102.849998474121,102.849998474121,96.1215018190167,0,0,0,0
|
||||
2024-12-30 00:00:00-05:00,101.949996948242,101.949996948242,101.949996948242,101.949996948242,95.2803788283474,0,0,0,0
|
||||
2024-12-31 00:00:00-05:00,101.569999694824,101.569999694824,101.569999694824,101.569999694824,94.9252411790763,0,0,0,0
|
||||
2025-01-02 00:00:00-05:00,101.699996948242,101.699996948242,101.699996948242,101.699996948242,95.0467339492879,0,0,0,0
|
||||
2025-01-03 00:00:00-05:00,102.970001220703,102.970001220703,102.970001220703,102.970001220703,96.2336539278645,0,0,0,0
|
||||
2025-01-06 00:00:00-05:00,104.370002746582,104.370002746582,104.370002746582,104.370002746582,97.5420666766528,0,0,0,0
|
||||
2025-01-07 00:00:00-05:00,103.620002746582,103.620002746582,103.620002746582,103.620002746582,96.8411320394744,0,0,0,0
|
||||
2025-01-08 00:00:00-05:00,103.389999389648,103.389999389648,103.389999389648,103.389999389648,96.6261756134183,0,0,0,0
|
||||
2025-01-10 00:00:00-05:00,101.860000610352,101.860000610352,101.860000610352,101.860000610352,95.1962700944184,0,0,0,0
|
||||
2025-01-13 00:00:00-05:00,100.919998168945,100.919998168945,100.919998168945,100.919998168945,94.3177630674664,0,0,0,0
|
||||
2025-01-14 00:00:00-05:00,101.690002441406,101.690002441406,101.690002441406,101.690002441406,95.0373932879241,0,0,0,0
|
||||
2025-01-15 00:00:00-05:00,103.26000213623,103.26000213623,103.26000213623,103.26000213623,96.5046828432066,0,0,0,0
|
||||
2025-01-16 00:00:00-05:00,103.849998474121,103.849998474121,103.849998474121,103.849998474121,97.0560813352546,0,0,0,0
|
||||
2025-01-17 00:00:00-05:00,104.319999694824,104.319999694824,104.319999694824,104.319999694824,97.4953348487306,0,0,0,0
|
||||
2025-01-21 00:00:00-05:00,105.919998168945,105.919998168945,105.919998168945,105.919998168945,98.9906606486561,0,0,0,0
|
||||
2025-01-22 00:00:00-05:00,106.370002746582,106.370002746582,106.370002746582,106.370002746582,99.4112257091287,0,0,0,0
|
||||
2025-01-23 00:00:00-05:00,106.800003051758,106.800003051758,106.800003051758,106.800003051758,99.813095186322,0,0,0,0
|
||||
2025-01-24 00:00:00-05:00,107.51000213623,107.51000213623,107.51000213623,107.51000213623,100.476645787218,0,0,0,0
|
||||
2025-01-27 00:00:00-05:00,105.819999694824,105.819999694824,105.819999694824,105.819999694824,98.8972041230875,0,0,0,0
|
||||
2025-01-28 00:00:00-05:00,107.050003051758,107.050003051758,107.050003051758,107.050003051758,100.046740065382,0,0,0,0
|
||||
2025-01-29 00:00:00-05:00,106.919998168945,106.919998168945,106.919998168945,106.919998168945,99.9252401648941,0,0,0,0
|
||||
2025-01-30 00:00:00-05:00,108.610000610352,108.610000610352,108.610000610352,108.610000610352,101.504681829024,0,0,0,0
|
||||
2025-01-31 00:00:00-05:00,107.5,107.5,107.5,107.5,100.467297995578,0,0,0,0
|
||||
2025-02-03 00:00:00-05:00,106.099998474121,106.099998474121,106.099998474121,106.099998474121,99.15888524679,0,0,0,0
|
||||
2025-02-04 00:00:00-05:00,108.76000213623,108.76000213623,108.76000213623,108.76000213623,101.644870182515,0,0,0,0
|
||||
2025-02-05 00:00:00-05:00,109.660003662109,109.660003662109,109.660003662109,109.660003662109,102.485993173185,0,0,0,0
|
||||
2025-02-06 00:00:00-05:00,109.970001220703,109.970001220703,109.970001220703,109.970001220703,102.77571054153,0,0,0,0
|
||||
2025-02-07 00:00:00-05:00,109.099998474121,109.099998474121,109.099998474121,109.099998474121,101.962623795504,0,0,0,0
|
||||
2025-02-10 00:00:00-05:00,110.180000305176,110.180000305176,110.180000305176,110.180000305176,102.971971384307,0,0,0,0
|
||||
2025-02-11 00:00:00-05:00,110.389999389648,110.389999389648,110.389999389648,110.389999389648,103.168232227084,0,0,0,0
|
||||
2025-02-12 00:00:00-05:00,110.699996948242,110.699996948242,110.699996948242,110.699996948242,103.457949595429,0,0,0,0
|
||||
2025-02-13 00:00:00-05:00,112.790000915527,112.790000915527,112.790000915527,112.790000915527,105.41122449211,0,0,0,0
|
||||
2025-02-14 00:00:00-05:00,113.300003051758,113.300003051758,113.300003051758,113.300003051758,105.887862041869,0,0,0,0
|
||||
2025-02-18 00:00:00-05:00,114.230003356934,114.230003356934,114.230003356934,114.230003356934,106.757021277181,0,0,0,0
|
||||
2025-02-19 00:00:00-05:00,113.230003356934,113.230003356934,113.230003356934,113.230003356934,105.822441760943,0,0,0,0
|
||||
2025-02-20 00:00:00-05:00,113.400001525879,113.400001525879,113.400001525879,113.400001525879,105.981318567437,0,0,0,0
|
||||
2025-02-21 00:00:00-05:00,112.25,112.25,112.25,112.25,104.906550697708,0,0,0,0
|
||||
2025-02-24 00:00:00-05:00,110.660003662109,110.660003662109,110.660003662109,110.660003662109,103.420572689423,0,0,0,0
|
||||
2025-02-25 00:00:00-05:00,110.339996337891,110.339996337891,110.339996337891,110.339996337891,103.121500399162,0,0,0,0
|
||||
2025-02-26 00:00:00-05:00,111.339996337891,111.339996337891,111.339996337891,111.339996337891,104.0560799154,0,0,0,0
|
||||
2025-02-27 00:00:00-05:00,108.76000213623,108.76000213623,108.76000213623,108.76000213623,101.644870182515,0,0,0,0
|
||||
2025-02-28 00:00:00-05:00,108.949996948242,108.949996948242,108.949996948242,108.949996948242,101.822435442013,0,0,0,0
|
||||
2025-03-03 00:00:00-05:00,107.400001525879,107.400001525879,107.400001525879,107.400001525879,100.37384147001,0,0,0,0
|
||||
2025-03-04 00:00:00-05:00,107.589996337891,107.589996337891,107.589996337891,107.589996337891,100.551406729507,0,0,0,0
|
||||
2025-03-05 00:00:00-05:00,110.949996948242,110.949996948242,110.949996948242,110.949996948242,103.691594474489,0,0,0,0
|
||||
2025-03-06 00:00:00-05:00,108.370002746582,108.370002746582,108.370002746582,108.370002746582,101.280384741605,0,0,0,0
|
||||
2025-03-07 00:00:00-05:00,108.620002746582,108.620002746582,108.620002746582,108.620002746582,101.514029620664,0,0,0,0
|
||||
2025-03-10 00:00:00-04:00,104.459999084473,104.459999084473,104.459999084473,104.459999084473,97.6261754105818,0,0,0,0
|
||||
2025-03-11 00:00:00-04:00,105,105,105,105,98.1308492049834,0,0,0,0
|
||||
2025-03-12 00:00:00-04:00,106.220001220703,106.220001220703,106.220001220703,106.220001220703,99.2710373556378,0,0,0,0
|
||||
2025-03-13 00:00:00-04:00,104.980003356934,104.980003356934,104.980003356934,104.980003356934,98.11216075198,0,0,0,0
|
||||
2025-03-14 00:00:00-04:00,107.809997558594,107.809997558594,107.809997558594,107.809997558594,100.757015363924,0,0,0,0
|
||||
2025-03-17 00:00:00-04:00,109.620002746582,109.620002746582,109.620002746582,109.620002746582,102.448609136902,0,0,0,0
|
||||
2025-03-18 00:00:00-04:00,108.589996337891,108.589996337891,108.589996337891,108.589996337891,101.485986245745,0,0,0,0
|
||||
2025-03-19 00:00:00-04:00,109.5,109.5,109.5,109.5,102.336457028054,0,0,0,0
|
||||
2025-03-20 00:00:00-04:00,109.029998779297,109.029998779297,109.029998779297,109.029998779297,101.897203514578,0,0,0,0
|
||||
2025-03-21 00:00:00-04:00,108.029998779297,108.029998779297,108.029998779297,108.029998779297,100.96262399834,0,0,0,0
|
||||
2025-03-24 00:00:00-04:00,108.680000305176,108.680000305176,108.680000305176,108.680000305176,101.57010210995,0,0,0,0
|
||||
2025-03-25 00:00:00-04:00,108.680000305176,108.680000305176,108.680000305176,108.680000305176,101.57010210995,0,0,0,0
|
||||
2025-03-26 00:00:00-04:00,106.26000213623,106.26000213623,106.26000213623,106.26000213623,99.3084213919205,0,0,0,0
|
||||
2025-03-27 00:00:00-04:00,106.650001525879,106.650001525879,106.650001525879,106.650001525879,99.6729068328312,0,0,0,0
|
||||
2025-03-28 00:00:00-04:00,104.559997558594,104.559997558594,104.559997558594,104.559997558594,97.7196319361505,0,0,0,0
|
||||
2025-03-31 00:00:00-04:00,103.01000213623,103.01000213623,103.01000213623,103.01000213623,96.2710379641472,0,0,0,0
|
||||
2025-04-01 00:00:00-04:00,103.129997253418,103.129997253418,103.129997253418,103.129997253418,96.3831829427192,0,0,0,0
|
||||
2025-04-02 00:00:00-04:00,103.819999694824,103.819999694824,103.819999694824,103.819999694824,97.0280450906116,0,0,0,0
|
||||
2025-04-03 00:00:00-04:00,100.059997558594,100.059997558594,100.059997558594,100.059997558594,93.5140241130797,0,0,0,0
|
||||
2025-04-04 00:00:00-04:00,93.5199966430664,93.5199966430664,93.5199966430664,93.5199966430664,87.4018732212505,0,0,0,0
|
||||
2025-04-07 00:00:00-04:00,92.1999969482422,92.1999969482422,92.1999969482422,92.1999969482422,86.1682285450275,0,0,0,0
|
||||
2025-04-08 00:00:00-04:00,91.3600006103516,91.3600006103516,91.3600006103516,91.3600006103516,85.38318517392,0,0,0,0
|
||||
2025-04-09 00:00:00-04:00,99.0800018310547,99.0800018310547,99.0800018310547,99.0800018310547,92.598140180121,0,0,0,0
|
||||
2025-04-10 00:00:00-04:00,96.3499984741211,96.3499984741211,96.3499984741211,96.3499984741211,90.0467349634701,0,0,0,0
|
||||
2025-04-11 00:00:00-04:00,98.9400024414063,98.9400024414063,98.9400024414063,98.9400024414063,92.4672996182698,0,0,0,0
|
||||
2025-04-14 00:00:00-04:00,99.9199981689453,99.9199981689453,99.9199981689453,99.9199981689453,93.3831835512285,0,0,0,0
|
||||
2025-04-15 00:00:00-04:00,100.849998474121,100.849998474121,100.849998474121,100.849998474121,94.2523427865408,0,0,0,0
|
||||
2025-04-16 00:00:00-04:00,98.9899978637695,98.9899978637695,98.9899978637695,98.9899978637695,92.5140243159162,0,0,0,0
|
||||
2025-04-17 00:00:00-04:00,99.6900024414063,99.6900024414063,99.6900024414063,99.6900024414063,93.1682342554482,0,0,0,0
|
||||
2025-04-21 00:00:00-04:00,98.7200012207031,98.7200012207031,98.7200012207031,98.7200012207031,92.2616909838533,0,0,0,0
|
||||
2025-04-22 00:00:00-04:00,100.769996643066,100.769996643066,100.769996643066,100.769996643066,94.1775747139756,0,0,0,0
|
||||
2025-04-23 00:00:00-04:00,102.279998779297,102.279998779297,102.279998779297,102.279998779297,95.5887917799721,0,0,0,0
|
||||
2025-04-24 00:00:00-04:00,104.540000915527,104.540000915527,104.540000915527,104.540000915527,97.7009434831471,0,0,0,0
|
||||
2025-04-25 00:00:00-04:00,105.269996643066,105.269996643066,105.269996643066,105.269996643066,98.3831825370463,0,0,0,0
|
||||
2025-04-28 00:00:00-04:00,105.150001525879,105.150001525879,105.150001525879,105.150001525879,98.2710375584743,0,0,0,0
|
||||
2025-04-29 00:00:00-04:00,105.360000610352,105.360000610352,105.360000610352,105.360000610352,98.4672984012511,0,0,0,0
|
||||
2025-04-30 00:00:00-04:00,106.040000915527,106.040000915527,106.040000915527,106.040000915527,99.102812757504,0,0,0,0
|
||||
2025-05-01 00:00:00-04:00,106.019996643066,106.019996643066,106.019996643066,106.019996643066,99.0841171742247,0,0,0,0
|
||||
2025-05-02 00:00:00-04:00,108.809997558594,108.809997558594,108.809997558594,108.809997558594,101.691594880162,0,0,0,0
|
||||
2025-05-05 00:00:00-04:00,108.610000610352,108.610000610352,108.610000610352,108.610000610352,101.504681829024,0,0,0,0
|
||||
2025-05-06 00:00:00-04:00,108.25,108.25,108.25,108.25,101.168232632757,0,0,0,0
|
||||
2025-05-07 00:00:00-04:00,108.25,108.25,108.25,108.25,101.168232632757,0,0,0,0
|
||||
2025-05-08 00:00:00-04:00,108.76000213623,108.76000213623,108.76000213623,108.76000213623,101.644870182515,0,0,0,0
|
||||
2025-05-09 00:00:00-04:00,109.139999389648,109.139999389648,109.139999389648,109.139999389648,102.000007831786,0,0,0,0
|
||||
2025-05-12 00:00:00-04:00,111.889999389648,111.889999389648,111.889999389648,111.889999389648,104.570101501441,0,0,0,0
|
||||
2025-05-13 00:00:00-04:00,112.699996948242,112.699996948242,112.699996948242,112.699996948242,105.327108627905,0,0,0,0
|
||||
2025-05-14 00:00:00-04:00,113.330001831055,113.330001831055,113.330001831055,113.330001831055,105.915898286512,0,0,0,0
|
||||
2025-05-15 00:00:00-04:00,113.849998474121,113.849998474121,113.849998474121,113.849998474121,106.401876497634,0,0,0,0
|
||||
2025-05-16 00:00:00-04:00,114.139999389648,114.139999389648,114.139999389648,114.139999389648,106.672905412976,0,0,0,0
|
||||
2025-05-19 00:00:00-04:00,114.779998779297,114.779998779297,114.779998779297,114.779998779297,107.271035732946,0,0,0,0
|
||||
2025-05-20 00:00:00-04:00,114.860000610352,114.860000610352,114.860000610352,114.860000610352,107.345803805512,0,0,0,0
|
||||
2025-05-21 00:00:00-04:00,113.809997558594,113.809997558594,113.809997558594,113.809997558594,106.364492461351,0,0,0,0
|
||||
2025-05-22 00:00:00-04:00,113.730003356934,113.730003356934,113.730003356934,113.730003356934,106.289731519062,0,0,0,0
|
||||
2025-05-23 00:00:00-04:00,113.330001831055,113.330001831055,113.330001831055,113.330001831055,105.915898286512,0,0,0,0
|
||||
2025-05-27 00:00:00-04:00,114.279998779297,114.279998779297,114.279998779297,114.279998779297,106.803745974827,0,0,0,0
|
||||
2025-05-28 00:00:00-04:00,113.069999694824,113.069999694824,113.069999694824,113.069999694824,105.672905615813,0,0,0,0
|
||||
2025-05-29 00:00:00-04:00,113.470001220703,113.470001220703,113.470001220703,113.470001220703,106.046738848363,0,0,0,0
|
||||
2025-05-30 00:00:00-04:00,113.279998779297,113.279998779297,113.279998779297,113.279998779297,105.869166458589,0,0,0,0
|
||||
2025-06-02 00:00:00-04:00,114.180000305176,114.180000305176,114.180000305176,114.180000305176,106.710289449259,0,0,0,0
|
||||
2025-06-03 00:00:00-04:00,113.860000610352,113.860000610352,113.860000610352,113.860000610352,106.411224289274,0,0,0,0
|
||||
2025-06-04 00:00:00-04:00,114.940002441406,114.940002441406,114.940002441406,114.940002441406,107.420571878077,0,0,0,0
|
||||
2025-06-05 00:00:00-04:00,115.339996337891,115.339996337891,115.339996337891,115.339996337891,107.794397980351,0,0,0,0
|
||||
2025-06-06 00:00:00-04:00,115.569999694824,115.569999694824,115.569999694824,115.569999694824,108.009354406407,0,0,0,0
|
||||
2025-06-09 00:00:00-04:00,115.529998779297,115.529998779297,115.529998779297,115.529998779297,107.971970370125,0,0,0,0
|
||||
2025-06-10 00:00:00-04:00,116.089996337891,116.089996337891,116.089996337891,116.089996337891,108.49533261753,0,0,0,0
|
||||
2025-06-11 00:00:00-04:00,116.180000305176,116.180000305176,116.180000305176,116.180000305176,108.579448481735,0,0,0,0
|
||||
2025-06-12 00:00:00-04:00,116.309997558594,116.309997558594,116.309997558594,116.309997558594,108.700941251946,0,0,0,0
|
||||
2025-06-13 00:00:00-04:00,114.26000213623,114.26000213623,114.26000213623,114.26000213623,106.785057521824,0,0,0,0
|
||||
2025-06-16 00:00:00-04:00,115.309997558594,115.309997558594,115.309997558594,115.309997558594,107.766361735708,0,0,0,0
|
||||
2025-06-17 00:00:00-04:00,113.860000610352,113.860000610352,113.860000610352,113.860000610352,106.411224289274,0,0,0,0
|
||||
2025-06-18 00:00:00-04:00,113.660003662109,113.660003662109,113.660003662109,113.660003662109,106.224311238136,0,0,0,0
|
||||
2025-06-20 00:00:00-04:00,112.680000305176,112.680000305176,112.680000305176,112.680000305176,105.308420174902,0,0,0,0
|
||||
2025-06-23 00:00:00-04:00,113.699996948242,113.699996948242,113.699996948242,113.699996948242,106.261688144143,0,0,0,0
|
||||
2025-06-24 00:00:00-04:00,113.699996948242,113.699996948242,113.699996948242,113.699996948242,106.261688144143,0,0,0,0
|
||||
2025-06-25 00:00:00-04:00,116.139999389648,116.139999389648,116.139999389648,116.139999389648,108.542064445452,0,0,0,0
|
||||
2025-06-26 00:00:00-04:00,117.069999694824,117.069999694824,117.069999694824,117.069999694824,109.411223680764,0,0,0,0
|
||||
2025-06-27 00:00:00-04:00,118.059997558594,118.059997558594,118.059997558594,118.059997558594,110.336455405363,0,0,0,0
|
||||
2025-06-30 00:00:00-04:00,117.919998168945,117.919998168945,117.919998168945,117.919998168945,110.205614843511,0,0,0,0
|
||||
2025-07-01 00:00:00-04:00,116.98999786377,116.98999786377,116.98999786377,116.98999786377,109.336455608199,0,0,0,0
|
||||
2025-07-02 00:00:00-04:00,117.449996948242,117.449996948242,117.449996948242,117.449996948242,109.766361330035,0,0,0,0
|
||||
2025-07-03 00:00:00-04:00,117.779998779297,117.779998779297,117.779998779297,117.779998779297,110.07477428166,0,0,0,0
|
||||
2025-07-07 00:00:00-04:00,116.849998474121,116.849998474121,116.849998474121,116.849998474121,109.205615046348,0,0,0,0
|
||||
2025-07-08 00:00:00-04:00,117.629997253418,117.629997253418,117.629997253418,117.629997253418,109.934585928169,0,0,0,0
|
||||
2025-07-09 00:00:00-04:00,118.209999084473,118.209999084473,118.209999084473,118.209999084473,110.476643758853,0,0,0,0
|
||||
2025-07-10 00:00:00-04:00,117.73999786377,117.73999786377,117.73999786377,117.73999786377,110.037390245378,0,0,0,0
|
||||
2025-07-11 00:00:00-04:00,116.75,116.75,116.75,116.75,109.112158520779,0,0,0,0
|
||||
2025-07-14 00:00:00-04:00,116.779998779297,116.779998779297,116.779998779297,116.779998779297,109.140194765422,0,0,0,0
|
||||
2025-07-15 00:00:00-04:00,117.120002746582,117.120002746582,117.120002746582,117.120002746582,109.457955508687,0,0,0,0
|
||||
2025-07-16 00:00:00-04:00,117.430000305176,117.430000305176,117.430000305176,117.430000305176,109.747672877032,0,0,0,0
|
||||
2025-07-17 00:00:00-04:00,118.220001220703,118.220001220703,118.220001220703,118.220001220703,110.485991550493,0,0,0,0
|
||||
2025-07-18 00:00:00-04:00,117.610000610352,117.610000610352,117.610000610352,117.610000610352,109.915897475166,0,0,0,0
|
||||
2025-07-21 00:00:00-04:00,117.699996948242,117.699996948242,117.699996948242,117.699996948242,110.000006209095,0,0,0,0
|
||||
2025-07-22 00:00:00-04:00,117.699996948242,117.699996948242,117.699996948242,117.699996948242,110.000006209095,0,0,0,0
|
||||
2025-07-23 00:00:00-04:00,119.860000610352,119.860000610352,119.860000610352,119.860000610352,112.018701386701,0,0,0,0
|
||||
2025-07-24 00:00:00-04:00,119.449996948242,119.449996948242,119.449996948242,119.449996948242,111.635520362511,0,0,0,0
|
||||
2025-07-25 00:00:00-04:00,119.559997558594,119.559997558594,119.559997558594,119.559997558594,111.73832467972,0,0,0,0
|
||||
2025-07-28 00:00:00-04:00,118.449996948242,118.449996948242,118.449996948242,118.449996948242,110.700940846273,0,0,0,0
|
||||
2025-07-29 00:00:00-04:00,117.309997558594,117.309997558594,117.309997558594,117.309997558594,109.635520768184,0,0,0,0
|
||||
2025-07-30 00:00:00-04:00,115.879997253418,115.879997253418,115.879997253418,115.879997253418,108.299071774753,0,0,0,0
|
||||
2025-07-31 00:00:00-04:00,114.089996337891,114.089996337891,114.089996337891,114.089996337891,106.626173585054,0,0,0,0
|
||||
2025-08-01 00:00:00-04:00,113.199996948242,113.199996948242,113.199996948242,113.199996948242,105.794398386024,0,0,0,0
|
||||
2025-08-04 00:00:00-04:00,114.839996337891,114.839996337891,114.839996337891,114.839996337891,107.327108222232,0,0,0,0
|
||||
2025-08-05 00:00:00-04:00,114.330001831055,114.330001831055,114.330001831055,114.330001831055,106.85047780275,0,0,0,0
|
||||
2025-08-06 00:00:00-04:00,114.51000213623,114.51000213623,114.51000213623,114.51000213623,107.018702400883,0,0,0,0
|
||||
2025-08-07 00:00:00-04:00,116.080001831055,116.080001831055,116.080001831055,116.080001831055,108.485991956166,0,0,0,0
|
||||
2025-08-08 00:00:00-04:00,116.370002746582,116.370002746582,116.370002746582,116.370002746582,108.757020871508,0,0,0,0
|
||||
2025-08-11 00:00:00-04:00,115.360000610352,115.360000610352,115.360000610352,115.360000610352,107.813093563631,0,0,0,0
|
||||
2025-08-12 00:00:00-04:00,117.699996948242,117.699996948242,117.699996948242,117.699996948242,110.000006209095,0,0,0,0
|
||||
2025-08-13 00:00:00-04:00,118.580001831055,118.580001831055,118.580001831055,118.580001831055,110.822440746761,0,0,0,0
|
||||
2025-08-14 00:00:00-04:00,117.860000610352,117.860000610352,117.860000610352,117.860000610352,110.149542354225,0,0,0,0
|
||||
2025-08-15 00:00:00-04:00,118.900001525879,118.900001525879,118.900001525879,118.900001525879,111.121505906746,0,0,0,0
|
||||
2025-08-18 00:00:00-04:00,119.309997558594,119.309997558594,119.309997558594,119.309997558594,111.50467980066,0,0,0,0
|
||||
2025-08-19 00:00:00-04:00,118.860000610352,118.860000610352,118.860000610352,118.860000610352,111.084121870463,0,0,0,0
|
||||
2025-08-20 00:00:00-04:00,118.569999694824,118.569999694824,118.569999694824,118.569999694824,110.813092955121,0,0,0,0
|
||||
2025-08-21 00:00:00-04:00,117.940002441406,117.940002441406,117.940002441406,117.940002441406,110.224310426791,0,0,0,0
|
||||
2025-08-22 00:00:00-04:00,120.230003356934,120.230003356934,120.230003356934,120.230003356934,112.364498374609,0,0,0,0
|
||||
2025-08-25 00:00:00-04:00,119.349998474121,119.349998474121,119.349998474121,119.349998474121,111.542063836943,0,0,0,0
|
||||
2025-08-26 00:00:00-04:00,119.800003051758,119.800003051758,119.800003051758,119.800003051758,111.962628897415,0,0,0,0
|
||||
2025-08-27 00:00:00-04:00,119.199996948242,119.199996948242,119.199996948242,119.199996948242,111.401875483452,0,0,0,0
|
||||
2025-08-28 00:00:00-04:00,119.529998779297,119.529998779297,119.529998779297,119.529998779297,111.710288435077,0,0,0,0
|
||||
2025-08-29 00:00:00-04:00,118.589996337891,118.589996337891,118.589996337891,118.589996337891,110.831781408125,0,0,0,0
|
||||
2025-09-02 00:00:00-04:00,117.099998474121,117.099998474121,117.099998474121,117.099998474121,109.439259925407,0,0,0,0
|
||||
2025-09-03 00:00:00-04:00,117.660003662109,117.660003662109,117.660003662109,117.660003662109,109.962629303088,0,0,0,0
|
||||
2025-09-04 00:00:00-04:00,118.580001831055,118.580001831055,118.580001831055,118.580001831055,110.822440746761,0,0,0,0
|
||||
2025-09-05 00:00:00-04:00,119.410003662109,119.410003662109,119.410003662109,119.410003662109,111.598143456504,0,0,0,0
|
||||
2025-09-08 00:00:00-04:00,120.5,120.5,120.5,120.5,112.616831706671,0,0,0,0
|
||||
2025-09-09 00:00:00-04:00,120.860000610352,120.860000610352,120.860000610352,120.860000610352,112.953280902939,0,0,0,0
|
||||
2025-09-10 00:00:00-04:00,120.610000610352,120.610000610352,120.610000610352,120.610000610352,112.71963602388,0,0,0,0
|
||||
2025-09-11 00:00:00-04:00,121.599998474121,121.599998474121,121.599998474121,121.599998474121,113.644867748478,0,0,0,0
|
||||
2025-09-12 00:00:00-04:00,121.209999084473,121.209999084473,121.209999084473,121.209999084473,113.280382307567,0,0,0,0
|
||||
2025-09-15 00:00:00-04:00,122.430000305176,122.430000305176,122.430000305176,122.430000305176,114.420570458222,0,0,0,0
|
||||
2025-09-16 00:00:00-04:00,122.900001525879,122.900001525879,122.900001525879,122.900001525879,114.859823971698,0,0,0,0
|
||||
2025-09-17 00:00:00-04:00,123.110000610352,123.110000610352,123.110000610352,123.110000610352,115.056084814475,0,0,0,0
|
||||
2025-09-18 00:00:00-04:00,124.75,124.75,124.75,124.75,116.588794650683,0,0,0,0
|
||||
2025-09-19 00:00:00-04:00,123.940002441406,123.940002441406,123.940002441406,123.940002441406,115.831787524218,0,0,0,0
|
||||
2025-09-22 00:00:00-04:00,124.569999694824,124.569999694824,124.569999694824,124.569999694824,116.420570052549,0,0,0,0
|
||||
2025-09-23 00:00:00-04:00,124,124,124,124,115.887860013504,0,0,0,0
|
||||
2025-09-24 00:00:00-04:00,123.26000213623,123.26000213623,123.26000213623,123.26000213623,115.196273167965,0,0,0,0
|
||||
2025-09-25 00:00:00-04:00,122.220001220703,122.220001220703,122.220001220703,122.220001220703,114.224309615445,0,0,0,0
|
||||
2025-09-26 00:00:00-04:00,122.120002746582,122.120002746582,122.120002746582,122.120002746582,114.130853089876,0,0,0,0
|
||||
2025-09-29 00:00:00-04:00,123.169998168945,123.169998168945,123.169998168945,123.169998168945,115.112157303761,0,0,0,0
|
||||
2025-09-30 00:00:00-04:00,123.199996948242,123.199996948242,123.199996948242,123.199996948242,115.140193548404,0,0,0,0
|
||||
2025-10-01 00:00:00-04:00,123.860000610352,123.860000610352,123.860000610352,123.860000610352,115.757019451653,0,0,0,0
|
||||
2025-10-02 00:00:00-04:00,125.309997558594,125.309997558594,125.309997558594,125.309997558594,117.112156898088,0,0,0,0
|
||||
2025-10-03 00:00:00-04:00,125.650001525879,125.650001525879,125.650001525879,125.650001525879,117.429917641352,0,0,0,0
|
||||
2025-10-06 00:00:00-04:00,126.889999389648,126.889999389648,126.889999389648,126.889999389648,118.58879424501,0,0,0,0
|
||||
2025-10-07 00:00:00-04:00,125.580001831055,125.580001831055,125.580001831055,125.580001831055,117.364497360426,0,0,0,0
|
||||
2025-10-08 00:00:00-04:00,126.120002746582,126.120002746582,126.120002746582,126.120002746582,117.869171154828,0,0,0,0
|
||||
2025-10-09 00:00:00-04:00,125.040000915527,125.040000915527,125.040000915527,125.040000915527,116.859823566025,0,0,0,0
|
||||
2025-10-10 00:00:00-04:00,120.529998779297,120.529998779297,120.529998779297,120.529998779297,112.644867951314,0,0,0,0
|
||||
2025-10-13 00:00:00-04:00,123.080001831055,123.080001831055,123.080001831055,123.080001831055,115.028048569832,0,0,0,0
|
||||
2025-10-14 00:00:00-04:00,122.540000915527,122.540000915527,122.540000915527,122.540000915527,114.52337477543,0,0,0,0
|
||||
2025-10-15 00:00:00-04:00,122.839996337891,122.839996337891,122.839996337891,122.839996337891,114.803744352136,0,0,0,0
|
||||
2025-10-16 00:00:00-04:00,122.970001220703,122.970001220703,122.970001220703,122.970001220703,114.925244252623,0,0,0,0
|
||||
2025-10-17 00:00:00-04:00,123.040000915527,123.040000915527,123.040000915527,123.040000915527,114.990664533549,0,0,0,0
|
||||
2025-10-20 00:00:00-04:00,124.769996643066,124.769996643066,124.769996643066,124.769996643066,116.607483103686,0,0,0,0
|
||||
2025-10-21 00:00:00-04:00,124.120002746582,124.120002746582,124.120002746582,124.120002746582,116.000012122352,0,0,0,0
|
||||
2025-10-22 00:00:00-04:00,122.669998168945,122.669998168945,122.669998168945,122.669998168945,114.644867545642,0,0,0,0
|
||||
2025-10-23 00:00:00-04:00,123.949996948242,123.949996948242,123.949996948242,123.949996948242,115.841128185582,0,0,0,0
|
||||
2025-10-24 00:00:00-04:00,124.440002441406,124.440002441406,124.440002441406,124.440002441406,116.299077282337,0,0,0,0
|
||||
2025-10-27 00:00:00-04:00,126.180000305176,126.180000305176,126.180000305176,126.180000305176,117.925243644114,0,0,0,0
|
||||
2025-10-28 00:00:00-04:00,125.730003356934,125.730003356934,125.730003356934,125.730003356934,117.504685713917,0,0,0,0
|
||||
2025-10-29 00:00:00-04:00,126,126,126,126,117.75701904598,0,0,0,0
|
||||
2025-10-30 00:00:00-04:00,125.300003051758,125.300003051758,125.300003051758,125.300003051758,117.102816236724,0,0,0,0
|
||||
2025-10-31 00:00:00-04:00,124.940002441406,124.940002441406,124.940002441406,124.940002441406,116.766367040456,0,0,0,0
|
||||
2025-11-03 00:00:00-05:00,125.080001831055,125.080001831055,125.080001831055,125.080001831055,116.897207602307,0,0,0,0
|
||||
2025-11-04 00:00:00-05:00,122.650001525879,122.650001525879,122.650001525879,122.650001525879,114.626179092638,0,0,0,0
|
||||
2025-11-05 00:00:00-05:00,123.150001525879,123.150001525879,123.150001525879,123.150001525879,115.093468850757,0,0,0,0
|
||||
2025-11-06 00:00:00-05:00,121.400001525879,121.400001525879,121.400001525879,121.400001525879,113.457954697341,0,0,0,0
|
||||
2025-11-07 00:00:00-05:00,120.959999084473,120.959999084473,120.959999084473,120.959999084473,113.046737428508,0,0,0,0
|
||||
2025-11-10 00:00:00-05:00,122.849998474121,122.849998474121,122.849998474121,122.849998474121,114.813092143775,0,0,0,0
|
||||
2025-11-11 00:00:00-05:00,123.300003051758,123.300003051758,123.300003051758,123.300003051758,115.233657204248,0,0,0,0
|
||||
2025-11-12 00:00:00-05:00,123.650001525879,123.650001525879,123.650001525879,123.650001525879,115.560758608876,0,0,0,0
|
||||
2025-11-13 00:00:00-05:00,121.470001220703,121.470001220703,121.470001220703,121.470001220703,113.523374978266,0,0,0,0
|
||||
2025-11-14 00:00:00-05:00,121.330001831055,121.330001831055,121.330001831055,121.330001831055,113.392534416415,0,0,0,0
|
||||
2025-11-17 00:00:00-05:00,119.73999786377,119.73999786377,119.73999786377,119.73999786377,111.906549277853,0,0,0,0
|
||||
2025-11-18 00:00:00-05:00,118.410003662109,118.410003662109,118.410003662109,118.410003662109,110.663563940267,0,0,0,0
|
||||
2025-11-19 00:00:00-05:00,118.279998779297,118.279998779297,118.279998779297,118.279998779297,110.542064039779,0,0,0,0
|
||||
2025-11-20 00:00:00-05:00,115.160003662109,115.160003662109,115.160003662109,115.160003662109,107.626180512493,0,0,0,0
|
||||
2025-11-21 00:00:00-05:00,116.569999694824,116.569999694824,116.569999694824,116.569999694824,108.943933922645,0,0,0,0
|
||||
2025-11-24 00:00:00-05:00,117.610000610352,117.610000610352,117.610000610352,117.610000610352,109.915897475166,0,0,0,0
|
||||
2025-11-25 00:00:00-05:00,118.849998474121,118.849998474121,118.849998474121,118.849998474121,111.074774078824,0,0,0,0
|
||||
2025-11-26 00:00:00-05:00,119.889999389648,119.889999389648,119.889999389648,119.889999389648,112.046737631344,0,0,0,0
|
||||
2025-11-28 00:00:00-05:00,120.910003662109,120.910003662109,120.910003662109,120.910003662109,113.000012730861,0,0,0,0
|
||||
2025-12-01 00:00:00-05:00,120,120,120,120,112.149541948552,0,0,0,0
|
||||
2025-12-02 00:00:00-05:00,120.769996643066,120.769996643066,120.769996643066,120.769996643066,112.869165038734,0,0,0,0
|
||||
2025-12-03 00:00:00-05:00,121.389999389648,121.389999389648,121.389999389648,121.389999389648,113.448606905701,0,0,0,0
|
||||
2025-12-04 00:00:00-05:00,121.559997558594,121.559997558594,121.559997558594,121.559997558594,113.607483712195,0,0,0,0
|
||||
2025-12-05 00:00:00-05:00,121.519996643066,121.519996643066,121.519996643066,121.519996643066,113.570099675913,0,0,0,0
|
||||
2025-12-08 00:00:00-05:00,121.48999786377,121.48999786377,121.48999786377,121.48999786377,113.54206343127,0,0,0,0
|
||||
2025-12-09 00:00:00-05:00,121.160003662109,121.160003662109,121.160003662109,121.160003662109,113.233657609921,0,0,0,0
|
||||
2025-12-10 00:00:00-05:00,122.550003051758,122.550003051758,122.550003051758,122.550003051758,114.53272256707,0,0,0,0
|
||||
2025-12-11 00:00:00-05:00,122.669998168945,122.669998168945,122.669998168945,122.669998168945,114.644867545642,0,0,0,0
|
||||
2025-12-12 00:00:00-05:00,121.089996337891,121.089996337891,121.089996337891,121.089996337891,113.168230198719,0,0,0,0
|
||||
2025-12-15 00:00:00-05:00,120.769996643066,120.769996643066,120.769996643066,120.769996643066,112.869165038734,0,0,0,0
|
||||
2025-12-16 00:00:00-05:00,120.099998474121,120.099998474121,120.099998474121,120.099998474121,112.242998474121,0,0,0,0
|
||||
2025-12-17 00:00:00-05:00,110.440002441406,110.440002441406,110.440002441406,110.440002441406,110.440002441406,0,7.857,0,6.42
|
||||
2025-12-18 00:00:00-05:00,111.779998779297,111.779998779297,111.779998779297,111.779998779297,111.779998779297,0,0,0,0
|
||||
2025-12-19 00:00:00-05:00,112.76000213623,112.76000213623,112.76000213623,112.76000213623,112.76000213623,0,0,0,0
|
||||
2025-12-22 00:00:00-05:00,113.379997253418,113.379997253418,113.379997253418,113.379997253418,113.379997253418,0,0,0,0
|
||||
2025-12-23 00:00:00-05:00,114.01000213623,114.01000213623,114.01000213623,114.01000213623,114.01000213623,0,0,0,0
|
||||
2025-12-24 00:00:00-05:00,114.129997253418,114.129997253418,114.129997253418,114.129997253418,114.129997253418,0,0,0,0
|
||||
2025-12-26 00:00:00-05:00,114.709999084473,114.709999084473,114.709999084473,114.709999084473,114.709999084473,0,0,0,0
|
||||
2025-12-29 00:00:00-05:00,114.440002441406,114.440002441406,114.440002441406,114.440002441406,114.440002441406,0,0,0,0
|
||||
2025-12-30 00:00:00-05:00,114.379997253418,114.379997253418,114.379997253418,114.379997253418,114.379997253418,0,0,0,0
|
||||
2025-12-31 00:00:00-05:00,113.98999786377,113.98999786377,113.98999786377,113.98999786377,113.98999786377,0,0,0,0
|
||||
2026-01-02 00:00:00-05:00,115.680000305176,115.680000305176,115.680000305176,115.680000305176,115.680000305176,0,0,0,0
|
||||
2026-01-05 00:00:00-05:00,118.099998474121,118.099998474121,118.099998474121,118.099998474121,118.099998474121,0,0,0,0
|
||||
2026-01-06 00:00:00-05:00,118.98999786377,118.98999786377,118.98999786377,118.98999786377,118.98999786377,0,0,0,0
|
||||
2026-01-07 00:00:00-05:00,118.019996643066,118.019996643066,118.019996643066,118.019996643066,118.019996643066,0,0,0,0
|
||||
2026-01-08 00:00:00-05:00,117.5,117.5,117.5,117.5,117.5,0,0,0,0
|
||||
2026-01-09 00:00:00-05:00,118.620002746582,118.620002746582,118.620002746582,118.620002746582,118.620002746582,0,0,0,0
|
||||
|
503
tests/data/VWILX-1d-cg-double-count.csv
Normal file
503
tests/data/VWILX-1d-cg-double-count.csv
Normal file
@@ -0,0 +1,503 @@
|
||||
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits,Capital Gains
|
||||
2024-01-10 00:00:00-05:00,100.02999877929688,100.02999877929688,100.02999877929688,100.02999877929688,73.67626190185547,0,0.0,0.0,0.0
|
||||
2024-01-11 00:00:00-05:00,100.25,100.25,100.25,100.25,73.83830261230469,0,0.0,0.0,0.0
|
||||
2024-01-12 00:00:00-05:00,100.44000244140625,100.44000244140625,100.44000244140625,100.44000244140625,73.9782485961914,0,0.0,0.0,0.0
|
||||
2024-01-16 00:00:00-05:00,98.70999908447266,98.70999908447266,98.70999908447266,98.70999908447266,72.70402526855469,0,0.0,0.0,0.0
|
||||
2024-01-17 00:00:00-05:00,97.05999755859375,97.05999755859375,97.05999755859375,97.05999755859375,71.48873138427734,0,0.0,0.0,0.0
|
||||
2024-01-18 00:00:00-05:00,98.02999877929688,98.02999877929688,98.02999877929688,98.02999877929688,72.20317840576172,0,0.0,0.0,0.0
|
||||
2024-01-19 00:00:00-05:00,98.7699966430664,98.7699966430664,98.7699966430664,98.7699966430664,72.74822235107422,0,0.0,0.0,0.0
|
||||
2024-01-22 00:00:00-05:00,98.76000213623047,98.76000213623047,98.76000213623047,98.76000213623047,72.74085235595703,0,0.0,0.0,0.0
|
||||
2024-01-23 00:00:00-05:00,99.37000274658203,99.37000274658203,99.37000274658203,99.37000274658203,73.19014739990234,0,0.0,0.0,0.0
|
||||
2024-01-24 00:00:00-05:00,100.41000366210938,100.41000366210938,100.41000366210938,100.41000366210938,73.95614624023438,0,0.0,0.0,0.0
|
||||
2024-01-25 00:00:00-05:00,100.3499984741211,100.3499984741211,100.3499984741211,100.3499984741211,73.91195678710938,0,0.0,0.0,0.0
|
||||
2024-01-26 00:00:00-05:00,100.83999633789062,100.83999633789062,100.83999633789062,100.83999633789062,74.27285766601562,0,0.0,0.0,0.0
|
||||
2024-01-29 00:00:00-05:00,101.19000244140625,101.19000244140625,101.19000244140625,101.19000244140625,74.53065490722656,0,0.0,0.0,0.0
|
||||
2024-01-30 00:00:00-05:00,100.41000366210938,100.41000366210938,100.41000366210938,100.41000366210938,73.95614624023438,0,0.0,0.0,0.0
|
||||
2024-01-31 00:00:00-05:00,99.27999877929688,99.27999877929688,99.27999877929688,99.27999877929688,73.12385559082031,0,0.0,0.0,0.0
|
||||
2024-02-01 00:00:00-05:00,100.80000305175781,100.80000305175781,100.80000305175781,100.80000305175781,74.24340057373047,0,0.0,0.0,0.0
|
||||
2024-02-02 00:00:00-05:00,100.12000274658203,100.12000274658203,100.12000274658203,100.12000274658203,73.7425537109375,0,0.0,0.0,0.0
|
||||
2024-02-05 00:00:00-05:00,100.2699966430664,100.2699966430664,100.2699966430664,100.2699966430664,73.85303497314453,0,0.0,0.0,0.0
|
||||
2024-02-06 00:00:00-05:00,101.08000183105469,101.08000183105469,101.08000183105469,101.08000183105469,74.44963073730469,0,0.0,0.0,0.0
|
||||
2024-02-07 00:00:00-05:00,101.86000061035156,101.86000061035156,101.86000061035156,101.86000061035156,75.02413177490234,0,0.0,0.0,0.0
|
||||
2024-02-08 00:00:00-05:00,102.72000122070312,102.72000122070312,102.72000122070312,102.72000122070312,75.65755462646484,0,0.0,0.0,0.0
|
||||
2024-02-09 00:00:00-05:00,103.44000244140625,103.44000244140625,103.44000244140625,103.44000244140625,76.18787384033203,0,0.0,0.0,0.0
|
||||
2024-02-12 00:00:00-05:00,103.54000091552734,103.54000091552734,103.54000091552734,103.54000091552734,76.26152801513672,0,0.0,0.0,0.0
|
||||
2024-02-13 00:00:00-05:00,101.23999786376953,101.23999786376953,101.23999786376953,101.23999786376953,74.56747436523438,0,0.0,0.0,0.0
|
||||
2024-02-14 00:00:00-05:00,103.01000213623047,103.01000213623047,103.01000213623047,103.01000213623047,75.87116241455078,0,0.0,0.0,0.0
|
||||
2024-02-15 00:00:00-05:00,104.33000183105469,104.33000183105469,104.33000183105469,104.33000183105469,76.84339141845703,0,0.0,0.0,0.0
|
||||
2024-02-16 00:00:00-05:00,104.3499984741211,104.3499984741211,104.3499984741211,104.3499984741211,76.85812377929688,0,0.0,0.0,0.0
|
||||
2024-02-20 00:00:00-05:00,103.4800033569336,103.4800033569336,103.4800033569336,103.4800033569336,76.21733856201172,0,0.0,0.0,0.0
|
||||
2024-02-21 00:00:00-05:00,103.75,103.75,103.75,103.75,76.41619873046875,0,0.0,0.0,0.0
|
||||
2024-02-22 00:00:00-05:00,106.08000183105469,106.08000183105469,106.08000183105469,106.08000183105469,78.13233947753906,0,0.0,0.0,0.0
|
||||
2024-02-23 00:00:00-05:00,105.2699966430664,105.2699966430664,105.2699966430664,105.2699966430664,77.53573608398438,0,0.0,0.0,0.0
|
||||
2024-02-26 00:00:00-05:00,105.3499984741211,105.3499984741211,105.3499984741211,105.3499984741211,77.59466552734375,0,0.0,0.0,0.0
|
||||
2024-02-27 00:00:00-05:00,105.93000030517578,105.93000030517578,105.93000030517578,105.93000030517578,78.02185821533203,0,0.0,0.0,0.0
|
||||
2024-02-28 00:00:00-05:00,105.20999908447266,105.20999908447266,105.20999908447266,105.20999908447266,77.49154663085938,0,0.0,0.0,0.0
|
||||
2024-02-29 00:00:00-05:00,105.5199966430664,105.5199966430664,105.5199966430664,105.5199966430664,77.7198715209961,0,0.0,0.0,0.0
|
||||
2024-03-01 00:00:00-05:00,107.01000213623047,107.01000213623047,107.01000213623047,107.01000213623047,78.81732940673828,0,0.0,0.0,0.0
|
||||
2024-03-04 00:00:00-05:00,106.44999694824219,106.44999694824219,106.44999694824219,106.44999694824219,78.40485382080078,0,0.0,0.0,0.0
|
||||
2024-03-05 00:00:00-05:00,105.23999786376953,105.23999786376953,105.23999786376953,105.23999786376953,77.5136489868164,0,0.0,0.0,0.0
|
||||
2024-03-06 00:00:00-05:00,106.62999725341797,106.62999725341797,106.62999725341797,106.62999725341797,78.53743743896484,0,0.0,0.0,0.0
|
||||
2024-03-07 00:00:00-05:00,108.18000030517578,108.18000030517578,108.18000030517578,108.18000030517578,79.6790771484375,0,0.0,0.0,0.0
|
||||
2024-03-08 00:00:00-05:00,106.98999786376953,106.98999786376953,106.98999786376953,106.98999786376953,78.8025894165039,0,0.0,0.0,0.0
|
||||
2024-03-11 00:00:00-04:00,107.11000061035156,107.11000061035156,107.11000061035156,107.11000061035156,78.89097595214844,0,0.0,0.0,0.0
|
||||
2024-03-12 00:00:00-04:00,108.73999786376953,108.73999786376953,108.73999786376953,108.73999786376953,80.09153747558594,0,0.0,0.0,0.0
|
||||
2024-03-13 00:00:00-04:00,108.55000305175781,108.55000305175781,108.55000305175781,108.55000305175781,79.95159912109375,0,0.0,0.0,0.0
|
||||
2024-03-14 00:00:00-04:00,107.19999694824219,107.19999694824219,107.19999694824219,107.19999694824219,78.95726013183594,0,0.0,0.0,0.0
|
||||
2024-03-15 00:00:00-04:00,106.12000274658203,106.12000274658203,106.12000274658203,106.12000274658203,78.16180419921875,0,0.0,0.0,0.0
|
||||
2024-03-18 00:00:00-04:00,106.38999938964844,106.38999938964844,106.38999938964844,106.38999938964844,78.36066436767578,0,0.0,0.0,0.0
|
||||
2024-03-19 00:00:00-04:00,106.45999908447266,106.45999908447266,106.45999908447266,106.45999908447266,78.41222381591797,0,0.0,0.0,0.0
|
||||
2024-03-20 00:00:00-04:00,107.76000213623047,107.76000213623047,107.76000213623047,107.76000213623047,79.36973571777344,0,0.0,0.0,0.0
|
||||
2024-03-21 00:00:00-04:00,108.04000091552734,108.04000091552734,108.04000091552734,108.04000091552734,79.57596588134766,0,0.0,0.0,0.0
|
||||
2024-03-22 00:00:00-04:00,107.94999694824219,107.94999694824219,107.94999694824219,107.94999694824219,79.5096664428711,0,0.0,0.0,0.0
|
||||
2024-03-25 00:00:00-04:00,107.79000091552734,107.79000091552734,107.79000091552734,107.79000091552734,79.3918228149414,0,0.0,0.0,0.0
|
||||
2024-03-26 00:00:00-04:00,107.55999755859375,107.55999755859375,107.55999755859375,107.55999755859375,79.22241973876953,0,0.0,0.0,0.0
|
||||
2024-03-27 00:00:00-04:00,107.6500015258789,107.6500015258789,107.6500015258789,107.6500015258789,79.28871154785156,0,0.0,0.0,0.0
|
||||
2024-03-28 00:00:00-04:00,107.19999694824219,107.19999694824219,107.19999694824219,107.19999694824219,78.95726013183594,0,0.0,0.0,0.0
|
||||
2024-04-01 00:00:00-04:00,107.29000091552734,107.29000091552734,107.29000091552734,107.29000091552734,79.0235595703125,0,0.0,0.0,0.0
|
||||
2024-04-02 00:00:00-04:00,106.79000091552734,106.79000091552734,106.79000091552734,106.79000091552734,78.65528106689453,0,0.0,0.0,0.0
|
||||
2024-04-03 00:00:00-04:00,107.29000091552734,107.29000091552734,107.29000091552734,107.29000091552734,79.0235595703125,0,0.0,0.0,0.0
|
||||
2024-04-04 00:00:00-04:00,106.4000015258789,106.4000015258789,106.4000015258789,106.4000015258789,78.36803436279297,0,0.0,0.0,0.0
|
||||
2024-04-05 00:00:00-04:00,106.95999908447266,106.95999908447266,106.95999908447266,106.95999908447266,78.7804946899414,0,0.0,0.0,0.0
|
||||
2024-04-08 00:00:00-04:00,107.47000122070312,107.47000122070312,107.47000122070312,107.47000122070312,79.1561279296875,0,0.0,0.0,0.0
|
||||
2024-04-09 00:00:00-04:00,107.87999725341797,107.87999725341797,107.87999725341797,107.87999725341797,79.45811462402344,0,0.0,0.0,0.0
|
||||
2024-04-10 00:00:00-04:00,106.56999969482422,106.56999969482422,106.56999969482422,106.56999969482422,78.49324035644531,0,0.0,0.0,0.0
|
||||
2024-04-11 00:00:00-04:00,107.4000015258789,107.4000015258789,107.4000015258789,107.4000015258789,79.10457611083984,0,0.0,0.0,0.0
|
||||
2024-04-12 00:00:00-04:00,105.08000183105469,105.08000183105469,105.08000183105469,105.08000183105469,77.39579772949219,0,0.0,0.0,0.0
|
||||
2024-04-15 00:00:00-04:00,104.30999755859375,104.30999755859375,104.30999755859375,104.30999755859375,76.82865905761719,0,0.0,0.0,0.0
|
||||
2024-04-16 00:00:00-04:00,103.9800033569336,103.9800033569336,103.9800033569336,103.9800033569336,76.58560180664062,0,0.0,0.0,0.0
|
||||
2024-04-17 00:00:00-04:00,103.27999877929688,103.27999877929688,103.27999877929688,103.27999877929688,76.07002258300781,0,0.0,0.0,0.0
|
||||
2024-04-18 00:00:00-04:00,102.4800033569336,102.4800033569336,102.4800033569336,102.4800033569336,75.48078918457031,0,0.0,0.0,0.0
|
||||
2024-04-19 00:00:00-04:00,101.13999938964844,101.13999938964844,101.13999938964844,101.13999938964844,74.49382019042969,0,0.0,0.0,0.0
|
||||
2024-04-22 00:00:00-04:00,102.58000183105469,102.58000183105469,102.58000183105469,102.58000183105469,75.554443359375,0,0.0,0.0,0.0
|
||||
2024-04-23 00:00:00-04:00,104.87999725341797,104.87999725341797,104.87999725341797,104.87999725341797,77.24848937988281,0,0.0,0.0,0.0
|
||||
2024-04-24 00:00:00-04:00,104.66000366210938,104.66000366210938,104.66000366210938,104.66000366210938,77.08645629882812,0,0.0,0.0,0.0
|
||||
2024-04-25 00:00:00-04:00,103.93000030517578,103.93000030517578,103.93000030517578,103.93000030517578,76.54877471923828,0,0.0,0.0,0.0
|
||||
2024-04-26 00:00:00-04:00,105.23999786376953,105.23999786376953,105.23999786376953,105.23999786376953,77.5136489868164,0,0.0,0.0,0.0
|
||||
2024-04-29 00:00:00-04:00,105.75,105.75,105.75,105.75,77.8892822265625,0,0.0,0.0,0.0
|
||||
2024-04-30 00:00:00-04:00,103.94999694824219,103.94999694824219,103.94999694824219,103.94999694824219,76.5634994506836,0,0.0,0.0,0.0
|
||||
2024-05-01 00:00:00-04:00,103.77999877929688,103.77999877929688,103.77999877929688,103.77999877929688,76.43829345703125,0,0.0,0.0,0.0
|
||||
2024-05-02 00:00:00-04:00,106.27999877929688,106.27999877929688,106.27999877929688,106.27999877929688,78.27964782714844,0,0.0,0.0,0.0
|
||||
2024-05-03 00:00:00-04:00,107.97000122070312,107.97000122070312,107.97000122070312,107.97000122070312,79.52440643310547,0,0.0,0.0,0.0
|
||||
2024-05-06 00:00:00-04:00,108.73999786376953,108.73999786376953,108.73999786376953,108.73999786376953,80.09153747558594,0,0.0,0.0,0.0
|
||||
2024-05-07 00:00:00-04:00,108.66999816894531,108.66999816894531,108.66999816894531,108.66999816894531,80.03998565673828,0,0.0,0.0,0.0
|
||||
2024-05-08 00:00:00-04:00,108.2300033569336,108.2300033569336,108.2300033569336,108.2300033569336,79.71590423583984,0,0.0,0.0,0.0
|
||||
2024-05-09 00:00:00-04:00,108.63999938964844,108.63999938964844,108.63999938964844,108.63999938964844,80.01788330078125,0,0.0,0.0,0.0
|
||||
2024-05-10 00:00:00-04:00,108.81999969482422,108.81999969482422,108.81999969482422,108.81999969482422,80.15045928955078,0,0.0,0.0,0.0
|
||||
2024-05-13 00:00:00-04:00,109.08999633789062,109.08999633789062,109.08999633789062,109.08999633789062,80.34932708740234,0,0.0,0.0,0.0
|
||||
2024-05-14 00:00:00-04:00,110.18000030517578,110.18000030517578,110.18000030517578,110.18000030517578,81.15216064453125,0,0.0,0.0,0.0
|
||||
2024-05-15 00:00:00-04:00,111.88999938964844,111.88999938964844,111.88999938964844,111.88999938964844,82.4116439819336,0,0.0,0.0,0.0
|
||||
2024-05-16 00:00:00-04:00,111.44999694824219,111.44999694824219,111.44999694824219,111.44999694824219,82.08757019042969,0,0.0,0.0,0.0
|
||||
2024-05-17 00:00:00-04:00,111.47000122070312,111.47000122070312,111.47000122070312,111.47000122070312,82.10230255126953,0,0.0,0.0,0.0
|
||||
2024-05-20 00:00:00-04:00,112.1500015258789,112.1500015258789,112.1500015258789,112.1500015258789,82.6031494140625,0,0.0,0.0,0.0
|
||||
2024-05-21 00:00:00-04:00,111.66000366210938,111.66000366210938,111.66000366210938,111.66000366210938,82.24224090576172,0,0.0,0.0,0.0
|
||||
2024-05-22 00:00:00-04:00,111.45999908447266,111.45999908447266,111.45999908447266,111.45999908447266,82.09493255615234,0,0.0,0.0,0.0
|
||||
2024-05-23 00:00:00-04:00,111.36000061035156,111.36000061035156,111.36000061035156,111.36000061035156,82.02127838134766,0,0.0,0.0,0.0
|
||||
2024-05-24 00:00:00-04:00,112.25,112.25,112.25,112.25,82.67680358886719,0,0.0,0.0,0.0
|
||||
2024-05-28 00:00:00-04:00,112.25,112.25,112.25,112.25,82.67680358886719,0,0.0,0.0,0.0
|
||||
2024-05-29 00:00:00-04:00,110.45999908447266,110.45999908447266,110.45999908447266,110.45999908447266,81.35839080810547,0,0.0,0.0,0.0
|
||||
2024-05-30 00:00:00-04:00,110.68000030517578,110.68000030517578,110.68000030517578,110.68000030517578,81.52043151855469,0,0.0,0.0,0.0
|
||||
2024-05-31 00:00:00-04:00,110.79000091552734,110.79000091552734,110.79000091552734,110.79000091552734,81.60144805908203,0,0.0,0.0,0.0
|
||||
2024-06-03 00:00:00-04:00,111.58000183105469,111.58000183105469,111.58000183105469,111.58000183105469,82.18331909179688,0,0.0,0.0,0.0
|
||||
2024-06-04 00:00:00-04:00,111.13999938964844,111.13999938964844,111.13999938964844,111.13999938964844,81.85923767089844,0,0.0,0.0,0.0
|
||||
2024-06-05 00:00:00-04:00,113.23999786376953,113.23999786376953,113.23999786376953,113.23999786376953,83.40597534179688,0,0.0,0.0,0.0
|
||||
2024-06-06 00:00:00-04:00,113.72000122070312,113.72000122070312,113.72000122070312,113.72000122070312,83.759521484375,0,0.0,0.0,0.0
|
||||
2024-06-07 00:00:00-04:00,112.05999755859375,112.05999755859375,112.05999755859375,112.05999755859375,82.53685760498047,0,0.0,0.0,0.0
|
||||
2024-06-10 00:00:00-04:00,112.37999725341797,112.37999725341797,112.37999725341797,112.37999725341797,82.77255249023438,0,0.0,0.0,0.0
|
||||
2024-06-11 00:00:00-04:00,111.5999984741211,111.5999984741211,111.5999984741211,111.5999984741211,82.19804382324219,0,0.0,0.0,0.0
|
||||
2024-06-12 00:00:00-04:00,113.05999755859375,113.05999755859375,113.05999755859375,113.05999755859375,83.27339935302734,0,0.0,0.0,0.0
|
||||
2024-06-13 00:00:00-04:00,111.95999908447266,111.95999908447266,111.95999908447266,111.95999908447266,82.46320343017578,0,0.0,0.0,0.0
|
||||
2024-06-14 00:00:00-04:00,111.04000091552734,111.04000091552734,111.04000091552734,111.04000091552734,81.78558349609375,0,0.0,0.0,0.0
|
||||
2024-06-17 00:00:00-04:00,111.1500015258789,111.1500015258789,111.1500015258789,111.1500015258789,81.86660766601562,0,0.0,0.0,0.0
|
||||
2024-06-18 00:00:00-04:00,111.22000122070312,111.22000122070312,111.22000122070312,111.22000122070312,81.91815948486328,0,0.0,0.0,0.0
|
||||
2024-06-20 00:00:00-04:00,111.0199966430664,111.0199966430664,111.0199966430664,111.0199966430664,81.7708511352539,0,0.0,0.0,0.0
|
||||
2024-06-21 00:00:00-04:00,110.38999938964844,110.38999938964844,110.38999938964844,110.38999938964844,81.30683135986328,0,0.0,0.0,0.0
|
||||
2024-06-24 00:00:00-04:00,110.51000213623047,110.51000213623047,110.51000213623047,110.51000213623047,81.39521789550781,0,0.0,0.0,0.0
|
||||
2024-06-25 00:00:00-04:00,111.38999938964844,111.38999938964844,111.38999938964844,111.38999938964844,82.04337310791016,0,0.0,0.0,0.0
|
||||
2024-06-26 00:00:00-04:00,110.73999786376953,110.73999786376953,110.73999786376953,110.73999786376953,81.56462097167969,0,0.0,0.0,0.0
|
||||
2024-06-27 00:00:00-04:00,110.25,110.25,110.25,110.25,81.20372009277344,0,0.0,0.0,0.0
|
||||
2024-06-28 00:00:00-04:00,109.72000122070312,109.72000122070312,109.72000122070312,109.72000122070312,80.81334686279297,0,0.0,0.0,0.0
|
||||
2024-07-01 00:00:00-04:00,109.6500015258789,109.6500015258789,109.6500015258789,109.6500015258789,80.76179504394531,0,0.0,0.0,0.0
|
||||
2024-07-02 00:00:00-04:00,110.06999969482422,110.06999969482422,110.06999969482422,110.06999969482422,81.0711441040039,0,0.0,0.0,0.0
|
||||
2024-07-03 00:00:00-04:00,111.51000213623047,111.51000213623047,111.51000213623047,111.51000213623047,82.13176727294922,0,0.0,0.0,0.0
|
||||
2024-07-05 00:00:00-04:00,112.48999786376953,112.48999786376953,112.48999786376953,112.48999786376953,82.85356903076172,0,0.0,0.0,0.0
|
||||
2024-07-08 00:00:00-04:00,112.16999816894531,112.16999816894531,112.16999816894531,112.16999816894531,82.61787414550781,0,0.0,0.0,0.0
|
||||
2024-07-09 00:00:00-04:00,112.38999938964844,112.38999938964844,112.38999938964844,112.38999938964844,82.77991485595703,0,0.0,0.0,0.0
|
||||
2024-07-10 00:00:00-04:00,113.7699966430664,113.7699966430664,113.7699966430664,113.7699966430664,83.79634094238281,0,0.0,0.0,0.0
|
||||
2024-07-11 00:00:00-04:00,113.86000061035156,113.86000061035156,113.86000061035156,113.86000061035156,83.86263275146484,0,0.0,0.0,0.0
|
||||
2024-07-12 00:00:00-04:00,115.2300033569336,115.2300033569336,115.2300033569336,115.2300033569336,84.87169647216797,0,0.0,0.0,0.0
|
||||
2024-07-15 00:00:00-04:00,113.77999877929688,113.77999877929688,113.77999877929688,113.77999877929688,83.8037109375,0,0.0,0.0,0.0
|
||||
2024-07-16 00:00:00-04:00,114.27999877929688,114.27999877929688,114.27999877929688,114.27999877929688,84.17198181152344,0,0.0,0.0,0.0
|
||||
2024-07-17 00:00:00-04:00,111.63999938964844,111.63999938964844,111.63999938964844,111.63999938964844,82.22750854492188,0,0.0,0.0,0.0
|
||||
2024-07-18 00:00:00-04:00,110.54000091552734,110.54000091552734,110.54000091552734,110.54000091552734,81.41732025146484,0,0.0,0.0,0.0
|
||||
2024-07-19 00:00:00-04:00,109.94999694824219,109.94999694824219,109.94999694824219,109.94999694824219,80.98275756835938,0,0.0,0.0,0.0
|
||||
2024-07-22 00:00:00-04:00,111.51000213623047,111.51000213623047,111.51000213623047,111.51000213623047,82.13176727294922,0,0.0,0.0,0.0
|
||||
2024-07-23 00:00:00-04:00,111.45999908447266,111.45999908447266,111.45999908447266,111.45999908447266,82.09493255615234,0,0.0,0.0,0.0
|
||||
2024-07-24 00:00:00-04:00,108.9000015258789,108.9000015258789,108.9000015258789,108.9000015258789,80.20938873291016,0,0.0,0.0,0.0
|
||||
2024-07-25 00:00:00-04:00,108.08000183105469,108.08000183105469,108.08000183105469,108.08000183105469,79.60542297363281,0,0.0,0.0,0.0
|
||||
2024-07-26 00:00:00-04:00,109.48999786376953,109.48999786376953,109.48999786376953,109.48999786376953,80.6439437866211,0,0.0,0.0,0.0
|
||||
2024-07-29 00:00:00-04:00,108.7699966430664,108.7699966430664,108.7699966430664,108.7699966430664,80.11363983154297,0,0.0,0.0,0.0
|
||||
2024-07-30 00:00:00-04:00,108.5,108.5,108.5,108.5,79.91476440429688,0,0.0,0.0,0.0
|
||||
2024-07-31 00:00:00-04:00,111.08999633789062,111.08999633789062,111.08999633789062,111.08999633789062,81.8224105834961,0,0.0,0.0,0.0
|
||||
2024-08-01 00:00:00-04:00,107.87999725341797,107.87999725341797,107.87999725341797,107.87999725341797,79.45811462402344,0,0.0,0.0,0.0
|
||||
2024-08-02 00:00:00-04:00,105.83000183105469,105.83000183105469,105.83000183105469,105.83000183105469,77.94820404052734,0,0.0,0.0,0.0
|
||||
2024-08-05 00:00:00-04:00,103.87000274658203,103.87000274658203,103.87000274658203,103.87000274658203,76.50458526611328,0,0.0,0.0,0.0
|
||||
2024-08-06 00:00:00-04:00,104.76000213623047,104.76000213623047,104.76000213623047,104.76000213623047,77.16010284423828,0,0.0,0.0,0.0
|
||||
2024-08-07 00:00:00-04:00,105.19999694824219,105.19999694824219,105.19999694824219,105.19999694824219,77.48418426513672,0,0.0,0.0,0.0
|
||||
2024-08-08 00:00:00-04:00,107.9000015258789,107.9000015258789,107.9000015258789,107.9000015258789,79.47284698486328,0,0.0,0.0,0.0
|
||||
2024-08-09 00:00:00-04:00,108.18000030517578,108.18000030517578,108.18000030517578,108.18000030517578,79.6790771484375,0,0.0,0.0,0.0
|
||||
2024-08-12 00:00:00-04:00,108.06999969482422,108.06999969482422,108.06999969482422,108.06999969482422,79.59805297851562,0,0.0,0.0,0.0
|
||||
2024-08-13 00:00:00-04:00,109.9000015258789,109.9000015258789,109.9000015258789,109.9000015258789,80.94593048095703,0,0.0,0.0,0.0
|
||||
2024-08-14 00:00:00-04:00,109.77999877929688,109.77999877929688,109.77999877929688,109.77999877929688,80.85753631591797,0,0.0,0.0,0.0
|
||||
2024-08-15 00:00:00-04:00,112.30000305175781,112.30000305175781,112.30000305175781,112.30000305175781,82.71363067626953,0,0.0,0.0,0.0
|
||||
2024-08-16 00:00:00-04:00,113.0,113.0,113.0,113.0,83.22920989990234,0,0.0,0.0,0.0
|
||||
2024-08-19 00:00:00-04:00,114.83000183105469,114.83000183105469,114.83000183105469,114.83000183105469,84.57707977294922,0,0.0,0.0,0.0
|
||||
2024-08-20 00:00:00-04:00,113.83000183105469,113.83000183105469,113.83000183105469,113.83000183105469,83.84053802490234,0,0.0,0.0,0.0
|
||||
2024-08-21 00:00:00-04:00,114.95999908447266,114.95999908447266,114.95999908447266,114.95999908447266,84.6728286743164,0,0.0,0.0,0.0
|
||||
2024-08-22 00:00:00-04:00,113.81999969482422,113.81999969482422,113.81999969482422,113.81999969482422,83.83316802978516,0,0.0,0.0,0.0
|
||||
2024-08-23 00:00:00-04:00,115.13999938964844,115.13999938964844,115.13999938964844,115.13999938964844,84.80541229248047,0,0.0,0.0,0.0
|
||||
2024-08-26 00:00:00-04:00,113.62999725341797,113.62999725341797,113.62999725341797,113.62999725341797,83.69322204589844,0,0.0,0.0,0.0
|
||||
2024-08-27 00:00:00-04:00,113.97000122070312,113.97000122070312,113.97000122070312,113.97000122070312,83.94365692138672,0,0.0,0.0,0.0
|
||||
2024-08-28 00:00:00-04:00,112.87999725341797,112.87999725341797,112.87999725341797,112.87999725341797,83.14081573486328,0,0.0,0.0,0.0
|
||||
2024-08-29 00:00:00-04:00,113.62999725341797,113.62999725341797,113.62999725341797,113.62999725341797,83.69322204589844,0,0.0,0.0,0.0
|
||||
2024-08-30 00:00:00-04:00,113.87000274658203,113.87000274658203,113.87000274658203,113.87000274658203,83.87000274658203,0,0.0,0.0,0.0
|
||||
2024-09-03 00:00:00-04:00,110.93000030517578,110.93000030517578,110.93000030517578,110.93000030517578,81.7045669555664,0,0.0,0.0,0.0
|
||||
2024-09-04 00:00:00-04:00,110.56999969482422,110.56999969482422,110.56999969482422,110.56999969482422,81.43940734863281,0,0.0,0.0,0.0
|
||||
2024-09-05 00:00:00-04:00,110.69000244140625,110.69000244140625,110.69000244140625,110.69000244140625,81.52779388427734,0,0.0,0.0,0.0
|
||||
2024-09-06 00:00:00-04:00,108.0999984741211,108.0999984741211,108.0999984741211,108.0999984741211,79.62015533447266,0,0.0,0.0,0.0
|
||||
2024-09-09 00:00:00-04:00,109.61000061035156,109.61000061035156,109.61000061035156,109.61000061035156,80.73233032226562,0,0.0,0.0,0.0
|
||||
2024-09-10 00:00:00-04:00,109.33000183105469,109.33000183105469,109.33000183105469,109.33000183105469,80.5261001586914,0,0.0,0.0,0.0
|
||||
2024-09-11 00:00:00-04:00,111.06999969482422,111.06999969482422,111.06999969482422,111.06999969482422,81.80767822265625,0,0.0,0.0,0.0
|
||||
2024-09-12 00:00:00-04:00,111.97000122070312,111.97000122070312,111.97000122070312,111.97000122070312,82.47056579589844,0,0.0,0.0,0.0
|
||||
2024-09-13 00:00:00-04:00,112.31999969482422,112.31999969482422,112.31999969482422,112.31999969482422,82.72836303710938,0,0.0,0.0,0.0
|
||||
2024-09-16 00:00:00-04:00,112.44999694824219,112.44999694824219,112.44999694824219,112.44999694824219,82.82410430908203,0,0.0,0.0,0.0
|
||||
2024-09-17 00:00:00-04:00,112.6500015258789,112.6500015258789,112.6500015258789,112.6500015258789,82.97142028808594,0,0.0,0.0,0.0
|
||||
2024-09-18 00:00:00-04:00,112.36000061035156,112.36000061035156,112.36000061035156,112.36000061035156,82.75782012939453,0,0.0,0.0,0.0
|
||||
2024-09-19 00:00:00-04:00,115.37000274658203,115.37000274658203,115.37000274658203,115.37000274658203,84.97481536865234,0,0.0,0.0,0.0
|
||||
2024-09-20 00:00:00-04:00,114.08999633789062,114.08999633789062,114.08999633789062,114.08999633789062,84.03203582763672,0,0.0,0.0,0.0
|
||||
2024-09-23 00:00:00-04:00,114.58999633789062,114.58999633789062,114.58999633789062,114.58999633789062,84.40030670166016,0,0.0,0.0,0.0
|
||||
2024-09-24 00:00:00-04:00,116.5199966430664,116.5199966430664,116.5199966430664,116.5199966430664,85.82183074951172,0,0.0,0.0,0.0
|
||||
2024-09-25 00:00:00-04:00,116.19999694824219,116.19999694824219,116.19999694824219,116.19999694824219,85.58613586425781,0,0.0,0.0,0.0
|
||||
2024-09-26 00:00:00-04:00,118.9800033569336,118.9800033569336,118.9800033569336,118.9800033569336,87.63372802734375,0,0.0,0.0,0.0
|
||||
2024-09-27 00:00:00-04:00,118.51000213623047,118.51000213623047,118.51000213623047,118.51000213623047,87.28755950927734,0,0.0,0.0,0.0
|
||||
2024-09-30 00:00:00-04:00,117.87000274658203,117.87000274658203,117.87000274658203,117.87000274658203,86.81616973876953,0,0.0,0.0,0.0
|
||||
2024-10-01 00:00:00-04:00,117.5,117.5,117.5,117.5,86.54364776611328,0,0.0,0.0,0.0
|
||||
2024-10-02 00:00:00-04:00,118.05000305175781,118.05000305175781,118.05000305175781,118.05000305175781,86.94874572753906,0,0.0,0.0,0.0
|
||||
2024-10-03 00:00:00-04:00,117.2300033569336,117.2300033569336,117.2300033569336,117.2300033569336,86.34477996826172,0,0.0,0.0,0.0
|
||||
2024-10-04 00:00:00-04:00,118.37999725341797,118.37999725341797,118.37999725341797,118.37999725341797,87.1917953491211,0,0.0,0.0,0.0
|
||||
2024-10-07 00:00:00-04:00,118.18000030517578,118.18000030517578,118.18000030517578,118.18000030517578,87.04448699951172,0,0.0,0.0,0.0
|
||||
2024-10-08 00:00:00-04:00,117.58999633789062,117.58999633789062,117.58999633789062,117.58999633789062,86.60992431640625,0,0.0,0.0,0.0
|
||||
2024-10-09 00:00:00-04:00,118.0,118.0,118.0,118.0,86.91191864013672,0,0.0,0.0,0.0
|
||||
2024-10-10 00:00:00-04:00,117.83000183105469,117.83000183105469,117.83000183105469,117.83000183105469,86.78670501708984,0,0.0,0.0,0.0
|
||||
2024-10-11 00:00:00-04:00,118.66000366210938,118.66000366210938,118.66000366210938,118.66000366210938,87.39803314208984,0,0.0,0.0,0.0
|
||||
2024-10-14 00:00:00-04:00,118.80000305175781,118.80000305175781,118.80000305175781,118.80000305175781,87.50115203857422,0,0.0,0.0,0.0
|
||||
2024-10-15 00:00:00-04:00,115.36000061035156,115.36000061035156,115.36000061035156,115.36000061035156,84.96744537353516,0,0.0,0.0,0.0
|
||||
2024-10-16 00:00:00-04:00,115.66000366210938,115.66000366210938,115.66000366210938,115.66000366210938,85.18840789794922,0,0.0,0.0,0.0
|
||||
2024-10-17 00:00:00-04:00,115.83999633789062,115.83999633789062,115.83999633789062,115.83999633789062,85.32098388671875,0,0.0,0.0,0.0
|
||||
2024-10-18 00:00:00-04:00,117.30000305175781,117.30000305175781,117.30000305175781,117.30000305175781,86.3963394165039,0,0.0,0.0,0.0
|
||||
2024-10-21 00:00:00-04:00,116.56999969482422,116.56999969482422,116.56999969482422,116.56999969482422,85.85865783691406,0,0.0,0.0,0.0
|
||||
2024-10-22 00:00:00-04:00,116.37000274658203,116.37000274658203,116.37000274658203,116.37000274658203,85.71135711669922,0,0.0,0.0,0.0
|
||||
2024-10-23 00:00:00-04:00,115.43000030517578,115.43000030517578,115.43000030517578,115.43000030517578,85.01900482177734,0,0.0,0.0,0.0
|
||||
2024-10-24 00:00:00-04:00,115.83000183105469,115.83000183105469,115.83000183105469,115.83000183105469,85.3136215209961,0,0.0,0.0,0.0
|
||||
2024-10-25 00:00:00-04:00,116.0,116.0,116.0,116.0,85.43883514404297,0,0.0,0.0,0.0
|
||||
2024-10-28 00:00:00-04:00,116.66999816894531,116.66999816894531,116.66999816894531,116.66999816894531,85.93231201171875,0,0.0,0.0,0.0
|
||||
2024-10-29 00:00:00-04:00,116.73999786376953,116.73999786376953,116.73999786376953,116.73999786376953,85.98387145996094,0,0.0,0.0,0.0
|
||||
2024-10-30 00:00:00-04:00,115.72000122070312,115.72000122070312,115.72000122070312,115.72000122070312,85.23259735107422,0,0.0,0.0,0.0
|
||||
2024-10-31 00:00:00-04:00,114.5199966430664,114.5199966430664,114.5199966430664,114.5199966430664,84.34874725341797,0,0.0,0.0,0.0
|
||||
2024-11-01 00:00:00-04:00,115.12999725341797,115.12999725341797,115.12999725341797,115.12999725341797,84.79803466796875,0,0.0,0.0,0.0
|
||||
2024-11-04 00:00:00-05:00,115.18000030517578,115.18000030517578,115.18000030517578,115.18000030517578,84.83486938476562,0,0.0,0.0,0.0
|
||||
2024-11-05 00:00:00-05:00,116.44999694824219,116.44999694824219,116.44999694824219,116.44999694824219,85.77027130126953,0,0.0,0.0,0.0
|
||||
2024-11-06 00:00:00-05:00,115.25,115.25,115.25,115.25,84.88642883300781,0,0.0,0.0,0.0
|
||||
2024-11-07 00:00:00-05:00,116.37000274658203,116.37000274658203,116.37000274658203,116.37000274658203,85.71135711669922,0,0.0,0.0,0.0
|
||||
2024-11-08 00:00:00-05:00,114.83000183105469,114.83000183105469,114.83000183105469,114.83000183105469,84.57707977294922,0,0.0,0.0,0.0
|
||||
2024-11-11 00:00:00-05:00,115.4800033569336,115.4800033569336,115.4800033569336,115.4800033569336,85.05583190917969,0,0.0,0.0,0.0
|
||||
2024-11-12 00:00:00-05:00,114.48999786376953,114.48999786376953,114.48999786376953,114.48999786376953,84.32665252685547,0,0.0,0.0,0.0
|
||||
2024-11-13 00:00:00-05:00,114.61000061035156,114.61000061035156,114.61000061035156,114.61000061035156,84.4150390625,0,0.0,0.0,0.0
|
||||
2024-11-14 00:00:00-05:00,114.18000030517578,114.18000030517578,114.18000030517578,114.18000030517578,84.09832763671875,0,0.0,0.0,0.0
|
||||
2024-11-15 00:00:00-05:00,112.25,112.25,112.25,112.25,82.67680358886719,0,0.0,0.0,0.0
|
||||
2024-11-18 00:00:00-05:00,112.87999725341797,112.87999725341797,112.87999725341797,112.87999725341797,83.14081573486328,0,0.0,0.0,0.0
|
||||
2024-11-19 00:00:00-05:00,113.29000091552734,113.29000091552734,113.29000091552734,113.29000091552734,83.44280242919922,0,0.0,0.0,0.0
|
||||
2024-11-20 00:00:00-05:00,113.37999725341797,113.37999725341797,113.37999725341797,113.37999725341797,83.50909423828125,0,0.0,0.0,0.0
|
||||
2024-11-21 00:00:00-05:00,113.70999908447266,113.70999908447266,113.70999908447266,113.70999908447266,83.75215148925781,0,0.0,0.0,0.0
|
||||
2024-11-22 00:00:00-05:00,114.16000366210938,114.16000366210938,114.16000366210938,114.16000366210938,84.0835952758789,0,0.0,0.0,0.0
|
||||
2024-11-25 00:00:00-05:00,115.16000366210938,115.16000366210938,115.16000366210938,115.16000366210938,84.82013702392578,0,0.0,0.0,0.0
|
||||
2024-11-26 00:00:00-05:00,114.76000213623047,114.76000213623047,114.76000213623047,114.76000213623047,84.52552032470703,0,0.0,0.0,0.0
|
||||
2024-11-27 00:00:00-05:00,114.97000122070312,114.97000122070312,114.97000122070312,114.97000122070312,84.68019104003906,0,0.0,0.0,0.0
|
||||
2024-11-29 00:00:00-05:00,115.33999633789062,115.33999633789062,115.33999633789062,115.33999633789062,84.95271301269531,0,0.0,0.0,0.0
|
||||
2024-12-02 00:00:00-05:00,116.04000091552734,116.04000091552734,116.04000091552734,116.04000091552734,85.46829223632812,0,0.0,0.0,0.0
|
||||
2024-12-03 00:00:00-05:00,116.11000061035156,116.11000061035156,116.11000061035156,116.11000061035156,85.51985168457031,0,0.0,0.0,0.0
|
||||
2024-12-04 00:00:00-05:00,117.16000366210938,117.16000366210938,117.16000366210938,117.16000366210938,86.29322052001953,0,0.0,0.0,0.0
|
||||
2024-12-05 00:00:00-05:00,117.36000061035156,117.36000061035156,117.36000061035156,117.36000061035156,86.4405288696289,0,0.0,0.0,0.0
|
||||
2024-12-06 00:00:00-05:00,117.77999877929688,117.77999877929688,117.77999877929688,117.77999877929688,86.7498779296875,0,0.0,0.0,0.0
|
||||
2024-12-09 00:00:00-05:00,117.75,117.75,117.75,117.75,86.72777557373047,0,0.0,0.0,0.0
|
||||
2024-12-10 00:00:00-05:00,116.05999755859375,116.05999755859375,116.05999755859375,116.05999755859375,85.48302459716797,0,0.0,0.0,0.0
|
||||
2024-12-11 00:00:00-05:00,117.06999969482422,117.06999969482422,117.06999969482422,117.06999969482422,86.22693634033203,0,0.0,0.0,0.0
|
||||
2024-12-12 00:00:00-05:00,116.62000274658203,116.62000274658203,116.62000274658203,116.62000274658203,85.8954849243164,0,0.0,0.0,0.0
|
||||
2024-12-13 00:00:00-05:00,116.26000213623047,116.26000213623047,116.26000213623047,116.26000213623047,85.63033294677734,0,0.0,0.0,0.0
|
||||
2024-12-16 00:00:00-05:00,115.83000183105469,115.83000183105469,115.83000183105469,115.83000183105469,85.3136215209961,0,0.0,0.0,0.0
|
||||
2024-12-17 00:00:00-05:00,115.58999633789062,115.58999633789062,115.58999633789062,115.58999633789062,85.13684844970703,0,0.0,0.0,0.0
|
||||
2024-12-18 00:00:00-05:00,102.33000183105469,102.33000183105469,102.33000183105469,102.33000183105469,90.1654281616211,0,9.968,0.0,8.999
|
||||
2024-12-19 00:00:00-05:00,102.04000091552734,102.04000091552734,102.04000091552734,102.04000091552734,89.90990447998047,0,0.0,0.0,0.0
|
||||
2024-12-20 00:00:00-05:00,102.33000183105469,102.33000183105469,102.33000183105469,102.33000183105469,90.1654281616211,0,0.0,0.0,0.0
|
||||
2024-12-23 00:00:00-05:00,103.13999938964844,103.13999938964844,103.13999938964844,103.13999938964844,90.87913513183594,0,0.0,0.0,0.0
|
||||
2024-12-24 00:00:00-05:00,103.58999633789062,103.58999633789062,103.58999633789062,103.58999633789062,91.27564239501953,0,0.0,0.0,0.0
|
||||
2024-12-26 00:00:00-05:00,103.41000366210938,103.41000366210938,103.41000366210938,103.41000366210938,91.1170425415039,0,0.0,0.0,0.0
|
||||
2024-12-27 00:00:00-05:00,102.8499984741211,102.8499984741211,102.8499984741211,102.8499984741211,90.62361145019531,0,0.0,0.0,0.0
|
||||
2024-12-30 00:00:00-05:00,101.94999694824219,101.94999694824219,101.94999694824219,101.94999694824219,89.83059692382812,0,0.0,0.0,0.0
|
||||
2024-12-31 00:00:00-05:00,101.56999969482422,101.56999969482422,101.56999969482422,101.56999969482422,89.49577331542969,0,0.0,0.0,0.0
|
||||
2025-01-02 00:00:00-05:00,101.69999694824219,101.69999694824219,101.69999694824219,101.69999694824219,89.61031341552734,0,0.0,0.0,0.0
|
||||
2025-01-03 00:00:00-05:00,102.97000122070312,102.97000122070312,102.97000122070312,102.97000122070312,90.7293472290039,0,0.0,0.0,0.0
|
||||
2025-01-06 00:00:00-05:00,104.37000274658203,104.37000274658203,104.37000274658203,104.37000274658203,91.96292114257812,0,0.0,0.0,0.0
|
||||
2025-01-07 00:00:00-05:00,103.62000274658203,103.62000274658203,103.62000274658203,103.62000274658203,91.30207824707031,0,0.0,0.0,0.0
|
||||
2025-01-08 00:00:00-05:00,103.38999938964844,103.38999938964844,103.38999938964844,103.38999938964844,91.09941864013672,0,0.0,0.0,0.0
|
||||
2025-01-10 00:00:00-05:00,101.86000061035156,101.86000061035156,101.86000061035156,101.86000061035156,89.75129699707031,0,0.0,0.0,0.0
|
||||
2025-01-13 00:00:00-05:00,100.91999816894531,100.91999816894531,100.91999816894531,100.91999816894531,88.92304229736328,0,0.0,0.0,0.0
|
||||
2025-01-14 00:00:00-05:00,101.69000244140625,101.69000244140625,101.69000244140625,101.69000244140625,89.60150909423828,0,0.0,0.0,0.0
|
||||
2025-01-15 00:00:00-05:00,103.26000213623047,103.26000213623047,103.26000213623047,103.26000213623047,90.98487091064453,0,0.0,0.0,0.0
|
||||
2025-01-16 00:00:00-05:00,103.8499984741211,103.8499984741211,103.8499984741211,103.8499984741211,91.5047378540039,0,0.0,0.0,0.0
|
||||
2025-01-17 00:00:00-05:00,104.31999969482422,104.31999969482422,104.31999969482422,104.31999969482422,91.91886138916016,0,0.0,0.0,0.0
|
||||
2025-01-21 00:00:00-05:00,105.91999816894531,105.91999816894531,105.91999816894531,105.91999816894531,93.32865905761719,0,0.0,0.0,0.0
|
||||
2025-01-22 00:00:00-05:00,106.37000274658203,106.37000274658203,106.37000274658203,106.37000274658203,93.72517395019531,0,0.0,0.0,0.0
|
||||
2025-01-23 00:00:00-05:00,106.80000305175781,106.80000305175781,106.80000305175781,106.80000305175781,94.10405731201172,0,0.0,0.0,0.0
|
||||
2025-01-24 00:00:00-05:00,107.51000213623047,107.51000213623047,107.51000213623047,107.51000213623047,94.72965240478516,0,0.0,0.0,0.0
|
||||
2025-01-27 00:00:00-05:00,105.81999969482422,105.81999969482422,105.81999969482422,105.81999969482422,93.24054718017578,0,0.0,0.0,0.0
|
||||
2025-01-28 00:00:00-05:00,107.05000305175781,107.05000305175781,107.05000305175781,107.05000305175781,94.32433319091797,0,0.0,0.0,0.0
|
||||
2025-01-29 00:00:00-05:00,106.91999816894531,106.91999816894531,106.91999816894531,106.91999816894531,94.20978546142578,0,0.0,0.0,0.0
|
||||
2025-01-30 00:00:00-05:00,108.61000061035156,108.61000061035156,108.61000061035156,108.61000061035156,95.69888305664062,0,0.0,0.0,0.0
|
||||
2025-01-31 00:00:00-05:00,107.5,107.5,107.5,107.5,94.72084045410156,0,0.0,0.0,0.0
|
||||
2025-02-03 00:00:00-05:00,106.0999984741211,106.0999984741211,106.0999984741211,106.0999984741211,93.48726654052734,0,0.0,0.0,0.0
|
||||
2025-02-04 00:00:00-05:00,108.76000213623047,108.76000213623047,108.76000213623047,108.76000213623047,95.8310546875,0,0.0,0.0,0.0
|
||||
2025-02-05 00:00:00-05:00,109.66000366210938,109.66000366210938,109.66000366210938,109.66000366210938,96.62406921386719,0,0.0,0.0,0.0
|
||||
2025-02-06 00:00:00-05:00,109.97000122070312,109.97000122070312,109.97000122070312,109.97000122070312,96.897216796875,0,0.0,0.0,0.0
|
||||
2025-02-07 00:00:00-05:00,109.0999984741211,109.0999984741211,109.0999984741211,109.0999984741211,96.1306381225586,0,0.0,0.0,0.0
|
||||
2025-02-10 00:00:00-05:00,110.18000030517578,110.18000030517578,110.18000030517578,110.18000030517578,97.0822525024414,0,0.0,0.0,0.0
|
||||
2025-02-11 00:00:00-05:00,110.38999938964844,110.38999938964844,110.38999938964844,110.38999938964844,97.26728820800781,0,0.0,0.0,0.0
|
||||
2025-02-12 00:00:00-05:00,110.69999694824219,110.69999694824219,110.69999694824219,110.69999694824219,97.54043579101562,0,0.0,0.0,0.0
|
||||
2025-02-13 00:00:00-05:00,112.79000091552734,112.79000091552734,112.79000091552734,112.79000091552734,99.38198852539062,0,0.0,0.0,0.0
|
||||
2025-02-14 00:00:00-05:00,113.30000305175781,113.30000305175781,113.30000305175781,113.30000305175781,99.83135986328125,0,0.0,0.0,0.0
|
||||
2025-02-18 00:00:00-05:00,114.2300033569336,114.2300033569336,114.2300033569336,114.2300033569336,100.65081024169922,0,0.0,0.0,0.0
|
||||
2025-02-19 00:00:00-05:00,113.2300033569336,113.2300033569336,113.2300033569336,113.2300033569336,99.76968383789062,0,0.0,0.0,0.0
|
||||
2025-02-20 00:00:00-05:00,113.4000015258789,113.4000015258789,113.4000015258789,113.4000015258789,99.91947174072266,0,0.0,0.0,0.0
|
||||
2025-02-21 00:00:00-05:00,112.25,112.25,112.25,112.25,98.90618133544922,0,0.0,0.0,0.0
|
||||
2025-02-24 00:00:00-05:00,110.66000366210938,110.66000366210938,110.66000366210938,110.66000366210938,97.50519561767578,0,0.0,0.0,0.0
|
||||
2025-02-25 00:00:00-05:00,110.33999633789062,110.33999633789062,110.33999633789062,110.33999633789062,97.22322845458984,0,0.0,0.0,0.0
|
||||
2025-02-26 00:00:00-05:00,111.33999633789062,111.33999633789062,111.33999633789062,111.33999633789062,98.10435485839844,0,0.0,0.0,0.0
|
||||
2025-02-27 00:00:00-05:00,108.76000213623047,108.76000213623047,108.76000213623047,108.76000213623047,95.8310546875,0,0.0,0.0,0.0
|
||||
2025-02-28 00:00:00-05:00,108.94999694824219,108.94999694824219,108.94999694824219,108.94999694824219,95.99846649169922,0,0.0,0.0,0.0
|
||||
2025-03-03 00:00:00-05:00,107.4000015258789,107.4000015258789,107.4000015258789,107.4000015258789,94.63272857666016,0,0.0,0.0,0.0
|
||||
2025-03-04 00:00:00-05:00,107.58999633789062,107.58999633789062,107.58999633789062,107.58999633789062,94.80013275146484,0,0.0,0.0,0.0
|
||||
2025-03-05 00:00:00-05:00,110.94999694824219,110.94999694824219,110.94999694824219,110.94999694824219,97.76071166992188,0,0.0,0.0,0.0
|
||||
2025-03-06 00:00:00-05:00,108.37000274658203,108.37000274658203,108.37000274658203,108.37000274658203,95.48741912841797,0,0.0,0.0,0.0
|
||||
2025-03-07 00:00:00-05:00,108.62000274658203,108.62000274658203,108.62000274658203,108.62000274658203,95.70770263671875,0,0.0,0.0,0.0
|
||||
2025-03-10 00:00:00-04:00,104.45999908447266,104.45999908447266,104.45999908447266,104.45999908447266,92.04222106933594,0,0.0,0.0,0.0
|
||||
2025-03-11 00:00:00-04:00,105.0,105.0,105.0,105.0,92.51802825927734,0,0.0,0.0,0.0
|
||||
2025-03-12 00:00:00-04:00,106.22000122070312,106.22000122070312,106.22000122070312,106.22000122070312,93.59300231933594,0,0.0,0.0,0.0
|
||||
2025-03-13 00:00:00-04:00,104.9800033569336,104.9800033569336,104.9800033569336,104.9800033569336,92.50041198730469,0,0.0,0.0,0.0
|
||||
2025-03-14 00:00:00-04:00,107.80999755859375,107.80999755859375,107.80999755859375,107.80999755859375,94.99398803710938,0,0.0,0.0,0.0
|
||||
2025-03-17 00:00:00-04:00,109.62000274658203,109.62000274658203,109.62000274658203,109.62000274658203,96.58882141113281,0,0.0,0.0,0.0
|
||||
2025-03-18 00:00:00-04:00,108.58999633789062,108.58999633789062,108.58999633789062,108.58999633789062,95.68125915527344,0,0.0,0.0,0.0
|
||||
2025-03-19 00:00:00-04:00,109.5,109.5,109.5,109.5,96.48308563232422,0,0.0,0.0,0.0
|
||||
2025-03-20 00:00:00-04:00,109.02999877929688,109.02999877929688,109.02999877929688,109.02999877929688,96.06895446777344,0,0.0,0.0,0.0
|
||||
2025-03-21 00:00:00-04:00,108.02999877929688,108.02999877929688,108.02999877929688,108.02999877929688,95.18783569335938,0,0.0,0.0,0.0
|
||||
2025-03-24 00:00:00-04:00,108.68000030517578,108.68000030517578,108.68000030517578,108.68000030517578,95.76056671142578,0,0.0,0.0,0.0
|
||||
2025-03-25 00:00:00-04:00,108.68000030517578,108.68000030517578,108.68000030517578,108.68000030517578,95.76056671142578,0,0.0,0.0,0.0
|
||||
2025-03-26 00:00:00-04:00,106.26000213623047,106.26000213623047,106.26000213623047,106.26000213623047,93.62825012207031,0,0.0,0.0,0.0
|
||||
2025-03-27 00:00:00-04:00,106.6500015258789,106.6500015258789,106.6500015258789,106.6500015258789,93.97188568115234,0,0.0,0.0,0.0
|
||||
2025-03-28 00:00:00-04:00,104.55999755859375,104.55999755859375,104.55999755859375,104.55999755859375,92.13033294677734,0,0.0,0.0,0.0
|
||||
2025-03-31 00:00:00-04:00,103.01000213623047,103.01000213623047,103.01000213623047,103.01000213623047,90.76459503173828,0,0.0,0.0,0.0
|
||||
2025-04-01 00:00:00-04:00,103.12999725341797,103.12999725341797,103.12999725341797,103.12999725341797,90.87032318115234,0,0.0,0.0,0.0
|
||||
2025-04-02 00:00:00-04:00,103.81999969482422,103.81999969482422,103.81999969482422,103.81999969482422,91.47830200195312,0,0.0,0.0,0.0
|
||||
2025-04-03 00:00:00-04:00,100.05999755859375,100.05999755859375,100.05999755859375,100.05999755859375,88.16527557373047,0,0.0,0.0,0.0
|
||||
2025-04-04 00:00:00-04:00,93.5199966430664,93.5199966430664,93.5199966430664,93.5199966430664,82.40271759033203,0,0.0,0.0,0.0
|
||||
2025-04-07 00:00:00-04:00,92.19999694824219,92.19999694824219,92.19999694824219,92.19999694824219,81.23963928222656,0,0.0,0.0,0.0
|
||||
2025-04-08 00:00:00-04:00,91.36000061035156,91.36000061035156,91.36000061035156,91.36000061035156,80.49949645996094,0,0.0,0.0,0.0
|
||||
2025-04-09 00:00:00-04:00,99.08000183105469,99.08000183105469,99.08000183105469,99.08000183105469,87.30177307128906,0,0.0,0.0,0.0
|
||||
2025-04-10 00:00:00-04:00,96.3499984741211,96.3499984741211,96.3499984741211,96.3499984741211,84.89630126953125,0,0.0,0.0,0.0
|
||||
2025-04-11 00:00:00-04:00,98.94000244140625,98.94000244140625,98.94000244140625,98.94000244140625,87.17842102050781,0,0.0,0.0,0.0
|
||||
2025-04-14 00:00:00-04:00,99.91999816894531,99.91999816894531,99.91999816894531,99.91999816894531,88.04191589355469,0,0.0,0.0,0.0
|
||||
2025-04-15 00:00:00-04:00,100.8499984741211,100.8499984741211,100.8499984741211,100.8499984741211,88.86135864257812,0,0.0,0.0,0.0
|
||||
2025-04-16 00:00:00-04:00,98.98999786376953,98.98999786376953,98.98999786376953,98.98999786376953,87.22247314453125,0,0.0,0.0,0.0
|
||||
2025-04-17 00:00:00-04:00,99.69000244140625,99.69000244140625,99.69000244140625,99.69000244140625,87.83926391601562,0,0.0,0.0,0.0
|
||||
2025-04-21 00:00:00-04:00,98.72000122070312,98.72000122070312,98.72000122070312,98.72000122070312,86.98457336425781,0,0.0,0.0,0.0
|
||||
2025-04-22 00:00:00-04:00,100.7699966430664,100.7699966430664,100.7699966430664,100.7699966430664,88.7908706665039,0,0.0,0.0,0.0
|
||||
2025-04-23 00:00:00-04:00,102.27999877929688,102.27999877929688,102.27999877929688,102.27999877929688,90.12136840820312,0,0.0,0.0,0.0
|
||||
2025-04-24 00:00:00-04:00,104.54000091552734,104.54000091552734,104.54000091552734,104.54000091552734,92.11270904541016,0,0.0,0.0,0.0
|
||||
2025-04-25 00:00:00-04:00,105.2699966430664,105.2699966430664,105.2699966430664,105.2699966430664,92.75592803955078,0,0.0,0.0,0.0
|
||||
2025-04-28 00:00:00-04:00,105.1500015258789,105.1500015258789,105.1500015258789,105.1500015258789,92.65019989013672,0,0.0,0.0,0.0
|
||||
2025-04-29 00:00:00-04:00,105.36000061035156,105.36000061035156,105.36000061035156,105.36000061035156,92.83523559570312,0,0.0,0.0,0.0
|
||||
2025-04-30 00:00:00-04:00,106.04000091552734,106.04000091552734,106.04000091552734,106.04000091552734,93.43439483642578,0,0.0,0.0,0.0
|
||||
2025-05-01 00:00:00-04:00,106.0199966430664,106.0199966430664,106.0199966430664,106.0199966430664,93.4167709350586,0,0.0,0.0,0.0
|
||||
2025-05-02 00:00:00-04:00,108.80999755859375,108.80999755859375,108.80999755859375,108.80999755859375,95.87510681152344,0,0.0,0.0,0.0
|
||||
2025-05-05 00:00:00-04:00,108.61000061035156,108.61000061035156,108.61000061035156,108.61000061035156,95.69888305664062,0,0.0,0.0,0.0
|
||||
2025-05-06 00:00:00-04:00,108.25,108.25,108.25,108.25,95.38168334960938,0,0.0,0.0,0.0
|
||||
2025-05-07 00:00:00-04:00,108.25,108.25,108.25,108.25,95.38168334960938,0,0.0,0.0,0.0
|
||||
2025-05-08 00:00:00-04:00,108.76000213623047,108.76000213623047,108.76000213623047,108.76000213623047,95.8310546875,0,0.0,0.0,0.0
|
||||
2025-05-09 00:00:00-04:00,109.13999938964844,109.13999938964844,109.13999938964844,109.13999938964844,96.16587829589844,0,0.0,0.0,0.0
|
||||
2025-05-12 00:00:00-04:00,111.88999938964844,111.88999938964844,111.88999938964844,111.88999938964844,98.58897399902344,0,0.0,0.0,0.0
|
||||
2025-05-13 00:00:00-04:00,112.69999694824219,112.69999694824219,112.69999694824219,112.69999694824219,99.30268096923828,0,0.0,0.0,0.0
|
||||
2025-05-14 00:00:00-04:00,113.33000183105469,113.33000183105469,113.33000183105469,113.33000183105469,99.85779571533203,0,0.0,0.0,0.0
|
||||
2025-05-15 00:00:00-04:00,113.8499984741211,113.8499984741211,113.8499984741211,113.8499984741211,100.31597137451172,0,0.0,0.0,0.0
|
||||
2025-05-16 00:00:00-04:00,114.13999938964844,114.13999938964844,114.13999938964844,114.13999938964844,100.57150268554688,0,0.0,0.0,0.0
|
||||
2025-05-19 00:00:00-04:00,114.77999877929688,114.77999877929688,114.77999877929688,114.77999877929688,101.13542175292969,0,0.0,0.0,0.0
|
||||
2025-05-20 00:00:00-04:00,114.86000061035156,114.86000061035156,114.86000061035156,114.86000061035156,101.2059097290039,0,0.0,0.0,0.0
|
||||
2025-05-21 00:00:00-04:00,113.80999755859375,113.80999755859375,113.80999755859375,113.80999755859375,100.28073120117188,0,0.0,0.0,0.0
|
||||
2025-05-22 00:00:00-04:00,113.7300033569336,113.7300033569336,113.7300033569336,113.7300033569336,100.21024322509766,0,0.0,0.0,0.0
|
||||
2025-05-23 00:00:00-04:00,113.33000183105469,113.33000183105469,113.33000183105469,113.33000183105469,99.85779571533203,0,0.0,0.0,0.0
|
||||
2025-05-27 00:00:00-04:00,114.27999877929688,114.27999877929688,114.27999877929688,114.27999877929688,100.69486236572266,0,0.0,0.0,0.0
|
||||
2025-05-28 00:00:00-04:00,113.06999969482422,113.06999969482422,113.06999969482422,113.06999969482422,99.62870025634766,0,0.0,0.0,0.0
|
||||
2025-05-29 00:00:00-04:00,113.47000122070312,113.47000122070312,113.47000122070312,113.47000122070312,99.98114776611328,0,0.0,0.0,0.0
|
||||
2025-05-30 00:00:00-04:00,113.27999877929688,113.27999877929688,113.27999877929688,113.27999877929688,99.81373596191406,0,0.0,0.0,0.0
|
||||
2025-06-02 00:00:00-04:00,114.18000030517578,114.18000030517578,114.18000030517578,114.18000030517578,100.60675048828125,0,0.0,0.0,0.0
|
||||
2025-06-03 00:00:00-04:00,113.86000061035156,113.86000061035156,113.86000061035156,113.86000061035156,100.32479095458984,0,0.0,0.0,0.0
|
||||
2025-06-04 00:00:00-04:00,114.94000244140625,114.94000244140625,114.94000244140625,114.94000244140625,101.27640533447266,0,0.0,0.0,0.0
|
||||
2025-06-05 00:00:00-04:00,115.33999633789062,115.33999633789062,115.33999633789062,115.33999633789062,101.62884521484375,0,0.0,0.0,0.0
|
||||
2025-06-06 00:00:00-04:00,115.56999969482422,115.56999969482422,115.56999969482422,115.56999969482422,101.83151245117188,0,0.0,0.0,0.0
|
||||
2025-06-09 00:00:00-04:00,115.52999877929688,115.52999877929688,115.52999877929688,115.52999877929688,101.7962646484375,0,0.0,0.0,0.0
|
||||
2025-06-10 00:00:00-04:00,116.08999633789062,116.08999633789062,116.08999633789062,116.08999633789062,102.28968811035156,0,0.0,0.0,0.0
|
||||
2025-06-11 00:00:00-04:00,116.18000030517578,116.18000030517578,116.18000030517578,116.18000030517578,102.3689956665039,0,0.0,0.0,0.0
|
||||
2025-06-12 00:00:00-04:00,116.30999755859375,116.30999755859375,116.30999755859375,116.30999755859375,102.48353576660156,0,0.0,0.0,0.0
|
||||
2025-06-13 00:00:00-04:00,114.26000213623047,114.26000213623047,114.26000213623047,114.26000213623047,100.67723846435547,0,0.0,0.0,0.0
|
||||
2025-06-16 00:00:00-04:00,115.30999755859375,115.30999755859375,115.30999755859375,115.30999755859375,101.6024169921875,0,0.0,0.0,0.0
|
||||
2025-06-17 00:00:00-04:00,113.86000061035156,113.86000061035156,113.86000061035156,113.86000061035156,100.32479095458984,0,0.0,0.0,0.0
|
||||
2025-06-18 00:00:00-04:00,113.66000366210938,113.66000366210938,113.66000366210938,113.66000366210938,100.14856719970703,0,0.0,0.0,0.0
|
||||
2025-06-20 00:00:00-04:00,112.68000030517578,112.68000030517578,112.68000030517578,112.68000030517578,99.28506469726562,0,0.0,0.0,0.0
|
||||
2025-06-23 00:00:00-04:00,113.69999694824219,113.69999694824219,113.69999694824219,113.69999694824219,100.18380737304688,0,0.0,0.0,0.0
|
||||
2025-06-24 00:00:00-04:00,113.69999694824219,113.69999694824219,113.69999694824219,113.69999694824219,100.18380737304688,0,0.0,0.0,0.0
|
||||
2025-06-25 00:00:00-04:00,116.13999938964844,116.13999938964844,116.13999938964844,116.13999938964844,102.33374786376953,0,0.0,0.0,0.0
|
||||
2025-06-26 00:00:00-04:00,117.06999969482422,117.06999969482422,117.06999969482422,117.06999969482422,103.1531982421875,0,0.0,0.0,0.0
|
||||
2025-06-27 00:00:00-04:00,118.05999755859375,118.05999755859375,118.05999755859375,118.05999755859375,104.02550506591797,0,0.0,0.0,0.0
|
||||
2025-06-30 00:00:00-04:00,117.91999816894531,117.91999816894531,117.91999816894531,117.91999816894531,103.90215301513672,0,0.0,0.0,0.0
|
||||
2025-07-01 00:00:00-04:00,116.98999786376953,116.98999786376953,116.98999786376953,116.98999786376953,103.08270263671875,0,0.0,0.0,0.0
|
||||
2025-07-02 00:00:00-04:00,117.44999694824219,117.44999694824219,117.44999694824219,117.44999694824219,103.48802185058594,0,0.0,0.0,0.0
|
||||
2025-07-03 00:00:00-04:00,117.77999877929688,117.77999877929688,117.77999877929688,117.77999877929688,103.77879333496094,0,0.0,0.0,0.0
|
||||
2025-07-07 00:00:00-04:00,116.8499984741211,116.8499984741211,116.8499984741211,116.8499984741211,102.9593505859375,0,0.0,0.0,0.0
|
||||
2025-07-08 00:00:00-04:00,117.62999725341797,117.62999725341797,117.62999725341797,117.62999725341797,103.64662170410156,0,0.0,0.0,0.0
|
||||
2025-07-09 00:00:00-04:00,118.20999908447266,118.20999908447266,118.20999908447266,118.20999908447266,104.15767669677734,0,0.0,0.0,0.0
|
||||
2025-07-10 00:00:00-04:00,117.73999786376953,117.73999786376953,117.73999786376953,117.73999786376953,103.74354553222656,0,0.0,0.0,0.0
|
||||
2025-07-11 00:00:00-04:00,116.75,116.75,116.75,116.75,102.8712387084961,0,0.0,0.0,0.0
|
||||
2025-07-14 00:00:00-04:00,116.77999877929688,116.77999877929688,116.77999877929688,116.77999877929688,102.89766693115234,0,0.0,0.0,0.0
|
||||
2025-07-15 00:00:00-04:00,117.12000274658203,117.12000274658203,117.12000274658203,117.12000274658203,103.19725799560547,0,0.0,0.0,0.0
|
||||
2025-07-16 00:00:00-04:00,117.43000030517578,117.43000030517578,117.43000030517578,117.43000030517578,103.47039794921875,0,0.0,0.0,0.0
|
||||
2025-07-17 00:00:00-04:00,118.22000122070312,118.22000122070312,118.22000122070312,118.22000122070312,104.16648864746094,0,0.0,0.0,0.0
|
||||
2025-07-18 00:00:00-04:00,117.61000061035156,117.61000061035156,117.61000061035156,117.61000061035156,103.6290054321289,0,0.0,0.0,0.0
|
||||
2025-07-21 00:00:00-04:00,117.69999694824219,117.69999694824219,117.69999694824219,117.69999694824219,103.70829772949219,0,0.0,0.0,0.0
|
||||
2025-07-22 00:00:00-04:00,117.69999694824219,117.69999694824219,117.69999694824219,117.69999694824219,103.70829772949219,0,0.0,0.0,0.0
|
||||
2025-07-23 00:00:00-04:00,119.86000061035156,119.86000061035156,119.86000061035156,119.86000061035156,105.61153411865234,0,0.0,0.0,0.0
|
||||
2025-07-24 00:00:00-04:00,119.44999694824219,119.44999694824219,119.44999694824219,119.44999694824219,105.2502670288086,0,0.0,0.0,0.0
|
||||
2025-07-25 00:00:00-04:00,119.55999755859375,119.55999755859375,119.55999755859375,119.55999755859375,105.3471908569336,0,0.0,0.0,0.0
|
||||
2025-07-28 00:00:00-04:00,118.44999694824219,118.44999694824219,118.44999694824219,118.44999694824219,104.36914825439453,0,0.0,0.0,0.0
|
||||
2025-07-29 00:00:00-04:00,117.30999755859375,117.30999755859375,117.30999755859375,117.30999755859375,103.36466217041016,0,0.0,0.0,0.0
|
||||
2025-07-30 00:00:00-04:00,115.87999725341797,115.87999725341797,115.87999725341797,115.87999725341797,102.10465240478516,0,0.0,0.0,0.0
|
||||
2025-07-31 00:00:00-04:00,114.08999633789062,114.08999633789062,114.08999633789062,114.08999633789062,100.5274429321289,0,0.0,0.0,0.0
|
||||
2025-08-01 00:00:00-04:00,113.19999694824219,113.19999694824219,113.19999694824219,113.19999694824219,99.74324035644531,0,0.0,0.0,0.0
|
||||
2025-08-04 00:00:00-04:00,114.83999633789062,114.83999633789062,114.83999633789062,114.83999633789062,101.18828582763672,0,0.0,0.0,0.0
|
||||
2025-08-05 00:00:00-04:00,114.33000183105469,114.33000183105469,114.33000183105469,114.33000183105469,100.7389144897461,0,0.0,0.0,0.0
|
||||
2025-08-06 00:00:00-04:00,114.51000213623047,114.51000213623047,114.51000213623047,114.51000213623047,100.89752197265625,0,0.0,0.0,0.0
|
||||
2025-08-07 00:00:00-04:00,116.08000183105469,116.08000183105469,116.08000183105469,116.08000183105469,102.2808837890625,0,0.0,0.0,0.0
|
||||
2025-08-08 00:00:00-04:00,116.37000274658203,116.37000274658203,116.37000274658203,116.37000274658203,102.53641510009766,0,0.0,0.0,0.0
|
||||
2025-08-11 00:00:00-04:00,115.36000061035156,115.36000061035156,115.36000061035156,115.36000061035156,101.64647674560547,0,0.0,0.0,0.0
|
||||
2025-08-12 00:00:00-04:00,117.69999694824219,117.69999694824219,117.69999694824219,117.69999694824219,103.70829772949219,0,0.0,0.0,0.0
|
||||
2025-08-13 00:00:00-04:00,118.58000183105469,118.58000183105469,118.58000183105469,118.58000183105469,104.48369598388672,0,0.0,0.0,0.0
|
||||
2025-08-14 00:00:00-04:00,117.86000061035156,117.86000061035156,117.86000061035156,117.86000061035156,103.84928131103516,0,0.0,0.0,0.0
|
||||
2025-08-15 00:00:00-04:00,118.9000015258789,118.9000015258789,118.9000015258789,118.9000015258789,104.76565551757812,0,0.0,0.0,0.0
|
||||
2025-08-18 00:00:00-04:00,119.30999755859375,119.30999755859375,119.30999755859375,119.30999755859375,105.12691497802734,0,0.0,0.0,0.0
|
||||
2025-08-19 00:00:00-04:00,118.86000061035156,118.86000061035156,118.86000061035156,118.86000061035156,104.73040771484375,0,0.0,0.0,0.0
|
||||
2025-08-20 00:00:00-04:00,118.56999969482422,118.56999969482422,118.56999969482422,118.56999969482422,104.47488403320312,0,0.0,0.0,0.0
|
||||
2025-08-21 00:00:00-04:00,117.94000244140625,117.94000244140625,117.94000244140625,117.94000244140625,103.9197769165039,0,0.0,0.0,0.0
|
||||
2025-08-22 00:00:00-04:00,120.2300033569336,120.2300033569336,120.2300033569336,120.2300033569336,105.93755340576172,0,0.0,0.0,0.0
|
||||
2025-08-25 00:00:00-04:00,119.3499984741211,119.3499984741211,119.3499984741211,119.3499984741211,105.16215515136719,0,0.0,0.0,0.0
|
||||
2025-08-26 00:00:00-04:00,119.80000305175781,119.80000305175781,119.80000305175781,119.80000305175781,105.55867004394531,0,0.0,0.0,0.0
|
||||
2025-08-27 00:00:00-04:00,119.19999694824219,119.19999694824219,119.19999694824219,119.19999694824219,105.02999114990234,0,0.0,0.0,0.0
|
||||
2025-08-28 00:00:00-04:00,119.52999877929688,119.52999877929688,119.52999877929688,119.52999877929688,105.32076263427734,0,0.0,0.0,0.0
|
||||
2025-08-29 00:00:00-04:00,118.58999633789062,118.58999633789062,118.58999633789062,118.58999633789062,104.49250030517578,0,0.0,0.0,0.0
|
||||
2025-09-02 00:00:00-04:00,117.0999984741211,117.0999984741211,117.0999984741211,117.0999984741211,103.17962646484375,0,0.0,0.0,0.0
|
||||
2025-09-03 00:00:00-04:00,117.66000366210938,117.66000366210938,117.66000366210938,117.66000366210938,103.67306518554688,0,0.0,0.0,0.0
|
||||
2025-09-04 00:00:00-04:00,118.58000183105469,118.58000183105469,118.58000183105469,118.58000183105469,104.48369598388672,0,0.0,0.0,0.0
|
||||
2025-09-05 00:00:00-04:00,119.41000366210938,119.41000366210938,119.41000366210938,119.41000366210938,105.21502685546875,0,0.0,0.0,0.0
|
||||
2025-09-08 00:00:00-04:00,120.5,120.5,120.5,120.5,106.17545318603516,0,0.0,0.0,0.0
|
||||
2025-09-09 00:00:00-04:00,120.86000061035156,120.86000061035156,120.86000061035156,120.86000061035156,106.49266052246094,0,0.0,0.0,0.0
|
||||
2025-09-10 00:00:00-04:00,120.61000061035156,120.61000061035156,120.61000061035156,120.61000061035156,106.27237701416016,0,0.0,0.0,0.0
|
||||
2025-09-11 00:00:00-04:00,121.5999984741211,121.5999984741211,121.5999984741211,121.5999984741211,107.14468383789062,0,0.0,0.0,0.0
|
||||
2025-09-12 00:00:00-04:00,121.20999908447266,121.20999908447266,121.20999908447266,121.20999908447266,106.8010482788086,0,0.0,0.0,0.0
|
||||
2025-09-15 00:00:00-04:00,122.43000030517578,122.43000030517578,122.43000030517578,122.43000030517578,107.87602233886719,0,0.0,0.0,0.0
|
||||
2025-09-16 00:00:00-04:00,122.9000015258789,122.9000015258789,122.9000015258789,122.9000015258789,108.29015350341797,0,0.0,0.0,0.0
|
||||
2025-09-17 00:00:00-04:00,123.11000061035156,123.11000061035156,123.11000061035156,123.11000061035156,108.47518920898438,0,0.0,0.0,0.0
|
||||
2025-09-18 00:00:00-04:00,124.75,124.75,124.75,124.75,109.92022705078125,0,0.0,0.0,0.0
|
||||
2025-09-19 00:00:00-04:00,123.94000244140625,123.94000244140625,123.94000244140625,123.94000244140625,109.2065200805664,0,0.0,0.0,0.0
|
||||
2025-09-22 00:00:00-04:00,124.56999969482422,124.56999969482422,124.56999969482422,124.56999969482422,109.76162719726562,0,0.0,0.0,0.0
|
||||
2025-09-23 00:00:00-04:00,124.0,124.0,124.0,124.0,109.25938415527344,0,0.0,0.0,0.0
|
||||
2025-09-24 00:00:00-04:00,123.26000213623047,123.26000213623047,123.26000213623047,123.26000213623047,108.60735321044922,0,0.0,0.0,0.0
|
||||
2025-09-25 00:00:00-04:00,122.22000122070312,122.22000122070312,122.22000122070312,122.22000122070312,107.69098663330078,0,0.0,0.0,0.0
|
||||
2025-09-26 00:00:00-04:00,122.12000274658203,122.12000274658203,122.12000274658203,122.12000274658203,107.60287475585938,0,0.0,0.0,0.0
|
||||
2025-09-29 00:00:00-04:00,123.16999816894531,123.16999816894531,123.16999816894531,123.16999816894531,108.5280532836914,0,0.0,0.0,0.0
|
||||
2025-09-30 00:00:00-04:00,123.19999694824219,123.19999694824219,123.19999694824219,123.19999694824219,108.55448150634766,0,0.0,0.0,0.0
|
||||
2025-10-01 00:00:00-04:00,123.86000061035156,123.86000061035156,123.86000061035156,123.86000061035156,109.13603210449219,0,0.0,0.0,0.0
|
||||
2025-10-02 00:00:00-04:00,125.30999755859375,125.30999755859375,125.30999755859375,125.30999755859375,110.41365814208984,0,0.0,0.0,0.0
|
||||
2025-10-03 00:00:00-04:00,125.6500015258789,125.6500015258789,125.6500015258789,125.6500015258789,110.71324157714844,0,0.0,0.0,0.0
|
||||
2025-10-06 00:00:00-04:00,126.88999938964844,126.88999938964844,126.88999938964844,126.88999938964844,111.80583190917969,0,0.0,0.0,0.0
|
||||
2025-10-07 00:00:00-04:00,125.58000183105469,125.58000183105469,125.58000183105469,125.58000183105469,110.65156555175781,0,0.0,0.0,0.0
|
||||
2025-10-08 00:00:00-04:00,126.12000274658203,126.12000274658203,126.12000274658203,126.12000274658203,111.12737274169922,0,0.0,0.0,0.0
|
||||
2025-10-09 00:00:00-04:00,125.04000091552734,125.04000091552734,125.04000091552734,125.04000091552734,110.1757583618164,0,0.0,0.0,0.0
|
||||
2025-10-10 00:00:00-04:00,120.52999877929688,120.52999877929688,120.52999877929688,120.52999877929688,106.2018814086914,0,0.0,0.0,0.0
|
||||
2025-10-13 00:00:00-04:00,123.08000183105469,123.08000183105469,123.08000183105469,123.08000183105469,108.4487533569336,0,0.0,0.0,0.0
|
||||
2025-10-14 00:00:00-04:00,122.54000091552734,122.54000091552734,122.54000091552734,122.54000091552734,107.97294616699219,0,0.0,0.0,0.0
|
||||
2025-10-15 00:00:00-04:00,122.83999633789062,122.83999633789062,122.83999633789062,122.83999633789062,108.2372817993164,0,0.0,0.0,0.0
|
||||
2025-10-16 00:00:00-04:00,122.97000122070312,122.97000122070312,122.97000122070312,122.97000122070312,108.3518295288086,0,0.0,0.0,0.0
|
||||
2025-10-17 00:00:00-04:00,123.04000091552734,123.04000091552734,123.04000091552734,123.04000091552734,108.41350555419922,0,0.0,0.0,0.0
|
||||
2025-10-20 00:00:00-04:00,124.7699966430664,124.7699966430664,124.7699966430664,124.7699966430664,109.93785095214844,0,0.0,0.0,0.0
|
||||
2025-10-21 00:00:00-04:00,124.12000274658203,124.12000274658203,124.12000274658203,124.12000274658203,109.36511993408203,0,0.0,0.0,0.0
|
||||
2025-10-22 00:00:00-04:00,122.66999816894531,122.66999816894531,122.66999816894531,122.66999816894531,108.08748626708984,0,0.0,0.0,0.0
|
||||
2025-10-23 00:00:00-04:00,123.94999694824219,123.94999694824219,123.94999694824219,123.94999694824219,109.21532440185547,0,0.0,0.0,0.0
|
||||
2025-10-24 00:00:00-04:00,124.44000244140625,124.44000244140625,124.44000244140625,124.44000244140625,109.64707946777344,0,0.0,0.0,0.0
|
||||
2025-10-27 00:00:00-04:00,126.18000030517578,126.18000030517578,126.18000030517578,126.18000030517578,111.18023681640625,0,0.0,0.0,0.0
|
||||
2025-10-28 00:00:00-04:00,125.7300033569336,125.7300033569336,125.7300033569336,125.7300033569336,110.78373718261719,0,0.0,0.0,0.0
|
||||
2025-10-29 00:00:00-04:00,126.0,126.0,126.0,126.0,111.02163696289062,0,0.0,0.0,0.0
|
||||
2025-10-30 00:00:00-04:00,125.30000305175781,125.30000305175781,125.30000305175781,125.30000305175781,110.40484619140625,0,0.0,0.0,0.0
|
||||
2025-10-31 00:00:00-04:00,124.94000244140625,124.94000244140625,124.94000244140625,124.94000244140625,110.087646484375,0,0.0,0.0,0.0
|
||||
2025-11-03 00:00:00-05:00,125.08000183105469,125.08000183105469,125.08000183105469,125.08000183105469,110.21099853515625,0,0.0,0.0,0.0
|
||||
2025-11-04 00:00:00-05:00,122.6500015258789,122.6500015258789,122.6500015258789,122.6500015258789,108.06986999511719,0,0.0,0.0,0.0
|
||||
2025-11-05 00:00:00-05:00,123.1500015258789,123.1500015258789,123.1500015258789,123.1500015258789,108.51042938232422,0,0.0,0.0,0.0
|
||||
2025-11-06 00:00:00-05:00,121.4000015258789,121.4000015258789,121.4000015258789,121.4000015258789,106.96846771240234,0,0.0,0.0,0.0
|
||||
2025-11-07 00:00:00-05:00,120.95999908447266,120.95999908447266,120.95999908447266,120.95999908447266,106.58076477050781,0,0.0,0.0,0.0
|
||||
2025-11-10 00:00:00-05:00,122.8499984741211,122.8499984741211,122.8499984741211,122.8499984741211,108.24609375,0,0.0,0.0,0.0
|
||||
2025-11-11 00:00:00-05:00,123.30000305175781,123.30000305175781,123.30000305175781,123.30000305175781,108.6426010131836,0,0.0,0.0,0.0
|
||||
2025-11-12 00:00:00-05:00,123.6500015258789,123.6500015258789,123.6500015258789,123.6500015258789,108.95099639892578,0,0.0,0.0,0.0
|
||||
2025-11-13 00:00:00-05:00,121.47000122070312,121.47000122070312,121.47000122070312,121.47000122070312,107.03014373779297,0,0.0,0.0,0.0
|
||||
2025-11-14 00:00:00-05:00,121.33000183105469,121.33000183105469,121.33000183105469,121.33000183105469,106.90678405761719,0,0.0,0.0,0.0
|
||||
2025-11-17 00:00:00-05:00,119.73999786376953,119.73999786376953,119.73999786376953,119.73999786376953,105.50579833984375,0,0.0,0.0,0.0
|
||||
2025-11-18 00:00:00-05:00,118.41000366210938,118.41000366210938,118.41000366210938,118.41000366210938,104.33390808105469,0,0.0,0.0,0.0
|
||||
2025-11-19 00:00:00-05:00,118.27999877929688,118.27999877929688,118.27999877929688,118.27999877929688,104.21935272216797,0,0.0,0.0,0.0
|
||||
2025-11-20 00:00:00-05:00,115.16000366210938,115.16000366210938,115.16000366210938,115.16000366210938,101.47025299072266,0,0.0,0.0,0.0
|
||||
2025-11-21 00:00:00-05:00,116.56999969482422,116.56999969482422,116.56999969482422,116.56999969482422,102.71263122558594,0,0.0,0.0,0.0
|
||||
2025-11-24 00:00:00-05:00,117.61000061035156,117.61000061035156,117.61000061035156,117.61000061035156,103.6290054321289,0,0.0,0.0,0.0
|
||||
2025-11-25 00:00:00-05:00,118.8499984741211,118.8499984741211,118.8499984741211,118.8499984741211,104.72159576416016,0,0.0,0.0,0.0
|
||||
2025-11-26 00:00:00-05:00,119.88999938964844,119.88999938964844,119.88999938964844,119.88999938964844,105.6379623413086,0,0.0,0.0,0.0
|
||||
2025-11-28 00:00:00-05:00,120.91000366210938,120.91000366210938,120.91000366210938,120.91000366210938,106.53671264648438,0,0.0,0.0,0.0
|
||||
2025-12-01 00:00:00-05:00,120.0,120.0,120.0,120.0,105.7348861694336,0,0.0,0.0,0.0
|
||||
2025-12-02 00:00:00-05:00,120.7699966430664,120.7699966430664,120.7699966430664,120.7699966430664,106.4133529663086,0,0.0,0.0,0.0
|
||||
2025-12-03 00:00:00-05:00,121.38999938964844,121.38999938964844,121.38999938964844,121.38999938964844,106.95964813232422,0,0.0,0.0,0.0
|
||||
2025-12-04 00:00:00-05:00,121.55999755859375,121.55999755859375,121.55999755859375,121.55999755859375,107.10944366455078,0,0.0,0.0,0.0
|
||||
2025-12-05 00:00:00-05:00,121.5199966430664,121.5199966430664,121.5199966430664,121.5199966430664,107.0741958618164,0,0.0,0.0,0.0
|
||||
2025-12-08 00:00:00-05:00,121.48999786376953,121.48999786376953,121.48999786376953,121.48999786376953,107.04776000976562,0,0.0,0.0,0.0
|
||||
2025-12-09 00:00:00-05:00,121.16000366210938,121.16000366210938,121.16000366210938,121.16000366210938,106.75699615478516,0,0.0,0.0,0.0
|
||||
2025-12-10 00:00:00-05:00,122.55000305175781,122.55000305175781,122.55000305175781,122.55000305175781,107.98175811767578,0,0.0,0.0,0.0
|
||||
2025-12-11 00:00:00-05:00,122.66999816894531,122.66999816894531,122.66999816894531,122.66999816894531,108.08748626708984,0,0.0,0.0,0.0
|
||||
2025-12-12 00:00:00-05:00,121.08999633789062,121.08999633789062,121.08999633789062,121.08999633789062,106.6953125,0,0.0,0.0,0.0
|
||||
2025-12-15 00:00:00-05:00,120.7699966430664,120.7699966430664,120.7699966430664,120.7699966430664,106.4133529663086,0,0.0,0.0,0.0
|
||||
2025-12-16 00:00:00-05:00,120.0999984741211,120.0999984741211,120.0999984741211,120.0999984741211,105.822998046875,0,0.0,0.0,0.0
|
||||
2025-12-17 00:00:00-05:00,110.44000244140625,110.44000244140625,110.44000244140625,110.44000244140625,110.44000244140625,0,7.857,0.0,6.42
|
||||
2025-12-18 00:00:00-05:00,111.77999877929688,111.77999877929688,111.77999877929688,111.77999877929688,111.77999877929688,0,0.0,0.0,0.0
|
||||
2025-12-19 00:00:00-05:00,112.76000213623047,112.76000213623047,112.76000213623047,112.76000213623047,112.76000213623047,0,0.0,0.0,0.0
|
||||
2025-12-22 00:00:00-05:00,113.37999725341797,113.37999725341797,113.37999725341797,113.37999725341797,113.37999725341797,0,0.0,0.0,0.0
|
||||
2025-12-23 00:00:00-05:00,114.01000213623047,114.01000213623047,114.01000213623047,114.01000213623047,114.01000213623047,0,0.0,0.0,0.0
|
||||
2025-12-24 00:00:00-05:00,114.12999725341797,114.12999725341797,114.12999725341797,114.12999725341797,114.12999725341797,0,0.0,0.0,0.0
|
||||
2025-12-26 00:00:00-05:00,114.70999908447266,114.70999908447266,114.70999908447266,114.70999908447266,114.70999908447266,0,0.0,0.0,0.0
|
||||
2025-12-29 00:00:00-05:00,114.44000244140625,114.44000244140625,114.44000244140625,114.44000244140625,114.44000244140625,0,0.0,0.0,0.0
|
||||
2025-12-30 00:00:00-05:00,114.37999725341797,114.37999725341797,114.37999725341797,114.37999725341797,114.37999725341797,0,0.0,0.0,0.0
|
||||
2025-12-31 00:00:00-05:00,113.98999786376953,113.98999786376953,113.98999786376953,113.98999786376953,113.98999786376953,0,0.0,0.0,0.0
|
||||
2026-01-02 00:00:00-05:00,115.68000030517578,115.68000030517578,115.68000030517578,115.68000030517578,115.68000030517578,0,0.0,0.0,0.0
|
||||
2026-01-05 00:00:00-05:00,118.0999984741211,118.0999984741211,118.0999984741211,118.0999984741211,118.0999984741211,0,0.0,0.0,0.0
|
||||
2026-01-06 00:00:00-05:00,118.98999786376953,118.98999786376953,118.98999786376953,118.98999786376953,118.98999786376953,0,0.0,0.0,0.0
|
||||
2026-01-07 00:00:00-05:00,118.0199966430664,118.0199966430664,118.0199966430664,118.0199966430664,118.0199966430664,0,0.0,0.0,0.0
|
||||
2026-01-08 00:00:00-05:00,117.5,117.5,117.5,117.5,117.5,0,0.0,0.0,0.0
|
||||
2026-01-09 00:00:00-05:00,118.62000274658203,118.62000274658203,118.62000274658203,118.62000274658203,118.62000274658203,0,0.0,0.0,0.0
|
||||
|
55
tests/test_calendars.py
Normal file
55
tests/test_calendars.py
Normal file
@@ -0,0 +1,55 @@
|
||||
from datetime import datetime, timedelta, timezone
|
||||
import unittest
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from tests.context import yfinance as yf, session_gbl
|
||||
|
||||
|
||||
class TestCalendars(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.calendars = yf.Calendars(session=session_gbl)
|
||||
|
||||
def test_get_earnings_calendar(self):
|
||||
result = self.calendars.get_earnings_calendar(limit=1)
|
||||
tickers = self.calendars.earnings_calendar.index.tolist()
|
||||
|
||||
self.assertIsInstance(result, pd.DataFrame)
|
||||
self.assertEqual(len(result), 1)
|
||||
self.assertIsInstance(tickers, list)
|
||||
self.assertEqual(len(tickers), len(result))
|
||||
self.assertEqual(tickers, result.index.tolist())
|
||||
|
||||
first_ticker = result.index.tolist()[0]
|
||||
result_first_ticker = self.calendars.earnings_calendar.loc[first_ticker].name
|
||||
self.assertEqual(first_ticker, result_first_ticker)
|
||||
|
||||
def test_get_earnings_calendar_init_params(self):
|
||||
result = self.calendars.get_earnings_calendar(limit=5)
|
||||
self.assertGreaterEqual(result['Event Start Date'].iloc[0], pd.to_datetime(datetime.now(tz=timezone.utc)))
|
||||
|
||||
start = datetime.now(tz=timezone.utc) - timedelta(days=7)
|
||||
result = yf.Calendars(start=start).get_earnings_calendar(limit=5)
|
||||
self.assertGreaterEqual(result['Event Start Date'].iloc[0], pd.to_datetime(start))
|
||||
|
||||
def test_get_ipo_info_calendar(self):
|
||||
result = self.calendars.get_ipo_info_calendar(limit=5)
|
||||
|
||||
self.assertIsInstance(result, pd.DataFrame)
|
||||
self.assertEqual(len(result), 5)
|
||||
|
||||
def test_get_economic_events_calendar(self):
|
||||
result = self.calendars.get_economic_events_calendar(limit=5)
|
||||
|
||||
self.assertIsInstance(result, pd.DataFrame)
|
||||
self.assertEqual(len(result), 5)
|
||||
|
||||
def test_get_splits_calendar(self):
|
||||
result = self.calendars.get_splits_calendar(limit=5)
|
||||
|
||||
self.assertIsInstance(result, pd.DataFrame)
|
||||
self.assertEqual(len(result), 5)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -61,7 +61,7 @@ class TestPriceRepairAssumptions(unittest.TestCase):
|
||||
vol_diff_pct0 = (dfr['Volume'].iloc[0] - df_truth['Volume'].iloc[0])/df_truth['Volume'].iloc[0]
|
||||
vol_diff_pct1 = (dfr['Volume'].iloc[-1] - df_truth['Volume'].iloc[-1])/df_truth['Volume'].iloc[-1]
|
||||
vol_diff_pct = _np.array([vol_diff_pct0, vol_diff_pct1])
|
||||
vol_match = vol_diff_pct > -0.23
|
||||
vol_match = vol_diff_pct > -0.32
|
||||
vol_match_nmatch = _np.sum(vol_match)
|
||||
vol_match_ndiff = len(vol_match) - vol_match_nmatch
|
||||
if vol_match.all():
|
||||
@@ -78,6 +78,8 @@ class TestPriceRepairAssumptions(unittest.TestCase):
|
||||
|
||||
if debug:
|
||||
print("- investigate:")
|
||||
print(f" - interval = {interval}")
|
||||
print(f" - period = {period}")
|
||||
print("- df_truth:")
|
||||
print(df_truth)#[['Open', 'Close', 'Volume']])
|
||||
df_1d = dat.history(interval='1d', period=period)
|
||||
@@ -121,7 +123,7 @@ class TestPriceRepair(unittest.TestCase):
|
||||
|
||||
tkrs = ["BHP.AX", "IMP.JO", "BP.L", "PNL.L", "INTC"]
|
||||
|
||||
dt_now = _pd.Timestamp.utcnow()
|
||||
dt_now = _pd.Timestamp.now('UTC')
|
||||
td_60d = _dt.timedelta(days=60)
|
||||
|
||||
# Round time for 'requests_cache' reuse
|
||||
@@ -301,10 +303,9 @@ class TestPriceRepair(unittest.TestCase):
|
||||
# Sometimes Yahoo suddenly shifts from cents->$ from some recent date.
|
||||
|
||||
tkrs = ['AET.L', 'SSW.JO']
|
||||
intervals = ['1d', '1wk']
|
||||
# tkrs = ['AET.L']
|
||||
# intervals = ['1wk']
|
||||
# import yfinance as yf ; yf.enable_debug_mode()
|
||||
# intervals = ['1d', '1wk']
|
||||
# Give up repairing 1wk intervals directly. Instead will resample from 1d
|
||||
intervals = ['1d']
|
||||
|
||||
for tkr in tkrs:
|
||||
for interval in intervals:
|
||||
@@ -361,27 +362,23 @@ class TestPriceRepair(unittest.TestCase):
|
||||
hist = dat._lazy_load_price_history()
|
||||
tz_exchange = dat.fast_info["timezone"]
|
||||
|
||||
df_bad = _pd.DataFrame(data={"Open": [0, 114.37, 114.20],
|
||||
"High": [0, 114.40, 114.40],
|
||||
"Low": [0, 114.36, 114.20],
|
||||
"Close": [114.39, 114.38, 114.45],
|
||||
"Adj Close": [114.39, 114.38, 114.45],
|
||||
"Volume": [9, 15666, 1094]},
|
||||
index=_pd.to_datetime([_dt.datetime(2025, 3, 17),
|
||||
_dt.datetime(2025, 3, 14),
|
||||
_dt.datetime(2025, 3, 13)]))
|
||||
df_bad = df_bad.sort_index()
|
||||
df_bad.index.name = "Date"
|
||||
df_bad.index = df_bad.index.tz_localize(tz_exchange)
|
||||
correct_df = dat.history(period='1mo', auto_adjust=False)
|
||||
|
||||
dt_bad = correct_df.index[len(correct_df)//2]
|
||||
df_bad = correct_df.copy()
|
||||
for c in df_bad.columns:
|
||||
df_bad.loc[dt_bad, c] = _np.nan
|
||||
|
||||
repaired_df = hist._fix_zeroes(df_bad, "1d", tz_exchange, prepost=False)
|
||||
|
||||
correct_df = df_bad.copy()
|
||||
correct_df.loc["2025-03-17", "Open"] = 114.62
|
||||
correct_df.loc["2025-03-17", "High"] = 114.62
|
||||
correct_df.loc["2025-03-17", "Low"] = 114.41
|
||||
for c in ["Open", "Low", "High", "Close"]:
|
||||
self.assertTrue(_np.isclose(repaired_df[c], correct_df[c], rtol=1e-7).all())
|
||||
try:
|
||||
self.assertTrue(_np.isclose(repaired_df[c], correct_df[c], rtol=1e-7).all())
|
||||
except Exception:
|
||||
print(f"# column = {c}")
|
||||
print("# correct:") ; print(correct_df[c])
|
||||
print("# repaired:") ; print(repaired_df[c])
|
||||
raise
|
||||
|
||||
self.assertTrue("Repaired?" in repaired_df.columns)
|
||||
self.assertFalse(repaired_df["Repaired?"].isna().any())
|
||||
@@ -421,7 +418,13 @@ class TestPriceRepair(unittest.TestCase):
|
||||
|
||||
df_slice_bad_repaired = hist._fix_zeroes(df_slice_bad, "1d", tz_exchange, prepost=False)
|
||||
for c in ["Close", "Adj Close"]:
|
||||
self.assertTrue(_np.isclose(df_slice_bad_repaired[c], df_slice[c], rtol=rtol).all())
|
||||
try:
|
||||
self.assertTrue(_np.isclose(df_slice_bad_repaired[c], df_slice[c], rtol=rtol).all())
|
||||
except Exception:
|
||||
print(f"# column = {c}")
|
||||
print("# correct:") ; print(df_slice[c])
|
||||
print("# repaired:") ; print(df_slice_bad_repaired[c])
|
||||
raise
|
||||
self.assertTrue("Repaired?" in df_slice_bad_repaired.columns)
|
||||
self.assertFalse(df_slice_bad_repaired["Repaired?"].isna().any())
|
||||
|
||||
@@ -464,7 +467,7 @@ class TestPriceRepair(unittest.TestCase):
|
||||
# Stocks that split in 2022 but no problems in Yahoo data,
|
||||
# so repair should change nothing
|
||||
good_tkrs = ['AMZN', 'DXCM', 'FTNT', 'GOOG', 'GME', 'PANW', 'SHOP', 'TSLA']
|
||||
good_tkrs += ['AEI', 'GHI', 'IRON', 'LXU', 'RSLS', 'TISI']
|
||||
good_tkrs += ['AEI', 'GHI', 'IRON', 'LXU', 'TISI']
|
||||
good_tkrs += ['BOL.ST', 'TUI1.DE']
|
||||
intervals = ['1d', '1wk', '1mo', '3mo']
|
||||
for tkr in good_tkrs:
|
||||
@@ -526,33 +529,36 @@ class TestPriceRepair(unittest.TestCase):
|
||||
# print(repaired_df[c] - correct_df[c])
|
||||
raise
|
||||
|
||||
# Had very high price volatility in Jan-2021 around split date that could
|
||||
# be mistaken for missing stock split adjustment. And old logic did think
|
||||
# column 'High' required fixing - wrong!
|
||||
sketchy_tkrs = ['FIZZ']
|
||||
intervals = ['1wk']
|
||||
for tkr in sketchy_tkrs:
|
||||
for interval in intervals:
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
tz_exchange = dat.fast_info["timezone"]
|
||||
hist = dat._lazy_load_price_history()
|
||||
false_positives = {}
|
||||
# FIZZ had very high price volatility in Jan-2021 around split date:
|
||||
false_positives['FIZZ'] = {'interval': '1d', 'start': '2020-11-30', 'end': '2021-04-01'}
|
||||
# GME has crazy price action in Jan 2021, mistaken for missing 2007 split
|
||||
false_positives['GME'] = {'interval': '1d', 'start': '2007-01-01', 'end': '2023-01-01'}
|
||||
# NVDA has a ~33% price drop on 2004-08-06, confused with earlier 3:2 split
|
||||
false_positives['NVDA'] = {'interval': '1d', 'start': '2001-07-01', 'end': '2007-09-15'}
|
||||
# yf.config.debug.logging = True
|
||||
for tkr, args in false_positives.items():
|
||||
interval = args['interval']
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
tz_exchange = dat.fast_info["timezone"]
|
||||
hist = dat._lazy_load_price_history()
|
||||
|
||||
df_good = hist.history(start='2020-11-30', end='2021-04-01', interval=interval, auto_adjust=False)
|
||||
df_good = hist.history(auto_adjust=False, **args)
|
||||
|
||||
repaired_df = hist._fix_bad_stock_splits(df_good, interval, tz_exchange)
|
||||
repaired_df = hist._fix_bad_stock_splits(df_good, interval, tz_exchange)
|
||||
|
||||
# Expect no change from repair
|
||||
df_good = df_good.sort_index()
|
||||
repaired_df = repaired_df.sort_index()
|
||||
for c in ["Open", "Low", "High", "Close", "Adj Close", "Volume"]:
|
||||
try:
|
||||
self.assertTrue((repaired_df[c].to_numpy() == df_good[c].to_numpy()).all())
|
||||
except AssertionError:
|
||||
print(f"tkr={tkr} interval={interval} COLUMN={c}")
|
||||
df_dbg = df_good[[c]].join(repaired_df[[c]], lsuffix='.good', rsuffix='.repaired')
|
||||
f_diff = repaired_df[c].to_numpy() != df_good[c].to_numpy()
|
||||
print(df_dbg[f_diff | _np.roll(f_diff, 1) | _np.roll(f_diff, -1)])
|
||||
raise
|
||||
# Expect no change from repair
|
||||
df_good = df_good.sort_index()
|
||||
repaired_df = repaired_df.sort_index()
|
||||
for c in ["Open", "Low", "High", "Close", "Adj Close", "Volume"]:
|
||||
try:
|
||||
self.assertTrue((repaired_df[c].to_numpy() == df_good[c].to_numpy()).all())
|
||||
except AssertionError:
|
||||
print(f"tkr={tkr} interval={interval} COLUMN={c}")
|
||||
df_dbg = df_good[[c]].join(repaired_df[[c]], lsuffix='.good', rsuffix='.repaired')
|
||||
f_diff = repaired_df[c].to_numpy() != df_good[c].to_numpy()
|
||||
print(df_dbg[f_diff | _np.roll(f_diff, 1) | _np.roll(f_diff, -1)])
|
||||
raise
|
||||
|
||||
def test_repair_bad_div_adjusts(self):
|
||||
interval = '1d'
|
||||
@@ -589,7 +595,6 @@ class TestPriceRepair(unittest.TestCase):
|
||||
|
||||
# Div 0.01x
|
||||
bad_tkrs += ['NVT.L']
|
||||
bad_tkrs += ['TENT.L']
|
||||
|
||||
# Missing div adjusts:
|
||||
bad_tkrs += ['1398.HK']
|
||||
@@ -598,7 +603,6 @@ class TestPriceRepair(unittest.TestCase):
|
||||
|
||||
# Phantom divs
|
||||
bad_tkrs += ['KAP.IL'] # 1x 1d phantom div, and false positives 0.01x in 1wk
|
||||
bad_tkrs += ['SAND']
|
||||
bad_tkrs += ['TEM.L']
|
||||
bad_tkrs += ['TEP.PA']
|
||||
|
||||
@@ -692,6 +696,44 @@ class TestPriceRepair(unittest.TestCase):
|
||||
print(repaired_df[c][f_diff] - correct_df[c][f_diff])
|
||||
raise
|
||||
|
||||
def test_repair_capital_gains_double_count(self):
|
||||
bad_tkrs = ['DODFX', 'VWILX', 'JENYX']
|
||||
for tkr in bad_tkrs:
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
hist = dat._lazy_load_price_history()
|
||||
|
||||
interval = '1d'
|
||||
fp = os.path.join(self.dp, "data", tkr.replace('.','-')+'-'+interval+"-cg-double-count.csv")
|
||||
|
||||
df_bad = _pd.read_csv(fp, index_col="Date")
|
||||
df_bad.index = _pd.to_datetime(df_bad.index, utc=True)
|
||||
|
||||
repaired_df = hist._repair_capital_gains(df_bad)
|
||||
|
||||
fp = os.path.join(self.dp, "data", tkr.replace('.','-')+'-'+interval+"-cg-double-count-fixed.csv")
|
||||
correct_df = _pd.read_csv(fp, index_col="Date")
|
||||
correct_df.index = _pd.to_datetime(correct_df.index, utc=True)
|
||||
|
||||
repaired_df = repaired_df.sort_index()
|
||||
correct_df = correct_df.sort_index()
|
||||
for c in ["Open", "Low", "High", "Close", "Adj Close", "Volume"]:
|
||||
try:
|
||||
self.assertTrue(_np.isclose(repaired_df[c], correct_df[c], rtol=5e-6).all())
|
||||
except AssertionError:
|
||||
f = (correct_df['Capital Gains']!=0).to_numpy()
|
||||
f2 = f|_np.roll(f,1)|_np.roll(f,2)|_np.roll(f,-1)|_np.roll(f,-2)
|
||||
print(f"tkr={tkr} COLUMN={c}")
|
||||
print("- repaired_df")
|
||||
print(repaired_df[f2].drop(['Open', 'High', 'Low', 'Volume', 'Capital Gains'], axis=1))
|
||||
print("- repaired_df[c]")
|
||||
print(repaired_df[f2][c])
|
||||
print("- correct_df[c]:")
|
||||
print(correct_df[f2][c])
|
||||
print("- diff:")
|
||||
print(repaired_df[f2][c] - correct_df[f2][c])
|
||||
raise
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -2,6 +2,7 @@ from tests.context import yfinance as yf
|
||||
from tests.context import session_gbl
|
||||
|
||||
import unittest
|
||||
import socket
|
||||
|
||||
import datetime as _dt
|
||||
import pytz as _tz
|
||||
@@ -68,7 +69,7 @@ class TestPriceHistory(unittest.TestCase):
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
tz = dat._get_ticker_tz(timeout=None)
|
||||
|
||||
dt_utc = _pd.Timestamp.utcnow()
|
||||
dt_utc = _pd.Timestamp.now('UTC')
|
||||
dt = dt_utc.astimezone(_tz.timezone(tz))
|
||||
start_d = dt.date() - _dt.timedelta(days=7)
|
||||
df = dat.history(start=start_d, interval="1h")
|
||||
@@ -88,7 +89,7 @@ class TestPriceHistory(unittest.TestCase):
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
tz = dat._get_ticker_tz(timeout=None)
|
||||
|
||||
dt_utc = _pd.Timestamp.utcnow()
|
||||
dt_utc = _pd.Timestamp.now('UTC')
|
||||
dt = dt_utc.astimezone(_tz.timezone(tz))
|
||||
if dt.time() < _dt.time(17, 0):
|
||||
continue
|
||||
@@ -224,7 +225,7 @@ class TestPriceHistory(unittest.TestCase):
|
||||
start_d = _dt.date(2022, 1, 1)
|
||||
end_d = _dt.date(2023, 1, 1)
|
||||
|
||||
tkr_div_dates = {'BHP.AX': [_dt.date(2022, 9, 1), _dt.date(2022, 2, 24)], # Yahoo claims 23-Feb but wrong because DST
|
||||
tkr_div_dates = {'BHP.AX': [_dt.date(2022, 9, 1), _dt.date(2022, 2, 24)],
|
||||
'IMP.JO': [_dt.date(2022, 9, 21), _dt.date(2022, 3, 16)],
|
||||
'BP.L': [_dt.date(2022, 11, 10), _dt.date(2022, 8, 11), _dt.date(2022, 5, 12),
|
||||
_dt.date(2022, 2, 17)],
|
||||
@@ -456,6 +457,21 @@ class TestPriceHistory(unittest.TestCase):
|
||||
|
||||
dat.history(start=start, end=end, interval=interval)
|
||||
|
||||
def test_transient_error_detection(self):
|
||||
"""Test that _is_transient_error correctly identifies transient vs permanent errors"""
|
||||
from yfinance.data import _is_transient_error
|
||||
from yfinance.exceptions import YFPricesMissingError
|
||||
|
||||
# Transient errors (should retry)
|
||||
self.assertTrue(_is_transient_error(socket.error("Network error")))
|
||||
self.assertTrue(_is_transient_error(TimeoutError("Timeout")))
|
||||
self.assertTrue(_is_transient_error(OSError("OS error")))
|
||||
|
||||
# Permanent errors (should NOT retry)
|
||||
self.assertFalse(_is_transient_error(ValueError("Invalid")))
|
||||
self.assertFalse(_is_transient_error(YFPricesMissingError('INVALID', '')))
|
||||
self.assertFalse(_is_transient_error(KeyError("key")))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -15,7 +15,7 @@ import pandas as pd
|
||||
from tests.context import yfinance as yf
|
||||
from tests.context import session_gbl
|
||||
from yfinance.exceptions import YFPricesMissingError, YFInvalidPeriodError, YFNotImplementedError, YFTickerMissingError, YFTzMissingError, YFDataException
|
||||
|
||||
from yfinance.config import YfConfig
|
||||
|
||||
import unittest
|
||||
# import requests_cache
|
||||
@@ -132,10 +132,11 @@ class TestTicker(unittest.TestCase):
|
||||
def test_invalid_period(self):
|
||||
tkr = 'VALE'
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
YfConfig.debug.hide_exceptions = False
|
||||
with self.assertRaises(YFInvalidPeriodError):
|
||||
dat.history(period="2wks", interval="1d", raise_errors=True)
|
||||
dat.history(period="2wks", interval="1d")
|
||||
with self.assertRaises(YFInvalidPeriodError):
|
||||
dat.history(period="2mos", interval="1d", raise_errors=True)
|
||||
dat.history(period="2mos", interval="1d")
|
||||
|
||||
def test_valid_custom_periods(self):
|
||||
valid_periods = [
|
||||
@@ -151,9 +152,11 @@ class TestTicker(unittest.TestCase):
|
||||
tkr = "AAPL"
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
|
||||
YfConfig.debug.hide_exceptions = False
|
||||
|
||||
for period, interval in valid_periods:
|
||||
with self.subTest(period=period, interval=interval):
|
||||
df = dat.history(period=period, interval=interval, raise_errors=True)
|
||||
df = dat.history(period=period, interval=interval)
|
||||
self.assertIsInstance(df, pd.DataFrame)
|
||||
self.assertFalse(df.empty, f"No data returned for period={period}, interval={interval}")
|
||||
self.assertIn("Close", df.columns, f"'Close' column missing for period={period}, interval={interval}")
|
||||
@@ -185,21 +188,25 @@ class TestTicker(unittest.TestCase):
|
||||
self.assertLessEqual(df.index[-1].to_pydatetime().replace(tzinfo=None), now,
|
||||
f"End date {df.index[-1]} out of range for period={period}")
|
||||
|
||||
def test_prices_missing(self):
|
||||
# this test will need to be updated every time someone wants to run a test
|
||||
# hard to find a ticker that matches this error other than options
|
||||
# META call option, 2024 April 26th @ strike of 180000
|
||||
tkr = 'META240426C00180000'
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
with self.assertRaises(YFPricesMissingError):
|
||||
dat.history(period="5d", interval="1m", raise_errors=True)
|
||||
# # 2025-12-11: test failing and no time to find new tkr
|
||||
# def test_prices_missing(self):
|
||||
# # this test will need to be updated every time someone wants to run a test
|
||||
# # hard to find a ticker that matches this error other than options
|
||||
# # META call option, 2024 April 26th @ strike of 180000
|
||||
|
||||
# tkr = 'META240426C00180000'
|
||||
# dat = yf.Ticker(tkr, session=self.session)
|
||||
# YfConfig.debug.hide_exceptions = False
|
||||
# with self.assertRaises(YFPricesMissingError):
|
||||
# dat.history(period="5d", interval="1m")
|
||||
|
||||
def test_ticker_missing(self):
|
||||
tkr = 'ATVI'
|
||||
dat = yf.Ticker(tkr, session=self.session)
|
||||
# A missing ticker can trigger either a niche error or the generalized error
|
||||
with self.assertRaises((YFTickerMissingError, YFTzMissingError, YFPricesMissingError)):
|
||||
dat.history(period="3mo", interval="1d", raise_errors=True)
|
||||
YfConfig.debug.hide_exceptions = False
|
||||
dat.history(period="3mo", interval="1d")
|
||||
|
||||
def test_goodTicker(self):
|
||||
# that yfinance works when full api is called on same instance of ticker
|
||||
@@ -234,6 +241,23 @@ class TestTicker(unittest.TestCase):
|
||||
for attribute_name, attribute_type in ticker_attributes:
|
||||
assert_attribute_type(self, dat, attribute_name, attribute_type)
|
||||
|
||||
def test_ticker_with_symbol_mic(self):
|
||||
equities = [
|
||||
("OR", "XPAR"), # L'Oréal on Euronext Paris
|
||||
("AAPL", "XNYS"), # Apple on NYSE
|
||||
("GOOGL", "XNAS"), # Alphabet on NASDAQ
|
||||
("BMW", "XETR"), # BMW on XETRA
|
||||
]
|
||||
for eq in equities:
|
||||
# No exception = pass
|
||||
yf.Ticker(eq)
|
||||
yf.Ticker((eq[0], eq[1].lower()))
|
||||
|
||||
def test_ticker_with_symbol_mic_invalid(self):
|
||||
with self.assertRaises(ValueError) as cm:
|
||||
yf.Ticker(('ABC', 'XXXX'))
|
||||
self.assertIn("Unknown MIC code: 'XXXX'", str(cm.exception))
|
||||
|
||||
|
||||
class TestTickerHistory(unittest.TestCase):
|
||||
session = None
|
||||
@@ -488,7 +512,7 @@ class TestTickerMiscFinancials(unittest.TestCase):
|
||||
def test_isin(self):
|
||||
data = self.ticker.isin
|
||||
self.assertIsInstance(data, str, "data has wrong type")
|
||||
self.assertEqual("ARDEUT116159", data, "data is empty")
|
||||
self.assertEqual("CA02080M1005", data, "data is empty")
|
||||
|
||||
data_cached = self.ticker.isin
|
||||
self.assertIs(data, data_cached, "data not cached")
|
||||
@@ -833,14 +857,14 @@ class TestTickerMiscFinancials(unittest.TestCase):
|
||||
data_cached = self.ticker.calendar
|
||||
self.assertIs(data, data_cached, "data not cached")
|
||||
|
||||
# # sustainability stopped working
|
||||
# def test_sustainability(self):
|
||||
# data = self.ticker.sustainability
|
||||
# self.assertIsInstance(data, pd.DataFrame, "data has wrong type")
|
||||
# self.assertFalse(data.empty, "data is empty")
|
||||
|
||||
def test_sustainability(self):
|
||||
data = self.ticker.sustainability
|
||||
self.assertIsInstance(data, pd.DataFrame, "data has wrong type")
|
||||
self.assertFalse(data.empty, "data is empty")
|
||||
|
||||
data_cached = self.ticker.sustainability
|
||||
self.assertIs(data, data_cached, "data not cached")
|
||||
# data_cached = self.ticker.sustainability
|
||||
# self.assertIs(data, data_cached, "data not cached")
|
||||
|
||||
# def test_shares(self):
|
||||
# data = self.ticker.shares
|
||||
@@ -983,7 +1007,7 @@ class TestTickerInfo(unittest.TestCase):
|
||||
self.symbols.append("QCSTIX") # good for testing, doesn't trade
|
||||
self.symbols += ["BTC-USD", "IWO", "VFINX", "^GSPC"]
|
||||
self.symbols += ["SOKE.IS", "ADS.DE"] # detected bugs
|
||||
self.symbols += ["EXTO", "NEPT" ] # Issues 2343 and 2363
|
||||
self.symbols += ["EXTO" ] # Issues 2343
|
||||
self.tickers = [yf.Ticker(s, session=self.session) for s in self.symbols]
|
||||
|
||||
def tearDown(self):
|
||||
@@ -1035,15 +1059,6 @@ class TestTickerInfo(unittest.TestCase):
|
||||
self.assertCountEqual(['quoteType', 'symbol', 'underlyingSymbol', 'uuid', 'maxAge', 'trailingPegRatio'], data.keys())
|
||||
self.assertIn("trailingPegRatio", data.keys(), "Did not find expected key 'trailingPegRatio' in info dict")
|
||||
|
||||
# Test issue 2363 (Empty QuoteResponse)
|
||||
data = self.tickers[11].info
|
||||
expected_keys = ['maxAge', 'priceHint', 'previousClose', 'open', 'dayLow', 'dayHigh', 'regularMarketPreviousClose',
|
||||
'regularMarketOpen', 'regularMarketDayLow', 'regularMarketDayHigh', 'volume', 'regularMarketVolume',
|
||||
'bid', 'ask', 'bidSize', 'askSize', 'fiftyTwoWeekLow', 'fiftyTwoWeekHigh', 'currency', 'tradeable',
|
||||
'exchange', 'quoteType', 'symbol', 'underlyingSymbol', 'shortName', 'timeZoneFullName', 'timeZoneShortName',
|
||||
'uuid', 'gmtOffSetMilliseconds', 'trailingPegRatio']
|
||||
self.assertCountEqual(expected_keys, data.keys())
|
||||
|
||||
# def test_fast_info_matches_info(self):
|
||||
# fast_info_keys = set()
|
||||
# for ticker in self.tickers:
|
||||
|
||||
@@ -15,7 +15,7 @@ import pandas as pd
|
||||
|
||||
import unittest
|
||||
|
||||
from yfinance.utils import is_valid_period_format, _dts_in_same_interval
|
||||
from yfinance.utils import is_valid_period_format, _dts_in_same_interval, _parse_user_dt
|
||||
|
||||
|
||||
class TestPandas(unittest.TestCase):
|
||||
@@ -169,6 +169,19 @@ class TestDateIntervalCheck(unittest.TestCase):
|
||||
dt3 = pd.Timestamp("2024-10-15 10:31:00")
|
||||
self.assertFalse(_dts_in_same_interval(dt1, dt3, "1min"))
|
||||
|
||||
def test_parse_user_dt(self):
|
||||
exchange_tz = "US/Eastern"
|
||||
dtstr = "2024-01-04"
|
||||
epoch = 1704344400 # output of `pd.Timestamp("2024-01-04", tz="US/Eastern").timestamp()`
|
||||
expected = pd.Timestamp(dtstr, tz=exchange_tz)
|
||||
|
||||
self.assertEqual(_parse_user_dt(epoch, exchange_tz), expected)
|
||||
self.assertEqual(_parse_user_dt(dtstr, exchange_tz), expected)
|
||||
self.assertEqual(_parse_user_dt(datetime(year=2024, month=1, day=4).date(), exchange_tz), expected)
|
||||
self.assertEqual(_parse_user_dt(datetime(year=2024, month=1, day=4), exchange_tz), expected)
|
||||
with self.assertRaises(ValueError):
|
||||
self.assertEqual(_parse_user_dt(float(epoch), exchange_tz), expected)
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ from . import version
|
||||
from .search import Search
|
||||
from .lookup import Lookup
|
||||
from .ticker import Ticker
|
||||
from .calendars import Calendars
|
||||
from .tickers import Tickers
|
||||
from .multi import download
|
||||
from .live import WebSocket, AsyncWebSocket
|
||||
@@ -31,7 +32,7 @@ from .cache import set_tz_cache_location
|
||||
from .domain.sector import Sector
|
||||
from .domain.industry import Industry
|
||||
from .domain.market import Market
|
||||
from .data import YfData
|
||||
from .config import YfConfig as config
|
||||
|
||||
from .screener.query import EquityQuery, FundQuery
|
||||
from .screener.screener import screen, PREDEFINED_SCREENER_QUERIES
|
||||
@@ -42,13 +43,17 @@ __author__ = "Ran Aroussi"
|
||||
import warnings
|
||||
warnings.filterwarnings('default', category=DeprecationWarning, module='^yfinance')
|
||||
|
||||
__all__ = ['download', 'Market', 'Search', 'Lookup', 'Ticker', 'Tickers', 'enable_debug_mode', 'set_tz_cache_location', 'Sector', 'Industry', 'WebSocket', 'AsyncWebSocket']
|
||||
__all__ = ['download', 'Market', 'Search', 'Lookup', 'Ticker', 'Tickers', 'enable_debug_mode', 'set_tz_cache_location', 'Sector', 'Industry', 'WebSocket', 'AsyncWebSocket', 'Calendars']
|
||||
# screener stuff:
|
||||
__all__ += ['EquityQuery', 'FundQuery', 'screen', 'PREDEFINED_SCREENER_QUERIES']
|
||||
|
||||
# Config stuff:
|
||||
_NOTSET=object()
|
||||
def set_config(proxy=_NOTSET):
|
||||
def set_config(proxy=_NOTSET, retries=_NOTSET):
|
||||
if proxy is not _NOTSET:
|
||||
YfData(proxy=proxy)
|
||||
__all__ += ["set_config"]
|
||||
warnings.warn("Set proxy via new config control: yf.config.network.proxy = proxy", DeprecationWarning)
|
||||
config.network.proxy = proxy
|
||||
if retries is not _NOTSET:
|
||||
warnings.warn("Set retries via new config control: yf.config.network.retries = retries", DeprecationWarning)
|
||||
config.network.retries = retries
|
||||
__all__ += ['config', 'set_config']
|
||||
|
||||
438
yfinance/base.py
438
yfinance/base.py
@@ -22,7 +22,6 @@
|
||||
from __future__ import print_function
|
||||
|
||||
import json as _json
|
||||
import warnings
|
||||
from typing import Optional, Union
|
||||
from urllib.parse import quote as urlencode
|
||||
|
||||
@@ -32,8 +31,10 @@ from curl_cffi import requests
|
||||
|
||||
|
||||
from . import utils, cache
|
||||
from .const import _MIC_TO_YAHOO_SUFFIX
|
||||
from .data import YfData
|
||||
from .exceptions import YFEarningsDateMissing, YFRateLimitError
|
||||
from .config import YfConfig
|
||||
from .exceptions import YFDataException, YFEarningsDateMissing, YFRateLimitError
|
||||
from .live import WebSocket
|
||||
from .scrapers.analysis import Analysis
|
||||
from .scrapers.fundamentals import Fundamentals
|
||||
@@ -42,13 +43,43 @@ from .scrapers.quote import Quote, FastInfo
|
||||
from .scrapers.history import PriceHistory
|
||||
from .scrapers.funds import FundsData
|
||||
|
||||
from .const import _BASE_URL_, _ROOT_URL_, _QUERY1_URL_, _SENTINEL_
|
||||
from .const import _BASE_URL_, _ROOT_URL_, _QUERY1_URL_
|
||||
|
||||
from io import StringIO
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
|
||||
_tz_info_fetch_ctr = 0
|
||||
|
||||
class TickerBase:
|
||||
def __init__(self, ticker, session=None, proxy=_SENTINEL_):
|
||||
def __init__(self, ticker, session=None):
|
||||
"""
|
||||
Initialize a Yahoo Finance Ticker object.
|
||||
|
||||
Args:
|
||||
ticker (str | tuple[str, str]):
|
||||
Yahoo Finance symbol (e.g. "AAPL")
|
||||
or a tuple of (symbol, MIC) e.g. ('OR','XPAR')
|
||||
(MIC = market identifier code)
|
||||
|
||||
session (requests.Session, optional):
|
||||
Custom requests session.
|
||||
"""
|
||||
if isinstance(ticker, tuple):
|
||||
if len(ticker) != 2:
|
||||
raise ValueError("Ticker tuple must be (symbol, mic_code)")
|
||||
base_symbol, mic_code = ticker
|
||||
# ticker = yahoo_ticker(base_symbol, mic_code)
|
||||
if mic_code.startswith('.'):
|
||||
mic_code = mic_code[1:]
|
||||
if mic_code.upper() not in _MIC_TO_YAHOO_SUFFIX:
|
||||
raise ValueError(f"Unknown MIC code: '{mic_code}'")
|
||||
sfx = _MIC_TO_YAHOO_SUFFIX[mic_code.upper()]
|
||||
if sfx != '':
|
||||
ticker = f'{base_symbol}.{sfx}'
|
||||
else:
|
||||
ticker = base_symbol
|
||||
|
||||
self.ticker = ticker.upper()
|
||||
self.session = session or requests.Session(impersonate="chrome")
|
||||
self._tz = None
|
||||
@@ -67,9 +98,6 @@ class TickerBase:
|
||||
raise ValueError("Empty ticker name")
|
||||
|
||||
self._data: YfData = YfData(session=session)
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
# accept isin as ticker
|
||||
if utils.is_isin(self.ticker):
|
||||
@@ -157,6 +185,8 @@ class TickerBase:
|
||||
# Must propagate this
|
||||
raise
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger.error(f"Failed to get ticker '{self.ticker}' reason: {e}")
|
||||
return None
|
||||
else:
|
||||
@@ -168,6 +198,8 @@ class TickerBase:
|
||||
try:
|
||||
return data["chart"]["result"][0]["meta"]["exchangeTimezoneName"]
|
||||
except Exception as err:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger.error(f"Could not get exchangeTimezoneName for ticker '{self.ticker}' reason: {err}")
|
||||
logger.debug("Got response: ")
|
||||
logger.debug("-------------")
|
||||
@@ -175,164 +207,100 @@ class TickerBase:
|
||||
logger.debug("-------------")
|
||||
return None
|
||||
|
||||
def get_recommendations(self, proxy=_SENTINEL_, as_dict=False):
|
||||
def get_recommendations(self, as_dict=False):
|
||||
"""
|
||||
Returns a DataFrame with the recommendations
|
||||
Columns: period strongBuy buy hold sell strongSell
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
data = self._quote.recommendations
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_recommendations_summary(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_recommendations_summary(self, as_dict=False):
|
||||
return self.get_recommendations(as_dict=as_dict)
|
||||
|
||||
def get_upgrades_downgrades(self, proxy=_SENTINEL_, as_dict=False):
|
||||
def get_upgrades_downgrades(self, as_dict=False):
|
||||
"""
|
||||
Returns a DataFrame with the recommendations changes (upgrades/downgrades)
|
||||
Index: date of grade
|
||||
Columns: firm toGrade fromGrade action
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
data = self._quote.upgrades_downgrades
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_calendar(self, proxy=_SENTINEL_) -> dict:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_calendar(self) -> dict:
|
||||
return self._quote.calendar
|
||||
|
||||
def get_sec_filings(self, proxy=_SENTINEL_) -> dict:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_sec_filings(self) -> dict:
|
||||
return self._quote.sec_filings
|
||||
|
||||
def get_major_holders(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_major_holders(self, as_dict=False):
|
||||
data = self._holders.major
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_institutional_holders(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_institutional_holders(self, as_dict=False):
|
||||
data = self._holders.institutional
|
||||
if data is not None:
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_mutualfund_holders(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_mutualfund_holders(self, as_dict=False):
|
||||
data = self._holders.mutualfund
|
||||
if data is not None:
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_insider_purchases(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_insider_purchases(self, as_dict=False):
|
||||
data = self._holders.insider_purchases
|
||||
if data is not None:
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_insider_transactions(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_insider_transactions(self, as_dict=False):
|
||||
data = self._holders.insider_transactions
|
||||
if data is not None:
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_insider_roster_holders(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_insider_roster_holders(self, as_dict=False):
|
||||
data = self._holders.insider_roster
|
||||
if data is not None:
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_info(self, proxy=_SENTINEL_) -> dict:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_info(self) -> dict:
|
||||
data = self._quote.info
|
||||
return data
|
||||
|
||||
def get_fast_info(self, proxy=_SENTINEL_):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_fast_info(self):
|
||||
if self._fast_info is None:
|
||||
self._fast_info = FastInfo(self)
|
||||
return self._fast_info
|
||||
|
||||
def get_sustainability(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_sustainability(self, as_dict=False):
|
||||
data = self._quote.sustainability
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_analyst_price_targets(self, proxy=_SENTINEL_) -> dict:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_analyst_price_targets(self) -> dict:
|
||||
"""
|
||||
Keys: current low high mean median
|
||||
"""
|
||||
data = self._analysis.analyst_price_targets
|
||||
return data
|
||||
|
||||
def get_earnings_estimate(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_earnings_estimate(self, as_dict=False):
|
||||
"""
|
||||
Index: 0q +1q 0y +1y
|
||||
Columns: numberOfAnalysts avg low high yearAgoEps growth
|
||||
@@ -340,11 +308,7 @@ class TickerBase:
|
||||
data = self._analysis.earnings_estimate
|
||||
return data.to_dict() if as_dict else data
|
||||
|
||||
def get_revenue_estimate(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_revenue_estimate(self, as_dict=False):
|
||||
"""
|
||||
Index: 0q +1q 0y +1y
|
||||
Columns: numberOfAnalysts avg low high yearAgoRevenue growth
|
||||
@@ -352,11 +316,7 @@ class TickerBase:
|
||||
data = self._analysis.revenue_estimate
|
||||
return data.to_dict() if as_dict else data
|
||||
|
||||
def get_earnings_history(self, proxy=_SENTINEL_, as_dict=False):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_earnings_history(self, as_dict=False):
|
||||
"""
|
||||
Index: pd.DatetimeIndex
|
||||
Columns: epsEstimate epsActual epsDifference surprisePercent
|
||||
@@ -364,43 +324,34 @@ class TickerBase:
|
||||
data = self._analysis.earnings_history
|
||||
return data.to_dict() if as_dict else data
|
||||
|
||||
def get_eps_trend(self, proxy=_SENTINEL_, as_dict=False):
|
||||
def get_eps_trend(self, as_dict=False):
|
||||
"""
|
||||
Index: 0q +1q 0y +1y
|
||||
Columns: current 7daysAgo 30daysAgo 60daysAgo 90daysAgo
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
data = self._analysis.eps_trend
|
||||
return data.to_dict() if as_dict else data
|
||||
|
||||
def get_eps_revisions(self, proxy=_SENTINEL_, as_dict=False):
|
||||
def get_eps_revisions(self, as_dict=False):
|
||||
"""
|
||||
Index: 0q +1q 0y +1y
|
||||
Columns: upLast7days upLast30days downLast7days downLast30days
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
data = self._analysis.eps_revisions
|
||||
return data.to_dict() if as_dict else data
|
||||
|
||||
def get_growth_estimates(self, proxy=_SENTINEL_, as_dict=False):
|
||||
def get_growth_estimates(self, as_dict=False):
|
||||
"""
|
||||
Index: 0q +1q 0y +1y +5y -5y
|
||||
Columns: stock industry sector index
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
data = self._analysis.growth_estimates
|
||||
return data.to_dict() if as_dict else data
|
||||
|
||||
def get_earnings(self, proxy=_SENTINEL_, as_dict=False, freq="yearly"):
|
||||
def get_earnings(self, as_dict=False, freq="yearly"):
|
||||
"""
|
||||
:Parameters:
|
||||
as_dict: bool
|
||||
@@ -410,9 +361,6 @@ class TickerBase:
|
||||
"yearly" or "quarterly" or "trailing"
|
||||
Default is "yearly"
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
if self._fundamentals.earnings is None:
|
||||
return None
|
||||
@@ -424,7 +372,7 @@ class TickerBase:
|
||||
return dict_data
|
||||
return data
|
||||
|
||||
def get_income_stmt(self, proxy=_SENTINEL_, as_dict=False, pretty=False, freq="yearly"):
|
||||
def get_income_stmt(self, as_dict=False, pretty=False, freq="yearly"):
|
||||
"""
|
||||
:Parameters:
|
||||
as_dict: bool
|
||||
@@ -437,9 +385,6 @@ class TickerBase:
|
||||
"yearly" or "quarterly" or "trailing"
|
||||
Default is "yearly"
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
data = self._fundamentals.financials.get_income_time_series(freq=freq)
|
||||
|
||||
@@ -450,21 +395,13 @@ class TickerBase:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_incomestmt(self, proxy=_SENTINEL_, as_dict=False, pretty=False, freq="yearly"):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def get_incomestmt(self, as_dict=False, pretty=False, freq="yearly"):
|
||||
return self.get_income_stmt(as_dict, pretty, freq)
|
||||
|
||||
return self.get_income_stmt(proxy, as_dict, pretty, freq)
|
||||
def get_financials(self, as_dict=False, pretty=False, freq="yearly"):
|
||||
return self.get_income_stmt(as_dict, pretty, freq)
|
||||
|
||||
def get_financials(self, proxy=_SENTINEL_, as_dict=False, pretty=False, freq="yearly"):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
return self.get_income_stmt(proxy, as_dict, pretty, freq)
|
||||
|
||||
def get_balance_sheet(self, proxy=_SENTINEL_, as_dict=False, pretty=False, freq="yearly"):
|
||||
def get_balance_sheet(self, as_dict=False, pretty=False, freq="yearly"):
|
||||
"""
|
||||
:Parameters:
|
||||
as_dict: bool
|
||||
@@ -477,9 +414,6 @@ class TickerBase:
|
||||
"yearly" or "quarterly"
|
||||
Default is "yearly"
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
|
||||
data = self._fundamentals.financials.get_balance_sheet_time_series(freq=freq)
|
||||
@@ -491,14 +425,10 @@ class TickerBase:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_balancesheet(self, proxy=_SENTINEL_, as_dict=False, pretty=False, freq="yearly"):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def get_balancesheet(self, as_dict=False, pretty=False, freq="yearly"):
|
||||
return self.get_balance_sheet(as_dict, pretty, freq)
|
||||
|
||||
return self.get_balance_sheet(proxy, as_dict, pretty, freq)
|
||||
|
||||
def get_cash_flow(self, proxy=_SENTINEL_, as_dict=False, pretty=False, freq="yearly") -> Union[pd.DataFrame, dict]:
|
||||
def get_cash_flow(self, as_dict=False, pretty=False, freq="yearly") -> Union[pd.DataFrame, dict]:
|
||||
"""
|
||||
:Parameters:
|
||||
as_dict: bool
|
||||
@@ -511,9 +441,6 @@ class TickerBase:
|
||||
"yearly" or "quarterly"
|
||||
Default is "yearly"
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
|
||||
data = self._fundamentals.financials.get_cash_flow_time_series(freq=freq)
|
||||
@@ -525,63 +452,39 @@ class TickerBase:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
def get_cashflow(self, proxy=_SENTINEL_, as_dict=False, pretty=False, freq="yearly"):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
return self.get_cash_flow(proxy, as_dict, pretty, freq)
|
||||
def get_cashflow(self, as_dict=False, pretty=False, freq="yearly"):
|
||||
return self.get_cash_flow(as_dict, pretty, freq)
|
||||
|
||||
def get_dividends(self, proxy=_SENTINEL_, period="max") -> pd.Series:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def get_dividends(self, period="max") -> pd.Series:
|
||||
return self._lazy_load_price_history().get_dividends(period=period)
|
||||
|
||||
def get_capital_gains(self, proxy=_SENTINEL_, period="max") -> pd.Series:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def get_capital_gains(self, period="max") -> pd.Series:
|
||||
return self._lazy_load_price_history().get_capital_gains(period=period)
|
||||
|
||||
def get_splits(self, proxy=_SENTINEL_, period="max") -> pd.Series:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def get_splits(self, period="max") -> pd.Series:
|
||||
return self._lazy_load_price_history().get_splits(period=period)
|
||||
|
||||
def get_actions(self, proxy=_SENTINEL_, period="max") -> pd.Series:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def get_actions(self, period="max") -> pd.Series:
|
||||
return self._lazy_load_price_history().get_actions(period=period)
|
||||
|
||||
def get_shares(self, proxy=_SENTINEL_, as_dict=False) -> Union[pd.DataFrame, dict]:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_shares(self, as_dict=False) -> Union[pd.DataFrame, dict]:
|
||||
data = self._fundamentals.shares
|
||||
if as_dict:
|
||||
return data.to_dict()
|
||||
return data
|
||||
|
||||
@utils.log_indent_decorator
|
||||
def get_shares_full(self, start=None, end=None, proxy=_SENTINEL_):
|
||||
def get_shares_full(self, start=None, end=None):
|
||||
logger = utils.get_yf_logger()
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
# Process dates
|
||||
tz = self._get_ticker_tz(timeout=10)
|
||||
dt_now = pd.Timestamp.utcnow().tz_convert(tz)
|
||||
dt_now = pd.Timestamp.now('UTC').tz_convert(tz)
|
||||
if start is not None:
|
||||
start_ts = utils._parse_user_dt(start, tz)
|
||||
start = pd.Timestamp.fromtimestamp(start_ts).tz_localize("UTC").tz_convert(tz)
|
||||
start = utils._parse_user_dt(start, tz)
|
||||
if end is not None:
|
||||
end_ts = utils._parse_user_dt(end, tz)
|
||||
end = pd.Timestamp.fromtimestamp(end_ts).tz_localize("UTC").tz_convert(tz)
|
||||
end = utils._parse_user_dt(end, tz)
|
||||
if end is None:
|
||||
end = dt_now
|
||||
if start is None:
|
||||
@@ -599,6 +502,8 @@ class TickerBase:
|
||||
json_data = self._data.cache_get(url=shares_url)
|
||||
json_data = json_data.json()
|
||||
except (_json.JSONDecodeError, requests.exceptions.RequestException):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger.error(f"{self.ticker}: Yahoo web request for share count failed")
|
||||
return None
|
||||
try:
|
||||
@@ -606,6 +511,8 @@ class TickerBase:
|
||||
except KeyError:
|
||||
fail = False
|
||||
if fail:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise requests.exceptions.HTTPError("Yahoo web request for share count returned 'Bad Request'")
|
||||
logger.error(f"{self.ticker}: Yahoo web request for share count failed")
|
||||
return None
|
||||
|
||||
@@ -615,6 +522,8 @@ class TickerBase:
|
||||
try:
|
||||
df = pd.Series(shares_data[0]["shares_out"], index=pd.to_datetime(shares_data[0]["timestamp"], unit="s"))
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger.error(f"{self.ticker}: Failed to parse shares count data: {e}")
|
||||
return None
|
||||
|
||||
@@ -622,11 +531,7 @@ class TickerBase:
|
||||
df = df.sort_index()
|
||||
return df
|
||||
|
||||
def get_isin(self, proxy=_SENTINEL_) -> Optional[str]:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_isin(self) -> Optional[str]:
|
||||
# *** experimental ***
|
||||
if self._isin is not None:
|
||||
return self._isin
|
||||
@@ -662,16 +567,13 @@ class TickerBase:
|
||||
self._isin = data.split(search_str)[1].split('"')[0].split('|')[0]
|
||||
return self._isin
|
||||
|
||||
def get_news(self, count=10, tab="news", proxy=_SENTINEL_) -> list:
|
||||
def get_news(self, count=10, tab="news") -> list:
|
||||
"""Allowed options for tab: "news", "all", "press releases"""
|
||||
if self._news:
|
||||
return self._news
|
||||
|
||||
logger = utils.get_yf_logger()
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
tab_queryrefs = {
|
||||
"all": "newsAll",
|
||||
@@ -693,12 +595,12 @@ class TickerBase:
|
||||
|
||||
data = self._data.post(url, body=payload)
|
||||
if data is None or "Will be right back" in data.text:
|
||||
raise RuntimeError("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***\n"
|
||||
"Our engineers are working quickly to resolve "
|
||||
"the issue. Thank you for your patience.")
|
||||
raise YFDataException("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***")
|
||||
try:
|
||||
data = data.json()
|
||||
except _json.JSONDecodeError:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger.error(f"{self.ticker}: Failed to retrieve the news and received faulty response instead.")
|
||||
data = {}
|
||||
|
||||
@@ -707,10 +609,119 @@ class TickerBase:
|
||||
self._news = [article for article in news if not article.get('ad', [])]
|
||||
return self._news
|
||||
|
||||
def get_earnings_dates(self, limit = 12, offset = 0) -> Optional[pd.DataFrame]:
|
||||
if limit > 100:
|
||||
raise ValueError("Yahoo caps limit at 100")
|
||||
|
||||
if self._earnings_dates and limit in self._earnings_dates:
|
||||
return self._earnings_dates[limit]
|
||||
|
||||
df = self._get_earnings_dates_using_scrape(limit, offset)
|
||||
self._earnings_dates[limit] = df
|
||||
return df
|
||||
|
||||
@utils.log_indent_decorator
|
||||
def get_earnings_dates(self, limit=12, proxy=_SENTINEL_) -> Optional[pd.DataFrame]:
|
||||
def _get_earnings_dates_using_scrape(self, limit = 12, offset = 0) -> Optional[pd.DataFrame]:
|
||||
"""
|
||||
Uses YfData.cache_get() to scrape earnings data from YahooFinance.
|
||||
(https://finance.yahoo.com/calendar/earnings?symbol=INTC)
|
||||
|
||||
Args:
|
||||
limit (int): Number of rows to extract (max=100)
|
||||
offset (int): if 0, search from future EPS estimates.
|
||||
if 1, search from the most recent EPS.
|
||||
if x, search from x'th recent EPS.
|
||||
|
||||
Returns:
|
||||
pd.DataFrame in the following format.
|
||||
|
||||
EPS Estimate Reported EPS Surprise(%)
|
||||
Date
|
||||
2025-10-30 2.97 - -
|
||||
2025-07-22 1.73 1.54 -10.88
|
||||
2025-05-06 2.63 2.7 2.57
|
||||
2025-02-06 2.09 2.42 16.06
|
||||
2024-10-31 1.92 1.55 -19.36
|
||||
... ... ... ...
|
||||
2014-07-31 0.61 0.65 7.38
|
||||
2014-05-01 0.55 0.68 22.92
|
||||
2014-02-13 0.55 0.58 6.36
|
||||
2013-10-31 0.51 0.54 6.86
|
||||
2013-08-01 0.46 0.5 7.86
|
||||
"""
|
||||
#####################################################
|
||||
# Define Constants
|
||||
#####################################################
|
||||
if limit > 0 and limit <= 25:
|
||||
size = 25
|
||||
elif limit > 25 and limit <= 50:
|
||||
size = 50
|
||||
elif limit > 50 and limit <= 100:
|
||||
size = 100
|
||||
else:
|
||||
raise ValueError("Please use limit <= 100")
|
||||
|
||||
# Define the URL
|
||||
url = "https://finance.yahoo.com/calendar/earnings?symbol={}&offset={}&size={}".format(
|
||||
self.ticker, offset, size
|
||||
)
|
||||
#####################################################
|
||||
# Get data
|
||||
#####################################################
|
||||
response = self._data.cache_get(url)
|
||||
|
||||
#####################################################
|
||||
# Response -> pd.DataFrame
|
||||
#####################################################
|
||||
# Parse the HTML content using BeautifulSoup
|
||||
soup = BeautifulSoup(response.text, "html.parser")
|
||||
# This page should have only one <table>
|
||||
table = soup.find("table")
|
||||
# If the table is found
|
||||
if table:
|
||||
# Get the HTML string of the table
|
||||
table_html = str(table)
|
||||
|
||||
# Wrap the HTML string in a StringIO object
|
||||
html_stringio = StringIO(table_html)
|
||||
|
||||
# Pass the StringIO object to pd.read_html()
|
||||
df = pd.read_html(html_stringio, na_values=['-'])[0]
|
||||
|
||||
# Drop redundant columns
|
||||
df = df.drop(["Symbol", "Company"], axis=1)
|
||||
|
||||
# Backwards compatibility
|
||||
df.rename(columns={'Surprise (%)': 'Surprise(%)'}, inplace=True)
|
||||
|
||||
df = df.dropna(subset="Earnings Date")
|
||||
|
||||
# Parse earnings date
|
||||
# - Pandas doesn't like EDT, EST
|
||||
df['Earnings Date'] = df['Earnings Date'].str.replace('EDT', 'America/New_York')
|
||||
df['Earnings Date'] = df['Earnings Date'].str.replace('EST', 'America/New_York')
|
||||
# - separate timezone string (last word)
|
||||
dt_parts = df['Earnings Date'].str.rsplit(' ', n=1, expand=True)
|
||||
dts = dt_parts[0]
|
||||
tzs = dt_parts[1]
|
||||
df['Earnings Date'] = pd.to_datetime(dts, format='%B %d, %Y at %I %p')
|
||||
df['Earnings Date'] = pd.Series([dt.tz_localize(tz) for dt, tz in zip(df['Earnings Date'], tzs)])
|
||||
df = df.set_index("Earnings Date")
|
||||
|
||||
else:
|
||||
err_msg = "No earnings dates found, symbol may be delisted"
|
||||
logger = utils.get_yf_logger()
|
||||
logger.error(f'{self.ticker}: {err_msg}')
|
||||
return None
|
||||
return df
|
||||
|
||||
@utils.log_indent_decorator
|
||||
def _get_earnings_dates_using_screener(self, limit=12) -> Optional[pd.DataFrame]:
|
||||
"""
|
||||
Get earning dates (future and historic)
|
||||
|
||||
In Summer 2025, Yahoo stopped updating the data at this endpoint.
|
||||
So reverting to scraping HTML.
|
||||
|
||||
Args:
|
||||
limit (int): max amount of upcoming and recent earnings dates to return.
|
||||
@@ -721,31 +732,16 @@ class TickerBase:
|
||||
"""
|
||||
logger = utils.get_yf_logger()
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
clamped_limit = min(limit, 100) # YF caps at 100, don't go higher
|
||||
|
||||
if self._earnings_dates and clamped_limit in self._earnings_dates:
|
||||
return self._earnings_dates[clamped_limit]
|
||||
|
||||
# Fetch data
|
||||
url = f"{_QUERY1_URL_}/v1/finance/visualization"
|
||||
params = {"lang": "en-US", "region": "US"}
|
||||
body = {
|
||||
"size": clamped_limit,
|
||||
"query": {
|
||||
"operator": "and",
|
||||
"operands": [
|
||||
{"operator": "eq", "operands": ["ticker", self.ticker]},
|
||||
{"operator": "eq", "operands": ["eventtype", "2"]}
|
||||
]
|
||||
},
|
||||
"size": limit,
|
||||
"query": { "operator": "eq", "operands": ["ticker", self.ticker] },
|
||||
"sortField": "startdatetime",
|
||||
"sortType": "DESC",
|
||||
"entityIdType": "earnings",
|
||||
"includeFields": ["startdatetime", "timeZoneShortName", "epsestimate", "epsactual", "epssurprisepct"]
|
||||
"includeFields": ["startdatetime", "timeZoneShortName", "epsestimate", "epsactual", "epssurprisepct", "eventtype"]
|
||||
}
|
||||
response = self._data.post(url, params=params, body=body)
|
||||
json_data = response.json()
|
||||
@@ -761,6 +757,14 @@ class TickerBase:
|
||||
logger.error(f'{self.ticker}: {err_msg}')
|
||||
return None
|
||||
|
||||
# Convert eventtype
|
||||
# - 1 = earnings call (manually confirmed)
|
||||
# - 2 = earnings report
|
||||
# - 11 = stockholders meeting (manually confirmed)
|
||||
df['Event Type'] = df['Event Type'].replace('^1$', 'Call', regex=True)
|
||||
df['Event Type'] = df['Event Type'].replace('^2$', 'Earnings', regex=True)
|
||||
df['Event Type'] = df['Event Type'].replace('^11$', 'Meeting', regex=True)
|
||||
|
||||
# Calculate earnings date
|
||||
df['Earnings Date'] = pd.to_datetime(df['Event Start Date'])
|
||||
tz = self._get_ticker_tz(timeout=30)
|
||||
@@ -778,21 +782,13 @@ class TickerBase:
|
||||
df.set_index('Earnings Date', inplace=True)
|
||||
df.rename(columns={'Surprise (%)': 'Surprise(%)'}, inplace=True) # Compatibility
|
||||
|
||||
self._earnings_dates[clamped_limit] = df
|
||||
self._earnings_dates[limit] = df
|
||||
return df
|
||||
|
||||
def get_history_metadata(self, proxy=_SENTINEL_) -> dict:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
return self._lazy_load_price_history().get_history_metadata(proxy)
|
||||
|
||||
def get_funds_data(self, proxy=_SENTINEL_) -> Optional[FundsData]:
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def get_history_metadata(self) -> dict:
|
||||
return self._lazy_load_price_history().get_history_metadata()
|
||||
|
||||
def get_funds_data(self) -> Optional[FundsData]:
|
||||
if not self._funds_data:
|
||||
self._funds_data = FundsData(self._data, self.ticker)
|
||||
|
||||
|
||||
547
yfinance/calendars.py
Normal file
547
yfinance/calendars.py
Normal file
@@ -0,0 +1,547 @@
|
||||
from __future__ import annotations # Just in case
|
||||
import json
|
||||
from typing import Any, Optional, List, Union, Dict
|
||||
import warnings
|
||||
import numpy as np
|
||||
from requests import Session, Response, exceptions
|
||||
import pandas as pd
|
||||
from datetime import datetime, date, timedelta
|
||||
|
||||
from .const import _QUERY1_URL_
|
||||
from .utils import log_indent_decorator, get_yf_logger, _parse_user_dt
|
||||
from .screener import screen
|
||||
from .data import YfData
|
||||
from .exceptions import YFException
|
||||
|
||||
|
||||
class CalendarQuery:
|
||||
"""
|
||||
Simple CalendarQuery class for calendar queries, similar to yf.screener.query.QueryBase.
|
||||
|
||||
Simple operand accepted by YF is of the form:
|
||||
`{ "operator": operator, "operands": [field, ...values] }`
|
||||
|
||||
Nested operand accepted by YF:
|
||||
`{ "operator": operator, "operands": [ ...CalendarQuery ] }`
|
||||
|
||||
### Simple example:
|
||||
```python
|
||||
op = CalendarQuery('eq', ['ticker', 'AAPL'])
|
||||
print(op.to_dict())
|
||||
```
|
||||
"""
|
||||
|
||||
def __init__(self, operator: str, operand: Union[List[Any], List["CalendarQuery"]]):
|
||||
"""
|
||||
:param operator: Operator string, e.g., 'eq', 'gte', 'and', 'or'.
|
||||
:param operand: List of operands: can be values (str, int), or other Operands instances (nested).
|
||||
"""
|
||||
operator = operator.upper()
|
||||
self.operator = operator
|
||||
self.operands = operand
|
||||
|
||||
def append(self, operand: Any) -> None:
|
||||
"""
|
||||
Append an operand to the operands list.
|
||||
|
||||
:param operand: CalendarQuery to append (can be value or CalendarQuery instance).
|
||||
"""
|
||||
self.operands.append(operand)
|
||||
|
||||
@property
|
||||
def is_empty(self) -> bool:
|
||||
"""
|
||||
Check if the operands list is empty.
|
||||
|
||||
:return: True if operands list is empty, False otherwise.
|
||||
"""
|
||||
return len(self.operands) == 0
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
"""
|
||||
Query-ready dict for YF.
|
||||
|
||||
Simple operand accepted by YF is of the form:
|
||||
`{ "operator": operator, "operands": [field, ...values] }`
|
||||
|
||||
Nested operand accepted by YF:
|
||||
`{ "operator": operator, "operands": [ ...CalendarQuery ] }`
|
||||
"""
|
||||
op = self.operator
|
||||
ops = self.operands
|
||||
return {
|
||||
"operator": op,
|
||||
"operands": [o.to_dict() if isinstance(o, CalendarQuery) else o for o in ops],
|
||||
}
|
||||
|
||||
|
||||
_CALENDAR_URL_ = f"{_QUERY1_URL_}/v1/finance/visualization"
|
||||
DATE_STR_FORMAT = "%Y-%m-%d"
|
||||
|
||||
PREDEFINED_CALENDARS = {
|
||||
"sp_earnings": {
|
||||
"sortField": "intradaymarketcap",
|
||||
"includeFields": [
|
||||
"ticker",
|
||||
"companyshortname",
|
||||
"intradaymarketcap",
|
||||
"eventname",
|
||||
"startdatetime",
|
||||
"startdatetimetype",
|
||||
"epsestimate",
|
||||
"epsactual",
|
||||
"epssurprisepct",
|
||||
],
|
||||
"nan_cols": ["Surprise (%)", "EPS Estimate", "Reported EPS"],
|
||||
"datetime_cols": ["Event Start Date"],
|
||||
"df_index": "Symbol",
|
||||
"renames": {
|
||||
"Surprise (%)": "Surprise(%)",
|
||||
"Company Name": "Company",
|
||||
"Market Cap (Intraday)": "Marketcap",
|
||||
},
|
||||
},
|
||||
"ipo_info": {
|
||||
"sortField": "startdatetime",
|
||||
"includeFields": [
|
||||
"ticker",
|
||||
"companyshortname",
|
||||
"exchange_short_name",
|
||||
"filingdate",
|
||||
"startdatetime",
|
||||
"amendeddate",
|
||||
"pricefrom",
|
||||
"priceto",
|
||||
"offerprice",
|
||||
"currencyname",
|
||||
"shares",
|
||||
"dealtype",
|
||||
],
|
||||
"nan_cols": ["Price From", "Price To", "Price", "Shares"],
|
||||
"datetime_cols": ["Filing Date", "Date", "Amended Date"],
|
||||
"df_index": "Symbol",
|
||||
"renames": {
|
||||
"Exchange Short Name": "Exchange",
|
||||
},
|
||||
},
|
||||
"economic_event": {
|
||||
"sortField": "startdatetime",
|
||||
"includeFields": [
|
||||
"econ_release",
|
||||
"country_code",
|
||||
"startdatetime",
|
||||
"period",
|
||||
"after_release_actual",
|
||||
"consensus_estimate",
|
||||
"prior_release_actual",
|
||||
"originally_reported_actual",
|
||||
],
|
||||
"nan_cols": ["Actual", "Market Expectation", "Prior to This", "Revised from"],
|
||||
"datetime_cols": ["Event Time"],
|
||||
"df_index": "Event",
|
||||
"renames": {
|
||||
"Country Code": "Region",
|
||||
"Market Expectation": "Expected",
|
||||
"Prior to This": "Last",
|
||||
"Revised from": "Revised",
|
||||
},
|
||||
},
|
||||
"splits": {
|
||||
"sortField": "startdatetime",
|
||||
"includeFields": [
|
||||
"ticker",
|
||||
"companyshortname",
|
||||
"startdatetime",
|
||||
"optionable",
|
||||
"old_share_worth",
|
||||
"share_worth",
|
||||
],
|
||||
"nan_cols": [],
|
||||
"datetime_cols": ["Payable On"],
|
||||
"df_index": "Symbol",
|
||||
"renames": {
|
||||
"Optionable?": "Optionable",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class Calendars:
|
||||
"""
|
||||
Get economic calendars, for example, Earnings, IPO, Economic Events, Splits
|
||||
|
||||
### Simple example default params:
|
||||
```python
|
||||
import yfinance as yf
|
||||
calendars = yf.Calendars()
|
||||
earnings_calendar = calendars.get_earnings_calendar(limit=50)
|
||||
print(earnings_calendar)
|
||||
```"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
start: Optional[Union[str, datetime, date]] = None,
|
||||
end: Optional[Union[str, datetime, date]] = None,
|
||||
session: Optional[Session] = None,
|
||||
):
|
||||
"""
|
||||
:param str | datetime | date start: start date (default today) \
|
||||
eg. start="2025-11-08"
|
||||
:param str | datetime | date end: end date (default `start + 7 days`) \
|
||||
eg. end="2025-11-08"
|
||||
:param session: requests.Session object, optional
|
||||
"""
|
||||
|
||||
self._logger = get_yf_logger()
|
||||
self.session = session or Session()
|
||||
self._data: YfData = YfData(session=session)
|
||||
|
||||
_start = self._parse_date_param(start)
|
||||
_end = self._parse_date_param(end)
|
||||
self._start = _start or datetime.now().strftime(DATE_STR_FORMAT)
|
||||
self._end = _end or (datetime.strptime(self._start, DATE_STR_FORMAT) + timedelta(days=7)).strftime(DATE_STR_FORMAT)
|
||||
|
||||
if not start and end:
|
||||
self._logger.debug(f"Incomplete boundary: did not provide `start`, using today {self._start=} to {self._end=}")
|
||||
elif start and not end:
|
||||
self._logger.debug(f"Incomplete boundary: did not provide `end`, using {self._start=} to {self._end=}: +7 days from self._start")
|
||||
|
||||
self._most_active_qy: CalendarQuery = CalendarQuery("or", [])
|
||||
|
||||
self._cache_request_body = {}
|
||||
self.calendars: Dict[str, pd.DataFrame] = {}
|
||||
|
||||
def _parse_date_param(self, _date: Optional[Union[str, datetime, date, int]]) -> str:
|
||||
if not _date:
|
||||
return ""
|
||||
else:
|
||||
return _parse_user_dt(_date).strftime(DATE_STR_FORMAT)
|
||||
|
||||
def _get_data(
|
||||
self, calendar_type: str, query: CalendarQuery, limit=12, offset=0, force=False
|
||||
) -> pd.DataFrame:
|
||||
if calendar_type not in PREDEFINED_CALENDARS:
|
||||
raise YFException(f"Unknown calendar type: {calendar_type}")
|
||||
|
||||
params = {"lang": "en-US", "region": "US"}
|
||||
body = {
|
||||
"sortType": "DESC",
|
||||
"entityIdType": calendar_type,
|
||||
"sortField": PREDEFINED_CALENDARS[calendar_type]["sortField"],
|
||||
"includeFields": PREDEFINED_CALENDARS[calendar_type]["includeFields"],
|
||||
"size": min(limit, 100), # YF caps at 100, don't go higher
|
||||
"offset": offset,
|
||||
"query": query.to_dict(),
|
||||
}
|
||||
|
||||
if self._cache_request_body.get(calendar_type, None) and not force:
|
||||
cache_body = self._cache_request_body[calendar_type]
|
||||
if cache_body == body and calendar_type in self.calendars:
|
||||
# Uses cache if force=False and new request has same body as previous
|
||||
self._logger.debug(f"Getting {calendar_type=} from local cache")
|
||||
return self.calendars[calendar_type]
|
||||
self._cache_request_body[calendar_type] = body
|
||||
|
||||
self._logger.debug(f"Fetching {calendar_type=} with {limit=}")
|
||||
response: Response = self._data.post(_CALENDAR_URL_, params=params, body=body)
|
||||
|
||||
try:
|
||||
json_data = response.json()
|
||||
except json.JSONDecodeError:
|
||||
self._logger.error(f"{calendar_type}: Failed to retrieve calendar.")
|
||||
json_data = {}
|
||||
|
||||
# Error returned
|
||||
if json_data.get("finance", {}).get("error", {}):
|
||||
raise YFException(json_data.get("finance", {}).get("error", {}))
|
||||
|
||||
self.calendars[calendar_type] = self._create_df(json_data)
|
||||
return self._cleanup_df(calendar_type)
|
||||
|
||||
def _create_df(self, json_data: dict) -> pd.DataFrame:
|
||||
columns = []
|
||||
for col in json_data["finance"]["result"][0]["documents"][0]["columns"]:
|
||||
columns.append(col["label"])
|
||||
|
||||
if col["label"] == "Event Start Date" and col["type"] == "STRING":
|
||||
# Rename duplicate columns Event Start Date
|
||||
columns[-1] = "Timing"
|
||||
|
||||
rows = json_data["finance"]["result"][0]["documents"][0]["rows"]
|
||||
return pd.DataFrame(rows, columns=columns)
|
||||
|
||||
def _cleanup_df(self, calendar_type: str) -> pd.DataFrame:
|
||||
predef_cal: dict = PREDEFINED_CALENDARS[calendar_type]
|
||||
df: pd.DataFrame = self.calendars[calendar_type]
|
||||
if df.empty:
|
||||
return df
|
||||
|
||||
# Convert types
|
||||
nan_cols: list = predef_cal["nan_cols"]
|
||||
if nan_cols:
|
||||
df[nan_cols] = df[nan_cols].astype("float64").replace(0.0, np.nan)
|
||||
|
||||
# Format the dataframe
|
||||
df.set_index(predef_cal["df_index"], inplace=True)
|
||||
for rename_from, rename_to in predef_cal["renames"].items():
|
||||
df.rename(columns={rename_from: rename_to}, inplace=True)
|
||||
|
||||
for datetime_col in predef_cal["datetime_cols"]:
|
||||
df[datetime_col] = pd.to_datetime(df[datetime_col])
|
||||
|
||||
return df
|
||||
|
||||
@log_indent_decorator
|
||||
def _get_most_active_operands(
|
||||
self, _market_cap: Optional[float], force=False
|
||||
) -> CalendarQuery:
|
||||
"""
|
||||
Retrieve tickers from YF, converts them into operands accepted by YF.
|
||||
Saves the operands in self._most_active_qy.
|
||||
Will not re-query if already populated.
|
||||
|
||||
Used for earnings calendar optional filter.
|
||||
|
||||
:param force: if True, will re-query even if operands already exist
|
||||
:return: list of operands for active traded stocks
|
||||
"""
|
||||
if not self._most_active_qy.is_empty and not force:
|
||||
return self._most_active_qy
|
||||
|
||||
self._logger.debug("Fetching 200 most_active for earnings calendar")
|
||||
|
||||
try:
|
||||
json_raw: dict = screen(query="MOST_ACTIVES", count=200)
|
||||
except exceptions.HTTPError:
|
||||
self._logger.error("Failed to retrieve most active stocks.")
|
||||
return self._most_active_qy
|
||||
|
||||
raw = json_raw.get("quotes", [{}])
|
||||
|
||||
self._most_active_qy = CalendarQuery("or", [])
|
||||
for stock in raw:
|
||||
if type(stock) is not dict:
|
||||
continue
|
||||
|
||||
ticker = stock.get("symbol", "")
|
||||
t_market_cap = stock.get("marketCap", 0)
|
||||
# We filter market_cap here because we want to keep self._most_active_qy consistent
|
||||
if ticker and (_market_cap is None or t_market_cap >= _market_cap):
|
||||
self._most_active_qy.append(CalendarQuery("eq", ["ticker", ticker]))
|
||||
|
||||
return self._most_active_qy
|
||||
|
||||
def _get_startdatetime_operators(self, start=None, end=None) -> CalendarQuery:
|
||||
"""
|
||||
Get startdatetime operands for start/end dates.
|
||||
If no dates passed, defaults to internal date set on initialization.
|
||||
"""
|
||||
_start = self._parse_date_param(start)
|
||||
_end = self._parse_date_param(end)
|
||||
if (start and not end) or (end and not start):
|
||||
warnings.warn(
|
||||
"When prividing custom `start` and `end` parameters, you may want to specify both, to avoid unexpected behaviour.",
|
||||
UserWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
return CalendarQuery(
|
||||
"and",
|
||||
[
|
||||
CalendarQuery("gte", ["startdatetime", _start or self._start]),
|
||||
CalendarQuery("lte", ["startdatetime", _end or self._end]),
|
||||
],
|
||||
)
|
||||
|
||||
### Manual getter functions:
|
||||
|
||||
@log_indent_decorator
|
||||
def get_earnings_calendar(
|
||||
self,
|
||||
market_cap: Optional[float] = None,
|
||||
filter_most_active: bool = True,
|
||||
start=None,
|
||||
end=None,
|
||||
limit=12,
|
||||
offset=0,
|
||||
force=False,
|
||||
) -> pd.DataFrame:
|
||||
"""
|
||||
Retrieve earnings calendar from YF as a DataFrame.
|
||||
Will re-query every time it is called, overwriting previous data.
|
||||
|
||||
:param market_cap: market cap cutoff in USD, default None
|
||||
:param filter_most_active: will filter for actively traded stocks (default True)
|
||||
:param str | datetime | date start: overwrite start date (default set by __init__) \
|
||||
eg. start="2025-11-08"
|
||||
:param str | datetime | date end: overwrite end date (default set by __init__) \
|
||||
eg. end="2025-11-08"
|
||||
:param limit: maximum number of results to return (YF caps at 100)
|
||||
:param offset: offsets the results for pagination. YF default 0
|
||||
:param force: if True, will re-query even if cache already exists
|
||||
:return: DataFrame with earnings calendar
|
||||
"""
|
||||
_start = self._parse_date_param(start)
|
||||
_end = self._parse_date_param(end)
|
||||
if (start and not end) or (end and not start):
|
||||
warnings.warn(
|
||||
"When prividing custom `start` and `end` parameters, you may want to specify both, to avoid unexpected behaviour.",
|
||||
UserWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
query = CalendarQuery(
|
||||
"and",
|
||||
[
|
||||
CalendarQuery("eq", ["region", "us"]),
|
||||
CalendarQuery(
|
||||
"or",
|
||||
[
|
||||
CalendarQuery("eq", ["eventtype", "EAD"]),
|
||||
CalendarQuery("eq", ["eventtype", "ERA"]),
|
||||
],
|
||||
),
|
||||
CalendarQuery("gte", ["startdatetime", _start or self._start]),
|
||||
CalendarQuery("lte", ["startdatetime", _end or self._end]),
|
||||
],
|
||||
)
|
||||
|
||||
if market_cap is not None:
|
||||
if market_cap < 10_000_000:
|
||||
warnings.warn(
|
||||
f"market_cap {market_cap} is very low, did you mean to set it higher?",
|
||||
UserWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
query.append(CalendarQuery("gte", ["intradaymarketcap", market_cap]))
|
||||
if filter_most_active and not offset:
|
||||
# YF does not like filter most active while offsetting
|
||||
query.append(self._get_most_active_operands(market_cap))
|
||||
|
||||
return self._get_data(
|
||||
calendar_type="sp_earnings",
|
||||
query=query,
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
force=force,
|
||||
)
|
||||
|
||||
@log_indent_decorator
|
||||
def get_ipo_info_calendar(
|
||||
self, start=None, end=None, limit=12, offset=0, force=False
|
||||
) -> pd.DataFrame:
|
||||
"""
|
||||
Retrieve IPOs calendar from YF as a Dataframe.
|
||||
|
||||
:param str | datetime | date start: overwrite start date (default set by __init__) \
|
||||
eg. start="2025-11-08"
|
||||
:param str | datetime | date end: overwrite end date (default set by __init__) \
|
||||
eg. end="2025-11-08"
|
||||
:param limit: maximum number of results to return (YF caps at 100)
|
||||
:param offset: offsets the results for pagination. YF default 0
|
||||
:param force: if True, will re-query even if cache already exists
|
||||
:return: DataFrame with IPOs calendar
|
||||
"""
|
||||
_start = self._parse_date_param(start)
|
||||
_end = self._parse_date_param(end)
|
||||
if (start and not end) or (end and not start):
|
||||
warnings.warn(
|
||||
"When prividing custom `start` and `end` parameters, you may want to specify both, to avoid unexpected behaviour.",
|
||||
UserWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
query = CalendarQuery(
|
||||
"or",
|
||||
[
|
||||
CalendarQuery("gtelt", ["startdatetime", _start or self._start, _end or self._end]),
|
||||
CalendarQuery("gtelt", ["filingdate", _start or self._start, _end or self._end]),
|
||||
CalendarQuery("gtelt", ["amendeddate", _start or self._start, _end or self._end]),
|
||||
],
|
||||
)
|
||||
|
||||
return self._get_data(
|
||||
calendar_type="ipo_info",
|
||||
query=query,
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
force=force,
|
||||
)
|
||||
|
||||
@log_indent_decorator
|
||||
def get_economic_events_calendar(
|
||||
self, start=None, end=None, limit=12, offset=0, force=False
|
||||
) -> pd.DataFrame:
|
||||
"""
|
||||
Retrieve Economic Events calendar from YF as a DataFrame.
|
||||
|
||||
:param str | datetime | date start: overwrite start date (default set by __init__) \
|
||||
eg. start="2025-11-08"
|
||||
:param str | datetime | date end: overwrite end date (default set by __init__) \
|
||||
eg. end="2025-11-08"
|
||||
:param limit: maximum number of results to return (YF caps at 100)
|
||||
:param offset: offsets the results for pagination. YF default 0
|
||||
:param force: if True, will re-query even if cache already exists
|
||||
:return: DataFrame with Economic Events calendar
|
||||
"""
|
||||
return self._get_data(
|
||||
calendar_type="economic_event",
|
||||
query=self._get_startdatetime_operators(start, end),
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
force=force,
|
||||
)
|
||||
|
||||
@log_indent_decorator
|
||||
def get_splits_calendar(
|
||||
self, start=None, end=None, limit=12, offset=0, force=False
|
||||
) -> pd.DataFrame:
|
||||
"""
|
||||
Retrieve Splits calendar from YF as a DataFrame.
|
||||
|
||||
:param str | datetime | date start: overwrite start date (default set by __init__) \
|
||||
eg. start="2025-11-08"
|
||||
:param str | datetime | date end: overwrite end date (default set by __init__) \
|
||||
eg. end="2025-11-08"
|
||||
:param limit: maximum number of results to return (YF caps at 100)
|
||||
:param offset: offsets the results for pagination. YF default 0
|
||||
:param force: if True, will re-query even if cache already exists
|
||||
:return: DataFrame with Splits calendar
|
||||
"""
|
||||
return self._get_data(
|
||||
calendar_type="splits",
|
||||
query=self._get_startdatetime_operators(start, end),
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
force=force,
|
||||
)
|
||||
|
||||
### Easy / Default getter functions:
|
||||
|
||||
@property
|
||||
def earnings_calendar(self) -> pd.DataFrame:
|
||||
"""Earnings calendar with default settings."""
|
||||
if "sp_earnings" in self.calendars:
|
||||
return self.calendars["sp_earnings"]
|
||||
return self.get_earnings_calendar()
|
||||
|
||||
@property
|
||||
def ipo_info_calendar(self) -> pd.DataFrame:
|
||||
"""IPOs calendar with default settings."""
|
||||
if "ipo_info" in self.calendars:
|
||||
return self.calendars["ipo_info"]
|
||||
return self.get_ipo_info_calendar()
|
||||
|
||||
@property
|
||||
def economic_events_calendar(self) -> pd.DataFrame:
|
||||
"""Economic events calendar with default settings."""
|
||||
if "economic_event" in self.calendars:
|
||||
return self.calendars["economic_event"]
|
||||
return self.get_economic_events_calendar()
|
||||
|
||||
@property
|
||||
def splits_calendar(self) -> pd.DataFrame:
|
||||
"""Splits calendar with default settings."""
|
||||
if "splits" in self.calendars:
|
||||
return self.calendars["splits"]
|
||||
return self.get_splits_calendar()
|
||||
58
yfinance/config.py
Normal file
58
yfinance/config.py
Normal file
@@ -0,0 +1,58 @@
|
||||
import json
|
||||
|
||||
|
||||
class NestedConfig:
|
||||
def __init__(self, name, data):
|
||||
self.__dict__['name'] = name
|
||||
self.__dict__['data'] = data
|
||||
|
||||
def __getattr__(self, key):
|
||||
return self.data.get(key)
|
||||
|
||||
def __setattr__(self, key, value):
|
||||
self.data[key] = value
|
||||
|
||||
def __len__(self):
|
||||
return len(self.__dict__['data'])
|
||||
|
||||
def __repr__(self):
|
||||
return json.dumps(self.data, indent=4)
|
||||
|
||||
class ConfigMgr:
|
||||
def __init__(self):
|
||||
self._initialised = False
|
||||
|
||||
def _load_option(self):
|
||||
self._initialised = True # prevent infinite loop
|
||||
self.options = {}
|
||||
|
||||
# Initialise defaults
|
||||
n = self.__getattr__('network')
|
||||
n.proxy = None
|
||||
n.retries = 0
|
||||
d = self.__getattr__('debug')
|
||||
d.hide_exceptions = True
|
||||
d.logging = False
|
||||
|
||||
def __getattr__(self, key):
|
||||
if not self._initialised:
|
||||
self._load_option()
|
||||
|
||||
if key not in self.options:
|
||||
self.options[key] = {}
|
||||
return NestedConfig(key, self.options[key])
|
||||
|
||||
def __contains__(self, key):
|
||||
if not self._initialised:
|
||||
self._load_option()
|
||||
|
||||
return key in self.options
|
||||
|
||||
def __repr__(self):
|
||||
if not self._initialised:
|
||||
self._load_option()
|
||||
|
||||
all_options = self.options.copy()
|
||||
return json.dumps(all_options, indent=4)
|
||||
|
||||
YfConfig = ConfigMgr()
|
||||
@@ -159,153 +159,223 @@ quote_summary_valid_modules = (
|
||||
"futuresChain",
|
||||
)
|
||||
|
||||
# map last updated as of 2024.09.18
|
||||
# map last updated as of 2025.12.19
|
||||
SECTOR_INDUSTY_MAPPING = {
|
||||
'basic-materials': {'specialty-chemicals',
|
||||
'gold',
|
||||
'building-materials',
|
||||
'copper',
|
||||
'steel',
|
||||
'agricultural-inputs',
|
||||
'chemicals',
|
||||
'other-industrial-metals-mining',
|
||||
'lumber-wood-production',
|
||||
'aluminum',
|
||||
'other-precious-metals-mining',
|
||||
'coking-coal',
|
||||
'paper-paper-products',
|
||||
'silver'},
|
||||
'communication-services': {'internet-content-information',
|
||||
'telecom-services',
|
||||
'entertainment',
|
||||
'electronic-gaming-multimedia',
|
||||
'advertising-agencies',
|
||||
'broadcasting',
|
||||
'publishing'},
|
||||
'consumer-cyclical': {'internet-retail',
|
||||
'auto-manufacturers',
|
||||
'restaurants',
|
||||
'home-improvement-retail',
|
||||
'travel-services',
|
||||
'specialty-retail',
|
||||
'apparel-retail',
|
||||
'residential-construction',
|
||||
'footwear-accessories',
|
||||
'packaging-containers',
|
||||
'lodging',
|
||||
'auto-parts',
|
||||
'auto-truck-dealerships',
|
||||
'gambling',
|
||||
'resorts-casinos',
|
||||
'leisure',
|
||||
'apparel-manufacturing',
|
||||
'personal-services',
|
||||
'furnishings-fixtures-appliances',
|
||||
'recreational-vehicles',
|
||||
'luxury-goods',
|
||||
'department-stores',
|
||||
'textile-manufacturing'},
|
||||
'consumer-defensive': {'discount-stores',
|
||||
'beverages-non-alcoholic',
|
||||
'household-personal-products',
|
||||
'packaged-foods',
|
||||
'tobacco',
|
||||
'confectioners',
|
||||
'farm-products',
|
||||
'food-distribution',
|
||||
'grocery-stores',
|
||||
'beverages-brewers',
|
||||
'education-training-services',
|
||||
'beverages-wineries-distilleries'},
|
||||
'energy': {'oil-gas-integrated',
|
||||
'oil-gas-midstream',
|
||||
'oil-gas-e-p',
|
||||
'oil-gas-equipment-services',
|
||||
'oil-gas-refining-marketing',
|
||||
'uranium',
|
||||
'oil-gas-drilling',
|
||||
'thermal-coal'},
|
||||
'financial-services': {'banks-diversified',
|
||||
'credit-services',
|
||||
'asset-management',
|
||||
'insurance-diversified',
|
||||
'banks-regional',
|
||||
'capital-markets',
|
||||
'financial-data-stock-exchanges',
|
||||
'insurance-property-casualty',
|
||||
'insurance-brokers',
|
||||
'insurance-life',
|
||||
'insurance-specialty',
|
||||
'mortgage-finance',
|
||||
'insurance-reinsurance',
|
||||
'shell-companies',
|
||||
'financial-conglomerates'},
|
||||
'healthcare': {'drug-manufacturers-general',
|
||||
'healthcare-plans',
|
||||
'biotechnology',
|
||||
'medical-devices',
|
||||
'diagnostics-research',
|
||||
'medical-instruments-supplies',
|
||||
'medical-care-facilities',
|
||||
'drug-manufacturers-specialty-generic',
|
||||
'health-information-services',
|
||||
'medical-distribution',
|
||||
'pharmaceutical-retailers'},
|
||||
'industrials': {'aerospace-defense',
|
||||
'specialty-industrial-machinery',
|
||||
'railroads',
|
||||
'building-products-equipment',
|
||||
'farm-heavy-construction-machinery',
|
||||
'specialty-business-services',
|
||||
'integrated-freight-logistics',
|
||||
'waste-management',
|
||||
'conglomerates',
|
||||
'industrial-distribution',
|
||||
'engineering-construction',
|
||||
'rental-leasing-services',
|
||||
'consulting-services',
|
||||
'trucking',
|
||||
'electrical-equipment-parts',
|
||||
'airlines',
|
||||
'tools-accessories',
|
||||
'pollution-treatment-controls',
|
||||
'security-protection-services',
|
||||
'marine-shipping',
|
||||
'metal-fabrication',
|
||||
'infrastructure-operations',
|
||||
'staffing-employment-services',
|
||||
'airports-air-services',
|
||||
'business-equipment-supplies'},
|
||||
'real-estate': {'reit-specialty',
|
||||
'reit-industrial',
|
||||
'reit-retail',
|
||||
'reit-residential',
|
||||
'reit-healthcare-facilities',
|
||||
'real-estate-services',
|
||||
'reit-office',
|
||||
'reit-diversified',
|
||||
'reit-mortgage',
|
||||
'reit-hotel-motel',
|
||||
'real-estate-development',
|
||||
'real-estate-diversified'},
|
||||
'technology': {'software-infrastructure',
|
||||
'semiconductors',
|
||||
'consumer-electronics',
|
||||
'software-application',
|
||||
'information-technology-services',
|
||||
'semiconductor-equipment-materials',
|
||||
'communication-equipment',
|
||||
'computer-hardware',
|
||||
'electronic-components',
|
||||
'scientific-technical-instruments',
|
||||
'solar',
|
||||
'electronics-computer-distribution'},
|
||||
'utilities': {'utilities-regulated-electric',
|
||||
'utilities-renewable',
|
||||
'utilities-diversified',
|
||||
'utilities-regulated-gas',
|
||||
'utilities-independent-power-producers',
|
||||
'utilities-regulated-water'}
|
||||
'Basic Materials': {'Specialty Chemicals',
|
||||
'Gold',
|
||||
'Building Materials',
|
||||
'Copper',
|
||||
'Steel',
|
||||
'Agricultural Inputs',
|
||||
'Chemicals',
|
||||
'Other Industrial Metals & Mining',
|
||||
'Lumber & Wood Production',
|
||||
'Aluminum',
|
||||
'Other Precious Metals & Mining',
|
||||
'Coking Coal',
|
||||
'Paper & Paper Products',
|
||||
'Silver'},
|
||||
'Communication Services': {'Advertising Agencies',
|
||||
'Broadcasting',
|
||||
'Electronic Gaming & Multimedia',
|
||||
'Entertainment',
|
||||
'Internet Content & Information',
|
||||
'Publishing',
|
||||
'Telecom Services'},
|
||||
'Consumer Cyclical': {'Apparel Manufacturing',
|
||||
'Apparel Retail',
|
||||
'Auto & Truck Dealerships',
|
||||
'Auto Manufacturers',
|
||||
'Auto Parts',
|
||||
'Department Stores',
|
||||
'Footwear & Accessories',
|
||||
'Furnishings, Fixtures & Appliances',
|
||||
'Gambling',
|
||||
'Home Improvement Retail',
|
||||
'Internet Retail',
|
||||
'Leisure',
|
||||
'Lodging',
|
||||
'Luxury Goods',
|
||||
'Packaging & Containers',
|
||||
'Personal Services',
|
||||
'Recreational Vehicles',
|
||||
'Residential Construction',
|
||||
'Resorts & Casinos',
|
||||
'Restaurants',
|
||||
'Specialty Retail',
|
||||
'Textile Manufacturing',
|
||||
'Travel Services'},
|
||||
'Consumer Defensive': {'Beverages—Brewers',
|
||||
'Beverages—Non-Alcoholic',
|
||||
'Beverages—Wineries & Distilleries',
|
||||
'Confectioners',
|
||||
'Discount Stores',
|
||||
'Education & Training Services',
|
||||
'Farm Products',
|
||||
'Food Distribution',
|
||||
'Grocery Stores',
|
||||
'Household & Personal Products',
|
||||
'Packaged Foods',
|
||||
'Tobacco'},
|
||||
'Energy': {'Oil & Gas Drilling',
|
||||
'Oil & Gas E&P',
|
||||
'Oil & Gas Equipment & Services',
|
||||
'Oil & Gas Integrated',
|
||||
'Oil & Gas Midstream',
|
||||
'Oil & Gas Refining & Marketing',
|
||||
'Thermal Coal',
|
||||
'Uranium'},
|
||||
'Financial Services': {'Asset Management',
|
||||
'Banks—Diversified',
|
||||
'Banks—Regional',
|
||||
'Capital Markets',
|
||||
'Credit Services',
|
||||
'Financial Conglomerates',
|
||||
'Financial Data & Stock Exchanges',
|
||||
'Insurance Brokers',
|
||||
'Insurance—Diversified',
|
||||
'Insurance—Life',
|
||||
'Insurance—Property & Casualty',
|
||||
'Insurance—Reinsurance',
|
||||
'Insurance—Specialty',
|
||||
'Mortgage Finance',
|
||||
'Shell Companies'},
|
||||
'Healthcare': {'Biotechnology',
|
||||
'Diagnostics & Research',
|
||||
'Drug Manufacturers—General',
|
||||
'Drug Manufacturers—Specialty & Generic',
|
||||
'Health Information Services',
|
||||
'Healthcare Plans',
|
||||
'Medical Care Facilities',
|
||||
'Medical Devices',
|
||||
'Medical Instruments & Supplies',
|
||||
'Medical Distribution',
|
||||
'Pharmaceutical Retailers'},
|
||||
'Industrials': {'Aerospace & Defense',
|
||||
'Airlines',
|
||||
'Airports & Air Services',
|
||||
'Building Products & Equipment',
|
||||
'Business Equipment & Supplies',
|
||||
'Conglomerates',
|
||||
'Consulting Services',
|
||||
'Electrical Equipment & Parts',
|
||||
'Engineering & Construction',
|
||||
'Farm & Heavy Construction Machinery',
|
||||
'Industrial Distribution',
|
||||
'Infrastructure Operations',
|
||||
'Integrated Freight & Logistics',
|
||||
'Marine Shipping',
|
||||
'Metal Fabrication',
|
||||
'Pollution & Treatment Controls',
|
||||
'Railroads',
|
||||
'Rental & Leasing Services',
|
||||
'Security & Protection Services',
|
||||
'Specialty Business Services',
|
||||
'Specialty Industrial Machinery',
|
||||
'Staffing & Employment Services',
|
||||
'Tools & Accessories',
|
||||
'Trucking',
|
||||
'Waste Management'},
|
||||
'Real Estate': {'Real Estate—Development',
|
||||
'Real Estate Services',
|
||||
'Real Estate—Diversified',
|
||||
'REIT—Healthcare Facilities',
|
||||
'REIT—Hotel & Motel',
|
||||
'REIT—Industrial',
|
||||
'REIT—Office',
|
||||
'REIT—Residential',
|
||||
'REIT—Retail',
|
||||
'REIT—Mortgage',
|
||||
'REIT—Specialty',
|
||||
'REIT—Diversified'},
|
||||
'Technology': {'Communication Equipment',
|
||||
'Computer Hardware',
|
||||
'Consumer Electronics',
|
||||
'Electronic Components',
|
||||
'Electronics & Computer Distribution',
|
||||
'Information Technology Services',
|
||||
'Scientific & Technical Instruments',
|
||||
'Semiconductor Equipment & Materials',
|
||||
'Semiconductors',
|
||||
'Software—Application',
|
||||
'Software—Infrastructure',
|
||||
'Solar'},
|
||||
'Utilities': {'Utilities—Diversified',
|
||||
'Utilities—Independent Power Producers',
|
||||
'Utilities—Regulated Electric',
|
||||
'Utilities—Regulated Gas',
|
||||
'Utilities—Regulated Water',
|
||||
'Utilities—Renewable'},
|
||||
}
|
||||
SECTOR_INDUSTY_MAPPING_LC = {}
|
||||
for k in SECTOR_INDUSTY_MAPPING.keys():
|
||||
k2 = k.lower().replace('& ', '').replace('- ', '').replace(', ', ' ').replace(' ', '-')
|
||||
SECTOR_INDUSTY_MAPPING_LC[k2] = []
|
||||
for v in SECTOR_INDUSTY_MAPPING[k]:
|
||||
v2 = v.lower().replace('& ', '').replace('- ', '').replace(', ', ' ').replace(' ', '-')
|
||||
SECTOR_INDUSTY_MAPPING_LC[k2].append(v2)
|
||||
|
||||
# _MIC_TO_YAHOO_SUFFIX maps Market Identifier Codes (MIC) to Yahoo Finance market suffixes.
|
||||
# c.f. :
|
||||
# https://help.yahoo.com/kb/finance-for-web/SLN2310.html;_ylt=AwrJKiCZFo9g3Y8AsDWPAwx.;_ylu=Y29sbwMEcG9zAzEEdnRpZAMEc2VjA3Ny?locale=en_US
|
||||
# https://www.iso20022.org/market-identifier-codes
|
||||
|
||||
_MIC_TO_YAHOO_SUFFIX = {
|
||||
'XCBT': 'CBT', 'XCME': 'CME', 'IFUS': 'NYB', 'CECS': 'CMX', 'XNYM': 'NYM', 'XNYS': '', 'XNAS': '', # United States
|
||||
'XBUE': 'BA', # Argentina
|
||||
'XVIE': 'VI', # Austria
|
||||
'XASX': 'AX', 'XAUS': 'XA', # Australia
|
||||
'XBRU': 'BR', # Belgium
|
||||
'BVMF': 'SA', # Brazil
|
||||
'CNSX': 'CN', 'NEOE': 'NE', 'XTSE': 'TO', 'XTSX': 'V', # Canada
|
||||
'XSGO': 'SN', # Chile
|
||||
'XSHG': 'SS', 'XSHE': 'SZ', # China
|
||||
'XBOG': 'CL', # Colombia
|
||||
'XPRA': 'PR', # Czech Republic
|
||||
'XCSE': 'CO', # Denmark
|
||||
'XCAI': 'CA', # Egypt
|
||||
'XTAL': 'TL', # Estonia
|
||||
'CEUX': 'XD', 'XEUR': 'NX', # Europe (Cboe Europe, Euronext)
|
||||
'XHEL': 'HE', # Finland
|
||||
'XPAR': 'PA', # France
|
||||
'XBER': 'BE', 'XBMS': 'BM', 'XDUS': 'DU', 'XFRA': 'F', 'XHAM': 'HM', 'XHAN': 'HA', 'XMUN': 'MU', 'XSTU': 'SG', 'XETR': 'DE', # Germany
|
||||
'XATH': 'AT', # Greece
|
||||
'XHKG': 'HK', # Hong Kong
|
||||
'XBUD': 'BD', # Hungary
|
||||
'XICE': 'IC', # Iceland
|
||||
'XBOM': 'BO', 'XNSE': 'NS', # India
|
||||
'XIDX': 'JK', # Indonesia
|
||||
'XDUB': 'IR', # Ireland
|
||||
'XTAE': 'TA', # Israel
|
||||
'MTAA': 'MI', 'EUTL': 'TI', # Italy
|
||||
'XTKS': 'T', # Japan
|
||||
'XKFE': 'KW', # Kuwait
|
||||
'XRIS': 'RG', # Latvia
|
||||
'XVIL': 'VS', # Lithuania
|
||||
'XKLS': 'KL', # Malaysia
|
||||
'XMEX': 'MX', # Mexico
|
||||
'XAMS': 'AS', # Netherlands
|
||||
'XNZE': 'NZ', # New Zealand
|
||||
'XOSL': 'OL', # Norway
|
||||
'XPHS': 'PS', # Philippines
|
||||
'XWAR': 'WA', # Poland
|
||||
'XLIS': 'LS', # Portugal
|
||||
'XQAT': 'QA', # Qatar
|
||||
'XBSE': 'RO', # Romania
|
||||
'XSES': 'SI', # Singapore
|
||||
'XJSE': 'JO', # South Africa
|
||||
'XKRX': 'KS', 'KQKS': 'KQ', # South Korea
|
||||
'BMEX': 'MC', # Spain
|
||||
'XSAU': 'SR', # Saudi Arabia
|
||||
'XSTO': 'ST', # Sweden
|
||||
'XSWX': 'SW', # Switzerland
|
||||
'ROCO': 'TWO', 'XTAI': 'TW', # Taiwan
|
||||
'XBKK': 'BK', # Thailand
|
||||
'XIST': 'IS', # Turkey
|
||||
'XDFM': 'AE', # UAE
|
||||
'AQXE': 'AQ', 'XCHI': 'XC', 'XLON': 'L', 'ILSE': 'IL', # United Kingdom
|
||||
'XCAR': 'CR', # Venezuela
|
||||
'XSTC': 'VN' # Vietnam
|
||||
}
|
||||
|
||||
def merge_two_level_dicts(dict1, dict2):
|
||||
@@ -380,6 +450,7 @@ EQUITY_SCREENER_EQ_MAP = {
|
||||
'se': {'STO'},
|
||||
'sg': {'SES'},
|
||||
'sr': {},
|
||||
'sw': {'EBS'},
|
||||
'th': {'SET'},
|
||||
'tr': {'IST'},
|
||||
'tw': {'TAI', 'TWO'},
|
||||
@@ -393,6 +464,7 @@ EQUITY_SCREENER_EQ_MAP = {
|
||||
"Real Estate", "Technology", "Energy", "Utilities", "Financial Services",
|
||||
"Consumer Defensive", "Consumer Cyclical"
|
||||
},
|
||||
"industry": SECTOR_INDUSTY_MAPPING,
|
||||
"peer_group": {
|
||||
"US Fund Equity Energy",
|
||||
"US CE Convertibles",
|
||||
@@ -529,7 +601,8 @@ EQUITY_SCREENER_FIELDS = {
|
||||
"eq_fields": {
|
||||
"region",
|
||||
"sector",
|
||||
"peer_group"},
|
||||
"peer_group",
|
||||
"industry"},
|
||||
"price":{
|
||||
"lastclosemarketcap.lasttwelvemonths",
|
||||
"percentchange",
|
||||
|
||||
162
yfinance/data.py
162
yfinance/data.py
@@ -1,16 +1,32 @@
|
||||
import functools
|
||||
from functools import lru_cache
|
||||
import socket
|
||||
import time as _time
|
||||
|
||||
from curl_cffi import requests
|
||||
from urllib.parse import urlsplit, urljoin
|
||||
from bs4 import BeautifulSoup
|
||||
import datetime
|
||||
|
||||
from frozendict import frozendict
|
||||
|
||||
from . import utils, cache
|
||||
from .config import YfConfig
|
||||
import threading
|
||||
|
||||
from .exceptions import YFRateLimitError, YFDataException
|
||||
from .exceptions import YFException, YFDataException, YFRateLimitError
|
||||
|
||||
|
||||
def _is_transient_error(exception):
|
||||
"""Check if error is transient (network/timeout) and should be retried."""
|
||||
if isinstance(exception, (TimeoutError, socket.error, OSError)):
|
||||
return True
|
||||
error_type_name = type(exception).__name__
|
||||
transient_error_types = {
|
||||
'Timeout', 'TimeoutError', 'ConnectionError', 'ConnectTimeout',
|
||||
'ReadTimeout', 'ChunkedEncodingError', 'RemoteDisconnected',
|
||||
}
|
||||
return error_type_name in transient_error_types
|
||||
|
||||
cache_maxsize = 64
|
||||
|
||||
@@ -53,9 +69,6 @@ class SingletonMeta(type):
|
||||
if 'session' in kwargs or (args and len(args) > 0):
|
||||
session = kwargs.get('session') if 'session' in kwargs else args[0]
|
||||
cls._instances[cls]._set_session(session)
|
||||
if 'proxy' in kwargs or (args and len(args) > 1):
|
||||
proxy = kwargs.get('proxy') if 'proxy' in kwargs else args[1]
|
||||
cls._instances[cls]._set_proxy(proxy)
|
||||
return cls._instances[cls]
|
||||
|
||||
|
||||
@@ -65,7 +78,7 @@ class YfData(metaclass=SingletonMeta):
|
||||
Singleton means one session one cookie shared by all threads.
|
||||
"""
|
||||
|
||||
def __init__(self, session=None, proxy=None):
|
||||
def __init__(self, session=None):
|
||||
self._crumb = None
|
||||
self._cookie = None
|
||||
|
||||
@@ -76,9 +89,8 @@ class YfData(metaclass=SingletonMeta):
|
||||
|
||||
self._cookie_lock = threading.Lock()
|
||||
|
||||
self._session, self._proxy = None, None
|
||||
self._session = None
|
||||
self._set_session(session or requests.Session(impersonate="chrome"))
|
||||
self._set_proxy(proxy)
|
||||
|
||||
def _set_session(self, session):
|
||||
if session is None:
|
||||
@@ -102,17 +114,8 @@ class YfData(metaclass=SingletonMeta):
|
||||
|
||||
with self._cookie_lock:
|
||||
self._session = session
|
||||
if self._proxy is not None:
|
||||
self._session.proxies = self._proxy
|
||||
|
||||
def _set_proxy(self, proxy=None):
|
||||
with self._cookie_lock:
|
||||
if proxy is not None:
|
||||
proxy = {'http': proxy, 'https': proxy} if isinstance(proxy, str) else proxy
|
||||
else:
|
||||
proxy = {}
|
||||
self._proxy = proxy
|
||||
self._session.proxies = proxy
|
||||
if YfConfig.network.proxy is not None:
|
||||
self._session.proxies = YfConfig.network.proxy
|
||||
|
||||
def _set_cookie_strategy(self, strategy, have_lock=False):
|
||||
if strategy == self._cookie_strategy:
|
||||
@@ -197,8 +200,10 @@ class YfData(metaclass=SingletonMeta):
|
||||
url='https://fc.yahoo.com',
|
||||
timeout=timeout,
|
||||
allow_redirects=True)
|
||||
except requests.exceptions.DNSError:
|
||||
# Possible because url on some privacy/ad blocklists
|
||||
except requests.exceptions.DNSError as e:
|
||||
# Possible because url on some privacy/ad blocklists.
|
||||
# Can ignore because have second strategy.
|
||||
utils.get_yf_logger().debug("Handling DNS error on cookie fetch: " + str(e))
|
||||
return False
|
||||
self._save_cookie_curlCffi()
|
||||
return True
|
||||
@@ -367,14 +372,24 @@ class YfData(metaclass=SingletonMeta):
|
||||
|
||||
@utils.log_indent_decorator
|
||||
def get(self, url, params=None, timeout=30):
|
||||
return self._make_request(url, request_method = self._session.get, params=params, timeout=timeout)
|
||||
response = self._make_request(url, request_method = self._session.get, params=params, timeout=timeout)
|
||||
|
||||
# Accept cookie-consent if redirected to consent page
|
||||
if not self._is_this_consent_url(response.url):
|
||||
# "Consent Page not detected"
|
||||
pass
|
||||
else:
|
||||
# "Consent Page detected"
|
||||
response = self._accept_consent_form(response, timeout)
|
||||
|
||||
return response
|
||||
|
||||
@utils.log_indent_decorator
|
||||
def post(self, url, body, params=None, timeout=30):
|
||||
return self._make_request(url, request_method = self._session.post, body=body, params=params, timeout=timeout)
|
||||
def post(self, url, body=None, params=None, timeout=30, data=None):
|
||||
return self._make_request(url, request_method = self._session.post, body=body, params=params, timeout=timeout, data=data)
|
||||
|
||||
@utils.log_indent_decorator
|
||||
def _make_request(self, url, request_method, body=None, params=None, timeout=30):
|
||||
def _make_request(self, url, request_method, body=None, params=None, timeout=30, data=None):
|
||||
# Important: treat input arguments as immutable.
|
||||
|
||||
if len(url) > 200:
|
||||
@@ -383,10 +398,13 @@ class YfData(metaclass=SingletonMeta):
|
||||
utils.get_yf_logger().debug(f'url={url}')
|
||||
utils.get_yf_logger().debug(f'params={params}')
|
||||
|
||||
# sync with config
|
||||
self._session.proxies = YfConfig.network.proxy
|
||||
|
||||
if params is None:
|
||||
params = {}
|
||||
if 'crumb' in params:
|
||||
raise Exception("Don't manually add 'crumb' to params dict, let data.py handle it")
|
||||
raise YFException("Don't manually add 'crumb' to params dict, let data.py handle it")
|
||||
|
||||
crumb, strategy = self._get_cookie_and_crumb()
|
||||
if crumb is not None:
|
||||
@@ -402,8 +420,20 @@ class YfData(metaclass=SingletonMeta):
|
||||
|
||||
if body:
|
||||
request_args['json'] = body
|
||||
|
||||
if data:
|
||||
request_args['data'] = data
|
||||
request_args['headers'] = {"Content-Type": "application/json"}
|
||||
|
||||
response = request_method(**request_args)
|
||||
for attempt in range(YfConfig.network.retries + 1):
|
||||
try:
|
||||
response = request_method(**request_args)
|
||||
break
|
||||
except Exception as e:
|
||||
if _is_transient_error(e) and attempt < YfConfig.network.retries:
|
||||
_time.sleep(2 ** attempt)
|
||||
else:
|
||||
raise
|
||||
utils.get_yf_logger().debug(f'response code={response.status_code}')
|
||||
if response.status_code >= 400:
|
||||
# Retry with other cookie strategy
|
||||
@@ -432,3 +462,83 @@ class YfData(metaclass=SingletonMeta):
|
||||
response = self.get(url, params=params, timeout=timeout)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
def _is_this_consent_url(self, response_url: str) -> bool:
|
||||
"""
|
||||
Check if given response_url is consent page
|
||||
|
||||
Args:
|
||||
response_url (str) : response.url
|
||||
|
||||
Returns:
|
||||
True : This is cookie-consent page
|
||||
False : This is not cookie-consent page
|
||||
"""
|
||||
try:
|
||||
return urlsplit(response_url).hostname and urlsplit(
|
||||
response_url
|
||||
).hostname.endswith("consent.yahoo.com")
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def _accept_consent_form(
|
||||
self, consent_resp: requests.Response, timeout: int
|
||||
) -> requests.Response:
|
||||
"""
|
||||
Click 'Accept all' to cookie-consent form and return response object.
|
||||
|
||||
Args:
|
||||
consent_resp (requests.Response) : Response instance of cookie-consent page
|
||||
timeout (int) : Raise TimeoutError if post doesn't respond
|
||||
|
||||
Returns:
|
||||
response (requests.Response) : Reponse instance received from the server after accepting cookie-consent post.
|
||||
"""
|
||||
soup = BeautifulSoup(consent_resp.text, "html.parser")
|
||||
|
||||
# Heuristic: pick the first form; Yahoo's CMP tends to have a single form for consent
|
||||
form = soup.find("form")
|
||||
if not form:
|
||||
return consent_resp
|
||||
|
||||
# action : URL to send "Accept Cookies"
|
||||
action = form.get("action") or consent_resp.url
|
||||
action = urljoin(consent_resp.url, action)
|
||||
|
||||
# Collect inputs (hidden tokens, etc.)
|
||||
"""
|
||||
<input name="csrfToken" type="hidden" value="..."/>
|
||||
<input name="sessionId" type="hidden" value="..."/>
|
||||
<input name="originalDoneUrl" type="hidden" value="..."/>
|
||||
<input name="namespace" type="hidden" value="yahoo"/>
|
||||
"""
|
||||
data = {}
|
||||
for inp in form.find_all("input"):
|
||||
name = inp.get("name")
|
||||
if not name:
|
||||
continue
|
||||
typ = (inp.get("type") or "text").lower()
|
||||
val = inp.get("value") or ""
|
||||
|
||||
if typ in ("checkbox", "radio"):
|
||||
# If it's clearly an "agree"/"accept" field or already checked, include it
|
||||
if (
|
||||
"agree" in name.lower()
|
||||
or "accept" in name.lower()
|
||||
or inp.has_attr("checked")
|
||||
):
|
||||
data[name] = val if val != "" else "1"
|
||||
else:
|
||||
data[name] = val
|
||||
|
||||
# If no explicit agree/accept in inputs, add a best-effort flag
|
||||
lowered = {k.lower() for k in data.keys()}
|
||||
if not any(("agree" in k or "accept" in k) for k in lowered):
|
||||
data["agree"] = "1"
|
||||
|
||||
# Submit the form with "Referer". Some servers check this header as a simple CSRF protection measure.
|
||||
headers = {"Referer": consent_resp.url}
|
||||
response = self._session.post(
|
||||
action, data=data, headers=headers, timeout=timeout, allow_redirects=True
|
||||
)
|
||||
return response
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
from abc import ABC, abstractmethod
|
||||
import pandas as _pd
|
||||
from typing import Dict, List, Optional
|
||||
import warnings
|
||||
|
||||
from ..const import _QUERY1_URL_, _SENTINEL_
|
||||
from ..const import _QUERY1_URL_
|
||||
from ..data import YfData
|
||||
from ..ticker import Ticker
|
||||
|
||||
@@ -15,9 +14,9 @@ class Domain(ABC):
|
||||
and methods for fetching and parsing data. Derived classes must implement the `_fetch_and_parse()` method.
|
||||
"""
|
||||
|
||||
def __init__(self, key: str, session=None, proxy=_SENTINEL_):
|
||||
def __init__(self, key: str, session=None):
|
||||
"""
|
||||
Initializes the Domain object with a key, session, and proxy.
|
||||
Initializes the Domain object with a key, session.
|
||||
|
||||
Args:
|
||||
key (str): Unique key identifying the domain entity.
|
||||
@@ -26,9 +25,6 @@ class Domain(ABC):
|
||||
self._key: str = key
|
||||
self.session = session
|
||||
self._data: YfData = YfData(session=session)
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
self._name: Optional[str] = None
|
||||
self._symbol: Optional[str] = None
|
||||
|
||||
@@ -2,10 +2,9 @@ from __future__ import print_function
|
||||
|
||||
import pandas as _pd
|
||||
from typing import Dict, Optional
|
||||
import warnings
|
||||
|
||||
from .. import utils
|
||||
from ..const import _SENTINEL_
|
||||
from ..config import YfConfig
|
||||
from ..data import YfData
|
||||
|
||||
from .domain import Domain, _QUERY_URL_
|
||||
@@ -15,15 +14,12 @@ class Industry(Domain):
|
||||
Represents an industry within a sector.
|
||||
"""
|
||||
|
||||
def __init__(self, key, session=None, proxy=_SENTINEL_):
|
||||
def __init__(self, key, session=None):
|
||||
"""
|
||||
Args:
|
||||
key (str): The key identifier for the industry.
|
||||
session (optional): The session to use for requests.
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
YfData(proxy=proxy)
|
||||
YfData(session=session)
|
||||
super(Industry, self).__init__(key, session)
|
||||
self._query_url = f'{_QUERY_URL_}/industries/{self._key}'
|
||||
@@ -96,7 +92,7 @@ class Industry(Domain):
|
||||
Returns:
|
||||
Optional[pd.DataFrame]: DataFrame containing parsed top performing companies data.
|
||||
"""
|
||||
compnaies_column = ['symbol','name','ytd return',' last price','target price']
|
||||
compnaies_column = ['symbol','name','ytd return','last price','target price']
|
||||
compnaies_values = [(c.get('symbol', None),
|
||||
c.get('name', None),
|
||||
c.get('ytdReturn',{}).get('raw', None),
|
||||
@@ -118,7 +114,7 @@ class Industry(Domain):
|
||||
Returns:
|
||||
Optional[pd.DataFrame]: DataFrame containing parsed top growth companies data.
|
||||
"""
|
||||
compnaies_column = ['symbol','name','ytd return',' growth estimate']
|
||||
compnaies_column = ['symbol','name','ytd return','growth estimate']
|
||||
compnaies_values = [(c.get('symbol', None),
|
||||
c.get('name', None),
|
||||
c.get('ytdReturn',{}).get('raw', None),
|
||||
@@ -147,6 +143,8 @@ class Industry(Domain):
|
||||
|
||||
return result
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger = utils.get_yf_logger()
|
||||
logger.error(f"Failed to get industry data for '{self._key}' reason: {e}")
|
||||
logger.debug("Got response: ")
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
import datetime as dt
|
||||
import json as _json
|
||||
import warnings
|
||||
|
||||
from ..const import _QUERY1_URL_, _SENTINEL_
|
||||
from ..config import YfConfig
|
||||
from ..const import _QUERY1_URL_
|
||||
from ..data import utils, YfData
|
||||
from ..exceptions import YFDataException
|
||||
|
||||
class Market:
|
||||
def __init__(self, market:'str', session=None, proxy=_SENTINEL_, timeout=30):
|
||||
def __init__(self, market:'str', session=None, timeout=30):
|
||||
self.market = market
|
||||
self.session = session
|
||||
self.timeout = timeout
|
||||
|
||||
self._data = YfData(session=self.session)
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
self._logger = utils.get_yf_logger()
|
||||
|
||||
@@ -24,12 +22,12 @@ class Market:
|
||||
def _fetch_json(self, url, params):
|
||||
data = self._data.cache_get(url=url, params=params, timeout=self.timeout)
|
||||
if data is None or "Will be right back" in data.text:
|
||||
raise RuntimeError("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***\n"
|
||||
"Our engineers are working quickly to resolve "
|
||||
"the issue. Thank you for your patience.")
|
||||
raise YFDataException("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***")
|
||||
try:
|
||||
return data.json()
|
||||
except _json.JSONDecodeError:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._logger.error(f"{self.market}: Failed to retrieve market data and recieved faulty data.")
|
||||
return {}
|
||||
|
||||
@@ -66,6 +64,8 @@ class Market:
|
||||
self._summary = self._summary['marketSummaryResponse']['result']
|
||||
self._summary = {x['exchange']:x for x in self._summary}
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._logger.error(f"{self.market}: Failed to parse market summary")
|
||||
self._logger.debug(f"{type(e)}: {e}")
|
||||
|
||||
@@ -75,18 +75,22 @@ class Market:
|
||||
self._status = self._status['finance']['marketTimes'][0]['marketTime'][0]
|
||||
self._status['timezone'] = self._status['timezone'][0]
|
||||
del self._status['time'] # redundant
|
||||
try:
|
||||
self._status.update({
|
||||
"open": dt.datetime.fromisoformat(self._status["open"]),
|
||||
"close": dt.datetime.fromisoformat(self._status["close"]),
|
||||
"tz": dt.timezone(dt.timedelta(hours=int(self._status["timezone"]["gmtoffset"]))/1000, self._status["timezone"]["short"])
|
||||
})
|
||||
except Exception as e:
|
||||
self._logger.error(f"{self.market}: Failed to update market status")
|
||||
self._logger.debug(f"{type(e)}: {e}")
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._logger.error(f"{self.market}: Failed to parse market status")
|
||||
self._logger.debug(f"{type(e)}: {e}")
|
||||
try:
|
||||
self._status.update({
|
||||
"open": dt.datetime.fromisoformat(self._status["open"]),
|
||||
"close": dt.datetime.fromisoformat(self._status["close"]),
|
||||
"tz": dt.timezone(dt.timedelta(hours=int(self._status["timezone"]["gmtoffset"]))/1000, self._status["timezone"]["short"])
|
||||
})
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._logger.error(f"{self.market}: Failed to update market status")
|
||||
self._logger.debug(f"{type(e)}: {e}")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,10 +2,9 @@ from __future__ import print_function
|
||||
|
||||
import pandas as _pd
|
||||
from typing import Dict, Optional
|
||||
import warnings
|
||||
|
||||
from ..const import SECTOR_INDUSTY_MAPPING, _SENTINEL_
|
||||
from ..data import YfData
|
||||
from ..config import YfConfig
|
||||
from ..const import SECTOR_INDUSTY_MAPPING_LC
|
||||
from ..utils import dynamic_docstring, generate_list_table_from_dict, get_yf_logger
|
||||
|
||||
from .domain import Domain, _QUERY_URL_
|
||||
@@ -16,22 +15,17 @@ class Sector(Domain):
|
||||
such as top ETFs, top mutual funds, and industry data.
|
||||
"""
|
||||
|
||||
def __init__(self, key, session=None, proxy=_SENTINEL_):
|
||||
def __init__(self, key, session=None):
|
||||
"""
|
||||
Args:
|
||||
key (str): The key representing the sector.
|
||||
session (requests.Session, optional): A session for making requests. Defaults to None.
|
||||
proxy (dict, optional): A dictionary containing proxy settings for the request. Defaults to None.
|
||||
|
||||
.. seealso::
|
||||
|
||||
:attr:`Sector.industries <yfinance.Sector.industries>`
|
||||
Map of sector and industry
|
||||
"""
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
YfData(session=session, proxy=proxy)
|
||||
|
||||
super(Sector, self).__init__(key, session)
|
||||
self._query_url: str = f'{_QUERY_URL_}/sectors/{self._key}'
|
||||
self._top_etfs: Optional[Dict] = None
|
||||
@@ -69,7 +63,7 @@ class Sector(Domain):
|
||||
self._ensure_fetched(self._top_mutual_funds)
|
||||
return self._top_mutual_funds
|
||||
|
||||
@dynamic_docstring({"sector_industry": generate_list_table_from_dict(SECTOR_INDUSTY_MAPPING,bullets=True)})
|
||||
@dynamic_docstring({"sector_industry": generate_list_table_from_dict(SECTOR_INDUSTY_MAPPING_LC,bullets=True)})
|
||||
@property
|
||||
def industries(self) -> _pd.DataFrame:
|
||||
"""
|
||||
@@ -148,6 +142,8 @@ class Sector(Domain):
|
||||
self._industries = self._parse_industries(data.get('industries', {}))
|
||||
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger = get_yf_logger()
|
||||
logger.error(f"Failed to get sector data for '{self._key}' reason: {e}")
|
||||
logger.debug("Got response: ")
|
||||
|
||||
@@ -45,7 +45,7 @@ class YFInvalidPeriodError(YFException):
|
||||
self.invalid_period = invalid_period
|
||||
self.valid_ranges = valid_ranges
|
||||
super().__init__(f"{self.ticker}: Period '{invalid_period}' is invalid, "
|
||||
f"must be of the format {valid_ranges}, etc.")
|
||||
f"must be one of: {valid_ranges}")
|
||||
|
||||
|
||||
class YFRateLimitError(YFException):
|
||||
|
||||
@@ -7,6 +7,7 @@ from websockets.sync.client import connect as sync_connect
|
||||
from websockets.asyncio.client import connect as async_connect
|
||||
|
||||
from yfinance import utils
|
||||
from yfinance.config import YfConfig
|
||||
from yfinance.pricing_pb2 import PricingData
|
||||
from google.protobuf.json_format import MessageToDict
|
||||
|
||||
@@ -27,6 +28,8 @@ class BaseWebSocket:
|
||||
pricing_data.ParseFromString(decoded_bytes)
|
||||
return MessageToDict(pricing_data, preserving_proto_field_name=True)
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self.logger.error("Failed to decode message: %s", e, exc_info=True)
|
||||
if self.verbose:
|
||||
print("Failed to decode message: %s", e)
|
||||
@@ -61,6 +64,8 @@ class AsyncWebSocket(BaseWebSocket):
|
||||
if self.verbose:
|
||||
print("Connected to WebSocket.")
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self.logger.error("Failed to connect to WebSocket: %s", e, exc_info=True)
|
||||
if self.verbose:
|
||||
print(f"Failed to connect to WebSocket: {e}")
|
||||
@@ -79,6 +84,8 @@ class AsyncWebSocket(BaseWebSocket):
|
||||
if self.verbose:
|
||||
print(f"Heartbeat subscription sent for symbols: {self._subscriptions}")
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self.logger.error("Error in heartbeat subscription: %s", e, exc_info=True)
|
||||
if self.verbose:
|
||||
print(f"Error in heartbeat subscription: {e}")
|
||||
@@ -162,6 +169,8 @@ class AsyncWebSocket(BaseWebSocket):
|
||||
else:
|
||||
self._message_handler(decoded_message)
|
||||
except Exception as handler_exception:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self.logger.error("Error in message handler: %s", handler_exception, exc_info=True)
|
||||
if self.verbose:
|
||||
print("Error in message handler:", handler_exception)
|
||||
@@ -176,6 +185,8 @@ class AsyncWebSocket(BaseWebSocket):
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self.logger.error("Error while listening to messages: %s", e, exc_info=True)
|
||||
if self.verbose:
|
||||
print("Error while listening to messages: %s", e)
|
||||
@@ -301,6 +312,8 @@ class WebSocket(BaseWebSocket):
|
||||
try:
|
||||
message_handler(decoded_message)
|
||||
except Exception as handler_exception:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self.logger.error("Error in message handler: %s", handler_exception, exc_info=True)
|
||||
if self.verbose:
|
||||
print("Error in message handler:", handler_exception)
|
||||
@@ -314,6 +327,8 @@ class WebSocket(BaseWebSocket):
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self.logger.error("Error while listening to messages: %s", e, exc_info=True)
|
||||
if self.verbose:
|
||||
print("Error while listening to messages: %s", e)
|
||||
|
||||
@@ -21,12 +21,12 @@
|
||||
|
||||
import json as _json
|
||||
import pandas as pd
|
||||
import warnings
|
||||
|
||||
from . import utils
|
||||
from .const import _QUERY1_URL_, _SENTINEL_
|
||||
from .config import YfConfig
|
||||
from .const import _QUERY1_URL_
|
||||
from .data import YfData
|
||||
from .exceptions import YFException
|
||||
from .exceptions import YFDataException
|
||||
|
||||
LOOKUP_TYPES = ["all", "equity", "mutualfund", "etf", "index", "future", "currency", "cryptocurrency"]
|
||||
|
||||
@@ -38,19 +38,14 @@ class Lookup:
|
||||
:param query: The search query for financial data lookup.
|
||||
:type query: str
|
||||
:param session: Custom HTTP session for requests (default None).
|
||||
:param proxy: Proxy settings for requests (default None).
|
||||
:param timeout: Request timeout in seconds (default 30).
|
||||
:param raise_errors: Raise exceptions on error (default True).
|
||||
"""
|
||||
|
||||
def __init__(self, query: str, session=None, proxy=_SENTINEL_, timeout=30, raise_errors=True):
|
||||
def __init__(self, query: str, session=None, timeout=30, raise_errors=True):
|
||||
self.session = session
|
||||
self._data = YfData(session=self.session)
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
self.query = query
|
||||
|
||||
self.timeout = timeout
|
||||
@@ -81,18 +76,19 @@ class Lookup:
|
||||
|
||||
data = self._data.get(url=url, params=params, timeout=self.timeout)
|
||||
if data is None or "Will be right back" in data.text:
|
||||
raise RuntimeError("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***\n"
|
||||
"Our engineers are working quickly to resolve "
|
||||
"the issue. Thank you for your patience.")
|
||||
raise YFDataException("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***")
|
||||
try:
|
||||
data = data.json()
|
||||
except _json.JSONDecodeError:
|
||||
self._logger.error(f"{self.query}: Failed to retrieve lookup results and received faulty response instead.")
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._logger.error(f"{self.ticker}: 'lookup' fetch received faulty data")
|
||||
data = {}
|
||||
|
||||
# Error returned
|
||||
if data.get("finance", {}).get("error", {}):
|
||||
raise YFException(data.get("finance", {}).get("error", {}))
|
||||
error = data.get("finance", {}).get("error", {})
|
||||
raise YFDataException(f"{self.ticker}: 'lookup' fetch returned error: {error}")
|
||||
|
||||
self._cache[cache_key] = data
|
||||
return data
|
||||
|
||||
@@ -25,7 +25,6 @@ import logging
|
||||
import time as _time
|
||||
import traceback
|
||||
from typing import Union
|
||||
import warnings
|
||||
|
||||
import multitasking as _multitasking
|
||||
import pandas as _pd
|
||||
@@ -34,13 +33,13 @@ from curl_cffi import requests
|
||||
from . import Ticker, utils
|
||||
from .data import YfData
|
||||
from . import shared
|
||||
from .const import _SENTINEL_
|
||||
from .config import YfConfig
|
||||
|
||||
@utils.log_indent_decorator
|
||||
def download(tickers, start=None, end=None, actions=False, threads=True,
|
||||
ignore_tz=None, group_by='column', auto_adjust=None, back_adjust=False,
|
||||
repair=False, keepna=False, progress=True, period="max", interval="1d",
|
||||
prepost=False, proxy=_SENTINEL_, rounding=False, timeout=10, session=None,
|
||||
ignore_tz=None, group_by='column', auto_adjust=True, back_adjust=False,
|
||||
repair=False, keepna=False, progress=True, period=None, interval="1d",
|
||||
prepost=False, rounding=False, timeout=10, session=None,
|
||||
multi_level_index=True) -> Union[_pd.DataFrame, None]:
|
||||
"""
|
||||
Download yahoo tickers
|
||||
@@ -49,6 +48,7 @@ def download(tickers, start=None, end=None, actions=False, threads=True,
|
||||
List of tickers to download
|
||||
period : str
|
||||
Valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
|
||||
Default: 1mo
|
||||
Either Use period parameter or use start and end
|
||||
interval : str
|
||||
Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
|
||||
@@ -95,16 +95,8 @@ def download(tickers, start=None, end=None, actions=False, threads=True,
|
||||
session = session or requests.Session(impersonate="chrome")
|
||||
|
||||
# Ensure data initialised with session.
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=3)
|
||||
YfData(proxy=proxy)
|
||||
YfData(session=session)
|
||||
|
||||
if auto_adjust is None:
|
||||
# Warn users that default has changed to True
|
||||
warnings.warn("YF.download() has changed argument auto_adjust default to True", FutureWarning, stacklevel=3)
|
||||
auto_adjust = True
|
||||
|
||||
if logger.isEnabledFor(logging.DEBUG):
|
||||
if threads:
|
||||
# With DEBUG, each thread generates a lot of log messages.
|
||||
@@ -260,7 +252,7 @@ def _realign_dfs():
|
||||
@_multitasking.task
|
||||
def _download_one_threaded(ticker, start=None, end=None,
|
||||
auto_adjust=False, back_adjust=False, repair=False,
|
||||
actions=False, progress=True, period="max",
|
||||
actions=False, progress=True, period=None,
|
||||
interval="1d", prepost=False,
|
||||
keepna=False, rounding=False, timeout=10):
|
||||
_download_one(ticker, start, end, auto_adjust, back_adjust, repair,
|
||||
@@ -272,25 +264,27 @@ def _download_one_threaded(ticker, start=None, end=None,
|
||||
|
||||
def _download_one(ticker, start=None, end=None,
|
||||
auto_adjust=False, back_adjust=False, repair=False,
|
||||
actions=False, period="max", interval="1d",
|
||||
actions=False, period=None, interval="1d",
|
||||
prepost=False, rounding=False,
|
||||
keepna=False, timeout=10):
|
||||
data = None
|
||||
|
||||
backup = YfConfig.network.hide_exceptions
|
||||
YfConfig.network.hide_exceptions = False
|
||||
try:
|
||||
data = Ticker(ticker).history(
|
||||
period=period, interval=interval,
|
||||
start=start, end=end, prepost=prepost,
|
||||
actions=actions, auto_adjust=auto_adjust,
|
||||
back_adjust=back_adjust, repair=repair,
|
||||
rounding=rounding, keepna=keepna, timeout=timeout,
|
||||
raise_errors=True
|
||||
rounding=rounding, keepna=keepna, timeout=timeout
|
||||
)
|
||||
shared._DFS[ticker.upper()] = data
|
||||
except Exception as e:
|
||||
# glob try/except needed as current thead implementation breaks if exception is raised.
|
||||
shared._DFS[ticker.upper()] = utils.empty_df()
|
||||
shared._ERRORS[ticker.upper()] = repr(e)
|
||||
shared._TRACEBACKS[ticker.upper()] = traceback.format_exc()
|
||||
else:
|
||||
shared._DFS[ticker.upper()] = data
|
||||
|
||||
YfConfig.network.hide_exceptions = backup
|
||||
|
||||
return data
|
||||
|
||||
@@ -1,20 +1,16 @@
|
||||
import curl_cffi
|
||||
import pandas as pd
|
||||
import warnings
|
||||
|
||||
from yfinance import utils
|
||||
from yfinance.const import quote_summary_valid_modules, _SENTINEL_
|
||||
from yfinance.config import YfConfig
|
||||
from yfinance.const import quote_summary_valid_modules
|
||||
from yfinance.data import YfData
|
||||
from yfinance.exceptions import YFException
|
||||
from yfinance.scrapers.quote import _QUOTE_SUMMARY_URL_
|
||||
|
||||
class Analysis:
|
||||
|
||||
def __init__(self, data: YfData, symbol: str, proxy=_SENTINEL_):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
data._set_proxy(proxy)
|
||||
|
||||
def __init__(self, data: YfData, symbol: str):
|
||||
self._data = data
|
||||
self._symbol = symbol
|
||||
|
||||
@@ -84,6 +80,8 @@ class Analysis:
|
||||
data = self._fetch(['financialData'])
|
||||
data = data['quoteSummary']['result'][0]['financialData']
|
||||
except (TypeError, KeyError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._analyst_price_targets = {}
|
||||
return self._analyst_price_targets
|
||||
|
||||
@@ -107,6 +105,8 @@ class Analysis:
|
||||
data = self._fetch(['earningsHistory'])
|
||||
data = data['quoteSummary']['result'][0]['earningsHistory']['history']
|
||||
except (TypeError, KeyError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._earnings_history = pd.DataFrame()
|
||||
return self._earnings_history
|
||||
|
||||
@@ -143,6 +143,8 @@ class Analysis:
|
||||
trends = self._fetch(['industryTrend', 'sectorTrend', 'indexTrend'])
|
||||
trends = trends['quoteSummary']['result'][0]
|
||||
except (TypeError, KeyError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._growth_estimates = pd.DataFrame()
|
||||
return self._growth_estimates
|
||||
|
||||
@@ -180,7 +182,9 @@ class Analysis:
|
||||
try:
|
||||
result = self._data.get_raw_json(_QUOTE_SUMMARY_URL_ + f"/{self._symbol}", params=params_dict)
|
||||
except curl_cffi.requests.exceptions.HTTPError as e:
|
||||
utils.get_yf_logger().error(str(e))
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
utils.get_yf_logger().error(str(e) + e.response.text)
|
||||
return None
|
||||
return result
|
||||
|
||||
@@ -189,4 +193,6 @@ class Analysis:
|
||||
data = self._fetch(['earningsTrend'])
|
||||
self._earnings_trend = data['quoteSummary']['result'][0]['earningsTrend']['trend']
|
||||
except (TypeError, KeyError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._earnings_trend = []
|
||||
|
||||
@@ -5,16 +5,13 @@ import warnings
|
||||
import pandas as pd
|
||||
|
||||
from yfinance import utils, const
|
||||
from yfinance.config import YfConfig
|
||||
from yfinance.data import YfData
|
||||
from yfinance.exceptions import YFException, YFNotImplementedError
|
||||
|
||||
class Fundamentals:
|
||||
|
||||
def __init__(self, data: YfData, symbol: str, proxy=const._SENTINEL_):
|
||||
if proxy is not const._SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
data._set_proxy(proxy)
|
||||
|
||||
def __init__(self, data: YfData, symbol: str):
|
||||
self._data = data
|
||||
self._symbol = symbol
|
||||
|
||||
@@ -51,31 +48,19 @@ class Financials:
|
||||
self._balance_sheet_time_series = {}
|
||||
self._cash_flow_time_series = {}
|
||||
|
||||
def get_income_time_series(self, freq="yearly", proxy=const._SENTINEL_) -> pd.DataFrame:
|
||||
if proxy is not const._SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_income_time_series(self, freq="yearly") -> pd.DataFrame:
|
||||
res = self._income_time_series
|
||||
if freq not in res:
|
||||
res[freq] = self._fetch_time_series("income", freq)
|
||||
return res[freq]
|
||||
|
||||
def get_balance_sheet_time_series(self, freq="yearly", proxy=const._SENTINEL_) -> pd.DataFrame:
|
||||
if proxy is not const._SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_balance_sheet_time_series(self, freq="yearly") -> pd.DataFrame:
|
||||
res = self._balance_sheet_time_series
|
||||
if freq not in res:
|
||||
res[freq] = self._fetch_time_series("balance-sheet", freq)
|
||||
return res[freq]
|
||||
|
||||
def get_cash_flow_time_series(self, freq="yearly", proxy=const._SENTINEL_) -> pd.DataFrame:
|
||||
if proxy is not const._SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
def get_cash_flow_time_series(self, freq="yearly") -> pd.DataFrame:
|
||||
res = self._cash_flow_time_series
|
||||
if freq not in res:
|
||||
res[freq] = self._fetch_time_series("cash-flow", freq)
|
||||
@@ -104,6 +89,8 @@ class Financials:
|
||||
if statement is not None:
|
||||
return statement
|
||||
except YFException as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
utils.get_yf_logger().error(f"{self._symbol}: Failed to create {name} financials table for reason: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
@@ -117,6 +104,8 @@ class Financials:
|
||||
try:
|
||||
return self._get_financials_time_series(timescale, keys)
|
||||
except Exception:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
pass
|
||||
|
||||
def _get_financials_time_series(self, timescale, keys: list) -> pd.DataFrame:
|
||||
@@ -128,7 +117,7 @@ class Financials:
|
||||
url = ts_url_base + "&type=" + ",".join([timescale + k for k in keys])
|
||||
# Yahoo returns maximum 4 years or 5 quarters, regardless of start_dt:
|
||||
start_dt = datetime.datetime(2016, 12, 31)
|
||||
end = pd.Timestamp.utcnow().ceil("D")
|
||||
end = pd.Timestamp.now('UTC').ceil("D")
|
||||
url += f"&period1={int(start_dt.timestamp())}&period2={int(end.timestamp())}"
|
||||
|
||||
# Step 3: fetch and reshape data
|
||||
@@ -159,6 +148,10 @@ class Financials:
|
||||
|
||||
df.index = df.index.str.replace("^" + timescale, "", regex=True)
|
||||
|
||||
# Ensure float type, not object
|
||||
for d in df.columns:
|
||||
df[d] = df[d].astype('float')
|
||||
|
||||
# Reorder table to match order on Yahoo website
|
||||
df = df.reindex([k for k in keys if k in df.index])
|
||||
df = df[sorted(df.columns, reverse=True)]
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import pandas as pd
|
||||
from typing import Dict, Optional
|
||||
import warnings
|
||||
|
||||
from yfinance import utils
|
||||
from yfinance.const import _BASE_URL_, _SENTINEL_
|
||||
from yfinance.config import YfConfig
|
||||
from yfinance.const import _BASE_URL_
|
||||
from yfinance.data import YfData
|
||||
from yfinance.exceptions import YFDataException
|
||||
|
||||
@@ -17,7 +17,7 @@ class FundsData:
|
||||
Notes:
|
||||
- fundPerformance module is not implemented as better data is queryable using history
|
||||
"""
|
||||
def __init__(self, data: YfData, symbol: str, proxy=_SENTINEL_):
|
||||
def __init__(self, data: YfData, symbol: str):
|
||||
"""
|
||||
Args:
|
||||
data (YfData): The YfData object for fetching data.
|
||||
@@ -25,9 +25,6 @@ class FundsData:
|
||||
"""
|
||||
self._data = data
|
||||
self._symbol = symbol
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
# quoteType
|
||||
self._quote_type = None
|
||||
@@ -193,8 +190,12 @@ class FundsData:
|
||||
self._parse_top_holdings(data["topHoldings"])
|
||||
self._parse_fund_profile(data["fundProfile"])
|
||||
except KeyError:
|
||||
raise YFDataException("No Fund data found.")
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
raise YFDataException(f"{self._symbol}: No Fund data found.")
|
||||
except Exception as e:
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
logger = utils.get_yf_logger()
|
||||
logger.error(f"Failed to get fund data for '{self._symbol}' reason: {e}")
|
||||
logger.debug("Got response: ")
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,9 @@
|
||||
import curl_cffi
|
||||
import pandas as pd
|
||||
import warnings
|
||||
|
||||
from yfinance import utils
|
||||
from yfinance.const import _BASE_URL_, _SENTINEL_
|
||||
from yfinance.config import YfConfig
|
||||
from yfinance.const import _BASE_URL_
|
||||
from yfinance.data import YfData
|
||||
from yfinance.exceptions import YFDataException
|
||||
|
||||
@@ -12,12 +12,9 @@ _QUOTE_SUMMARY_URL_ = f"{_BASE_URL_}/v10/finance/quoteSummary"
|
||||
class Holders:
|
||||
_SCRAPE_URL_ = 'https://finance.yahoo.com/quote'
|
||||
|
||||
def __init__(self, data: YfData, symbol: str, proxy=_SENTINEL_):
|
||||
def __init__(self, data: YfData, symbol: str):
|
||||
self._data = data
|
||||
self._symbol = symbol
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
data._set_proxy(proxy)
|
||||
|
||||
self._major = None
|
||||
self._major_direct_holders = None
|
||||
@@ -75,7 +72,9 @@ class Holders:
|
||||
try:
|
||||
result = self._fetch()
|
||||
except curl_cffi.requests.exceptions.HTTPError as e:
|
||||
utils.get_yf_logger().error(str(e))
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
utils.get_yf_logger().error(str(e) + e.response.text)
|
||||
|
||||
self._major = pd.DataFrame()
|
||||
self._major_direct_holders = pd.DataFrame()
|
||||
@@ -98,6 +97,8 @@ class Holders:
|
||||
self._parse_insider_holders(data.get("insiderHolders", {}))
|
||||
self._parse_net_share_purchase_activity(data.get("netSharePurchaseActivity", {}))
|
||||
except (KeyError, IndexError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
raise YFDataException("Failed to parse holders json data.")
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -3,10 +3,10 @@ import datetime
|
||||
import json
|
||||
import numpy as _np
|
||||
import pandas as pd
|
||||
import warnings
|
||||
|
||||
from yfinance import utils
|
||||
from yfinance.const import quote_summary_valid_modules, _BASE_URL_, _QUERY1_URL_, _SENTINEL_
|
||||
from yfinance.config import YfConfig
|
||||
from yfinance.const import quote_summary_valid_modules, _BASE_URL_, _QUERY1_URL_
|
||||
from yfinance.data import YfData
|
||||
from yfinance.exceptions import YFDataException, YFException
|
||||
|
||||
@@ -26,11 +26,8 @@ _QUOTE_SUMMARY_URL_ = f"{_BASE_URL_}/v10/finance/quoteSummary"
|
||||
class FastInfo:
|
||||
# Contain small subset of info[] items that can be fetched faster elsewhere.
|
||||
# Imitates a dict.
|
||||
def __init__(self, tickerBaseObject, proxy=_SENTINEL_):
|
||||
def __init__(self, tickerBaseObject):
|
||||
self._tkr = tickerBaseObject
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._tkr._data._set_proxy(proxy)
|
||||
|
||||
self._prices_1y = None
|
||||
self._prices_1wk_1h_prepost = None
|
||||
@@ -106,7 +103,7 @@ class FastInfo:
|
||||
|
||||
def __getitem__(self, k):
|
||||
if not isinstance(k, str):
|
||||
raise KeyError("key must be a string")
|
||||
raise KeyError(f"key must be a string not '{type(k)}'")
|
||||
if k not in self._keys:
|
||||
raise KeyError(f"'{k}' not valid key. Examine 'FastInfo.keys()'")
|
||||
if k in self._cc_to_sc_key:
|
||||
@@ -146,7 +143,7 @@ class FastInfo:
|
||||
if self._prices_1y.empty:
|
||||
return self._prices_1y
|
||||
|
||||
dnow = pd.Timestamp.utcnow().tz_convert(self.timezone).date()
|
||||
dnow = pd.Timestamp.now('UTC').tz_convert(self.timezone).date()
|
||||
d1 = dnow
|
||||
d0 = (d1 + datetime.timedelta(days=1)) - utils._interval_to_timedelta("1y")
|
||||
if fullDaysOnly and self._exchange_open_now():
|
||||
@@ -173,7 +170,7 @@ class FastInfo:
|
||||
return self._md
|
||||
|
||||
def _exchange_open_now(self):
|
||||
t = pd.Timestamp.utcnow()
|
||||
t = pd.Timestamp.now('UTC')
|
||||
self._get_exchange_metadata()
|
||||
|
||||
# if self._today_open is None and self._today_close is None:
|
||||
@@ -234,7 +231,7 @@ class FastInfo:
|
||||
if self._shares is not None:
|
||||
return self._shares
|
||||
|
||||
shares = self._tkr.get_shares_full(start=pd.Timestamp.utcnow().date()-pd.Timedelta(days=548))
|
||||
shares = self._tkr.get_shares_full(start=pd.Timestamp.now('UTC').date()-pd.Timedelta(days=548))
|
||||
# if shares is None:
|
||||
# # Requesting 18 months failed, so fallback to shares which should include last year
|
||||
# shares = self._tkr.get_shares()
|
||||
@@ -467,8 +464,6 @@ class FastInfo:
|
||||
except Exception as e:
|
||||
if "Cannot retrieve share count" in str(e):
|
||||
shares = None
|
||||
elif "failed to decrypt Yahoo" in str(e):
|
||||
shares = None
|
||||
else:
|
||||
raise
|
||||
|
||||
@@ -486,12 +481,9 @@ class FastInfo:
|
||||
|
||||
|
||||
class Quote:
|
||||
def __init__(self, data: YfData, symbol: str, proxy=_SENTINEL_):
|
||||
def __init__(self, data: YfData, symbol: str):
|
||||
self._data = data
|
||||
self._symbol = symbol
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
self._info = None
|
||||
self._retired_info = None
|
||||
@@ -523,6 +515,8 @@ class Quote:
|
||||
try:
|
||||
data = result["quoteSummary"]["result"][0]
|
||||
except (KeyError, IndexError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
raise YFDataException(f"Failed to parse json response from Yahoo Finance: {result}")
|
||||
self._sustainability = pd.DataFrame(data)
|
||||
return self._sustainability
|
||||
@@ -537,6 +531,8 @@ class Quote:
|
||||
try:
|
||||
data = result["quoteSummary"]["result"][0]["recommendationTrend"]["trend"]
|
||||
except (KeyError, IndexError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
raise YFDataException(f"Failed to parse json response from Yahoo Finance: {result}")
|
||||
self._recommendations = pd.DataFrame(data)
|
||||
return self._recommendations
|
||||
@@ -558,6 +554,8 @@ class Quote:
|
||||
df.index = pd.to_datetime(df.index, unit='s')
|
||||
self._upgrades_downgrades = df
|
||||
except (KeyError, IndexError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
raise YFDataException(f"Failed to parse json response from Yahoo Finance: {result}")
|
||||
return self._upgrades_downgrades
|
||||
|
||||
@@ -589,7 +587,9 @@ class Quote:
|
||||
try:
|
||||
result = self._data.get_raw_json(_QUOTE_SUMMARY_URL_ + f"/{self._symbol}", params=params_dict)
|
||||
except curl_cffi.requests.exceptions.HTTPError as e:
|
||||
utils.get_yf_logger().error(str(e))
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
utils.get_yf_logger().error(str(e) + e.response.text)
|
||||
return None
|
||||
return result
|
||||
|
||||
@@ -598,7 +598,9 @@ class Quote:
|
||||
try:
|
||||
result = self._data.get_raw_json(f"{_QUERY1_URL_}/v7/finance/quote?", params=params_dict)
|
||||
except curl_cffi.requests.exceptions.HTTPError as e:
|
||||
utils.get_yf_logger().error(str(e))
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
utils.get_yf_logger().error(str(e) + e.response.text)
|
||||
return None
|
||||
return result
|
||||
|
||||
@@ -697,9 +699,9 @@ class Quote:
|
||||
for k in keys:
|
||||
url += "&type=" + k
|
||||
# Request 6 months of data
|
||||
start = pd.Timestamp.utcnow().floor("D") - datetime.timedelta(days=365 // 2)
|
||||
start = pd.Timestamp.now('UTC').floor("D") - datetime.timedelta(days=365 // 2)
|
||||
start = int(start.timestamp())
|
||||
end = pd.Timestamp.utcnow().ceil("D")
|
||||
end = pd.Timestamp.now('UTC').ceil("D")
|
||||
end = int(end.timestamp())
|
||||
url += f"&period1={start}&period2={end}"
|
||||
|
||||
@@ -740,6 +742,8 @@ class Quote:
|
||||
self._calendar['Revenue Low'] = earnings.get('revenueLow', None)
|
||||
self._calendar['Revenue Average'] = earnings.get('revenueAverage', None)
|
||||
except (KeyError, IndexError):
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
raise YFDataException(f"Failed to parse json response from Yahoo Finance: {result}")
|
||||
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ class EquityQuery(QueryBase):
|
||||
"""
|
||||
return EQUITY_SCREENER_FIELDS
|
||||
|
||||
@dynamic_docstring({"valid_values_table": generate_list_table_from_dict_universal(EQUITY_SCREENER_EQ_MAP, concat_keys=['exchange'])})
|
||||
@dynamic_docstring({"valid_values_table": generate_list_table_from_dict_universal(EQUITY_SCREENER_EQ_MAP, concat_keys=['exchange', 'industry'])})
|
||||
@property
|
||||
def valid_values(self) -> Dict:
|
||||
"""
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import curl_cffi
|
||||
from typing import Union
|
||||
import warnings
|
||||
from json import dumps
|
||||
|
||||
from yfinance.const import _QUERY1_URL_, _SENTINEL_
|
||||
from yfinance.const import _QUERY1_URL_
|
||||
from yfinance.data import YfData
|
||||
from ..utils import dynamic_docstring, generate_list_table_from_dict_universal
|
||||
|
||||
@@ -59,7 +60,7 @@ def screen(query: Union[str, EquityQuery, FundQuery],
|
||||
sortAsc: bool = None,
|
||||
userId: str = None,
|
||||
userIdType: str = None,
|
||||
session = None, proxy = _SENTINEL_):
|
||||
session = None):
|
||||
"""
|
||||
Run a screen: predefined query, or custom query.
|
||||
|
||||
@@ -111,11 +112,7 @@ def screen(query: Union[str, EquityQuery, FundQuery],
|
||||
{predefined_screeners}
|
||||
"""
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
_data = YfData(session=session, proxy=proxy)
|
||||
else:
|
||||
_data = YfData(session=session)
|
||||
_data = YfData(session=session)
|
||||
|
||||
# Only use defaults when user NOT give a predefined, because
|
||||
# Yahoo's predefined endpoint auto-applies defaults. Also,
|
||||
@@ -198,10 +195,11 @@ def screen(query: Union[str, EquityQuery, FundQuery],
|
||||
elif isinstance(post_query['query'], FndQy):
|
||||
post_query['quoteType'] = 'MUTUALFUND'
|
||||
post_query['query'] = post_query['query'].to_dict()
|
||||
data = dumps(post_query, separators=(",", ":"), ensure_ascii=False)
|
||||
|
||||
# Fetch
|
||||
response = _data.post(_SCREENER_URL_,
|
||||
body=post_query,
|
||||
data=data,
|
||||
params=params_dict)
|
||||
response.raise_for_status()
|
||||
return response.json()['finance']['result'][0]
|
||||
|
||||
@@ -20,17 +20,18 @@
|
||||
#
|
||||
|
||||
import json as _json
|
||||
import warnings
|
||||
|
||||
from . import utils
|
||||
from .const import _BASE_URL_, _SENTINEL_
|
||||
from .config import YfConfig
|
||||
from .const import _BASE_URL_
|
||||
from .data import YfData
|
||||
from .exceptions import YFDataException
|
||||
|
||||
|
||||
class Search:
|
||||
def __init__(self, query, max_results=8, news_count=8, lists_count=8, include_cb=True, include_nav_links=False,
|
||||
include_research=False, include_cultural_assets=False, enable_fuzzy_query=False, recommended=8,
|
||||
session=None, proxy=_SENTINEL_, timeout=30, raise_errors=True):
|
||||
session=None, timeout=30, raise_errors=True):
|
||||
"""
|
||||
Fetches and organizes search results from Yahoo Finance, including stock quotes and news articles.
|
||||
|
||||
@@ -52,10 +53,6 @@ class Search:
|
||||
self.session = session
|
||||
self._data = YfData(session=self.session)
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
|
||||
self.query = query
|
||||
self.max_results = max_results
|
||||
self.enable_fuzzy_query = enable_fuzzy_query
|
||||
@@ -104,13 +101,13 @@ class Search:
|
||||
|
||||
data = self._data.cache_get(url=url, params=params, timeout=self.timeout)
|
||||
if data is None or "Will be right back" in data.text:
|
||||
raise RuntimeError("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***\n"
|
||||
"Our engineers are working quickly to resolve "
|
||||
"the issue. Thank you for your patience.")
|
||||
raise YFDataException("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***")
|
||||
try:
|
||||
data = data.json()
|
||||
except _json.JSONDecodeError:
|
||||
self._logger.error(f"{self.query}: Failed to retrieve search results and received faulty response instead.")
|
||||
if not YfConfig.debug.hide_exceptions:
|
||||
raise
|
||||
self._logger.error(f"{self.query}: 'search' fetch received faulty data")
|
||||
data = {}
|
||||
|
||||
self._response = data
|
||||
|
||||
@@ -22,20 +22,16 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from collections import namedtuple as _namedtuple
|
||||
import warnings
|
||||
|
||||
import pandas as _pd
|
||||
|
||||
from .base import TickerBase
|
||||
from .const import _BASE_URL_, _SENTINEL_
|
||||
from .const import _BASE_URL_
|
||||
from .scrapers.funds import FundsData
|
||||
|
||||
|
||||
class Ticker(TickerBase):
|
||||
def __init__(self, ticker, session=None, proxy=_SENTINEL_):
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
def __init__(self, ticker, session=None):
|
||||
super(Ticker, self).__init__(ticker, session=session)
|
||||
self._expirations = {}
|
||||
self._underlying = {}
|
||||
|
||||
@@ -21,12 +21,9 @@
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import warnings
|
||||
|
||||
from . import Ticker, multi
|
||||
from .live import WebSocket
|
||||
from .data import YfData
|
||||
from .const import _SENTINEL_
|
||||
|
||||
|
||||
class Tickers:
|
||||
@@ -49,38 +46,25 @@ class Tickers:
|
||||
# "Tickers", ticker_objects.keys(), rename=True
|
||||
# )(*ticker_objects.values())
|
||||
|
||||
def history(self, period="1mo", interval="1d",
|
||||
def history(self, period=None, interval="1d",
|
||||
start=None, end=None, prepost=False,
|
||||
actions=True, auto_adjust=True, repair=False,
|
||||
proxy=_SENTINEL_,
|
||||
threads=True, group_by='column', progress=True,
|
||||
timeout=10, **kwargs):
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
proxy = _SENTINEL_
|
||||
|
||||
return self.download(
|
||||
period, interval,
|
||||
start, end, prepost,
|
||||
actions, auto_adjust, repair,
|
||||
proxy,
|
||||
threads, group_by, progress,
|
||||
timeout, **kwargs)
|
||||
|
||||
def download(self, period="1mo", interval="1d",
|
||||
def download(self, period=None, interval="1d",
|
||||
start=None, end=None, prepost=False,
|
||||
actions=True, auto_adjust=True, repair=False,
|
||||
proxy=_SENTINEL_,
|
||||
threads=True, group_by='column', progress=True,
|
||||
timeout=10, **kwargs):
|
||||
|
||||
if proxy is not _SENTINEL_:
|
||||
warnings.warn("Set proxy via new config function: yf.set_config(proxy=proxy)", DeprecationWarning, stacklevel=2)
|
||||
self._data._set_proxy(proxy)
|
||||
proxy = _SENTINEL_
|
||||
|
||||
data = multi.download(self.symbols,
|
||||
start=start, end=end,
|
||||
actions=actions,
|
||||
|
||||
@@ -31,6 +31,7 @@ from functools import wraps
|
||||
from inspect import getmembers
|
||||
from types import FunctionType
|
||||
from typing import List, Optional
|
||||
import warnings
|
||||
|
||||
import numpy as _np
|
||||
import pandas as _pd
|
||||
@@ -39,6 +40,8 @@ from dateutil.relativedelta import relativedelta
|
||||
from pytz import UnknownTimeZoneError
|
||||
|
||||
from yfinance import const
|
||||
from yfinance.exceptions import YFException
|
||||
from yfinance.config import YfConfig
|
||||
|
||||
# From https://stackoverflow.com/a/59128615
|
||||
def attributes(obj):
|
||||
@@ -146,6 +149,12 @@ class YFLogFormatter(logging.Filter):
|
||||
def get_yf_logger():
|
||||
global yf_logger
|
||||
global yf_log_indented
|
||||
|
||||
if yf_log_indented and not YfConfig.debug.logging:
|
||||
_disable_debug_mode()
|
||||
elif YfConfig.debug.logging and not yf_log_indented:
|
||||
_enable_debug_mode()
|
||||
|
||||
if yf_log_indented:
|
||||
yf_logger = get_indented_logger('yfinance')
|
||||
elif yf_logger is None:
|
||||
@@ -155,6 +164,10 @@ def get_yf_logger():
|
||||
|
||||
|
||||
def enable_debug_mode():
|
||||
warnings.warn("enable_debug_mode() is replaced by: yf.config.debug.logging = True (or False to disable)", DeprecationWarning)
|
||||
_enable_debug_mode()
|
||||
|
||||
def _enable_debug_mode():
|
||||
global yf_logger
|
||||
global yf_log_indented
|
||||
if not yf_log_indented:
|
||||
@@ -170,6 +183,16 @@ def enable_debug_mode():
|
||||
yf_log_indented = True
|
||||
|
||||
|
||||
def _disable_debug_mode():
|
||||
global yf_logger
|
||||
global yf_log_indented
|
||||
if yf_log_indented:
|
||||
yf_logger = logging.getLogger('yfinance')
|
||||
yf_logger.setLevel(logging.NOTSET)
|
||||
yf_logger = None
|
||||
yf_log_indented = False
|
||||
|
||||
|
||||
def is_isin(string):
|
||||
return bool(_re.match("^([A-Z]{2})([A-Z0-9]{9})([0-9])$", string))
|
||||
|
||||
@@ -399,20 +422,23 @@ def snake_case_2_camelCase(s):
|
||||
return sc
|
||||
|
||||
|
||||
def _parse_user_dt(dt, exchange_tz):
|
||||
def _parse_user_dt(dt, exchange_tz=_tz.utc):
|
||||
if isinstance(dt, int):
|
||||
# Should already be epoch, test with conversion:
|
||||
_datetime.datetime.fromtimestamp(dt)
|
||||
dt = _pd.Timestamp(dt, unit="s", tz=exchange_tz)
|
||||
else:
|
||||
# Convert str/date -> datetime, set tzinfo=exchange, get timestamp:
|
||||
if isinstance(dt, str):
|
||||
dt = _datetime.datetime.strptime(str(dt), '%Y-%m-%d')
|
||||
if isinstance(dt, _datetime.date) and not isinstance(dt, _datetime.datetime):
|
||||
dt = _datetime.datetime.combine(dt, _datetime.time(0))
|
||||
if isinstance(dt, _datetime.datetime) and dt.tzinfo is None:
|
||||
# Assume user is referring to exchange's timezone
|
||||
dt = _tz.timezone(exchange_tz).localize(dt)
|
||||
dt = int(dt.timestamp())
|
||||
if isinstance(dt, _datetime.datetime):
|
||||
if dt.tzinfo is None:
|
||||
# Assume user is referring to exchange's timezone
|
||||
dt = _pd.Timestamp(dt).tz_localize(exchange_tz)
|
||||
else:
|
||||
dt = _pd.Timestamp(dt).tz_convert(exchange_tz)
|
||||
else: # if we reached here, then it hasn't been any known type
|
||||
raise ValueError(f"Unable to parse input dt {dt} of type {type(dt)}")
|
||||
return dt
|
||||
|
||||
|
||||
@@ -519,7 +545,10 @@ def parse_actions(data):
|
||||
dividends.set_index("date", inplace=True)
|
||||
dividends.index = _pd.to_datetime(dividends.index, unit="s")
|
||||
dividends.sort_index(inplace=True)
|
||||
dividends.columns = ["Dividends"]
|
||||
if 'currency' in dividends.columns and (dividends['currency'] == '').all():
|
||||
# Currency column useless, drop it.
|
||||
dividends = dividends.drop('currency', axis=1)
|
||||
dividends = dividends.rename(columns={'amount': 'Dividends'})
|
||||
|
||||
if "capitalGains" in data["events"] and len(data["events"]['capitalGains']) > 0:
|
||||
capital_gains = _pd.DataFrame(
|
||||
@@ -572,7 +601,8 @@ def fix_Yahoo_returning_prepost_unrequested(quotes, interval, tradingPeriods):
|
||||
quotes.index = idx
|
||||
# "end" = end of regular trading hours (including any auction)
|
||||
f_drop = quotes.index >= quotes["end"]
|
||||
f_drop = f_drop | (quotes.index < quotes["start"])
|
||||
td = _interval_to_timedelta(interval)
|
||||
f_drop = f_drop | (quotes.index + td <= quotes["start"])
|
||||
if f_drop.any():
|
||||
# When printing report, ignore rows that were already NaNs:
|
||||
# f_na = quotes[["Open","Close"]].isna().all(axis=1)
|
||||
@@ -696,14 +726,10 @@ def fix_Yahoo_returning_live_separate(quotes, interval, tz_exchange, prepost, re
|
||||
|
||||
|
||||
def safe_merge_dfs(df_main, df_sub, interval):
|
||||
if df_sub.empty:
|
||||
raise Exception("No data to merge")
|
||||
if df_main.empty:
|
||||
return df_main
|
||||
|
||||
data_cols = [c for c in df_sub.columns if c not in df_main]
|
||||
if len(data_cols) > 1:
|
||||
raise Exception("Expected 1 data col")
|
||||
data_col = data_cols[0]
|
||||
|
||||
df_main = df_main.sort_index()
|
||||
@@ -744,6 +770,13 @@ def safe_merge_dfs(df_main, df_sub, interval):
|
||||
if df_sub.empty:
|
||||
df_main['Dividends'] = 0.0
|
||||
return df_main
|
||||
|
||||
# df_sub changed so recalc indices:
|
||||
df_main['_date'] = df_main.index.date
|
||||
df_sub['_date'] = df_sub.index.date
|
||||
indices = _np.searchsorted(_np.append(df_main['_date'], [df_main['_date'].iloc[-1]+td]), df_sub['_date'], side='left')
|
||||
df_main = df_main.drop('_date', axis=1)
|
||||
df_sub = df_sub.drop('_date', axis=1)
|
||||
else:
|
||||
empty_row_data = {**{c:[_np.nan] for c in const._PRICE_COLNAMES_}, 'Volume':[0]}
|
||||
if interval == '1d':
|
||||
@@ -780,7 +813,7 @@ def safe_merge_dfs(df_main, df_sub, interval):
|
||||
f_outOfRange = indices == -1
|
||||
if f_outOfRange.any():
|
||||
if intraday or interval in ['1d', '1wk']:
|
||||
raise Exception(f"The following '{data_col}' events are out-of-range, did not expect with interval {interval}: {df_sub.index[f_outOfRange]}")
|
||||
raise YFException(f"The following '{data_col}' events are out-of-range, did not expect with interval {interval}: {df_sub.index[f_outOfRange]}")
|
||||
get_yf_logger().debug(f'Discarding these {data_col} events:' + '\n' + str(df_sub[f_outOfRange]))
|
||||
df_sub = df_sub[~f_outOfRange].copy()
|
||||
indices = indices[~f_outOfRange]
|
||||
@@ -802,7 +835,7 @@ def safe_merge_dfs(df_main, df_sub, interval):
|
||||
df = df.groupby("_NewIndex").prod()
|
||||
df.index.name = None
|
||||
else:
|
||||
raise Exception(f"New index contains duplicates but unsure how to aggregate for '{data_col_name}'")
|
||||
raise YFException(f"New index contains duplicates but unsure how to aggregate for '{data_col_name}'")
|
||||
if "_NewIndex" in df.columns:
|
||||
df = df.drop("_NewIndex", axis=1)
|
||||
return df
|
||||
@@ -814,7 +847,7 @@ def safe_merge_dfs(df_main, df_sub, interval):
|
||||
f_na = df[data_col].isna()
|
||||
data_lost = sum(~f_na) < df_sub.shape[0]
|
||||
if data_lost:
|
||||
raise Exception('Data was lost in merge, investigate')
|
||||
raise YFException('Data was lost in merge, investigate')
|
||||
|
||||
return df
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
version = "0.2.63"
|
||||
version = "1.1.0"
|
||||
|
||||
Reference in New Issue
Block a user