Merge pull request #1661 from ranaroussi/dev

sync dev -> main
main
ValueRaider 2023-08-13 12:44:05 +01:00 committed by GitHub
commit b6372c0945
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 1426 additions and 598 deletions

View File

@ -39,7 +39,7 @@ setup(
'License :: OSI Approved :: Apache Software License',
# 'Development Status :: 3 - Alpha',
'Development Status :: 4 - Beta',
#'Development Status :: 5 - Production/Stable',
# 'Development Status :: 5 - Production/Stable',
'Operating System :: OS Independent',

View File

@ -0,0 +1,6 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2023-05-30 00:00:00+02:00,19.5900001525879,19.7999992370605,19.2700004577637,19.3500003814697,18.6291382416581,196309,0,0
2023-05-31 00:00:00+02:00,19.1200008392334,19.1399993896484,18.7000007629395,18.7900009155273,18.0900009155273,156652,0,0
2023-06-02 00:00:00+02:00,18.5499992370605,19,18.5100002288818,18.8999996185303,18.8999996185303,83439,0.7,0
2023-06-05 00:00:00+02:00,18.9300003051758,19.0900001525879,18.8400001525879,19,19,153167,0,0
2023-06-06 00:00:00+02:00,18.9099998474121,18.9500007629395,18.5100002288818,18.6599998474121,18.6599998474121,104352,0,0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2023-05-30 00:00:00+02:00 19.5900001525879 19.7999992370605 19.2700004577637 19.3500003814697 18.6291382416581 196309 0 0
3 2023-05-31 00:00:00+02:00 19.1200008392334 19.1399993896484 18.7000007629395 18.7900009155273 18.0900009155273 156652 0 0
4 2023-06-02 00:00:00+02:00 18.5499992370605 19 18.5100002288818 18.8999996185303 18.8999996185303 83439 0.7 0
5 2023-06-05 00:00:00+02:00 18.9300003051758 19.0900001525879 18.8400001525879 19 19 153167 0 0
6 2023-06-06 00:00:00+02:00 18.9099998474121 18.9500007629395 18.5100002288818 18.6599998474121 18.6599998474121 104352 0 0

View File

@ -0,0 +1,6 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2023-05-30 00:00:00+02:00,19.59000015258789,19.799999237060547,19.270000457763672,19.350000381469727,19.350000381469727,196309,0.0,0.0
2023-05-31 00:00:00+02:00,19.1200008392334,19.139999389648438,18.700000762939453,18.790000915527344,18.790000915527344,156652,0.0,0.0
2023-06-02 00:00:00+02:00,18.549999237060547,19.0,18.510000228881836,18.899999618530273,18.899999618530273,83439,0.7,0.0
2023-06-05 00:00:00+02:00,18.93000030517578,19.09000015258789,18.84000015258789,19.0,19.0,153167,0.0,0.0
2023-06-06 00:00:00+02:00,18.90999984741211,18.950000762939453,18.510000228881836,18.65999984741211,18.65999984741211,104352,0.0,0.0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2023-05-30 00:00:00+02:00 19.59000015258789 19.799999237060547 19.270000457763672 19.350000381469727 19.350000381469727 196309 0.0 0.0
3 2023-05-31 00:00:00+02:00 19.1200008392334 19.139999389648438 18.700000762939453 18.790000915527344 18.790000915527344 156652 0.0 0.0
4 2023-06-02 00:00:00+02:00 18.549999237060547 19.0 18.510000228881836 18.899999618530273 18.899999618530273 83439 0.7 0.0
5 2023-06-05 00:00:00+02:00 18.93000030517578 19.09000015258789 18.84000015258789 19.0 19.0 153167 0.0 0.0
6 2023-06-06 00:00:00+02:00 18.90999984741211 18.950000762939453 18.510000228881836 18.65999984741211 18.65999984741211 104352 0.0 0.0

View File

@ -0,0 +1,24 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2022-06-06 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-06-01 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-31 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-30 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-27 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-26 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-25 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-24 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-23 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-20 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-19 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-18 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,532454,0,0
2022-05-17 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-16 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-13 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-12 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-11 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-10 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-09 00:00:00+01:00,0.1455,0.1455,0.1455,0.1455,0.1455,0,0,0
2022-05-06 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-05 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-04 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
2022-05-03 00:00:00+01:00,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0.145500004291534,0,0,0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2022-06-06 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
3 2022-06-01 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
4 2022-05-31 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
5 2022-05-30 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
6 2022-05-27 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
7 2022-05-26 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
8 2022-05-25 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
9 2022-05-24 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
10 2022-05-23 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
11 2022-05-20 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
12 2022-05-19 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
13 2022-05-18 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 532454 0 0
14 2022-05-17 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
15 2022-05-16 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
16 2022-05-13 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
17 2022-05-12 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
18 2022-05-11 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
19 2022-05-10 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
20 2022-05-09 00:00:00+01:00 0.1455 0.1455 0.1455 0.1455 0.1455 0 0 0
21 2022-05-06 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
22 2022-05-05 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
23 2022-05-04 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0
24 2022-05-03 00:00:00+01:00 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0.145500004291534 0 0 0

View File

@ -0,0 +1,24 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2022-06-06 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-06-01 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-31 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
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-27 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-26 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-25 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-24 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-20 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-19 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-05-18 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,532454,0.0,0.0
2022-05-17 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-05-16 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-05-13 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-05-12 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-05-11 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-05-10 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,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-06 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-05 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-04 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-05-03 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2022-06-06 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
3 2022-06-01 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
4 2022-05-31 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
5 2022-05-30 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
6 2022-05-27 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
7 2022-05-26 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
8 2022-05-25 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
9 2022-05-24 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
10 2022-05-23 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
11 2022-05-20 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
12 2022-05-19 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
13 2022-05-18 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 532454 0.0 0.0
14 2022-05-17 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
15 2022-05-16 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
16 2022-05-13 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
17 2022-05-12 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
18 2022-05-11 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
19 2022-05-10 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
20 2022-05-09 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
21 2022-05-06 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
22 2022-05-05 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
23 2022-05-04 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
24 2022-05-03 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0

View File

@ -0,0 +1,37 @@
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 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2022-05-30 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
3 2022-05-23 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
4 2022-05-16 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 532454 0 0
5 2022-05-09 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
6 2022-05-02 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
7 2022-04-25 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
8 2022-04-18 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
9 2022-04-11 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
10 2022-04-04 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
11 2022-03-28 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
12 2022-03-21 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
13 2022-03-14 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
14 2022-03-07 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
15 2022-02-28 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
16 2022-02-21 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
17 2022-02-14 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
18 2022-02-07 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
19 2022-01-31 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
20 2022-01-24 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
21 2022-01-17 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
22 2022-01-10 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
23 2022-01-03 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
24 2021-12-27 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
25 2021-12-20 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
26 2021-12-13 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
27 2021-12-06 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
28 2021-11-29 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
29 2021-11-22 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
30 2021-11-15 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
31 2021-11-08 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
32 2021-11-01 00:00:00+00:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
33 2021-10-25 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
34 2021-10-18 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
35 2021-10-11 00:00:00+01:00 14.5500 14.5500 14.5500 14.5500 14.5500 0 0 0
36 2021-10-04 00:00:00+01:00 14.8000 15.3400 14.4000 14.5500 14.5500 2171373 0 0
37 2021-09-27 00:00:00+01:00 15.6000 16.0000 14.9000 15.0500 15.0500 3860549 0 0

View File

@ -0,0 +1,25 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2022-08-15 00:00:00+01:00,27.6000,28.2000,26.2000,27.6000,27.6000,3535668,0,0
2022-08-12 00:00:00+01:00,27.3000,29.8000,26.4030,27.0000,27.0000,7223353,0,0
2022-08-11 00:00:00+01:00,26.0000,29.8000,24.2000,27.1000,27.1000,12887933,0,0
2022-08-10 00:00:00+01:00,25.0000,29.2000,22.5000,25.0000,25.0000,26572680,0,0
2022-08-09 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-08-08 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-08-05 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-08-04 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-08-03 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-08-02 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-08-01 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-29 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-28 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-27 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-26 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-25 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-22 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-21 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-20 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-19 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-18 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-15 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-14 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0
2022-07-13 00:00:00+01:00,14.5500,14.5500,14.5500,14.5500,14.5500,0,0,0

View File

@ -0,0 +1,37 @@
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
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2022-05-30 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
3 2022-05-23 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
4 2022-05-16 00:00:00+01:00 14.550000190734863 14.550000190734863 0.14550000429153442 0.14550000429153442 0.14550000429153442 532454 0.0 0.0
5 2022-05-09 00:00:00+01:00 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 14.550000190734863 0 0.0 0.0
6 2022-05-02 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
7 2022-04-25 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
8 2022-04-18 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
9 2022-04-11 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
10 2022-04-04 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
11 2022-03-28 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
12 2022-03-21 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
13 2022-03-14 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
14 2022-03-07 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
15 2022-02-28 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
16 2022-02-21 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
17 2022-02-14 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
18 2022-02-07 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
19 2022-01-31 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
20 2022-01-24 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
21 2022-01-17 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
22 2022-01-10 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
23 2022-01-03 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
24 2021-12-27 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
25 2021-12-20 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
26 2021-12-13 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
27 2021-12-06 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
28 2021-11-29 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
29 2021-11-22 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
30 2021-11-15 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
31 2021-11-08 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
32 2021-11-01 00:00:00+00:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
33 2021-10-25 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
34 2021-10-18 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
35 2021-10-11 00:00:00+01:00 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0.14550000429153442 0 0.0 0.0
36 2021-10-04 00:00:00+01:00 14.800000190734863 15.34000015258789 0.14399999380111694 0.14550000429153442 0.14550000429153442 2171373 0.0 0.0
37 2021-09-27 00:00:00+01:00 15.600000381469727 16.0 14.899999618530273 15.050000190734863 15.050000190734863 3860549 0.0 0.0

View File

@ -0,0 +1,25 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2022-08-15 00:00:00+01:00,27.600000381469727,28.200000762939453,26.200000762939453,27.600000381469727,27.600000381469727,3535668,0.0,0.0
2022-08-12 00:00:00+01:00,27.299999237060547,29.799999237060547,26.402999877929688,27.0,27.0,7223353,0.0,0.0
2022-08-11 00:00:00+01:00,26.0,29.799999237060547,24.200000762939453,27.100000381469727,27.100000381469727,12887933,0.0,0.0
2022-08-10 00:00:00+01:00,25.0,29.200000762939453,22.5,25.0,25.0,26572680,0.0,0.0
2022-08-09 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-08-08 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-08-05 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-08-04 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-08-03 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-08-02 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-08-01 00:00:00+01:00,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,14.550000190734863,0,0.0,0.0
2022-07-29 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-28 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-27 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-26 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-25 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-22 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-21 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-20 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-19 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-18 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-15 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-14 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0
2022-07-13 00:00:00+01:00,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0.14550000429153442,0,0.0,0.0

View File

@ -0,0 +1,85 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2021-12-13 00:00:00+00:00,393.999975585938,406.6,391.4,402.899916992188,291.232287597656,62714764.4736842,0,0
2021-12-20 00:00:00+00:00,393.999975585938,412.199990234375,392.502983398438,409.899997558594,296.292243652344,46596651.3157895,0,0
2021-12-27 00:00:00+00:00,409.899997558594,416.550971679688,408.387001953125,410.4,296.653642578125,10818482.8947368,0,0
2022-01-03 00:00:00+00:00,410.4,432.199995117188,410.4,432.099985351563,312.339265136719,44427327.6315789,0,0
2022-01-10 00:00:00+00:00,431.3,439.199982910156,429.099970703125,436.099912109375,315.230618896484,29091400,0,0
2022-01-17 00:00:00+00:00,437.999912109375,445.199965820313,426.999997558594,431.999975585938,312.267017822266,43787351.3157895,0,0
2022-01-24 00:00:00+00:00,430.099975585938,440.999973144531,420.999968261719,433.499982910156,313.351237792969,58487296.0526316,0,0
2022-01-31 00:00:00+00:00,436.199968261719,443.049987792969,432.099985351563,435.199916992188,314.580045166016,43335806.5789474,0,0
2022-02-07 00:00:00+00:00,437.899995117188,448.799992675781,436.051994628906,444.39998046875,321.230207519531,39644061.8421053,0,0
2022-02-14 00:00:00+00:00,437.699975585938,441.999978027344,426.699968261719,432.199995117188,312.411558837891,49972693.4210526,0,0
2022-02-21 00:00:00+00:00,435.499992675781,438.476999511719,408.29998046875,423.399970703125,306.050571289063,65719596.0526316,0,0
2022-02-28 00:00:00+00:00,415.099995117188,427.999909667969,386.199932861328,386.799945068359,279.594578857422,94057936.8421053,4.1875,0
2022-03-07 00:00:00+00:00,374.999952392578,417.299978027344,361.101981201172,409.599968261719,298.389248046875,71269101.3157895,0,0
2022-03-14 00:00:00+00:00,413.099985351563,426.699968261719,408.899992675781,422.399965820313,307.713929443359,55431927.6315789,0,0
2022-03-21 00:00:00+00:00,422.699995117188,442.7,422.399965820313,437.799985351563,318.932696533203,39896352.6315789,0,0
2022-03-28 00:00:00+01:00,442.49998046875,460.999978027344,440.097983398438,444.6,323.886403808594,56413515.7894737,0,0
2022-04-04 00:00:00+01:00,439.699985351563,445.399985351563,421.999973144531,425.799973144531,310.190817871094,49415836.8421053,19.342106,0
2022-04-11 00:00:00+01:00,425.39998046875,435.599909667969,420.799995117188,434.299968261719,327.211427001953,29875081.5789474,0,0
2022-04-18 00:00:00+01:00,434.299968261719,447.799987792969,433.599992675781,437.799985351563,329.848419189453,49288272.3684211,0,0
2022-04-25 00:00:00+01:00,430.699987792969,438.799990234375,423.999982910156,433.299916992188,326.457967529297,44656776.3157895,0,0
2022-05-02 00:00:00+01:00,433.299916992188,450.999975585938,414.499982910156,414.899975585938,312.595018310547,29538167.1052632,0,0
2022-05-09 00:00:00+01:00,413.199995117188,417.449992675781,368.282923583984,408.199970703125,307.547099609375,73989611.8421053,0,0
2022-05-16 00:00:00+01:00,384,423.600006103516,384,412.100006103516,310.485473632813,81938261,101.69,0.76
2022-05-23 00:00:00+01:00,416.100006103516,442.399993896484,341.915008544922,440.899993896484,409.764678955078,45432941,0,0
2022-05-30 00:00:00+01:00,442.700012207031,444.200012207031,426.600006103516,428.700012207031,398.426239013672,37906659,0,0
2022-06-06 00:00:00+01:00,425.299987792969,434.010009765625,405.200012207031,405.399993896484,376.771606445313,40648810,0,0
2022-06-13 00:00:00+01:00,402.5,420,399.799987792969,411.200012207031,382.162048339844,74196958,0,0
2022-06-20 00:00:00+01:00,412.5,421.899993896484,398.399993896484,411.5,382.440826416016,28679717,0,0
2022-06-27 00:00:00+01:00,413.100006103516,422.399993896484,397.399993896484,401.600006103516,373.239959716797,35468994,0,0
2022-07-04 00:00:00+01:00,405.399993896484,406.600006103516,382.299987792969,401.299987792969,372.961120605469,35304748,0,0
2022-07-11 00:00:00+01:00,394.799987792969,405.850006103516,383.399993896484,396.600006103516,368.593048095703,42308459,0,0
2022-07-18 00:00:00+01:00,392.5,399.700012207031,384.799987792969,391.700012207031,364.039093017578,36656839,0,0
2022-07-25 00:00:00+01:00,392.200012207031,400.799987792969,388.700012207031,396,368.035430908203,33124660,0,0
2022-08-01 00:00:00+01:00,396.399993896484,405.5,390.415008544922,402,373.611724853516,21753121,0,0
2022-08-08 00:00:00+01:00,406.600006103516,473.700012207031,403.299987792969,467.899993896484,434.858032226563,59155709,0,0
2022-08-15 00:00:00+01:00,468.100006103516,470.5,434,437,406.140106201172,36989620,10.3,0
2022-08-22 00:00:00+01:00,436.100006103516,436.869995117188,419.299987792969,420.5,399.780303955078,36492572,0,0
2022-08-29 00:00:00+01:00,420.5,426.600006103516,408.600006103516,426.600006103516,405.579742431641,29573657,0,0
2022-09-05 00:00:00+01:00,418.5,444.4169921875,416.100006103516,443.100006103516,421.266723632813,34375126,0,0
2022-09-12 00:00:00+01:00,444.649993896484,448.899993896484,435.200012207031,440.100006103516,418.414520263672,39085960,0,0
2022-09-19 00:00:00+01:00,440.100006103516,447.200012207031,419.299987792969,422.899993896484,402.062042236328,27982081,0,0
2022-09-26 00:00:00+01:00,421.200012207031,421.200012207031,373.31201171875,388.200012207031,369.071868896484,70408935,0,0
2022-10-03 00:00:00+01:00,382.899993896484,409.875,380.555999755859,400.700012207031,380.955932617188,37581751,0,0
2022-10-10 00:00:00+01:00,395.799987792969,404.470001220703,366.700012207031,394.299987792969,374.871276855469,52952323,0,0
2022-10-17 00:00:00+01:00,394.299987792969,414.799987792969,393,406.5,386.470123291016,26441475,0,0
2022-10-24 00:00:00+01:00,407.100006103516,418.227996826172,407.100006103516,413.299987792969,392.93505859375,26239756,0,0
2022-10-31 00:00:00+00:00,413.899993896484,430.200012207031,412,429.299987792969,408.146667480469,23168047,0,0
2022-11-07 00:00:00+00:00,427.299987792969,445.899993896484,420.652008056641,438.399993896484,416.798278808594,36709117,0,0
2022-11-14 00:00:00+00:00,438.299987792969,458.489990234375,435,455.100006103516,432.675415039063,29106506,0,0
2022-11-21 00:00:00+00:00,454.399993896484,461,450,456.600006103516,434.101501464844,21667730,0,0
2022-11-28 00:00:00+00:00,453.799987792969,456.899993896484,435.100006103516,444.799987792969,422.882934570313,33326204,0,0
2022-12-05 00:00:00+00:00,442.899993896484,450.25,441.299987792969,448,425.925262451172,29147089,0,0
2022-12-12 00:00:00+00:00,445.100006103516,451.299987792969,431.200012207031,436.100006103516,414.611633300781,46593233,0,0
2022-12-19 00:00:00+00:00,436,452.600006103516,433.600006103516,444,422.122344970703,20982140,0,0
2022-12-26 00:00:00+00:00,444,452.058013916016,442.399993896484,442.799987792969,420.981475830078,8249664,0,0
2023-01-02 00:00:00+00:00,445.899993896484,458.149993896484,443.299987792969,456,433.531066894531,28687622,0,0
2023-01-09 00:00:00+00:00,456,461.066009521484,435.799987792969,444.200012207031,422.3125,39237336,0,0
2023-01-16 00:00:00+00:00,444.299987792969,447.200012207031,434.399993896484,439,417.368713378906,35267336,0,0
2023-01-23 00:00:00+00:00,440,459.299987792969,439.5,457.399993896484,434.862091064453,37495012,0,0
2023-01-30 00:00:00+00:00,454.399993896484,459.399993896484,447.799987792969,450.299987792969,428.111907958984,48879358,0,0
2023-02-06 00:00:00+00:00,448,449.200012207031,436.299987792969,440,418.319458007813,38799772,0,0
2023-02-13 00:00:00+00:00,441.200012207031,450.299987792969,440,447.600006103516,425.544982910156,30251441,0,0
2023-02-20 00:00:00+00:00,448.5,450.799987792969,434.299987792969,440,418.319458007813,26764528,0,0
2023-02-27 00:00:00+00:00,442.899993896484,450.5,441.608001708984,447.200012207031,425.164703369141,29895454,0,0
2023-03-06 00:00:00+00:00,447.399993896484,467.299987792969,443.100006103516,449.700012207031,427.54150390625,82322819,0,0
2023-03-13 00:00:00+00:00,450,451.417999267578,400.68701171875,402.200012207031,382.382019042969,85158023,0,0
2023-03-20 00:00:00+00:00,396.200012207031,425.399993896484,383.496002197266,408.299987792969,388.181427001953,60152666,0,0
2023-03-27 00:00:00+01:00,416,422.049987792969,399.549987792969,404.200012207031,384.283477783203,81534829,20.7,0
2023-04-03 00:00:00+01:00,405,434.100006103516,404.399993896484,417.100006103516,417.100006103516,43217151,0,0
2023-04-10 00:00:00+01:00,419.100006103516,426.700012207031,419.100006103516,421.700012207031,421.700012207031,32435695,0,0
2023-04-17 00:00:00+01:00,423.700012207031,427.635009765625,415.399993896484,420.299987792969,420.299987792969,37715986,0,0
2023-04-24 00:00:00+01:00,418.100006103516,423,415.299987792969,423,423,34331974,0,0
2023-05-01 00:00:00+01:00,423.399993896484,426.100006103516,406.399993896484,414.600006103516,414.600006103516,40446519,0,0
2023-05-08 00:00:00+01:00,414.600006103516,419.100006103516,408,412.700012207031,412.700012207031,36950836,0,0
2023-05-15 00:00:00+01:00,414,418.399993896484,407.399993896484,413.5,413.5,53109487,0,0
2023-05-22 00:00:00+01:00,413.600006103516,424,394.700012207031,401.299987792969,401.299987792969,64363368,0,0
2023-05-29 00:00:00+01:00,401.299987792969,409.477996826172,392.700012207031,409.100006103516,409.100006103516,47587959,0,0
2023-06-05 00:00:00+01:00,406.299987792969,410.700012207031,400.100006103516,400.899993896484,400.899993896484,22494985,0,0
2023-06-12 00:00:00+01:00,404.100006103516,406,394.5,396,396,41531163,0,0
2023-06-19 00:00:00+01:00,394,399.899993896484,380.720001220703,386.200012207031,386.200012207031,40439880,0,0
2023-06-26 00:00:00+01:00,387.200012207031,397,382.899993896484,395.200012207031,395.200012207031,27701915,0,0
2023-07-03 00:00:00+01:00,396.5,399.799987792969,380.100006103516,381.799987792969,381.799987792969,26005305,0,0
2023-07-10 00:00:00+01:00,380,392.299987792969,379.403991699219,386,386,29789300,0,0
2023-07-17 00:00:00+01:00,385,389.5,384.251007080078,387.100006103516,387.100006103516,0,0,0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2021-12-13 00:00:00+00:00 393.999975585938 406.6 391.4 402.899916992188 291.232287597656 62714764.4736842 0 0
3 2021-12-20 00:00:00+00:00 393.999975585938 412.199990234375 392.502983398438 409.899997558594 296.292243652344 46596651.3157895 0 0
4 2021-12-27 00:00:00+00:00 409.899997558594 416.550971679688 408.387001953125 410.4 296.653642578125 10818482.8947368 0 0
5 2022-01-03 00:00:00+00:00 410.4 432.199995117188 410.4 432.099985351563 312.339265136719 44427327.6315789 0 0
6 2022-01-10 00:00:00+00:00 431.3 439.199982910156 429.099970703125 436.099912109375 315.230618896484 29091400 0 0
7 2022-01-17 00:00:00+00:00 437.999912109375 445.199965820313 426.999997558594 431.999975585938 312.267017822266 43787351.3157895 0 0
8 2022-01-24 00:00:00+00:00 430.099975585938 440.999973144531 420.999968261719 433.499982910156 313.351237792969 58487296.0526316 0 0
9 2022-01-31 00:00:00+00:00 436.199968261719 443.049987792969 432.099985351563 435.199916992188 314.580045166016 43335806.5789474 0 0
10 2022-02-07 00:00:00+00:00 437.899995117188 448.799992675781 436.051994628906 444.39998046875 321.230207519531 39644061.8421053 0 0
11 2022-02-14 00:00:00+00:00 437.699975585938 441.999978027344 426.699968261719 432.199995117188 312.411558837891 49972693.4210526 0 0
12 2022-02-21 00:00:00+00:00 435.499992675781 438.476999511719 408.29998046875 423.399970703125 306.050571289063 65719596.0526316 0 0
13 2022-02-28 00:00:00+00:00 415.099995117188 427.999909667969 386.199932861328 386.799945068359 279.594578857422 94057936.8421053 4.1875 0
14 2022-03-07 00:00:00+00:00 374.999952392578 417.299978027344 361.101981201172 409.599968261719 298.389248046875 71269101.3157895 0 0
15 2022-03-14 00:00:00+00:00 413.099985351563 426.699968261719 408.899992675781 422.399965820313 307.713929443359 55431927.6315789 0 0
16 2022-03-21 00:00:00+00:00 422.699995117188 442.7 422.399965820313 437.799985351563 318.932696533203 39896352.6315789 0 0
17 2022-03-28 00:00:00+01:00 442.49998046875 460.999978027344 440.097983398438 444.6 323.886403808594 56413515.7894737 0 0
18 2022-04-04 00:00:00+01:00 439.699985351563 445.399985351563 421.999973144531 425.799973144531 310.190817871094 49415836.8421053 19.342106 0
19 2022-04-11 00:00:00+01:00 425.39998046875 435.599909667969 420.799995117188 434.299968261719 327.211427001953 29875081.5789474 0 0
20 2022-04-18 00:00:00+01:00 434.299968261719 447.799987792969 433.599992675781 437.799985351563 329.848419189453 49288272.3684211 0 0
21 2022-04-25 00:00:00+01:00 430.699987792969 438.799990234375 423.999982910156 433.299916992188 326.457967529297 44656776.3157895 0 0
22 2022-05-02 00:00:00+01:00 433.299916992188 450.999975585938 414.499982910156 414.899975585938 312.595018310547 29538167.1052632 0 0
23 2022-05-09 00:00:00+01:00 413.199995117188 417.449992675781 368.282923583984 408.199970703125 307.547099609375 73989611.8421053 0 0
24 2022-05-16 00:00:00+01:00 384 423.600006103516 384 412.100006103516 310.485473632813 81938261 101.69 0.76
25 2022-05-23 00:00:00+01:00 416.100006103516 442.399993896484 341.915008544922 440.899993896484 409.764678955078 45432941 0 0
26 2022-05-30 00:00:00+01:00 442.700012207031 444.200012207031 426.600006103516 428.700012207031 398.426239013672 37906659 0 0
27 2022-06-06 00:00:00+01:00 425.299987792969 434.010009765625 405.200012207031 405.399993896484 376.771606445313 40648810 0 0
28 2022-06-13 00:00:00+01:00 402.5 420 399.799987792969 411.200012207031 382.162048339844 74196958 0 0
29 2022-06-20 00:00:00+01:00 412.5 421.899993896484 398.399993896484 411.5 382.440826416016 28679717 0 0
30 2022-06-27 00:00:00+01:00 413.100006103516 422.399993896484 397.399993896484 401.600006103516 373.239959716797 35468994 0 0
31 2022-07-04 00:00:00+01:00 405.399993896484 406.600006103516 382.299987792969 401.299987792969 372.961120605469 35304748 0 0
32 2022-07-11 00:00:00+01:00 394.799987792969 405.850006103516 383.399993896484 396.600006103516 368.593048095703 42308459 0 0
33 2022-07-18 00:00:00+01:00 392.5 399.700012207031 384.799987792969 391.700012207031 364.039093017578 36656839 0 0
34 2022-07-25 00:00:00+01:00 392.200012207031 400.799987792969 388.700012207031 396 368.035430908203 33124660 0 0
35 2022-08-01 00:00:00+01:00 396.399993896484 405.5 390.415008544922 402 373.611724853516 21753121 0 0
36 2022-08-08 00:00:00+01:00 406.600006103516 473.700012207031 403.299987792969 467.899993896484 434.858032226563 59155709 0 0
37 2022-08-15 00:00:00+01:00 468.100006103516 470.5 434 437 406.140106201172 36989620 10.3 0
38 2022-08-22 00:00:00+01:00 436.100006103516 436.869995117188 419.299987792969 420.5 399.780303955078 36492572 0 0
39 2022-08-29 00:00:00+01:00 420.5 426.600006103516 408.600006103516 426.600006103516 405.579742431641 29573657 0 0
40 2022-09-05 00:00:00+01:00 418.5 444.4169921875 416.100006103516 443.100006103516 421.266723632813 34375126 0 0
41 2022-09-12 00:00:00+01:00 444.649993896484 448.899993896484 435.200012207031 440.100006103516 418.414520263672 39085960 0 0
42 2022-09-19 00:00:00+01:00 440.100006103516 447.200012207031 419.299987792969 422.899993896484 402.062042236328 27982081 0 0
43 2022-09-26 00:00:00+01:00 421.200012207031 421.200012207031 373.31201171875 388.200012207031 369.071868896484 70408935 0 0
44 2022-10-03 00:00:00+01:00 382.899993896484 409.875 380.555999755859 400.700012207031 380.955932617188 37581751 0 0
45 2022-10-10 00:00:00+01:00 395.799987792969 404.470001220703 366.700012207031 394.299987792969 374.871276855469 52952323 0 0
46 2022-10-17 00:00:00+01:00 394.299987792969 414.799987792969 393 406.5 386.470123291016 26441475 0 0
47 2022-10-24 00:00:00+01:00 407.100006103516 418.227996826172 407.100006103516 413.299987792969 392.93505859375 26239756 0 0
48 2022-10-31 00:00:00+00:00 413.899993896484 430.200012207031 412 429.299987792969 408.146667480469 23168047 0 0
49 2022-11-07 00:00:00+00:00 427.299987792969 445.899993896484 420.652008056641 438.399993896484 416.798278808594 36709117 0 0
50 2022-11-14 00:00:00+00:00 438.299987792969 458.489990234375 435 455.100006103516 432.675415039063 29106506 0 0
51 2022-11-21 00:00:00+00:00 454.399993896484 461 450 456.600006103516 434.101501464844 21667730 0 0
52 2022-11-28 00:00:00+00:00 453.799987792969 456.899993896484 435.100006103516 444.799987792969 422.882934570313 33326204 0 0
53 2022-12-05 00:00:00+00:00 442.899993896484 450.25 441.299987792969 448 425.925262451172 29147089 0 0
54 2022-12-12 00:00:00+00:00 445.100006103516 451.299987792969 431.200012207031 436.100006103516 414.611633300781 46593233 0 0
55 2022-12-19 00:00:00+00:00 436 452.600006103516 433.600006103516 444 422.122344970703 20982140 0 0
56 2022-12-26 00:00:00+00:00 444 452.058013916016 442.399993896484 442.799987792969 420.981475830078 8249664 0 0
57 2023-01-02 00:00:00+00:00 445.899993896484 458.149993896484 443.299987792969 456 433.531066894531 28687622 0 0
58 2023-01-09 00:00:00+00:00 456 461.066009521484 435.799987792969 444.200012207031 422.3125 39237336 0 0
59 2023-01-16 00:00:00+00:00 444.299987792969 447.200012207031 434.399993896484 439 417.368713378906 35267336 0 0
60 2023-01-23 00:00:00+00:00 440 459.299987792969 439.5 457.399993896484 434.862091064453 37495012 0 0
61 2023-01-30 00:00:00+00:00 454.399993896484 459.399993896484 447.799987792969 450.299987792969 428.111907958984 48879358 0 0
62 2023-02-06 00:00:00+00:00 448 449.200012207031 436.299987792969 440 418.319458007813 38799772 0 0
63 2023-02-13 00:00:00+00:00 441.200012207031 450.299987792969 440 447.600006103516 425.544982910156 30251441 0 0
64 2023-02-20 00:00:00+00:00 448.5 450.799987792969 434.299987792969 440 418.319458007813 26764528 0 0
65 2023-02-27 00:00:00+00:00 442.899993896484 450.5 441.608001708984 447.200012207031 425.164703369141 29895454 0 0
66 2023-03-06 00:00:00+00:00 447.399993896484 467.299987792969 443.100006103516 449.700012207031 427.54150390625 82322819 0 0
67 2023-03-13 00:00:00+00:00 450 451.417999267578 400.68701171875 402.200012207031 382.382019042969 85158023 0 0
68 2023-03-20 00:00:00+00:00 396.200012207031 425.399993896484 383.496002197266 408.299987792969 388.181427001953 60152666 0 0
69 2023-03-27 00:00:00+01:00 416 422.049987792969 399.549987792969 404.200012207031 384.283477783203 81534829 20.7 0
70 2023-04-03 00:00:00+01:00 405 434.100006103516 404.399993896484 417.100006103516 417.100006103516 43217151 0 0
71 2023-04-10 00:00:00+01:00 419.100006103516 426.700012207031 419.100006103516 421.700012207031 421.700012207031 32435695 0 0
72 2023-04-17 00:00:00+01:00 423.700012207031 427.635009765625 415.399993896484 420.299987792969 420.299987792969 37715986 0 0
73 2023-04-24 00:00:00+01:00 418.100006103516 423 415.299987792969 423 423 34331974 0 0
74 2023-05-01 00:00:00+01:00 423.399993896484 426.100006103516 406.399993896484 414.600006103516 414.600006103516 40446519 0 0
75 2023-05-08 00:00:00+01:00 414.600006103516 419.100006103516 408 412.700012207031 412.700012207031 36950836 0 0
76 2023-05-15 00:00:00+01:00 414 418.399993896484 407.399993896484 413.5 413.5 53109487 0 0
77 2023-05-22 00:00:00+01:00 413.600006103516 424 394.700012207031 401.299987792969 401.299987792969 64363368 0 0
78 2023-05-29 00:00:00+01:00 401.299987792969 409.477996826172 392.700012207031 409.100006103516 409.100006103516 47587959 0 0
79 2023-06-05 00:00:00+01:00 406.299987792969 410.700012207031 400.100006103516 400.899993896484 400.899993896484 22494985 0 0
80 2023-06-12 00:00:00+01:00 404.100006103516 406 394.5 396 396 41531163 0 0
81 2023-06-19 00:00:00+01:00 394 399.899993896484 380.720001220703 386.200012207031 386.200012207031 40439880 0 0
82 2023-06-26 00:00:00+01:00 387.200012207031 397 382.899993896484 395.200012207031 395.200012207031 27701915 0 0
83 2023-07-03 00:00:00+01:00 396.5 399.799987792969 380.100006103516 381.799987792969 381.799987792969 26005305 0 0
84 2023-07-10 00:00:00+01:00 380 392.299987792969 379.403991699219 386 386 29789300 0 0
85 2023-07-17 00:00:00+01:00 385 389.5 384.251007080078 387.100006103516 387.100006103516 0 0 0

View File

@ -0,0 +1,85 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2021-12-13 00:00:00+00:00,518.4210205078125,535.0,515.0,530.1314697265625,383.20037841796875,47663221,0.0,0.0
2021-12-20 00:00:00+00:00,518.4210205078125,542.368408203125,516.4512939453125,539.3421020507812,389.85821533203125,35413455,0.0,0.0
2021-12-27 00:00:00+00:00,539.3421020507812,548.0933837890625,537.351318359375,540.0,390.333740234375,8222047,0.0,0.0
2022-01-03 00:00:00+00:00,540.0,568.6842041015625,540.0,568.5526123046875,410.97271728515625,33764769,0.0,0.0
2022-01-10 00:00:00+00:00,567.5,577.8947143554688,564.605224609375,573.815673828125,414.7771301269531,22109464,0.0,0.0
2022-01-17 00:00:00+00:00,576.315673828125,585.7894287109375,561.8421020507812,568.4210205078125,410.8776550292969,33278387,0.0,0.0
2022-01-24 00:00:00+00:00,565.9210205078125,580.2631225585938,553.9473266601562,570.3947143554688,412.30426025390625,44450345,0.0,0.0
2022-01-31 00:00:00+00:00,573.9473266601562,582.9605102539062,568.5526123046875,572.6314697265625,413.9211120605469,32935213,0.0,0.0
2022-02-07 00:00:00+00:00,576.1842041015625,590.5263061523438,573.7526245117188,584.73681640625,422.67132568359375,30129487,0.0,0.0
2022-02-14 00:00:00+00:00,575.9210205078125,581.5789184570312,561.4473266601562,568.6842041015625,411.0678405761719,37979247,0.0,0.0
2022-02-21 00:00:00+00:00,573.0263061523438,576.9434204101562,537.23681640625,557.105224609375,402.6981201171875,49946893,0.0,0.0
2022-02-28 00:00:00+00:00,546.1842041015625,563.1577758789062,508.1578063964844,508.9472961425781,367.8876037597656,71484032,4.1875,0.0
2022-03-07 00:00:00+00:00,493.4209899902344,549.0789184570312,475.1341857910156,538.9473266601562,392.617431640625,54164517,0.0,0.0
2022-03-14 00:00:00+00:00,543.5526123046875,561.4473266601562,538.0263061523438,555.7894287109375,404.8867492675781,42128265,0.0,0.0
2022-03-21 00:00:00+00:00,556.1842041015625,582.5,555.7894287109375,576.0526123046875,419.6482849121094,30321228,0.0,0.0
2022-03-28 00:00:00+01:00,582.23681640625,606.5789184570312,579.0762939453125,585.0,426.16632080078125,42874272,0.0,0.0
2022-04-04 00:00:00+01:00,578.5526123046875,586.0526123046875,555.2631225585938,560.2631225585938,408.14581298828125,37556036,19.342106,0.0
2022-04-11 00:00:00+01:00,559.73681640625,573.1577758789062,553.6842041015625,571.4473266601562,430.5413513183594,22705062,0.0,0.0
2022-04-18 00:00:00+01:00,571.4473266601562,589.2105102539062,570.5263061523438,576.0526123046875,434.0110778808594,37459087,0.0,0.0
2022-04-25 00:00:00+01:00,566.7105102539062,577.368408203125,557.8947143554688,570.1314697265625,429.5499572753906,33939150,0.0,0.0
2022-05-02 00:00:00+01:00,570.1314697265625,593.4210205078125,545.3947143554688,545.9210205078125,411.3092346191406,22449007,0.0,0.0
2022-05-09 00:00:00+01:00,543.6842041015625,549.2763061523438,484.5827941894531,537.105224609375,404.667236328125,56232105,0.0,0.0
2022-05-16 00:00:00+01:00,384.0,423.6000061035156,384.0,412.1000061035156,310.4854736328125,81938261,101.69,0.76
2022-05-23 00:00:00+01:00,416.1000061035156,442.3999938964844,341.9150085449219,440.8999938964844,409.7646789550781,45432941,0.0,0.0
2022-05-30 00:00:00+01:00,442.70001220703125,444.20001220703125,426.6000061035156,428.70001220703125,398.4262390136719,37906659,0.0,0.0
2022-06-06 00:00:00+01:00,425.29998779296875,434.010009765625,405.20001220703125,405.3999938964844,376.7716064453125,40648810,0.0,0.0
2022-06-13 00:00:00+01:00,402.5,420.0,399.79998779296875,411.20001220703125,382.16204833984375,74196958,0.0,0.0
2022-06-20 00:00:00+01:00,412.5,421.8999938964844,398.3999938964844,411.5,382.4408264160156,28679717,0.0,0.0
2022-06-27 00:00:00+01:00,413.1000061035156,422.3999938964844,397.3999938964844,401.6000061035156,373.2399597167969,35468994,0.0,0.0
2022-07-04 00:00:00+01:00,405.3999938964844,406.6000061035156,382.29998779296875,401.29998779296875,372.96112060546875,35304748,0.0,0.0
2022-07-11 00:00:00+01:00,394.79998779296875,405.8500061035156,383.3999938964844,396.6000061035156,368.5930480957031,42308459,0.0,0.0
2022-07-18 00:00:00+01:00,392.5,399.70001220703125,384.79998779296875,391.70001220703125,364.0390930175781,36656839,0.0,0.0
2022-07-25 00:00:00+01:00,392.20001220703125,400.79998779296875,388.70001220703125,396.0,368.0354309082031,33124660,0.0,0.0
2022-08-01 00:00:00+01:00,396.3999938964844,405.5,390.4150085449219,402.0,373.6117248535156,21753121,0.0,0.0
2022-08-08 00:00:00+01:00,406.6000061035156,473.70001220703125,403.29998779296875,467.8999938964844,434.8580322265625,59155709,0.0,0.0
2022-08-15 00:00:00+01:00,468.1000061035156,470.5,434.0,437.0,406.1401062011719,36989620,10.3,0.0
2022-08-22 00:00:00+01:00,436.1000061035156,436.8699951171875,419.29998779296875,420.5,399.7803039550781,36492572,0.0,0.0
2022-08-29 00:00:00+01:00,420.5,426.6000061035156,408.6000061035156,426.6000061035156,405.5797424316406,29573657,0.0,0.0
2022-09-05 00:00:00+01:00,418.5,444.4169921875,416.1000061035156,443.1000061035156,421.2667236328125,34375126,0.0,0.0
2022-09-12 00:00:00+01:00,444.6499938964844,448.8999938964844,435.20001220703125,440.1000061035156,418.4145202636719,39085960,0.0,0.0
2022-09-19 00:00:00+01:00,440.1000061035156,447.20001220703125,419.29998779296875,422.8999938964844,402.0620422363281,27982081,0.0,0.0
2022-09-26 00:00:00+01:00,421.20001220703125,421.20001220703125,373.31201171875,388.20001220703125,369.0718688964844,70408935,0.0,0.0
2022-10-03 00:00:00+01:00,382.8999938964844,409.875,380.5559997558594,400.70001220703125,380.9559326171875,37581751,0.0,0.0
2022-10-10 00:00:00+01:00,395.79998779296875,404.4700012207031,366.70001220703125,394.29998779296875,374.87127685546875,52952323,0.0,0.0
2022-10-17 00:00:00+01:00,394.29998779296875,414.79998779296875,393.0,406.5,386.4701232910156,26441475,0.0,0.0
2022-10-24 00:00:00+01:00,407.1000061035156,418.2279968261719,407.1000061035156,413.29998779296875,392.93505859375,26239756,0.0,0.0
2022-10-31 00:00:00+00:00,413.8999938964844,430.20001220703125,412.0,429.29998779296875,408.14666748046875,23168047,0.0,0.0
2022-11-07 00:00:00+00:00,427.29998779296875,445.8999938964844,420.6520080566406,438.3999938964844,416.79827880859375,36709117,0.0,0.0
2022-11-14 00:00:00+00:00,438.29998779296875,458.489990234375,435.0,455.1000061035156,432.6754150390625,29106506,0.0,0.0
2022-11-21 00:00:00+00:00,454.3999938964844,461.0,450.0,456.6000061035156,434.10150146484375,21667730,0.0,0.0
2022-11-28 00:00:00+00:00,453.79998779296875,456.8999938964844,435.1000061035156,444.79998779296875,422.8829345703125,33326204,0.0,0.0
2022-12-05 00:00:00+00:00,442.8999938964844,450.25,441.29998779296875,448.0,425.9252624511719,29147089,0.0,0.0
2022-12-12 00:00:00+00:00,445.1000061035156,451.29998779296875,431.20001220703125,436.1000061035156,414.61163330078125,46593233,0.0,0.0
2022-12-19 00:00:00+00:00,436.0,452.6000061035156,433.6000061035156,444.0,422.1223449707031,20982140,0.0,0.0
2022-12-26 00:00:00+00:00,444.0,452.0580139160156,442.3999938964844,442.79998779296875,420.9814758300781,8249664,0.0,0.0
2023-01-02 00:00:00+00:00,445.8999938964844,458.1499938964844,443.29998779296875,456.0,433.53106689453125,28687622,0.0,0.0
2023-01-09 00:00:00+00:00,456.0,461.0660095214844,435.79998779296875,444.20001220703125,422.3125,39237336,0.0,0.0
2023-01-16 00:00:00+00:00,444.29998779296875,447.20001220703125,434.3999938964844,439.0,417.36871337890625,35267336,0.0,0.0
2023-01-23 00:00:00+00:00,440.0,459.29998779296875,439.5,457.3999938964844,434.8620910644531,37495012,0.0,0.0
2023-01-30 00:00:00+00:00,454.3999938964844,459.3999938964844,447.79998779296875,450.29998779296875,428.1119079589844,48879358,0.0,0.0
2023-02-06 00:00:00+00:00,448.0,449.20001220703125,436.29998779296875,440.0,418.3194580078125,38799772,0.0,0.0
2023-02-13 00:00:00+00:00,441.20001220703125,450.29998779296875,440.0,447.6000061035156,425.54498291015625,30251441,0.0,0.0
2023-02-20 00:00:00+00:00,448.5,450.79998779296875,434.29998779296875,440.0,418.3194580078125,26764528,0.0,0.0
2023-02-27 00:00:00+00:00,442.8999938964844,450.5,441.6080017089844,447.20001220703125,425.1647033691406,29895454,0.0,0.0
2023-03-06 00:00:00+00:00,447.3999938964844,467.29998779296875,443.1000061035156,449.70001220703125,427.54150390625,82322819,0.0,0.0
2023-03-13 00:00:00+00:00,450.0,451.4179992675781,400.68701171875,402.20001220703125,382.38201904296875,85158023,0.0,0.0
2023-03-20 00:00:00+00:00,396.20001220703125,425.3999938964844,383.4960021972656,408.29998779296875,388.1814270019531,60152666,0.0,0.0
2023-03-27 00:00:00+01:00,416.0,422.04998779296875,399.54998779296875,404.20001220703125,384.2834777832031,81534829,20.7,0.0
2023-04-03 00:00:00+01:00,405.0,434.1000061035156,404.3999938964844,417.1000061035156,417.1000061035156,43217151,0.0,0.0
2023-04-10 00:00:00+01:00,419.1000061035156,426.70001220703125,419.1000061035156,421.70001220703125,421.70001220703125,32435695,0.0,0.0
2023-04-17 00:00:00+01:00,423.70001220703125,427.635009765625,415.3999938964844,420.29998779296875,420.29998779296875,37715986,0.0,0.0
2023-04-24 00:00:00+01:00,418.1000061035156,423.0,415.29998779296875,423.0,423.0,34331974,0.0,0.0
2023-05-01 00:00:00+01:00,423.3999938964844,426.1000061035156,406.3999938964844,414.6000061035156,414.6000061035156,40446519,0.0,0.0
2023-05-08 00:00:00+01:00,414.6000061035156,419.1000061035156,408.0,412.70001220703125,412.70001220703125,36950836,0.0,0.0
2023-05-15 00:00:00+01:00,414.0,418.3999938964844,407.3999938964844,413.5,413.5,53109487,0.0,0.0
2023-05-22 00:00:00+01:00,413.6000061035156,424.0,394.70001220703125,401.29998779296875,401.29998779296875,64363368,0.0,0.0
2023-05-29 00:00:00+01:00,401.29998779296875,409.4779968261719,392.70001220703125,409.1000061035156,409.1000061035156,47587959,0.0,0.0
2023-06-05 00:00:00+01:00,406.29998779296875,410.70001220703125,400.1000061035156,400.8999938964844,400.8999938964844,22494985,0.0,0.0
2023-06-12 00:00:00+01:00,404.1000061035156,406.0,394.5,396.0,396.0,41531163,0.0,0.0
2023-06-19 00:00:00+01:00,394.0,399.8999938964844,380.7200012207031,386.20001220703125,386.20001220703125,40439880,0.0,0.0
2023-06-26 00:00:00+01:00,387.20001220703125,397.0,382.8999938964844,395.20001220703125,395.20001220703125,27701915,0.0,0.0
2023-07-03 00:00:00+01:00,396.5,399.79998779296875,380.1000061035156,381.79998779296875,381.79998779296875,26005305,0.0,0.0
2023-07-10 00:00:00+01:00,380.0,392.29998779296875,379.40399169921875,386.0,386.0,29789300,0.0,0.0
2023-07-17 00:00:00+01:00,385.0,389.5,384.2510070800781,387.1000061035156,387.1000061035156,0,0.0,0.0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2021-12-13 00:00:00+00:00 518.4210205078125 535.0 515.0 530.1314697265625 383.20037841796875 47663221 0.0 0.0
3 2021-12-20 00:00:00+00:00 518.4210205078125 542.368408203125 516.4512939453125 539.3421020507812 389.85821533203125 35413455 0.0 0.0
4 2021-12-27 00:00:00+00:00 539.3421020507812 548.0933837890625 537.351318359375 540.0 390.333740234375 8222047 0.0 0.0
5 2022-01-03 00:00:00+00:00 540.0 568.6842041015625 540.0 568.5526123046875 410.97271728515625 33764769 0.0 0.0
6 2022-01-10 00:00:00+00:00 567.5 577.8947143554688 564.605224609375 573.815673828125 414.7771301269531 22109464 0.0 0.0
7 2022-01-17 00:00:00+00:00 576.315673828125 585.7894287109375 561.8421020507812 568.4210205078125 410.8776550292969 33278387 0.0 0.0
8 2022-01-24 00:00:00+00:00 565.9210205078125 580.2631225585938 553.9473266601562 570.3947143554688 412.30426025390625 44450345 0.0 0.0
9 2022-01-31 00:00:00+00:00 573.9473266601562 582.9605102539062 568.5526123046875 572.6314697265625 413.9211120605469 32935213 0.0 0.0
10 2022-02-07 00:00:00+00:00 576.1842041015625 590.5263061523438 573.7526245117188 584.73681640625 422.67132568359375 30129487 0.0 0.0
11 2022-02-14 00:00:00+00:00 575.9210205078125 581.5789184570312 561.4473266601562 568.6842041015625 411.0678405761719 37979247 0.0 0.0
12 2022-02-21 00:00:00+00:00 573.0263061523438 576.9434204101562 537.23681640625 557.105224609375 402.6981201171875 49946893 0.0 0.0
13 2022-02-28 00:00:00+00:00 546.1842041015625 563.1577758789062 508.1578063964844 508.9472961425781 367.8876037597656 71484032 4.1875 0.0
14 2022-03-07 00:00:00+00:00 493.4209899902344 549.0789184570312 475.1341857910156 538.9473266601562 392.617431640625 54164517 0.0 0.0
15 2022-03-14 00:00:00+00:00 543.5526123046875 561.4473266601562 538.0263061523438 555.7894287109375 404.8867492675781 42128265 0.0 0.0
16 2022-03-21 00:00:00+00:00 556.1842041015625 582.5 555.7894287109375 576.0526123046875 419.6482849121094 30321228 0.0 0.0
17 2022-03-28 00:00:00+01:00 582.23681640625 606.5789184570312 579.0762939453125 585.0 426.16632080078125 42874272 0.0 0.0
18 2022-04-04 00:00:00+01:00 578.5526123046875 586.0526123046875 555.2631225585938 560.2631225585938 408.14581298828125 37556036 19.342106 0.0
19 2022-04-11 00:00:00+01:00 559.73681640625 573.1577758789062 553.6842041015625 571.4473266601562 430.5413513183594 22705062 0.0 0.0
20 2022-04-18 00:00:00+01:00 571.4473266601562 589.2105102539062 570.5263061523438 576.0526123046875 434.0110778808594 37459087 0.0 0.0
21 2022-04-25 00:00:00+01:00 566.7105102539062 577.368408203125 557.8947143554688 570.1314697265625 429.5499572753906 33939150 0.0 0.0
22 2022-05-02 00:00:00+01:00 570.1314697265625 593.4210205078125 545.3947143554688 545.9210205078125 411.3092346191406 22449007 0.0 0.0
23 2022-05-09 00:00:00+01:00 543.6842041015625 549.2763061523438 484.5827941894531 537.105224609375 404.667236328125 56232105 0.0 0.0
24 2022-05-16 00:00:00+01:00 384.0 423.6000061035156 384.0 412.1000061035156 310.4854736328125 81938261 101.69 0.76
25 2022-05-23 00:00:00+01:00 416.1000061035156 442.3999938964844 341.9150085449219 440.8999938964844 409.7646789550781 45432941 0.0 0.0
26 2022-05-30 00:00:00+01:00 442.70001220703125 444.20001220703125 426.6000061035156 428.70001220703125 398.4262390136719 37906659 0.0 0.0
27 2022-06-06 00:00:00+01:00 425.29998779296875 434.010009765625 405.20001220703125 405.3999938964844 376.7716064453125 40648810 0.0 0.0
28 2022-06-13 00:00:00+01:00 402.5 420.0 399.79998779296875 411.20001220703125 382.16204833984375 74196958 0.0 0.0
29 2022-06-20 00:00:00+01:00 412.5 421.8999938964844 398.3999938964844 411.5 382.4408264160156 28679717 0.0 0.0
30 2022-06-27 00:00:00+01:00 413.1000061035156 422.3999938964844 397.3999938964844 401.6000061035156 373.2399597167969 35468994 0.0 0.0
31 2022-07-04 00:00:00+01:00 405.3999938964844 406.6000061035156 382.29998779296875 401.29998779296875 372.96112060546875 35304748 0.0 0.0
32 2022-07-11 00:00:00+01:00 394.79998779296875 405.8500061035156 383.3999938964844 396.6000061035156 368.5930480957031 42308459 0.0 0.0
33 2022-07-18 00:00:00+01:00 392.5 399.70001220703125 384.79998779296875 391.70001220703125 364.0390930175781 36656839 0.0 0.0
34 2022-07-25 00:00:00+01:00 392.20001220703125 400.79998779296875 388.70001220703125 396.0 368.0354309082031 33124660 0.0 0.0
35 2022-08-01 00:00:00+01:00 396.3999938964844 405.5 390.4150085449219 402.0 373.6117248535156 21753121 0.0 0.0
36 2022-08-08 00:00:00+01:00 406.6000061035156 473.70001220703125 403.29998779296875 467.8999938964844 434.8580322265625 59155709 0.0 0.0
37 2022-08-15 00:00:00+01:00 468.1000061035156 470.5 434.0 437.0 406.1401062011719 36989620 10.3 0.0
38 2022-08-22 00:00:00+01:00 436.1000061035156 436.8699951171875 419.29998779296875 420.5 399.7803039550781 36492572 0.0 0.0
39 2022-08-29 00:00:00+01:00 420.5 426.6000061035156 408.6000061035156 426.6000061035156 405.5797424316406 29573657 0.0 0.0
40 2022-09-05 00:00:00+01:00 418.5 444.4169921875 416.1000061035156 443.1000061035156 421.2667236328125 34375126 0.0 0.0
41 2022-09-12 00:00:00+01:00 444.6499938964844 448.8999938964844 435.20001220703125 440.1000061035156 418.4145202636719 39085960 0.0 0.0
42 2022-09-19 00:00:00+01:00 440.1000061035156 447.20001220703125 419.29998779296875 422.8999938964844 402.0620422363281 27982081 0.0 0.0
43 2022-09-26 00:00:00+01:00 421.20001220703125 421.20001220703125 373.31201171875 388.20001220703125 369.0718688964844 70408935 0.0 0.0
44 2022-10-03 00:00:00+01:00 382.8999938964844 409.875 380.5559997558594 400.70001220703125 380.9559326171875 37581751 0.0 0.0
45 2022-10-10 00:00:00+01:00 395.79998779296875 404.4700012207031 366.70001220703125 394.29998779296875 374.87127685546875 52952323 0.0 0.0
46 2022-10-17 00:00:00+01:00 394.29998779296875 414.79998779296875 393.0 406.5 386.4701232910156 26441475 0.0 0.0
47 2022-10-24 00:00:00+01:00 407.1000061035156 418.2279968261719 407.1000061035156 413.29998779296875 392.93505859375 26239756 0.0 0.0
48 2022-10-31 00:00:00+00:00 413.8999938964844 430.20001220703125 412.0 429.29998779296875 408.14666748046875 23168047 0.0 0.0
49 2022-11-07 00:00:00+00:00 427.29998779296875 445.8999938964844 420.6520080566406 438.3999938964844 416.79827880859375 36709117 0.0 0.0
50 2022-11-14 00:00:00+00:00 438.29998779296875 458.489990234375 435.0 455.1000061035156 432.6754150390625 29106506 0.0 0.0
51 2022-11-21 00:00:00+00:00 454.3999938964844 461.0 450.0 456.6000061035156 434.10150146484375 21667730 0.0 0.0
52 2022-11-28 00:00:00+00:00 453.79998779296875 456.8999938964844 435.1000061035156 444.79998779296875 422.8829345703125 33326204 0.0 0.0
53 2022-12-05 00:00:00+00:00 442.8999938964844 450.25 441.29998779296875 448.0 425.9252624511719 29147089 0.0 0.0
54 2022-12-12 00:00:00+00:00 445.1000061035156 451.29998779296875 431.20001220703125 436.1000061035156 414.61163330078125 46593233 0.0 0.0
55 2022-12-19 00:00:00+00:00 436.0 452.6000061035156 433.6000061035156 444.0 422.1223449707031 20982140 0.0 0.0
56 2022-12-26 00:00:00+00:00 444.0 452.0580139160156 442.3999938964844 442.79998779296875 420.9814758300781 8249664 0.0 0.0
57 2023-01-02 00:00:00+00:00 445.8999938964844 458.1499938964844 443.29998779296875 456.0 433.53106689453125 28687622 0.0 0.0
58 2023-01-09 00:00:00+00:00 456.0 461.0660095214844 435.79998779296875 444.20001220703125 422.3125 39237336 0.0 0.0
59 2023-01-16 00:00:00+00:00 444.29998779296875 447.20001220703125 434.3999938964844 439.0 417.36871337890625 35267336 0.0 0.0
60 2023-01-23 00:00:00+00:00 440.0 459.29998779296875 439.5 457.3999938964844 434.8620910644531 37495012 0.0 0.0
61 2023-01-30 00:00:00+00:00 454.3999938964844 459.3999938964844 447.79998779296875 450.29998779296875 428.1119079589844 48879358 0.0 0.0
62 2023-02-06 00:00:00+00:00 448.0 449.20001220703125 436.29998779296875 440.0 418.3194580078125 38799772 0.0 0.0
63 2023-02-13 00:00:00+00:00 441.20001220703125 450.29998779296875 440.0 447.6000061035156 425.54498291015625 30251441 0.0 0.0
64 2023-02-20 00:00:00+00:00 448.5 450.79998779296875 434.29998779296875 440.0 418.3194580078125 26764528 0.0 0.0
65 2023-02-27 00:00:00+00:00 442.8999938964844 450.5 441.6080017089844 447.20001220703125 425.1647033691406 29895454 0.0 0.0
66 2023-03-06 00:00:00+00:00 447.3999938964844 467.29998779296875 443.1000061035156 449.70001220703125 427.54150390625 82322819 0.0 0.0
67 2023-03-13 00:00:00+00:00 450.0 451.4179992675781 400.68701171875 402.20001220703125 382.38201904296875 85158023 0.0 0.0
68 2023-03-20 00:00:00+00:00 396.20001220703125 425.3999938964844 383.4960021972656 408.29998779296875 388.1814270019531 60152666 0.0 0.0
69 2023-03-27 00:00:00+01:00 416.0 422.04998779296875 399.54998779296875 404.20001220703125 384.2834777832031 81534829 20.7 0.0
70 2023-04-03 00:00:00+01:00 405.0 434.1000061035156 404.3999938964844 417.1000061035156 417.1000061035156 43217151 0.0 0.0
71 2023-04-10 00:00:00+01:00 419.1000061035156 426.70001220703125 419.1000061035156 421.70001220703125 421.70001220703125 32435695 0.0 0.0
72 2023-04-17 00:00:00+01:00 423.70001220703125 427.635009765625 415.3999938964844 420.29998779296875 420.29998779296875 37715986 0.0 0.0
73 2023-04-24 00:00:00+01:00 418.1000061035156 423.0 415.29998779296875 423.0 423.0 34331974 0.0 0.0
74 2023-05-01 00:00:00+01:00 423.3999938964844 426.1000061035156 406.3999938964844 414.6000061035156 414.6000061035156 40446519 0.0 0.0
75 2023-05-08 00:00:00+01:00 414.6000061035156 419.1000061035156 408.0 412.70001220703125 412.70001220703125 36950836 0.0 0.0
76 2023-05-15 00:00:00+01:00 414.0 418.3999938964844 407.3999938964844 413.5 413.5 53109487 0.0 0.0
77 2023-05-22 00:00:00+01:00 413.6000061035156 424.0 394.70001220703125 401.29998779296875 401.29998779296875 64363368 0.0 0.0
78 2023-05-29 00:00:00+01:00 401.29998779296875 409.4779968261719 392.70001220703125 409.1000061035156 409.1000061035156 47587959 0.0 0.0
79 2023-06-05 00:00:00+01:00 406.29998779296875 410.70001220703125 400.1000061035156 400.8999938964844 400.8999938964844 22494985 0.0 0.0
80 2023-06-12 00:00:00+01:00 404.1000061035156 406.0 394.5 396.0 396.0 41531163 0.0 0.0
81 2023-06-19 00:00:00+01:00 394.0 399.8999938964844 380.7200012207031 386.20001220703125 386.20001220703125 40439880 0.0 0.0
82 2023-06-26 00:00:00+01:00 387.20001220703125 397.0 382.8999938964844 395.20001220703125 395.20001220703125 27701915 0.0 0.0
83 2023-07-03 00:00:00+01:00 396.5 399.79998779296875 380.1000061035156 381.79998779296875 381.79998779296875 26005305 0.0 0.0
84 2023-07-10 00:00:00+01:00 380.0 392.29998779296875 379.40399169921875 386.0 386.0 29789300 0.0 0.0
85 2023-07-17 00:00:00+01:00 385.0 389.5 384.2510070800781 387.1000061035156 387.1000061035156 0 0.0 0.0

View File

@ -0,0 +1,42 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2020-09-30 00:00:00-04:00,4.40000009536743,4.44999980926514,4.01999998092651,4.44999980926514,4.44999980926514,22600,0,0
2020-09-29 00:00:00-04:00,4.3899998664856,4.40000009536743,4.13000011444092,4.30000019073486,4.30000019073486,10800,0,0
2020-09-28 00:00:00-04:00,4.09000015258789,4.25,4.09000015258789,4.25,4.25,8000,0,0
2020-09-25 00:00:00-04:00,3.95000004768372,4.09999990463257,3.95000004768372,4.05000019073486,4.05000019073486,13500,0,0
2020-09-24 00:00:00-04:00,3.84999990463257,4,3.84999990463257,4,4,8800,0,0
2020-09-23 00:00:00-04:00,3.99000000953674,4,3.99000000953674,4,4,5900,0,0
2020-09-22 00:00:00-04:00,3.90000009536743,4.09999990463257,3.84999990463257,4.09999990463257,4.09999990463257,3100,0,0
2020-09-21 00:00:00-04:00,4.09999990463257,4.09999990463257,4.09999990463257,4.09999990463257,4.09999990463257,1200,0,0
2020-09-18 00:00:00-04:00,3.92000007629395,4.09999990463257,3.92000007629395,4.09999990463257,4.09999990463257,27200,0,0
2020-09-17 00:00:00-04:00,3.90000009536743,3.99000000953674,3.8199999332428,3.99000000953674,3.99000000953674,3300,0,0
2020-09-16 00:00:00-04:00,3.79999995231628,4,3.79999995231628,4,4,3300,0,0
2020-09-15 00:00:00-04:00,3.95000004768372,4,3.95000004768372,4,4,2400,0,0
2020-09-14 00:00:00-04:00,3.96000003814697,4,3.96000003814697,4,4,800,0,0
2020-09-11 00:00:00-04:00,3.95000004768372,3.97000002861023,3.72000002861023,3.97000002861023,3.97000002861023,5700,0,0
2020-09-10 00:00:00-04:00,4,4.09999990463257,4,4.09999990463257,4.09999990463257,7100,0,0
2020-09-09 00:00:00-04:00,3.5699999332428,4,3.5699999332428,4,4,18100,0,0
2020-09-08 00:00:00-04:00,3.40000009536743,3.59999990463257,3.40000009536743,3.59999990463257,3.59999990463257,19500,0,0
2020-09-04 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,400,0,0
2020-09-03 00:00:00-04:00,3.58999991416931,3.58999991416931,3.58999991416931,3.58999991416931,3.58999991416931,0,0,0
2020-09-02 00:00:00-04:00,3.5,3.58999991416931,3.5,3.58999991416931,3.58999991416931,2000,0,0
2020-09-01 00:00:00-04:00,3.5,3.59999990463257,3.5,3.59999990463257,3.59999990463257,1200,0,0
2020-08-31 00:00:00-04:00,3.15000009536743,3.70000004768372,3.15000009536743,3.70000004768372,3.70000004768372,26500,0,0
2020-08-28 00:00:00-04:00,3.76999998092651,3.76999998092651,3.70000004768372,3.70000004768372,3.70000004768372,1600,0,0
2020-08-27 00:00:00-04:00,3.65000009536743,3.65000009536743,3.65000009536743,3.65000009536743,3.65000009536743,0,0,0
2020-08-26 00:00:00-04:00,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,0,0,0.1
2020-08-25 00:00:00-04:00,3.40000009536743,3.70000004768372,3.40000009536743,3.70000004768372,3.70000004768372,2900,0,0
2020-08-24 00:00:00-04:00,3.29999995231628,3.5,3.29999995231628,3.5,3.5,10000,0,0
2020-08-21 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,150,0,0
2020-08-20 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-19 00:00:00-04:00,3.40000009536743,3.5,3.40000009536743,3.5,3.5,9050,0,0
2020-08-18 00:00:00-04:00,3.5,3.79999995231628,3.5,3.5,3.5,2250,0,0
2020-08-17 00:00:00-04:00,2.79999995231628,3.70000004768372,2.79999995231628,3.70000004768372,3.70000004768372,5050,0,0
2020-08-14 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-13 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-12 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-11 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-10 00:00:00-04:00,3.5,3.70000004768372,3.5,3.5,3.5,3300,0,0
2020-08-07 00:00:00-04:00,3.5,3.79999995231628,3.5,3.79999995231628,3.79999995231628,2500,0,0
2020-08-06 00:00:00-04:00,3.5,3.70000004768372,3.40000009536743,3.70000004768372,3.70000004768372,3000,0,0
2020-08-05 00:00:00-04:00,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,0,0,0
2020-08-04 00:00:00-04:00,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,0,0,0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2020-09-30 00:00:00-04:00 4.40000009536743 4.44999980926514 4.01999998092651 4.44999980926514 4.44999980926514 22600 0 0
3 2020-09-29 00:00:00-04:00 4.3899998664856 4.40000009536743 4.13000011444092 4.30000019073486 4.30000019073486 10800 0 0
4 2020-09-28 00:00:00-04:00 4.09000015258789 4.25 4.09000015258789 4.25 4.25 8000 0 0
5 2020-09-25 00:00:00-04:00 3.95000004768372 4.09999990463257 3.95000004768372 4.05000019073486 4.05000019073486 13500 0 0
6 2020-09-24 00:00:00-04:00 3.84999990463257 4 3.84999990463257 4 4 8800 0 0
7 2020-09-23 00:00:00-04:00 3.99000000953674 4 3.99000000953674 4 4 5900 0 0
8 2020-09-22 00:00:00-04:00 3.90000009536743 4.09999990463257 3.84999990463257 4.09999990463257 4.09999990463257 3100 0 0
9 2020-09-21 00:00:00-04:00 4.09999990463257 4.09999990463257 4.09999990463257 4.09999990463257 4.09999990463257 1200 0 0
10 2020-09-18 00:00:00-04:00 3.92000007629395 4.09999990463257 3.92000007629395 4.09999990463257 4.09999990463257 27200 0 0
11 2020-09-17 00:00:00-04:00 3.90000009536743 3.99000000953674 3.8199999332428 3.99000000953674 3.99000000953674 3300 0 0
12 2020-09-16 00:00:00-04:00 3.79999995231628 4 3.79999995231628 4 4 3300 0 0
13 2020-09-15 00:00:00-04:00 3.95000004768372 4 3.95000004768372 4 4 2400 0 0
14 2020-09-14 00:00:00-04:00 3.96000003814697 4 3.96000003814697 4 4 800 0 0
15 2020-09-11 00:00:00-04:00 3.95000004768372 3.97000002861023 3.72000002861023 3.97000002861023 3.97000002861023 5700 0 0
16 2020-09-10 00:00:00-04:00 4 4.09999990463257 4 4.09999990463257 4.09999990463257 7100 0 0
17 2020-09-09 00:00:00-04:00 3.5699999332428 4 3.5699999332428 4 4 18100 0 0
18 2020-09-08 00:00:00-04:00 3.40000009536743 3.59999990463257 3.40000009536743 3.59999990463257 3.59999990463257 19500 0 0
19 2020-09-04 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 400 0 0
20 2020-09-03 00:00:00-04:00 3.58999991416931 3.58999991416931 3.58999991416931 3.58999991416931 3.58999991416931 0 0 0
21 2020-09-02 00:00:00-04:00 3.5 3.58999991416931 3.5 3.58999991416931 3.58999991416931 2000 0 0
22 2020-09-01 00:00:00-04:00 3.5 3.59999990463257 3.5 3.59999990463257 3.59999990463257 1200 0 0
23 2020-08-31 00:00:00-04:00 3.15000009536743 3.70000004768372 3.15000009536743 3.70000004768372 3.70000004768372 26500 0 0
24 2020-08-28 00:00:00-04:00 3.76999998092651 3.76999998092651 3.70000004768372 3.70000004768372 3.70000004768372 1600 0 0
25 2020-08-27 00:00:00-04:00 3.65000009536743 3.65000009536743 3.65000009536743 3.65000009536743 3.65000009536743 0 0 0
26 2020-08-26 00:00:00-04:00 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 0 0 0.1
27 2020-08-25 00:00:00-04:00 3.40000009536743 3.70000004768372 3.40000009536743 3.70000004768372 3.70000004768372 2900 0 0
28 2020-08-24 00:00:00-04:00 3.29999995231628 3.5 3.29999995231628 3.5 3.5 10000 0 0
29 2020-08-21 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 150 0 0
30 2020-08-20 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
31 2020-08-19 00:00:00-04:00 3.40000009536743 3.5 3.40000009536743 3.5 3.5 9050 0 0
32 2020-08-18 00:00:00-04:00 3.5 3.79999995231628 3.5 3.5 3.5 2250 0 0
33 2020-08-17 00:00:00-04:00 2.79999995231628 3.70000004768372 2.79999995231628 3.70000004768372 3.70000004768372 5050 0 0
34 2020-08-14 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
35 2020-08-13 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
36 2020-08-12 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
37 2020-08-11 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
38 2020-08-10 00:00:00-04:00 3.5 3.70000004768372 3.5 3.5 3.5 3300 0 0
39 2020-08-07 00:00:00-04:00 3.5 3.79999995231628 3.5 3.79999995231628 3.79999995231628 2500 0 0
40 2020-08-06 00:00:00-04:00 3.5 3.70000004768372 3.40000009536743 3.70000004768372 3.70000004768372 3000 0 0
41 2020-08-05 00:00:00-04:00 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 0 0 0
42 2020-08-04 00:00:00-04:00 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 0 0 0

View File

@ -0,0 +1,42 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2020-09-30 00:00:00-04:00,4.40000009536743,4.44999980926514,4.01999998092651,4.44999980926514,4.44999980926514,22600,0,0
2020-09-29 00:00:00-04:00,4.3899998664856,4.40000009536743,4.13000011444092,4.30000019073486,4.30000019073486,10800,0,0
2020-09-28 00:00:00-04:00,4.09000015258789,4.25,4.09000015258789,4.25,4.25,8000,0,0
2020-09-25 00:00:00-04:00,3.95000004768372,4.09999990463257,3.95000004768372,4.05000019073486,4.05000019073486,13500,0,0
2020-09-24 00:00:00-04:00,3.84999990463257,4,3.84999990463257,4,4,8800,0,0
2020-09-23 00:00:00-04:00,3.99000000953674,4,3.99000000953674,4,4,5900,0,0
2020-09-22 00:00:00-04:00,3.90000009536743,4.09999990463257,3.84999990463257,4.09999990463257,4.09999990463257,3100,0,0
2020-09-21 00:00:00-04:00,4.09999990463257,4.09999990463257,4.09999990463257,4.09999990463257,4.09999990463257,1200,0,0
2020-09-18 00:00:00-04:00,3.92000007629395,4.09999990463257,3.92000007629395,4.09999990463257,4.09999990463257,27200,0,0
2020-09-17 00:00:00-04:00,3.90000009536743,3.99000000953674,3.8199999332428,3.99000000953674,3.99000000953674,3300,0,0
2020-09-16 00:00:00-04:00,3.79999995231628,4,3.79999995231628,4,4,3300,0,0
2020-09-15 00:00:00-04:00,3.95000004768372,4,3.95000004768372,4,4,2400,0,0
2020-09-14 00:00:00-04:00,3.96000003814697,4,3.96000003814697,4,4,800,0,0
2020-09-11 00:00:00-04:00,3.95000004768372,3.97000002861023,3.72000002861023,3.97000002861023,3.97000002861023,5700,0,0
2020-09-10 00:00:00-04:00,4,4.09999990463257,4,4.09999990463257,4.09999990463257,7100,0,0
2020-09-09 00:00:00-04:00,3.5699999332428,4,3.5699999332428,4,4,18100,0,0
2020-09-08 00:00:00-04:00,3.40000009536743,3.59999990463257,3.40000009536743,3.59999990463257,3.59999990463257,19500,0,0
2020-09-04 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,400,0,0
2020-09-03 00:00:00-04:00,3.58999991416931,3.58999991416931,3.58999991416931,3.58999991416931,3.58999991416931,0,0,0
2020-09-02 00:00:00-04:00,3.5,3.58999991416931,3.5,3.58999991416931,3.58999991416931,2000,0,0
2020-09-01 00:00:00-04:00,3.5,3.59999990463257,3.5,3.59999990463257,3.59999990463257,1200,0,0
2020-08-31 00:00:00-04:00,3.15000009536743,3.70000004768372,3.15000009536743,3.70000004768372,3.70000004768372,26500,0,0
2020-08-28 00:00:00-04:00,3.76999998092651,3.76999998092651,3.70000004768372,3.70000004768372,3.70000004768372,1600,0,0
2020-08-27 00:00:00-04:00,3.65000009536743,3.65000009536743,3.65000009536743,3.65000009536743,3.65000009536743,0,0,0
2020-08-26 00:00:00-04:00,0.370000004768372,0.370000004768372,0.370000004768372,0.370000004768372,0.370000004768372,0,0,0.1
2020-08-25 00:00:00-04:00,3.40000009536743,3.70000004768372,3.40000009536743,3.70000004768372,3.70000004768372,2900,0,0
2020-08-24 00:00:00-04:00,3.29999995231628,3.5,3.29999995231628,3.5,3.5,10000,0,0
2020-08-21 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,150,0,0
2020-08-20 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-19 00:00:00-04:00,3.40000009536743,3.5,3.40000009536743,3.5,3.5,9050,0,0
2020-08-18 00:00:00-04:00,3.5,3.79999995231628,3.5,3.5,3.5,2250,0,0
2020-08-17 00:00:00-04:00,2.79999995231628,3.70000004768372,2.79999995231628,3.70000004768372,3.70000004768372,5050,0,0
2020-08-14 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-13 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-12 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-11 00:00:00-04:00,3.5,3.5,3.5,3.5,3.5,0,0,0
2020-08-10 00:00:00-04:00,3.5,3.70000004768372,3.5,3.5,3.5,3300,0,0
2020-08-07 00:00:00-04:00,3.5,3.79999995231628,3.5,3.79999995231628,3.79999995231628,2500,0,0
2020-08-06 00:00:00-04:00,3.5,3.70000004768372,3.40000009536743,3.70000004768372,3.70000004768372,3000,0,0
2020-08-05 00:00:00-04:00,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,0,0,0
2020-08-04 00:00:00-04:00,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,3.70000004768372,0,0,0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2020-09-30 00:00:00-04:00 4.40000009536743 4.44999980926514 4.01999998092651 4.44999980926514 4.44999980926514 22600 0 0
3 2020-09-29 00:00:00-04:00 4.3899998664856 4.40000009536743 4.13000011444092 4.30000019073486 4.30000019073486 10800 0 0
4 2020-09-28 00:00:00-04:00 4.09000015258789 4.25 4.09000015258789 4.25 4.25 8000 0 0
5 2020-09-25 00:00:00-04:00 3.95000004768372 4.09999990463257 3.95000004768372 4.05000019073486 4.05000019073486 13500 0 0
6 2020-09-24 00:00:00-04:00 3.84999990463257 4 3.84999990463257 4 4 8800 0 0
7 2020-09-23 00:00:00-04:00 3.99000000953674 4 3.99000000953674 4 4 5900 0 0
8 2020-09-22 00:00:00-04:00 3.90000009536743 4.09999990463257 3.84999990463257 4.09999990463257 4.09999990463257 3100 0 0
9 2020-09-21 00:00:00-04:00 4.09999990463257 4.09999990463257 4.09999990463257 4.09999990463257 4.09999990463257 1200 0 0
10 2020-09-18 00:00:00-04:00 3.92000007629395 4.09999990463257 3.92000007629395 4.09999990463257 4.09999990463257 27200 0 0
11 2020-09-17 00:00:00-04:00 3.90000009536743 3.99000000953674 3.8199999332428 3.99000000953674 3.99000000953674 3300 0 0
12 2020-09-16 00:00:00-04:00 3.79999995231628 4 3.79999995231628 4 4 3300 0 0
13 2020-09-15 00:00:00-04:00 3.95000004768372 4 3.95000004768372 4 4 2400 0 0
14 2020-09-14 00:00:00-04:00 3.96000003814697 4 3.96000003814697 4 4 800 0 0
15 2020-09-11 00:00:00-04:00 3.95000004768372 3.97000002861023 3.72000002861023 3.97000002861023 3.97000002861023 5700 0 0
16 2020-09-10 00:00:00-04:00 4 4.09999990463257 4 4.09999990463257 4.09999990463257 7100 0 0
17 2020-09-09 00:00:00-04:00 3.5699999332428 4 3.5699999332428 4 4 18100 0 0
18 2020-09-08 00:00:00-04:00 3.40000009536743 3.59999990463257 3.40000009536743 3.59999990463257 3.59999990463257 19500 0 0
19 2020-09-04 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 400 0 0
20 2020-09-03 00:00:00-04:00 3.58999991416931 3.58999991416931 3.58999991416931 3.58999991416931 3.58999991416931 0 0 0
21 2020-09-02 00:00:00-04:00 3.5 3.58999991416931 3.5 3.58999991416931 3.58999991416931 2000 0 0
22 2020-09-01 00:00:00-04:00 3.5 3.59999990463257 3.5 3.59999990463257 3.59999990463257 1200 0 0
23 2020-08-31 00:00:00-04:00 3.15000009536743 3.70000004768372 3.15000009536743 3.70000004768372 3.70000004768372 26500 0 0
24 2020-08-28 00:00:00-04:00 3.76999998092651 3.76999998092651 3.70000004768372 3.70000004768372 3.70000004768372 1600 0 0
25 2020-08-27 00:00:00-04:00 3.65000009536743 3.65000009536743 3.65000009536743 3.65000009536743 3.65000009536743 0 0 0
26 2020-08-26 00:00:00-04:00 0.370000004768372 0.370000004768372 0.370000004768372 0.370000004768372 0.370000004768372 0 0 0.1
27 2020-08-25 00:00:00-04:00 3.40000009536743 3.70000004768372 3.40000009536743 3.70000004768372 3.70000004768372 2900 0 0
28 2020-08-24 00:00:00-04:00 3.29999995231628 3.5 3.29999995231628 3.5 3.5 10000 0 0
29 2020-08-21 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 150 0 0
30 2020-08-20 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
31 2020-08-19 00:00:00-04:00 3.40000009536743 3.5 3.40000009536743 3.5 3.5 9050 0 0
32 2020-08-18 00:00:00-04:00 3.5 3.79999995231628 3.5 3.5 3.5 2250 0 0
33 2020-08-17 00:00:00-04:00 2.79999995231628 3.70000004768372 2.79999995231628 3.70000004768372 3.70000004768372 5050 0 0
34 2020-08-14 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
35 2020-08-13 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
36 2020-08-12 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
37 2020-08-11 00:00:00-04:00 3.5 3.5 3.5 3.5 3.5 0 0 0
38 2020-08-10 00:00:00-04:00 3.5 3.70000004768372 3.5 3.5 3.5 3300 0 0
39 2020-08-07 00:00:00-04:00 3.5 3.79999995231628 3.5 3.79999995231628 3.79999995231628 2500 0 0
40 2020-08-06 00:00:00-04:00 3.5 3.70000004768372 3.40000009536743 3.70000004768372 3.70000004768372 3000 0 0
41 2020-08-05 00:00:00-04:00 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 0 0 0
42 2020-08-04 00:00:00-04:00 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 3.70000004768372 0 0 0

View File

@ -0,0 +1,30 @@
Date,Open,High,Low,Close,Adj Close,Volume,Dividends,Stock Splits
2023-06-09 00:00:00+02:00,34.7000,34.7100,33.2400,33.6200,33.6200,7148409,0,0
2023-06-08 00:00:00+02:00,34.9000,34.9900,34.0400,34.3600,34.3600,10406999,0,0
2023-06-07 00:00:00+02:00,34.5500,35.6400,34.3200,35.0900,35.0900,10118918,0,0
2023-06-06 00:00:00+02:00,34.5000,34.8200,34.0500,34.4600,34.4600,9109709,0,0
2023-06-05 00:00:00+02:00,35.0000,35.3000,34.2000,34.7000,34.7000,8791993,0,0
2023-06-02 00:00:00+02:00,35.6900,36.1800,34.6000,34.9700,34.9700,8844549,0,0
2023-06-01 00:00:00+02:00,35.2300,35.3800,34.2400,35.3500,35.3500,6721030,0,0
2023-05-31 00:00:00+02:00,34.8,35.48,34.26,35.01,35.01,32605833,0,0
2023-05-30 00:00:00+02:00,34.39,35.37,33.85,34.23,34.23,8970804,0,0
2023-05-29 00:00:00+02:00,34.66,35.06,34.02,34.32,34.32,3912803,0,0
2023-05-26 00:00:00+02:00,34.75,35.99,34.33,34.53,34.53,6744718,0,0
2023-05-25 00:00:00+02:00,35.4,36.09,34.63,35.07,35.07,16900221,0,0
2023-05-24 00:00:00+02:00,36.2,36.5,35.26,35.4,35.4,9049505,0,0
2023-05-23 00:00:00+02:00,36.9,36.67,35.56,36.1,36.1,10797373,0,0
2023-05-22 00:00:00+02:00,37.05,37.36,36.09,36.61,36.61,7132641,0,0
2023-05-19 00:00:00+02:00,36.2,37.15,36.25,36.9,36.9,12648518,0,0
2023-05-18 00:00:00+02:00,36.57,36.99,35.84,36.46,36.46,10674542,0,0
2023-05-17 00:00:00+02:00,36.87,37.31,36.56,36.71,36.71,9892791,0,0
2023-05-16 00:00:00+02:00,37.15,37.73,36.96,37.03,37.03,4706789,0,0
2023-05-15 00:00:00+02:00,37.74,38.05,36.96,37.27,37.27,7890969,0,0
2023-05-12 00:00:00+02:00,37.5,38.44,36.71,37.74,37.74,8724303,0,0
2023-05-11 00:00:00+02:00,38.8,38.88,37.01,37.32,37.32,14371855,0,0
2023-05-10 00:00:00+02:00,38.93,38.8,36.42,38.1,38.1,30393389,0,0
2023-05-09 00:00:00+02:00,44.41,44.41,39.39,39.66,39.66,19833428,0,0
2023-05-08 00:00:00+02:00,44.63,45.78,44.56,44.71,44.71,11092519,0,0
2023-05-05 00:00:00+02:00,42.99,44.9,42.87,44.58,44.58,28539048,0,0
2023-05-04 00:00:00+02:00,41.49,43.3,41.23,42.83,42.83,15506868,0,0
2023-05-03 00:00:00+02:00,39.75,40.98,39.68,40.95,40.95,14657028,0,0
2023-05-02 00:00:00+02:00,40.37,40.32,39.17,39.65,39.65,11818133,0,0
1 Date Open High Low Close Adj Close Volume Dividends Stock Splits
2 2023-06-09 00:00:00+02:00 34.7000 34.7100 33.2400 33.6200 33.6200 7148409 0 0
3 2023-06-08 00:00:00+02:00 34.9000 34.9900 34.0400 34.3600 34.3600 10406999 0 0
4 2023-06-07 00:00:00+02:00 34.5500 35.6400 34.3200 35.0900 35.0900 10118918 0 0
5 2023-06-06 00:00:00+02:00 34.5000 34.8200 34.0500 34.4600 34.4600 9109709 0 0
6 2023-06-05 00:00:00+02:00 35.0000 35.3000 34.2000 34.7000 34.7000 8791993 0 0
7 2023-06-02 00:00:00+02:00 35.6900 36.1800 34.6000 34.9700 34.9700 8844549 0 0
8 2023-06-01 00:00:00+02:00 35.2300 35.3800 34.2400 35.3500 35.3500 6721030 0 0
9 2023-05-31 00:00:00+02:00 34.8 35.48 34.26 35.01 35.01 32605833 0 0
10 2023-05-30 00:00:00+02:00 34.39 35.37 33.85 34.23 34.23 8970804 0 0
11 2023-05-29 00:00:00+02:00 34.66 35.06 34.02 34.32 34.32 3912803 0 0
12 2023-05-26 00:00:00+02:00 34.75 35.99 34.33 34.53 34.53 6744718 0 0
13 2023-05-25 00:00:00+02:00 35.4 36.09 34.63 35.07 35.07 16900221 0 0
14 2023-05-24 00:00:00+02:00 36.2 36.5 35.26 35.4 35.4 9049505 0 0
15 2023-05-23 00:00:00+02:00 36.9 36.67 35.56 36.1 36.1 10797373 0 0
16 2023-05-22 00:00:00+02:00 37.05 37.36 36.09 36.61 36.61 7132641 0 0
17 2023-05-19 00:00:00+02:00 36.2 37.15 36.25 36.9 36.9 12648518 0 0
18 2023-05-18 00:00:00+02:00 36.57 36.99 35.84 36.46 36.46 10674542 0 0
19 2023-05-17 00:00:00+02:00 36.87 37.31 36.56 36.71 36.71 9892791 0 0
20 2023-05-16 00:00:00+02:00 37.15 37.73 36.96 37.03 37.03 4706789 0 0
21 2023-05-15 00:00:00+02:00 37.74 38.05 36.96 37.27 37.27 7890969 0 0
22 2023-05-12 00:00:00+02:00 37.5 38.44 36.71 37.74 37.74 8724303 0 0
23 2023-05-11 00:00:00+02:00 38.8 38.88 37.01 37.32 37.32 14371855 0 0
24 2023-05-10 00:00:00+02:00 38.93 38.8 36.42 38.1 38.1 30393389 0 0
25 2023-05-09 00:00:00+02:00 44.41 44.41 39.39 39.66 39.66 19833428 0 0
26 2023-05-08 00:00:00+02:00 44.63 45.78 44.56 44.71 44.71 11092519 0 0
27 2023-05-05 00:00:00+02:00 42.99 44.9 42.87 44.58 44.58 28539048 0 0
28 2023-05-04 00:00:00+02:00 41.49 43.3 41.23 42.83 42.83 15506868 0 0
29 2023-05-03 00:00:00+02:00 39.75 40.98 39.68 40.95 40.95 14657028 0 0
30 2023-05-02 00:00:00+02:00 40.37 40.32 39.17 39.65 39.65 11818133 0 0

View File

@ -59,7 +59,7 @@ class TestPriceHistory(unittest.TestCase):
dt1 = df.index[-1]
try:
self.assertNotEqual(dt0.hour, dt1.hour)
except:
except AssertionError:
print("Ticker = ", tkr)
raise
@ -82,7 +82,7 @@ class TestPriceHistory(unittest.TestCase):
dt1 = df.index[-1]
try:
self.assertNotEqual(dt0, dt1)
except:
except AssertionError:
print("Ticker = ", tkr)
raise
@ -106,7 +106,7 @@ class TestPriceHistory(unittest.TestCase):
dt1 = df.index[-1]
try:
self.assertNotEqual(dt0.week, dt1.week)
except:
except AssertionError:
print("Ticker={}: Last two rows within same week:".format(tkr))
print(df.iloc[df.shape[0] - 2:])
raise
@ -172,18 +172,19 @@ class TestPriceHistory(unittest.TestCase):
start_d = _dt.date(2022, 1, 1)
end_d = _dt.date(2023, 1, 1)
tkr_div_dates = {}
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['IMP.JO'] = [_dt.date(2022, 9, 21), _dt.date(2022, 3, 16)]
tkr_div_dates['BP.L'] = [_dt.date(2022, 11, 10), _dt.date(2022, 8, 11), _dt.date(2022, 5, 12), _dt.date(2022, 2, 17)]
tkr_div_dates['INTC'] = [_dt.date(2022, 11, 4), _dt.date(2022, 8, 4), _dt.date(2022, 5, 5), _dt.date(2022, 2, 4)]
tkr_div_dates = {'BHP.AX': [_dt.date(2022, 9, 1), _dt.date(2022, 2, 24)], # Yahoo claims 23-Feb but wrong because DST
'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)],
'INTC': [_dt.date(2022, 11, 4), _dt.date(2022, 8, 4), _dt.date(2022, 5, 5),
_dt.date(2022, 2, 4)]}
for tkr,dates in tkr_div_dates.items():
for tkr, dates in tkr_div_dates.items():
df = yf.Ticker(tkr, session=self.session).history(interval='1d', start=start_d, end=end_d)
df_divs = df[df['Dividends']!=0].sort_index(ascending=False)
df_divs = df[df['Dividends'] != 0].sort_index(ascending=False)
try:
self.assertTrue((df_divs.index.date == dates).all())
except:
except AssertionError:
print(f'- ticker = {tkr}')
print('- response:') ; print(df_divs.index.date)
print('- answer:') ; print(dates)
@ -201,7 +202,7 @@ class TestPriceHistory(unittest.TestCase):
self.assertTrue(((df2["Dividends"] > 0) | (df2["Stock Splits"] > 0)).any())
try:
self.assertTrue(df1.index.equals(df2.index))
except:
except AssertionError:
missing_from_df1 = df2.index.difference(df1.index)
missing_from_df2 = df1.index.difference(df2.index)
print("{} missing these dates: {}".format(tkr1, missing_from_df1))
@ -216,7 +217,7 @@ class TestPriceHistory(unittest.TestCase):
self.assertTrue(((df1["Dividends"] > 0) | (df1["Stock Splits"] > 0)).any())
try:
self.assertTrue(df1.index.equals(df2.index))
except:
except AssertionError:
missing_from_df1 = df2.index.difference(df1.index)
missing_from_df2 = df1.index.difference(df2.index)
print("{}-with-events missing these dates: {}".format(tkr, missing_from_df1))
@ -298,7 +299,7 @@ class TestPriceHistory(unittest.TestCase):
self.assertTrue(((df2["Dividends"] > 0) | (df2["Stock Splits"] > 0)).any())
try:
self.assertTrue(df1.index.equals(df2.index))
except:
except AssertionError:
missing_from_df1 = df2.index.difference(df1.index)
missing_from_df2 = df1.index.difference(df2.index)
print("{} missing these dates: {}".format(tkr1, missing_from_df1))
@ -313,7 +314,7 @@ class TestPriceHistory(unittest.TestCase):
self.assertTrue(((df1["Dividends"] > 0) | (df1["Stock Splits"] > 0)).any())
try:
self.assertTrue(df1.index.equals(df2.index))
except:
except AssertionError:
missing_from_df1 = df2.index.difference(df1.index)
missing_from_df2 = df1.index.difference(df2.index)
print("{}-with-events missing these dates: {}".format(tkr, missing_from_df1))
@ -331,7 +332,7 @@ class TestPriceHistory(unittest.TestCase):
self.assertTrue(((df2["Dividends"] > 0) | (df2["Stock Splits"] > 0)).any())
try:
self.assertTrue(df1.index.equals(df2.index))
except:
except AssertionError:
missing_from_df1 = df2.index.difference(df1.index)
missing_from_df2 = df1.index.difference(df2.index)
print("{} missing these dates: {}".format(tkr1, missing_from_df1))
@ -346,7 +347,7 @@ class TestPriceHistory(unittest.TestCase):
self.assertTrue(((df1["Dividends"] > 0) | (df1["Stock Splits"] > 0)).any())
try:
self.assertTrue(df1.index.equals(df2.index))
except:
except AssertionError:
missing_from_df1 = df2.index.difference(df1.index)
missing_from_df2 = df1.index.difference(df2.index)
print("{}-with-events missing these dates: {}".format(tkr, missing_from_df1))
@ -358,15 +359,15 @@ class TestPriceHistory(unittest.TestCase):
dfm = yf.Ticker("ABBV").history(period="max", interval="1mo")
dfd = yf.Ticker("ABBV").history(period="max", interval="1d")
dfd = dfd[dfd.index > dfm.index[0]]
dfm_divs = dfm[dfm['Dividends']!=0]
dfd_divs = dfd[dfd['Dividends']!=0]
dfm_divs = dfm[dfm['Dividends'] != 0]
dfd_divs = dfd[dfd['Dividends'] != 0]
self.assertEqual(dfm_divs.shape[0], dfd_divs.shape[0])
dfm = yf.Ticker("F").history(period="50mo",interval="1mo")
dfm = yf.Ticker("F").history(period="50mo", interval="1mo")
dfd = yf.Ticker("F").history(period="50mo", interval="1d")
dfd = dfd[dfd.index > dfm.index[0]]
dfm_divs = dfm[dfm['Dividends']!=0]
dfd_divs = dfd[dfd['Dividends']!=0]
dfm_divs = dfm[dfm['Dividends'] != 0]
dfd_divs = dfd[dfd['Dividends'] != 0]
self.assertEqual(dfm_divs.shape[0], dfd_divs.shape[0])
def test_tz_dst_ambiguous(self):
@ -397,7 +398,7 @@ class TestPriceHistory(unittest.TestCase):
df = dat.history(start=start, end=end, interval=interval)
try:
self.assertTrue((df.index.weekday == 0).all())
except:
except AssertionError:
print("Weekly data not aligned to Monday")
raise
@ -449,18 +450,18 @@ class TestPriceHistory(unittest.TestCase):
interval = "1h"
interval_td = _dt.timedelta(hours=1)
time_open = _dt.time(9)
time_close = _dt.time(17,30)
time_close = _dt.time(17, 30)
special_day = _dt.date(2022, 12, 23)
time_early_close = _dt.time(13, 2)
dat = yf.Ticker(tkr, session=self.session)
# Half trading day Jan 5, Apr 14, May 25, Jun 23, Nov 4, Dec 23, Dec 30
half_days = [_dt.date(special_day.year, x[0], x[1]) for x in [(1,5), (4,14), (5,25), (6,23), (11,4), (12,23), (12,30)]]
half_days = [_dt.date(special_day.year, x[0], x[1]) for x in [(1, 5), (4, 14), (5, 25), (6, 23), (11, 4), (12, 23), (12, 30)]]
# Yahoo has incorrectly classified afternoon of 2022-04-13 as post-market.
# Nothing yfinance can do because Yahoo doesn't return data with prepost=False.
# But need to handle in this test.
expected_incorrect_half_days = [_dt.date(2022,4,13)]
expected_incorrect_half_days = [_dt.date(2022, 4, 13)]
half_days = sorted(half_days+expected_incorrect_half_days)
# Run
@ -477,7 +478,7 @@ class TestPriceHistory(unittest.TestCase):
last_dts = _pd.Series(df.index).groupby(df.index.date).last()
f_early_close = (last_dts+interval_td).dt.time < time_close
early_close_dates = last_dts.index[f_early_close].values
unexpected_early_close_dates = [d for d in early_close_dates if not d in half_days]
unexpected_early_close_dates = [d for d in early_close_dates if d not in half_days]
self.assertEqual(len(unexpected_early_close_dates), 0)
self.assertEqual(len(early_close_dates), len(half_days))
self.assertTrue(_np.equal(early_close_dates, half_days).all())
@ -493,7 +494,7 @@ class TestPriceHistory(unittest.TestCase):
interval = "1h"
interval_td = _dt.timedelta(hours=1)
time_open = _dt.time(10)
time_close = _dt.time(16,12)
time_close = _dt.time(16, 12)
# No early closes in 2022
dat = yf.Ticker(tkr, session=self.session)
@ -530,6 +531,7 @@ class TestPriceHistory(unittest.TestCase):
df = dat.history(start=start, end=end, interval=interval)
class TestPriceRepair(unittest.TestCase):
session = None
@ -573,12 +575,12 @@ class TestPriceRepair(unittest.TestCase):
"High": [476, 476.5, 477, 480],
"Low": [470.5, 470, 465.5, 468.26],
"Close": [475, 473.5, 472, 473.5],
"Adj Close": [475, 473.5, 472, 473.5],
"Adj Close": [470.1, 468.6, 467.1, 468.6],
"Volume": [2295613, 2245604, 3000287, 2635611]},
index=_pd.to_datetime([_dt.date(2022, 10, 24),
_dt.date(2022, 10, 17),
_dt.date(2022, 10, 10),
_dt.date(2022, 10, 3)]))
index=_pd.to_datetime([_dt.date(2022, 10, 24),
_dt.date(2022, 10, 17),
_dt.date(2022, 10, 10),
_dt.date(2022, 10, 3)]))
df = df.sort_index()
df.index.name = "Date"
df_bad = df.copy()
@ -590,18 +592,17 @@ class TestPriceRepair(unittest.TestCase):
# Run test
df_repaired = dat._fix_unit_random_mixups(df_bad, "1wk", tz_exchange, prepost=False, silent=True)
df_repaired = dat._fix_unit_random_mixups(df_bad, "1wk", tz_exchange, prepost=False)
# First test - no errors left
for c in data_cols:
try:
self.assertTrue(_np.isclose(df_repaired[c], df[c], rtol=1e-2).all())
except:
except AssertionError:
print(df[c])
print(df_repaired[c])
raise
# Second test - all differences should be either ~1x or ~100x
ratio = df_bad[data_cols].values / df[data_cols].values
ratio = ratio.round(2)
@ -624,16 +625,16 @@ class TestPriceRepair(unittest.TestCase):
tz_exchange = dat.fast_info["timezone"]
data_cols = ["Low", "High", "Open", "Close", "Adj Close"]
df = _pd.DataFrame(data={"Open": [400, 398, 392.5, 417],
"High": [421, 425, 419, 420.5],
"Low": [400, 380.5, 376.5, 396],
"Close": [410, 409.5, 402, 399],
"Adj Close": [398.02, 397.53, 390.25, 387.34],
df = _pd.DataFrame(data={"Open": [400, 398, 392.5, 417],
"High": [421, 425, 419, 420.5],
"Low": [400, 380.5, 376.5, 396],
"Close": [410, 409.5, 402, 399],
"Adj Close": [393.91, 393.43, 386.22, 383.34],
"Volume": [3232600, 3773900, 10835000, 4257900]},
index=_pd.to_datetime([_dt.date(2020, 3, 30),
_dt.date(2020, 3, 23),
_dt.date(2020, 3, 16),
_dt.date(2020, 3, 9)]))
index=_pd.to_datetime([_dt.date(2020, 3, 30),
_dt.date(2020, 3, 23),
_dt.date(2020, 3, 16),
_dt.date(2020, 3, 9)]))
df = df.sort_index()
# Simulate data missing split-adjustment:
df[data_cols] *= 100.0
@ -648,13 +649,13 @@ class TestPriceRepair(unittest.TestCase):
df.index = df.index.tz_localize(tz_exchange)
df_bad.index = df_bad.index.tz_localize(tz_exchange)
df_repaired = dat._fix_unit_random_mixups(df_bad, "1wk", tz_exchange, prepost=False, silent=True)
df_repaired = dat._fix_unit_random_mixups(df_bad, "1wk", tz_exchange, prepost=False)
# First test - no errors left
for c in data_cols:
try:
self.assertTrue(_np.isclose(df_repaired[c], df[c], rtol=1e-2).all())
except:
except AssertionError:
print("Mismatch in column", c)
print("- df_repaired:")
print(df_repaired[c])
@ -688,10 +689,10 @@ class TestPriceRepair(unittest.TestCase):
"Close": [475.5, 475.5, 474.5, 475],
"Adj Close": [475.5, 475.5, 474.5, 475],
"Volume": [436414, 485947, 358067, 287620]},
index=_pd.to_datetime([_dt.date(2022, 11, 1),
_dt.date(2022, 10, 31),
_dt.date(2022, 10, 28),
_dt.date(2022, 10, 27)]))
index=_pd.to_datetime([_dt.date(2022, 11, 1),
_dt.date(2022, 10, 31),
_dt.date(2022, 10, 28),
_dt.date(2022, 10, 27)]))
df = df.sort_index()
df.index.name = "Date"
df_bad = df.copy()
@ -701,7 +702,7 @@ class TestPriceRepair(unittest.TestCase):
df.index = df.index.tz_localize(tz_exchange)
df_bad.index = df_bad.index.tz_localize(tz_exchange)
df_repaired = dat._fix_unit_random_mixups(df_bad, "1d", tz_exchange, prepost=False, silent=True)
df_repaired = dat._fix_unit_random_mixups(df_bad, "1d", tz_exchange, prepost=False)
# First test - no errors left
for c in data_cols:
@ -725,46 +726,55 @@ class TestPriceRepair(unittest.TestCase):
# Some 100x errors are not sporadic.
# Sometimes Yahoo suddenly shifts from cents->$ from some recent date.
tkr = "SSW.JO"
dat = yf.Ticker(tkr, session=self.session)
tz_exchange = dat.fast_info["timezone"]
tkrs = ['AET.L', 'SSW.JO']
for tkr in tkrs:
for interval in ['1d', '1wk']:
dat = yf.Ticker(tkr, session=self.session)
tz_exchange = dat.fast_info["timezone"]
data_cols = ["Low", "High", "Open", "Close", "Adj Close"]
_dp = os.path.dirname(__file__)
df_bad = _pd.read_csv(os.path.join(_dp, "data", tkr.replace('.','-')+"-100x-error.csv"), index_col="Date")
df_bad.index = _pd.to_datetime(df_bad.index)
df_bad = df_bad.sort_index()
data_cols = ["Low", "High", "Open", "Close", "Adj Close"]
_dp = os.path.dirname(__file__)
fp = os.path.join(_dp, "data", tkr.replace('.','-') + '-' + interval + "-100x-error.csv")
if not os.path.isfile(fp):
continue
df_bad = _pd.read_csv(fp, index_col="Date")
df_bad.index = _pd.to_datetime(df_bad.index, utc=True).tz_convert(tz_exchange)
df_bad = df_bad.sort_index()
df = df_bad.copy()
for d in data_cols:
df.loc[:'2023-05-31', d] *= 0.01 # fix error
df = df_bad.copy()
fp = os.path.join(_dp, "data", tkr.replace('.','-') + '-' + interval + "-100x-error-fixed.csv")
df = _pd.read_csv(fp, index_col="Date")
df.index = _pd.to_datetime(df.index, utc=True).tz_convert(tz_exchange)
df = df.sort_index()
df_repaired = dat._fix_unit_switch(df_bad, "1d", tz_exchange)
df_repaired = df_repaired.sort_index()
df_repaired = dat._fix_unit_switch(df_bad, interval, tz_exchange)
df_repaired = df_repaired.sort_index()
# First test - no errors left
for c in data_cols:
try:
self.assertTrue(_np.isclose(df_repaired[c], df[c], rtol=1e-2).all())
except:
print(df_repaired[c])
print(df[c])
print(f"TEST FAIL on column '{c}")
raise
# First test - no errors left
for c in data_cols:
try:
self.assertTrue(_np.isclose(df_repaired[c], df[c], rtol=1e-2).all())
except:
print("- repaired:")
print(df_repaired[c])
print("- correct:")
print(df[c])
print(f"TEST FAIL on column '{c}' (tkr={tkr} interval={interval})")
raise
# Second test - all differences should be either ~1x or ~100x
ratio = df_bad[data_cols].values / df[data_cols].values
ratio = ratio.round(2)
# - round near-100 ratio to 100:
f = ratio > 90
ratio[f] = (ratio[f] / 10).round().astype(int) * 10 # round ratio to nearest 10
# - now test
f_100 = ratio == 100
f_1 = ratio == 1
self.assertTrue((f_100 | f_1).all())
# Second test - all differences should be either ~1x or ~100x
ratio = df_bad[data_cols].values / df[data_cols].values
ratio = ratio.round(2)
# - round near-100 ratio to 100:
f = ratio > 90
ratio[f] = (ratio[f] / 10).round().astype(int) * 10 # round ratio to nearest 10
# - now test
f_100 = (ratio == 100) | (ratio == 0.01)
f_1 = ratio == 1
self.assertTrue((f_100 | f_1).all())
self.assertTrue("Repaired?" in df_repaired.columns)
self.assertFalse(df_repaired["Repaired?"].isna().any())
self.assertTrue("Repaired?" in df_repaired.columns)
self.assertFalse(df_repaired["Repaired?"].isna().any())
def test_repair_zeroes_daily(self):
tkr = "BBIL.L"
@ -777,9 +787,9 @@ class TestPriceRepair(unittest.TestCase):
"Close": [103.03, 102.05, 102.08],
"Adj Close": [102.03, 102.05, 102.08],
"Volume": [560, 137, 117]},
index=_pd.to_datetime([_dt.datetime(2022, 11, 1),
_dt.datetime(2022, 10, 31),
_dt.datetime(2022, 10, 30)]))
index=_pd.to_datetime([_dt.datetime(2022, 11, 1),
_dt.datetime(2022, 10, 31),
_dt.datetime(2022, 10, 30)]))
df_bad = df_bad.sort_index()
df_bad.index.name = "Date"
df_bad.index = df_bad.index.tz_localize(tz_exchange)
@ -808,11 +818,11 @@ class TestPriceRepair(unittest.TestCase):
"Adj Close": [28.12, 28.93, 28.57, 29.83, 29.70],
"Volume": [36e6, 51e6, 49e6, 58e6, 62e6],
"Dividends": [0, 0, 0.365, 0, 0]},
index=_pd.to_datetime([_dt.datetime(2023, 2, 8),
_dt.datetime(2023, 2, 7),
_dt.datetime(2023, 2, 6),
_dt.datetime(2023, 2, 3),
_dt.datetime(2023, 2, 2)]))
index=_pd.to_datetime([_dt.datetime(2023, 2, 8),
_dt.datetime(2023, 2, 7),
_dt.datetime(2023, 2, 6),
_dt.datetime(2023, 2, 3),
_dt.datetime(2023, 2, 2)]))
df = df.sort_index()
df.index.name = "Date"
dat = yf.Ticker(tkr, session=self.session)
@ -853,7 +863,7 @@ class TestPriceRepair(unittest.TestCase):
for c in ["Open", "Low", "High", "Close"]:
try:
self.assertTrue(_np.isclose(repaired_df[c], correct_df[c], rtol=1e-7).all())
except:
except AssertionError:
print("COLUMN", c)
print("- repaired_df")
print(repaired_df)
@ -867,35 +877,6 @@ class TestPriceRepair(unittest.TestCase):
self.assertFalse(repaired_df["Repaired?"].isna().any())
def test_repair_bad_stock_split(self):
bad_tkrs = ['4063.T', 'ALPHA.PA', 'CNE.L', 'MOB.ST', 'SPM.MI']
for tkr in bad_tkrs:
dat = yf.Ticker(tkr, session=self.session)
tz_exchange = dat.fast_info["timezone"]
_dp = os.path.dirname(__file__)
df_bad = _pd.read_csv(os.path.join(_dp, "data", tkr.replace('.','-')+"-bad-stock-split.csv"), index_col="Date")
df_bad.index = _pd.to_datetime(df_bad.index)
repaired_df = dat._fix_bad_stock_split(df_bad, "1d", tz_exchange)
correct_df = _pd.read_csv(os.path.join(_dp, "data", tkr.replace('.','-')+"-bad-stock-split-fixed.csv"), index_col="Date")
correct_df.index = _pd.to_datetime(correct_df.index)
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:
print(f"tkr={tkr} COLUMN={c}")
print("- repaired_df")
print(repaired_df)
print("- correct_df[c]:")
print(correct_df[c])
print("- diff:")
print(repaired_df[c] - correct_df[c])
raise
# 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']
@ -908,7 +889,7 @@ class TestPriceRepair(unittest.TestCase):
tz_exchange = dat.fast_info["timezone"]
_dp = os.path.dirname(__file__)
df_good = dat.history(period='2y', interval=interval, auto_adjust=False)
df_good = dat.history(start='2020-01-01', end=_dt.date.today(), interval=interval, auto_adjust=False)
repaired_df = dat._fix_bad_stock_split(df_good, interval, tz_exchange)
@ -925,6 +906,100 @@ class TestPriceRepair(unittest.TestCase):
print(df_dbg[f_diff | _np.roll(f_diff, 1) | _np.roll(f_diff, -1)])
raise
bad_tkrs = ['4063.T', 'ALPHA.PA', 'AV.L', 'CNE.L', 'MOB.ST', 'SPM.MI']
bad_tkrs.append('LA.V') # special case - stock split error is 3 years ago! why not fixed?
for tkr in bad_tkrs:
dat = yf.Ticker(tkr, session=self.session)
tz_exchange = dat.fast_info["timezone"]
_dp = os.path.dirname(__file__)
interval = '1d'
fp = os.path.join(_dp, "data", tkr.replace('.','-')+'-'+interval+"-bad-stock-split.csv")
if not os.path.isfile(fp):
interval = '1wk'
fp = os.path.join(_dp, "data", tkr.replace('.','-')+'-'+interval+"-bad-stock-split.csv")
df_bad = _pd.read_csv(fp, index_col="Date")
df_bad.index = _pd.to_datetime(df_bad.index, utc=True)
repaired_df = dat._fix_bad_stock_split(df_bad, "1d", tz_exchange)
fp = os.path.join(_dp, "data", tkr.replace('.','-')+'-'+interval+"-bad-stock-split-fixed.csv")
correct_df = _pd.read_csv(fp, index_col="Date")
correct_df.index = _pd.to_datetime(correct_df.index)
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:
print(f"tkr={tkr} COLUMN={c}")
# print("- repaired_df")
# print(repaired_df)
# print("- correct_df[c]:")
# print(correct_df[c])
# print("- diff:")
# 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"]
_dp = os.path.dirname(__file__)
df_good = dat.history(start='2020-11-30', end='2021-04-01', interval=interval, auto_adjust=False)
repaired_df = dat._fix_bad_stock_split(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
def test_repair_missing_div_adjust(self):
tkr = '8TRA.DE'
dat = yf.Ticker(tkr, session=self.session)
tz_exchange = dat.fast_info["timezone"]
_dp = os.path.dirname(__file__)
df_bad = _pd.read_csv(os.path.join(_dp, "data", tkr.replace('.','-')+"-1d-missing-div-adjust.csv"), index_col="Date")
df_bad.index = _pd.to_datetime(df_bad.index)
repaired_df = dat._fix_missing_div_adjust(df_bad, "1d", tz_exchange)
correct_df = _pd.read_csv(os.path.join(_dp, "data", tkr.replace('.','-')+"-1d-missing-div-adjust-fixed.csv"), index_col="Date")
correct_df.index = _pd.to_datetime(correct_df.index)
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:
print(f"tkr={tkr} COLUMN={c}")
print("- repaired_df")
print(repaired_df)
print("- correct_df[c]:")
print(correct_df[c])
print("- diff:")
print(repaired_df[c] - correct_df[c])
raise
if __name__ == '__main__':
unittest.main()

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,118 @@
_BASE_URL_ = 'https://query2.finance.yahoo.com'
_ROOT_URL_ = 'https://finance.yahoo.com'
fundamentals_keys = {}
fundamentals_keys['financials'] = ["TaxEffectOfUnusualItems","TaxRateForCalcs","NormalizedEBITDA","NormalizedDilutedEPS","NormalizedBasicEPS","TotalUnusualItems","TotalUnusualItemsExcludingGoodwill","NetIncomeFromContinuingOperationNetMinorityInterest","ReconciledDepreciation","ReconciledCostOfRevenue","EBITDA","EBIT","NetInterestIncome","InterestExpense","InterestIncome","ContinuingAndDiscontinuedDilutedEPS","ContinuingAndDiscontinuedBasicEPS","NormalizedIncome","NetIncomeFromContinuingAndDiscontinuedOperation","TotalExpenses","RentExpenseSupplemental","ReportedNormalizedDilutedEPS","ReportedNormalizedBasicEPS","TotalOperatingIncomeAsReported","DividendPerShare","DilutedAverageShares","BasicAverageShares","DilutedEPS","DilutedEPSOtherGainsLosses","TaxLossCarryforwardDilutedEPS","DilutedAccountingChange","DilutedExtraordinary","DilutedDiscontinuousOperations","DilutedContinuousOperations","BasicEPS","BasicEPSOtherGainsLosses","TaxLossCarryforwardBasicEPS","BasicAccountingChange","BasicExtraordinary","BasicDiscontinuousOperations","BasicContinuousOperations","DilutedNIAvailtoComStockholders","AverageDilutionEarnings","NetIncomeCommonStockholders","OtherunderPreferredStockDividend","PreferredStockDividends","NetIncome","MinorityInterests","NetIncomeIncludingNoncontrollingInterests","NetIncomeFromTaxLossCarryforward","NetIncomeExtraordinary","NetIncomeDiscontinuousOperations","NetIncomeContinuousOperations","EarningsFromEquityInterestNetOfTax","TaxProvision","PretaxIncome","OtherIncomeExpense","OtherNonOperatingIncomeExpenses","SpecialIncomeCharges","GainOnSaleOfPPE","GainOnSaleOfBusiness","OtherSpecialCharges","WriteOff","ImpairmentOfCapitalAssets","RestructuringAndMergernAcquisition","SecuritiesAmortization","EarningsFromEquityInterest","GainOnSaleOfSecurity","NetNonOperatingInterestIncomeExpense","TotalOtherFinanceCost","InterestExpenseNonOperating","InterestIncomeNonOperating","OperatingIncome","OperatingExpense","OtherOperatingExpenses","OtherTaxes","ProvisionForDoubtfulAccounts","DepreciationAmortizationDepletionIncomeStatement","DepletionIncomeStatement","DepreciationAndAmortizationInIncomeStatement","Amortization","AmortizationOfIntangiblesIncomeStatement","DepreciationIncomeStatement","ResearchAndDevelopment","SellingGeneralAndAdministration","SellingAndMarketingExpense","GeneralAndAdministrativeExpense","OtherGandA","InsuranceAndClaims","RentAndLandingFees","SalariesAndWages","GrossProfit","CostOfRevenue","TotalRevenue","ExciseTaxes","OperatingRevenue"]
fundamentals_keys['balance-sheet'] = ["TreasurySharesNumber","PreferredSharesNumber","OrdinarySharesNumber","ShareIssued","NetDebt","TotalDebt","TangibleBookValue","InvestedCapital","WorkingCapital","NetTangibleAssets","CapitalLeaseObligations","CommonStockEquity","PreferredStockEquity","TotalCapitalization","TotalEquityGrossMinorityInterest","MinorityInterest","StockholdersEquity","OtherEquityInterest","GainsLossesNotAffectingRetainedEarnings","OtherEquityAdjustments","FixedAssetsRevaluationReserve","ForeignCurrencyTranslationAdjustments","MinimumPensionLiabilities","UnrealizedGainLoss","TreasuryStock","RetainedEarnings","AdditionalPaidInCapital","CapitalStock","OtherCapitalStock","CommonStock","PreferredStock","TotalPartnershipCapital","GeneralPartnershipCapital","LimitedPartnershipCapital","TotalLiabilitiesNetMinorityInterest","TotalNonCurrentLiabilitiesNetMinorityInterest","OtherNonCurrentLiabilities","LiabilitiesHeldforSaleNonCurrent","RestrictedCommonStock","PreferredSecuritiesOutsideStockEquity","DerivativeProductLiabilities","EmployeeBenefits","NonCurrentPensionAndOtherPostretirementBenefitPlans","NonCurrentAccruedExpenses","DuetoRelatedPartiesNonCurrent","TradeandOtherPayablesNonCurrent","NonCurrentDeferredLiabilities","NonCurrentDeferredRevenue","NonCurrentDeferredTaxesLiabilities","LongTermDebtAndCapitalLeaseObligation","LongTermCapitalLeaseObligation","LongTermDebt","LongTermProvisions","CurrentLiabilities","OtherCurrentLiabilities","CurrentDeferredLiabilities","CurrentDeferredRevenue","CurrentDeferredTaxesLiabilities","CurrentDebtAndCapitalLeaseObligation","CurrentCapitalLeaseObligation","CurrentDebt","OtherCurrentBorrowings","LineOfCredit","CommercialPaper","CurrentNotesPayable","PensionandOtherPostRetirementBenefitPlansCurrent","CurrentProvisions","PayablesAndAccruedExpenses","CurrentAccruedExpenses","InterestPayable","Payables","OtherPayable","DuetoRelatedPartiesCurrent","DividendsPayable","TotalTaxPayable","IncomeTaxPayable","AccountsPayable","TotalAssets","TotalNonCurrentAssets","OtherNonCurrentAssets","DefinedPensionBenefit","NonCurrentPrepaidAssets","NonCurrentDeferredAssets","NonCurrentDeferredTaxesAssets","DuefromRelatedPartiesNonCurrent","NonCurrentNoteReceivables","NonCurrentAccountsReceivable","FinancialAssets","InvestmentsAndAdvances","OtherInvestments","InvestmentinFinancialAssets","HeldToMaturitySecurities","AvailableForSaleSecurities","FinancialAssetsDesignatedasFairValueThroughProfitorLossTotal","TradingSecurities","LongTermEquityInvestment","InvestmentsinJointVenturesatCost","InvestmentsInOtherVenturesUnderEquityMethod","InvestmentsinAssociatesatCost","InvestmentsinSubsidiariesatCost","InvestmentProperties","GoodwillAndOtherIntangibleAssets","OtherIntangibleAssets","Goodwill","NetPPE","AccumulatedDepreciation","GrossPPE","Leases","ConstructionInProgress","OtherProperties","MachineryFurnitureEquipment","BuildingsAndImprovements","LandAndImprovements","Properties","CurrentAssets","OtherCurrentAssets","HedgingAssetsCurrent","AssetsHeldForSaleCurrent","CurrentDeferredAssets","CurrentDeferredTaxesAssets","RestrictedCash","PrepaidAssets","Inventory","InventoriesAdjustmentsAllowances","OtherInventories","FinishedGoods","WorkInProcess","RawMaterials","Receivables","ReceivablesAdjustmentsAllowances","OtherReceivables","DuefromRelatedPartiesCurrent","TaxesReceivable","AccruedInterestReceivable","NotesReceivable","LoansReceivable","AccountsReceivable","AllowanceForDoubtfulAccountsReceivable","GrossAccountsReceivable","CashCashEquivalentsAndShortTermInvestments","OtherShortTermInvestments","CashAndCashEquivalents","CashEquivalents","CashFinancial"]
fundamentals_keys['cash-flow'] = ["ForeignSales","DomesticSales","AdjustedGeographySegmentData","FreeCashFlow","RepurchaseOfCapitalStock","RepaymentOfDebt","IssuanceOfDebt","IssuanceOfCapitalStock","CapitalExpenditure","InterestPaidSupplementalData","IncomeTaxPaidSupplementalData","EndCashPosition","OtherCashAdjustmentOutsideChangeinCash","BeginningCashPosition","EffectOfExchangeRateChanges","ChangesInCash","OtherCashAdjustmentInsideChangeinCash","CashFlowFromDiscontinuedOperation","FinancingCashFlow","CashFromDiscontinuedFinancingActivities","CashFlowFromContinuingFinancingActivities","NetOtherFinancingCharges","InterestPaidCFF","ProceedsFromStockOptionExercised","CashDividendsPaid","PreferredStockDividendPaid","CommonStockDividendPaid","NetPreferredStockIssuance","PreferredStockPayments","PreferredStockIssuance","NetCommonStockIssuance","CommonStockPayments","CommonStockIssuance","NetIssuancePaymentsOfDebt","NetShortTermDebtIssuance","ShortTermDebtPayments","ShortTermDebtIssuance","NetLongTermDebtIssuance","LongTermDebtPayments","LongTermDebtIssuance","InvestingCashFlow","CashFromDiscontinuedInvestingActivities","CashFlowFromContinuingInvestingActivities","NetOtherInvestingChanges","InterestReceivedCFI","DividendsReceivedCFI","NetInvestmentPurchaseAndSale","SaleOfInvestment","PurchaseOfInvestment","NetInvestmentPropertiesPurchaseAndSale","SaleOfInvestmentProperties","PurchaseOfInvestmentProperties","NetBusinessPurchaseAndSale","SaleOfBusiness","PurchaseOfBusiness","NetIntangiblesPurchaseAndSale","SaleOfIntangibles","PurchaseOfIntangibles","NetPPEPurchaseAndSale","SaleOfPPE","PurchaseOfPPE","CapitalExpenditureReported","OperatingCashFlow","CashFromDiscontinuedOperatingActivities","CashFlowFromContinuingOperatingActivities","TaxesRefundPaid","InterestReceivedCFO","InterestPaidCFO","DividendReceivedCFO","DividendPaidCFO","ChangeInWorkingCapital","ChangeInOtherWorkingCapital","ChangeInOtherCurrentLiabilities","ChangeInOtherCurrentAssets","ChangeInPayablesAndAccruedExpense","ChangeInAccruedExpense","ChangeInInterestPayable","ChangeInPayable","ChangeInDividendPayable","ChangeInAccountPayable","ChangeInTaxPayable","ChangeInIncomeTaxPayable","ChangeInPrepaidAssets","ChangeInInventory","ChangeInReceivables","ChangesInAccountReceivables","OtherNonCashItems","ExcessTaxBenefitFromStockBasedCompensation","StockBasedCompensation","UnrealizedGainLossOnInvestmentSecurities","ProvisionandWriteOffofAssets","AssetImpairmentCharge","AmortizationOfSecurities","DeferredTax","DeferredIncomeTax","DepreciationAmortizationDepletion","Depletion","DepreciationAndAmortization","AmortizationCashFlow","AmortizationOfIntangibles","Depreciation","OperatingGainsLosses","PensionAndEmployeeBenefitExpense","EarningsLossesFromEquityInvestments","GainLossOnInvestmentSecurities","NetForeignCurrencyExchangeGainLoss","GainLossOnSaleOfPPE","GainLossOnSaleOfBusiness","NetIncomeFromContinuingOperations","CashFlowsfromusedinOperatingActivitiesDirect","TaxesRefundPaidDirect","InterestReceivedDirect","InterestPaidDirect","DividendsReceivedDirect","DividendsPaidDirect","ClassesofCashPayments","OtherCashPaymentsfromOperatingActivities","PaymentsonBehalfofEmployees","PaymentstoSuppliersforGoodsandServices","ClassesofCashReceiptsfromOperatingActivities","OtherCashReceiptsfromOperatingActivities","ReceiptsfromGovernmentGrants","ReceiptsfromCustomers"]
fundamentals_keys = {
'financials': ["TaxEffectOfUnusualItems", "TaxRateForCalcs", "NormalizedEBITDA", "NormalizedDilutedEPS",
"NormalizedBasicEPS", "TotalUnusualItems", "TotalUnusualItemsExcludingGoodwill",
"NetIncomeFromContinuingOperationNetMinorityInterest", "ReconciledDepreciation",
"ReconciledCostOfRevenue", "EBITDA", "EBIT", "NetInterestIncome", "InterestExpense",
"InterestIncome", "ContinuingAndDiscontinuedDilutedEPS", "ContinuingAndDiscontinuedBasicEPS",
"NormalizedIncome", "NetIncomeFromContinuingAndDiscontinuedOperation", "TotalExpenses",
"RentExpenseSupplemental", "ReportedNormalizedDilutedEPS", "ReportedNormalizedBasicEPS",
"TotalOperatingIncomeAsReported", "DividendPerShare", "DilutedAverageShares", "BasicAverageShares",
"DilutedEPS", "DilutedEPSOtherGainsLosses", "TaxLossCarryforwardDilutedEPS",
"DilutedAccountingChange", "DilutedExtraordinary", "DilutedDiscontinuousOperations",
"DilutedContinuousOperations", "BasicEPS", "BasicEPSOtherGainsLosses", "TaxLossCarryforwardBasicEPS",
"BasicAccountingChange", "BasicExtraordinary", "BasicDiscontinuousOperations",
"BasicContinuousOperations", "DilutedNIAvailtoComStockholders", "AverageDilutionEarnings",
"NetIncomeCommonStockholders", "OtherunderPreferredStockDividend", "PreferredStockDividends",
"NetIncome", "MinorityInterests", "NetIncomeIncludingNoncontrollingInterests",
"NetIncomeFromTaxLossCarryforward", "NetIncomeExtraordinary", "NetIncomeDiscontinuousOperations",
"NetIncomeContinuousOperations", "EarningsFromEquityInterestNetOfTax", "TaxProvision",
"PretaxIncome", "OtherIncomeExpense", "OtherNonOperatingIncomeExpenses", "SpecialIncomeCharges",
"GainOnSaleOfPPE", "GainOnSaleOfBusiness", "OtherSpecialCharges", "WriteOff",
"ImpairmentOfCapitalAssets", "RestructuringAndMergernAcquisition", "SecuritiesAmortization",
"EarningsFromEquityInterest", "GainOnSaleOfSecurity", "NetNonOperatingInterestIncomeExpense",
"TotalOtherFinanceCost", "InterestExpenseNonOperating", "InterestIncomeNonOperating",
"OperatingIncome", "OperatingExpense", "OtherOperatingExpenses", "OtherTaxes",
"ProvisionForDoubtfulAccounts", "DepreciationAmortizationDepletionIncomeStatement",
"DepletionIncomeStatement", "DepreciationAndAmortizationInIncomeStatement", "Amortization",
"AmortizationOfIntangiblesIncomeStatement", "DepreciationIncomeStatement", "ResearchAndDevelopment",
"SellingGeneralAndAdministration", "SellingAndMarketingExpense", "GeneralAndAdministrativeExpense",
"OtherGandA", "InsuranceAndClaims", "RentAndLandingFees", "SalariesAndWages", "GrossProfit",
"CostOfRevenue", "TotalRevenue", "ExciseTaxes", "OperatingRevenue"],
'balance-sheet': ["TreasurySharesNumber", "PreferredSharesNumber", "OrdinarySharesNumber", "ShareIssued", "NetDebt",
"TotalDebt", "TangibleBookValue", "InvestedCapital", "WorkingCapital", "NetTangibleAssets",
"CapitalLeaseObligations", "CommonStockEquity", "PreferredStockEquity", "TotalCapitalization",
"TotalEquityGrossMinorityInterest", "MinorityInterest", "StockholdersEquity",
"OtherEquityInterest", "GainsLossesNotAffectingRetainedEarnings", "OtherEquityAdjustments",
"FixedAssetsRevaluationReserve", "ForeignCurrencyTranslationAdjustments",
"MinimumPensionLiabilities", "UnrealizedGainLoss", "TreasuryStock", "RetainedEarnings",
"AdditionalPaidInCapital", "CapitalStock", "OtherCapitalStock", "CommonStock", "PreferredStock",
"TotalPartnershipCapital", "GeneralPartnershipCapital", "LimitedPartnershipCapital",
"TotalLiabilitiesNetMinorityInterest", "TotalNonCurrentLiabilitiesNetMinorityInterest",
"OtherNonCurrentLiabilities", "LiabilitiesHeldforSaleNonCurrent", "RestrictedCommonStock",
"PreferredSecuritiesOutsideStockEquity", "DerivativeProductLiabilities", "EmployeeBenefits",
"NonCurrentPensionAndOtherPostretirementBenefitPlans", "NonCurrentAccruedExpenses",
"DuetoRelatedPartiesNonCurrent", "TradeandOtherPayablesNonCurrent",
"NonCurrentDeferredLiabilities", "NonCurrentDeferredRevenue",
"NonCurrentDeferredTaxesLiabilities", "LongTermDebtAndCapitalLeaseObligation",
"LongTermCapitalLeaseObligation", "LongTermDebt", "LongTermProvisions", "CurrentLiabilities",
"OtherCurrentLiabilities", "CurrentDeferredLiabilities", "CurrentDeferredRevenue",
"CurrentDeferredTaxesLiabilities", "CurrentDebtAndCapitalLeaseObligation",
"CurrentCapitalLeaseObligation", "CurrentDebt", "OtherCurrentBorrowings", "LineOfCredit",
"CommercialPaper", "CurrentNotesPayable", "PensionandOtherPostRetirementBenefitPlansCurrent",
"CurrentProvisions", "PayablesAndAccruedExpenses", "CurrentAccruedExpenses", "InterestPayable",
"Payables", "OtherPayable", "DuetoRelatedPartiesCurrent", "DividendsPayable", "TotalTaxPayable",
"IncomeTaxPayable", "AccountsPayable", "TotalAssets", "TotalNonCurrentAssets",
"OtherNonCurrentAssets", "DefinedPensionBenefit", "NonCurrentPrepaidAssets",
"NonCurrentDeferredAssets", "NonCurrentDeferredTaxesAssets", "DuefromRelatedPartiesNonCurrent",
"NonCurrentNoteReceivables", "NonCurrentAccountsReceivable", "FinancialAssets",
"InvestmentsAndAdvances", "OtherInvestments", "InvestmentinFinancialAssets",
"HeldToMaturitySecurities", "AvailableForSaleSecurities",
"FinancialAssetsDesignatedasFairValueThroughProfitorLossTotal", "TradingSecurities",
"LongTermEquityInvestment", "InvestmentsinJointVenturesatCost",
"InvestmentsInOtherVenturesUnderEquityMethod", "InvestmentsinAssociatesatCost",
"InvestmentsinSubsidiariesatCost", "InvestmentProperties", "GoodwillAndOtherIntangibleAssets",
"OtherIntangibleAssets", "Goodwill", "NetPPE", "AccumulatedDepreciation", "GrossPPE", "Leases",
"ConstructionInProgress", "OtherProperties", "MachineryFurnitureEquipment",
"BuildingsAndImprovements", "LandAndImprovements", "Properties", "CurrentAssets",
"OtherCurrentAssets", "HedgingAssetsCurrent", "AssetsHeldForSaleCurrent", "CurrentDeferredAssets",
"CurrentDeferredTaxesAssets", "RestrictedCash", "PrepaidAssets", "Inventory",
"InventoriesAdjustmentsAllowances", "OtherInventories", "FinishedGoods", "WorkInProcess",
"RawMaterials", "Receivables", "ReceivablesAdjustmentsAllowances", "OtherReceivables",
"DuefromRelatedPartiesCurrent", "TaxesReceivable", "AccruedInterestReceivable", "NotesReceivable",
"LoansReceivable", "AccountsReceivable", "AllowanceForDoubtfulAccountsReceivable",
"GrossAccountsReceivable", "CashCashEquivalentsAndShortTermInvestments",
"OtherShortTermInvestments", "CashAndCashEquivalents", "CashEquivalents", "CashFinancial"],
'cash-flow': ["ForeignSales", "DomesticSales", "AdjustedGeographySegmentData", "FreeCashFlow",
"RepurchaseOfCapitalStock", "RepaymentOfDebt", "IssuanceOfDebt", "IssuanceOfCapitalStock",
"CapitalExpenditure", "InterestPaidSupplementalData", "IncomeTaxPaidSupplementalData",
"EndCashPosition", "OtherCashAdjustmentOutsideChangeinCash", "BeginningCashPosition",
"EffectOfExchangeRateChanges", "ChangesInCash", "OtherCashAdjustmentInsideChangeinCash",
"CashFlowFromDiscontinuedOperation", "FinancingCashFlow", "CashFromDiscontinuedFinancingActivities",
"CashFlowFromContinuingFinancingActivities", "NetOtherFinancingCharges", "InterestPaidCFF",
"ProceedsFromStockOptionExercised", "CashDividendsPaid", "PreferredStockDividendPaid",
"CommonStockDividendPaid", "NetPreferredStockIssuance", "PreferredStockPayments",
"PreferredStockIssuance", "NetCommonStockIssuance", "CommonStockPayments", "CommonStockIssuance",
"NetIssuancePaymentsOfDebt", "NetShortTermDebtIssuance", "ShortTermDebtPayments",
"ShortTermDebtIssuance", "NetLongTermDebtIssuance", "LongTermDebtPayments", "LongTermDebtIssuance",
"InvestingCashFlow", "CashFromDiscontinuedInvestingActivities",
"CashFlowFromContinuingInvestingActivities", "NetOtherInvestingChanges", "InterestReceivedCFI",
"DividendsReceivedCFI", "NetInvestmentPurchaseAndSale", "SaleOfInvestment", "PurchaseOfInvestment",
"NetInvestmentPropertiesPurchaseAndSale", "SaleOfInvestmentProperties",
"PurchaseOfInvestmentProperties", "NetBusinessPurchaseAndSale", "SaleOfBusiness",
"PurchaseOfBusiness", "NetIntangiblesPurchaseAndSale", "SaleOfIntangibles", "PurchaseOfIntangibles",
"NetPPEPurchaseAndSale", "SaleOfPPE", "PurchaseOfPPE", "CapitalExpenditureReported",
"OperatingCashFlow", "CashFromDiscontinuedOperatingActivities",
"CashFlowFromContinuingOperatingActivities", "TaxesRefundPaid", "InterestReceivedCFO",
"InterestPaidCFO", "DividendReceivedCFO", "DividendPaidCFO", "ChangeInWorkingCapital",
"ChangeInOtherWorkingCapital", "ChangeInOtherCurrentLiabilities", "ChangeInOtherCurrentAssets",
"ChangeInPayablesAndAccruedExpense", "ChangeInAccruedExpense", "ChangeInInterestPayable",
"ChangeInPayable", "ChangeInDividendPayable", "ChangeInAccountPayable", "ChangeInTaxPayable",
"ChangeInIncomeTaxPayable", "ChangeInPrepaidAssets", "ChangeInInventory", "ChangeInReceivables",
"ChangesInAccountReceivables", "OtherNonCashItems", "ExcessTaxBenefitFromStockBasedCompensation",
"StockBasedCompensation", "UnrealizedGainLossOnInvestmentSecurities", "ProvisionandWriteOffofAssets",
"AssetImpairmentCharge", "AmortizationOfSecurities", "DeferredTax", "DeferredIncomeTax",
"DepreciationAmortizationDepletion", "Depletion", "DepreciationAndAmortization",
"AmortizationCashFlow", "AmortizationOfIntangibles", "Depreciation", "OperatingGainsLosses",
"PensionAndEmployeeBenefitExpense", "EarningsLossesFromEquityInvestments",
"GainLossOnInvestmentSecurities", "NetForeignCurrencyExchangeGainLoss", "GainLossOnSaleOfPPE",
"GainLossOnSaleOfBusiness", "NetIncomeFromContinuingOperations",
"CashFlowsfromusedinOperatingActivitiesDirect", "TaxesRefundPaidDirect", "InterestReceivedDirect",
"InterestPaidDirect", "DividendsReceivedDirect", "DividendsPaidDirect", "ClassesofCashPayments",
"OtherCashPaymentsfromOperatingActivities", "PaymentsonBehalfofEmployees",
"PaymentstoSuppliersforGoodsandServices", "ClassesofCashReceiptsfromOperatingActivities",
"OtherCashReceiptsfromOperatingActivities", "ReceiptsfromGovernmentGrants", "ReceiptsfromCustomers"]}
price_colnames = ['Open', 'High', 'Low', 'Close', 'Adj Close']

View File

@ -22,14 +22,16 @@
from __future__ import print_function
import logging
import traceback
import time as _time
import traceback
import multitasking as _multitasking
import pandas as _pd
from . import Ticker, utils
from . import shared
@utils.log_indent_decorator
def download(tickers, start=None, end=None, actions=False, threads=True, ignore_tz=None,
group_by='column', auto_adjust=False, back_adjust=False, repair=False, keepna=False,
@ -181,7 +183,7 @@ def download(tickers, start=None, end=None, actions=False, threads=True, ignore_
for ticker in shared._ERRORS:
err = shared._ERRORS[ticker]
err = err.replace(f'{ticker}', '%ticker%')
if not err in errors:
if err not in errors:
errors[err] = [ticker]
else:
errors[err].append(ticker)
@ -193,7 +195,7 @@ def download(tickers, start=None, end=None, actions=False, threads=True, ignore_
for ticker in shared._TRACEBACKS:
tb = shared._TRACEBACKS[ticker]
tb = tb.replace(f'{ticker}', '%ticker%')
if not tb in tbs:
if tb not in tbs:
tbs[tb] = [ticker]
else:
tbs[tb].append(ticker)

View File

@ -1,14 +1,13 @@
import datetime
import logging
import json
import pandas as pd
import numpy as np
from yfinance import utils, const
from yfinance.data import TickerData
from yfinance.exceptions import YFinanceException, YFNotImplementedError
class Fundamentals:
def __init__(self, data: TickerData, proxy=None):
@ -76,9 +75,9 @@ class Financials:
allowed_timescales = ["yearly", "quarterly"]
if name not in allowed_names:
raise ValueError("Illegal argument: name must be one of: {}".format(allowed_names))
raise ValueError(f"Illegal argument: name must be one of: {allowed_names}")
if timescale not in allowed_timescales:
raise ValueError("Illegal argument: timescale must be one of: {}".format(allowed_names))
raise ValueError(f"Illegal argument: timescale must be one of: {allowed_names}")
try:
statement = self._create_financials_table(name, timescale, proxy)
@ -86,7 +85,7 @@ class Financials:
if statement is not None:
return statement
except YFinanceException as e:
utils.get_yf_logger().error("%s: Failed to create %s financials table for reason: %r", self._data.ticker, name, e)
utils.get_yf_logger().error(f"{self._data.ticker}: Failed to create {name} financials table for reason: {e}")
return pd.DataFrame()
def _create_financials_table(self, name, timescale, proxy):
@ -106,15 +105,12 @@ class Financials:
timescale = timescale_translation[timescale]
# Step 2: construct url:
ts_url_base = \
"https://query2.finance.yahoo.com/ws/fundamentals-timeseries/v1/finance/timeseries/{0}?symbol={0}" \
.format(self._data.ticker)
ts_url_base = f"https://query2.finance.yahoo.com/ws/fundamentals-timeseries/v1/finance/timeseries/{self._data.ticker}?symbol={self._data.ticker}"
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")
url += "&period1={}&period2={}".format(int(start_dt.timestamp()), int(end.timestamp()))
url += f"&period1={int(start_dt.timestamp())}&period2={int(end.timestamp())}"
# Step 3: fetch and reshape data
json_str = self._data.cache_get(url=url, proxy=proxy).text

View File

@ -2,6 +2,7 @@ import pandas as pd
from yfinance.data import TickerData
class Holders:
_SCRAPE_URL_ = 'https://finance.yahoo.com/quote'
@ -32,7 +33,7 @@ class Holders:
return self._mutualfund
def _scrape(self, proxy):
ticker_url = "{}/{}".format(self._SCRAPE_URL_, self._data.ticker)
ticker_url = f"{self._SCRAPE_URL_}/{self._data.ticker}"
try:
resp = self._data.cache_get(ticker_url + '/holders', proxy=proxy)
holders = pd.read_html(resp.text)

View File

@ -1,10 +1,11 @@
import datetime
import logging
import json
import logging
import warnings
from collections.abc import MutableMapping
import pandas as pd
import numpy as _np
import pandas as pd
from yfinance import utils
from yfinance.data import TickerData
@ -22,7 +23,7 @@ info_retired_keys = info_retired_keys_price | info_retired_keys_exchange | info_
_BASIC_URL_ = "https://query2.finance.yahoo.com/v6/finance/quoteSummary"
from collections.abc import MutableMapping
class InfoDictWrapper(MutableMapping):
""" Simple wrapper around info dict, intercepting 'gets' to
print how-to-migrate messages for specific keys. Requires
@ -126,12 +127,12 @@ class FastInfo:
# Because released before fixing key case, need to officially support
# camel-case but also secretly support snake-case
base_keys = [k for k in _properties if not '_' in k]
base_keys = [k for k in _properties if '_' not in k]
sc_keys = [k for k in _properties if '_' in k]
self._sc_to_cc_key = {k:utils.snake_case_2_camelCase(k) for k in sc_keys}
self._cc_to_sc_key = {v:k for k,v in self._sc_to_cc_key.items()}
self._sc_to_cc_key = {k: utils.snake_case_2_camelCase(k) for k in sc_keys}
self._cc_to_sc_key = {v: k for k, v in self._sc_to_cc_key.items()}
self._public_keys = sorted(base_keys + list(self._sc_to_cc_key.values()))
self._keys = sorted(self._public_keys + sc_keys)
@ -139,37 +140,44 @@ class FastInfo:
# dict imitation:
def keys(self):
return self._public_keys
def items(self):
return [(k,self[k]) for k in self._public_keys]
return [(k, self[k]) for k in self._public_keys]
def values(self):
return [self[k] for k in self._public_keys]
def get(self, key, default=None):
if key in self.keys():
if key in self._cc_to_sc_key:
key = self._cc_to_sc_key[key]
return self[key]
return default
def __getitem__(self, k):
if not isinstance(k, str):
raise KeyError(f"key must be a string")
if not k in self._keys:
if k not in self._keys:
raise KeyError(f"'{k}' not valid key. Examine 'FastInfo.keys()'")
if k in self._cc_to_sc_key:
k = self._cc_to_sc_key[k]
return getattr(self, k)
def __contains__(self, k):
return k in self.keys()
def __iter__(self):
return iter(self.keys())
def __str__(self):
return "lazy-loading dict with keys = " + str(self.keys())
def __repr__(self):
return self.__str__()
def toJSON(self, indent=4):
d = {k:self[k] for k in self.keys()}
return _json.dumps({k:self[k] for k in self.keys()}, indent=indent)
d = {k: self[k] for k in self.keys()}
return json.dumps({k: self[k] for k in self.keys()}, indent=indent)
def _get_1y_prices(self, fullDaysOnly=False):
if self._prices_1y is None:
@ -183,7 +191,7 @@ class FastInfo:
self._today_open = pd.to_datetime(ctp["regular"]["start"], unit='s', utc=True).tz_convert(self.timezone)
self._today_close = pd.to_datetime(ctp["regular"]["end"], unit='s', utc=True).tz_convert(self.timezone)
self._today_midnight = self._today_close.ceil("D")
except:
except Exception:
self._today_open = None
self._today_close = None
self._today_midnight = None
@ -588,9 +596,7 @@ class Quote:
return
self._already_fetched = True
modules = ['financialData', 'quoteType', 'defaultKeyStatistics', 'assetProfile', 'summaryDetail']
params_dict = {}
params_dict["modules"] = modules
params_dict["ssl"] = "true"
params_dict = {"modules": modules, "ssl": "true"}
result = self._data.get_raw_json(
_BASIC_URL_ + f"/{self._data.ticker}", params=params_dict, proxy=proxy
)
@ -612,13 +618,14 @@ class Quote:
if v1
}
# recursively format but only because of 'companyOfficers'
def _format(k, v):
if isinstance(v, dict) and "raw" in v and "fmt" in v:
v2 = v["fmt"] if k in {"regularMarketTime", "postMarketTime"} else v["raw"]
elif isinstance(v, list):
v2 = [_format(None, x) for x in v]
elif isinstance(v, dict):
v2 = {k:_format(k, x) for k, x in v.items()}
v2 = {k: _format(k, x) for k, x in v.items()}
elif isinstance(v, str):
v2 = v.replace("\xa0", " ")
else:
@ -663,8 +670,7 @@ class Quote:
# pass
#
# For just one/few variable is faster to query directly:
url = "https://query1.finance.yahoo.com/ws/fundamentals-timeseries/v1/finance/timeseries/{}?symbol={}".format(
self._data.ticker, self._data.ticker)
url = f"https://query1.finance.yahoo.com/ws/fundamentals-timeseries/v1/finance/timeseries/{self._data.ticker}?symbol={self._data.ticker}"
for k in keys:
url += "&type=" + k
# Request 6 months of data

View File

@ -22,10 +22,10 @@
from __future__ import print_function
import datetime as _datetime
import pandas as _pd
from collections import namedtuple as _namedtuple
import pandas as _pd
from .base import TickerBase
@ -33,25 +33,29 @@ class Ticker(TickerBase):
def __init__(self, ticker, session=None):
super(Ticker, self).__init__(ticker, session=session)
self._expirations = {}
self._underlying = {}
def __repr__(self):
return 'yfinance.Ticker object <%s>' % self.ticker
return f'yfinance.Ticker object <{self.ticker}>'
def _download_options(self, date=None, proxy=None):
if date is None:
url = "{}/v7/finance/options/{}".format(
self._base_url, self.ticker)
url = f"{self._base_url}/v7/finance/options/{self.ticker}"
else:
url = "{}/v7/finance/options/{}?date={}".format(
self._base_url, self.ticker, date)
url = f"{self._base_url}/v7/finance/options/{self.ticker}?date={date}"
r = self._data.get(url=url, proxy=proxy).json()
if len(r.get('optionChain', {}).get('result', [])) > 0:
for exp in r['optionChain']['result'][0]['expirationDates']:
self._expirations[_datetime.datetime.utcfromtimestamp(
exp).strftime('%Y-%m-%d')] = exp
self._underlying = r['optionChain']['result'][0].get('quote', {})
opt = r['optionChain']['result'][0].get('options', [])
return opt[0] if len(opt) > 0 else []
return dict(**opt[0],underlying=self._underlying) if len(opt) > 0 else {}
return {}
def _options2df(self, opt, tz=None):
data = _pd.DataFrame(opt).reindex(columns=[
@ -84,15 +88,15 @@ class Ticker(TickerBase):
self._download_options()
if date not in self._expirations:
raise ValueError(
"Expiration `%s` cannot be found. "
"Available expiration are: [%s]" % (
date, ', '.join(self._expirations)))
f"Expiration `{date}` cannot be found. "
f"Available expirations are: [{', '.join(self._expirations)}]")
date = self._expirations[date]
options = self._download_options(date, proxy=proxy)
return _namedtuple('Options', ['calls', 'puts'])(**{
return _namedtuple('Options', ['calls', 'puts', 'underlying'])(**{
"calls": self._options2df(options['calls'], tz=tz),
"puts": self._options2df(options['puts'], tz=tz)
"puts": self._options2df(options['puts'], tz=tz),
"underlying": options['underlying']
})
# ------------------------

View File

@ -22,19 +22,21 @@
from __future__ import print_function
from . import Ticker, multi
# from collections import namedtuple as _namedtuple
class Tickers:
def __repr__(self):
return 'yfinance.Tickers object <%s>' % ",".join(self.symbols)
return f"yfinance.Tickers object <{','.join(self.symbols)}>"
def __init__(self, tickers, session=None):
tickers = tickers if isinstance(
tickers, list) else tickers.replace(',', ' ').split()
self.symbols = [ticker.upper() for ticker in tickers]
self.tickers = {ticker:Ticker(ticker, session=session) for ticker in self.symbols}
self.tickers = {ticker: Ticker(ticker, session=session) for ticker in self.symbols}
# self.tickers = _namedtuple(
# "Tickers", ticker_objects.keys(), rename=True

View File

@ -21,29 +21,32 @@
from __future__ import print_function
from yfinance import const
import atexit as _atexit
import datetime as _datetime
import dateutil as _dateutil
import logging
import os as _os
import re as _re
import sqlite3 as _sqlite3
import sys as _sys
import threading
from functools import lru_cache
from inspect import getmembers
from threading import Lock
from types import FunctionType
from typing import Dict, Union, List, Optional
import appdirs as _ad
import numpy as _np
import pandas as _pd
import pytz as _tz
import requests as _requests
import re as _re
import pandas as _pd
import numpy as _np
import sys as _sys
import os as _os
import appdirs as _ad
import sqlite3 as _sqlite3
import atexit as _atexit
from functools import lru_cache
import logging
from threading import Lock
from dateutil.relativedelta import relativedelta
from pytz import UnknownTimeZoneError
from yfinance import const
from .const import _BASE_URL_
try:
import ujson as _json
except ImportError:
@ -54,14 +57,12 @@ user_agent_headers = {
# From https://stackoverflow.com/a/59128615
from types import FunctionType
from inspect import getmembers
def attributes(obj):
disallowed_names = {
name for name, value in getmembers(type(obj))
name for name, value in getmembers(type(obj))
if isinstance(value, FunctionType)}
return {
name: getattr(obj, name) for name in dir(obj)
name: getattr(obj, name) for name in dir(obj)
if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)}
@ -72,7 +73,7 @@ def print_once(msg):
print(msg)
## Logging
# Logging
# Note: most of this logic is adding indentation with function depth,
# so that DEBUG log is readable.
class IndentLoggerAdapter(logging.LoggerAdapter):
@ -84,20 +85,26 @@ class IndentLoggerAdapter(logging.LoggerAdapter):
msg = '\n'.join([i + m for m in msg.split('\n')])
return msg, kwargs
import threading
_indentation_level = threading.local()
class IndentationContext:
def __init__(self, increment=1):
self.increment = increment
def __enter__(self):
_indentation_level.indent = getattr(_indentation_level, 'indent', 0) + self.increment
def __exit__(self, exc_type, exc_val, exc_tb):
_indentation_level.indent -= self.increment
def get_indented_logger(name=None):
# Never cache the returned value! Will break indentation.
return IndentLoggerAdapter(logging.getLogger(name), {'indent': getattr(_indentation_level, 'indent', 0)})
def log_indent_decorator(func):
def wrapper(*args, **kwargs):
logger = get_indented_logger('yfinance')
@ -111,6 +118,7 @@ def log_indent_decorator(func):
return wrapper
class MultiLineFormatter(logging.Formatter):
# The 'fmt' formatting further down is only applied to first line
# of log message, specifically the padding after %level%.
@ -138,8 +146,11 @@ class MultiLineFormatter(logging.Formatter):
formatted.extend(padding + line for line in lines[1:])
return '\n'.join(formatted)
yf_logger = None
yf_log_indented = False
def get_yf_logger():
global yf_logger
if yf_logger is None:
@ -149,6 +160,7 @@ def get_yf_logger():
yf_logger = get_indented_logger('yfinance')
return yf_logger
def setup_debug_formatting():
global yf_logger
yf_logger = get_yf_logger()
@ -167,24 +179,21 @@ def setup_debug_formatting():
global yf_log_indented
yf_log_indented = True
def enable_debug_mode():
get_yf_logger().setLevel(logging.DEBUG)
setup_debug_formatting()
##
def is_isin(string):
return bool(_re.match("^([A-Z]{2})([A-Z0-9]{9})([0-9]{1})$", string))
return bool(_re.match("^([A-Z]{2})([A-Z0-9]{9})([0-9])$", string))
def get_all_by_isin(isin, proxy=None, session=None):
if not (is_isin(isin)):
raise ValueError("Invalid ISIN number")
from .base import _BASE_URL_
session = session or _requests
url = "{}/v1/finance/search?q={}".format(_BASE_URL_, isin)
url = f"{_BASE_URL_}/v1/finance/search?q={isin}"
data = session.get(url=url, proxies=proxy, headers=user_agent_headers)
try:
data = data.json()
@ -236,7 +245,7 @@ def empty_earnings_dates_df():
def build_template(data):
'''
"""
build_template returns the details required to rebuild any of the yahoo finance financial statements in the same order as the yahoo finance webpage. The function is built to be used on the "FinancialTemplateStore" json which appears in any one of the three yahoo finance webpages: "/financials", "/cash-flow" and "/balance-sheet".
Returns:
@ -245,95 +254,80 @@ def build_template(data):
- template_order: The order that quarterlies should be in (note that quarterlies have no pre-fix - hence why this is required).
- level_detail: The level of each individual line item. E.g. for the "/financials" webpage, "Total Revenue" is a level 0 item and is the summation of "Operating Revenue" and "Excise Taxes" which are level 1 items.
'''
"""
template_ttm_order = [] # Save the TTM (Trailing Twelve Months) ordering to an object.
template_annual_order = [] # Save the annual ordering to an object.
template_order = [] # Save the ordering to an object (this can be utilized for quarterlies)
level_detail = [] # Record the level of each line item of the income statement ("Operating Revenue" and "Excise Taxes" sum to return "Total Revenue" we need to keep track of this)
for key in data['template']:
# Loop through the json to retreive the exact financial order whilst appending to the objects
template_ttm_order.append('trailing{}'.format(key['key']))
template_annual_order.append('annual{}'.format(key['key']))
template_order.append('{}'.format(key['key']))
level_detail.append(0)
if 'children' in key:
for child1 in key['children']: # Level 1
template_ttm_order.append('trailing{}'.format(child1['key']))
template_annual_order.append('annual{}'.format(child1['key']))
template_order.append('{}'.format(child1['key']))
level_detail.append(1)
if 'children' in child1:
for child2 in child1['children']: # Level 2
template_ttm_order.append('trailing{}'.format(child2['key']))
template_annual_order.append('annual{}'.format(child2['key']))
template_order.append('{}'.format(child2['key']))
level_detail.append(2)
if 'children' in child2:
for child3 in child2['children']: # Level 3
template_ttm_order.append('trailing{}'.format(child3['key']))
template_annual_order.append('annual{}'.format(child3['key']))
template_order.append('{}'.format(child3['key']))
level_detail.append(3)
if 'children' in child3:
for child4 in child3['children']: # Level 4
template_ttm_order.append('trailing{}'.format(child4['key']))
template_annual_order.append('annual{}'.format(child4['key']))
template_order.append('{}'.format(child4['key']))
level_detail.append(4)
if 'children' in child4:
for child5 in child4['children']: # Level 5
template_ttm_order.append('trailing{}'.format(child5['key']))
template_annual_order.append('annual{}'.format(child5['key']))
template_order.append('{}'.format(child5['key']))
level_detail.append(5)
def traverse(node, level):
"""
A recursive function that visits a node and its children.
Args:
node: The current node in the data structure.
level: The depth of the current node in the data structure.
"""
if level > 5: # Stop when level is above 5
return
template_ttm_order.append(f"trailing{node['key']}")
template_annual_order.append(f"annual{node['key']}")
template_order.append(f"{node['key']}")
level_detail.append(level)
if 'children' in node: # Check if the node has children
for child in node['children']: # If yes, traverse each child
traverse(child, level + 1) # Increment the level by 1 for each child
for key in data['template']: # Loop through the data
traverse(key, 0) # Call the traverse function with initial level being 0
return template_ttm_order, template_annual_order, template_order, level_detail
def retreive_financial_details(data):
'''
retreive_financial_details returns all of the available financial details under the "QuoteTimeSeriesStore" for any of the following three yahoo finance webpages: "/financials", "/cash-flow" and "/balance-sheet".
def retrieve_financial_details(data):
"""
retrieve_financial_details returns all of the available financial details under the
"QuoteTimeSeriesStore" for any of the following three yahoo finance webpages:
"/financials", "/cash-flow" and "/balance-sheet".
Returns:
- TTM_dicts: A dictionary full of all of the available Trailing Twelve Month figures, this can easily be converted to a pandas dataframe.
- Annual_dicts: A dictionary full of all of the available Annual figures, this can easily be converted to a pandas dataframe.
'''
"""
TTM_dicts = [] # Save a dictionary object to store the TTM financials.
Annual_dicts = [] # Save a dictionary object to store the Annual financials.
for key in data['timeSeries']: # Loop through the time series data to grab the key financial figures.
for key, timeseries in data.get('timeSeries', {}).items(): # Loop through the time series data to grab the key financial figures.
try:
if len(data['timeSeries'][key]) > 0:
time_series_dict = {}
time_series_dict['index'] = key
for each in data['timeSeries'][key]: # Loop through the years
if each == None:
if timeseries:
time_series_dict = {'index': key}
for each in timeseries: # Loop through the years
if not each:
continue
else:
time_series_dict[each['asOfDate']] = each['reportedValue']
# time_series_dict["{}".format(each['asOfDate'])] = data['timeSeries'][key][each]['reportedValue']
time_series_dict[each.get('asOfDate')] = each.get('reportedValue')
if 'trailing' in key:
TTM_dicts.append(time_series_dict)
elif 'annual' in key:
Annual_dicts.append(time_series_dict)
except Exception as e:
pass
except KeyError as e:
print(f"An error occurred while processing the key: {e}")
return TTM_dicts, Annual_dicts
def format_annual_financial_statement(level_detail, annual_dicts, annual_order, ttm_dicts=None, ttm_order=None):
'''
"""
format_annual_financial_statement formats any annual financial statement
Returns:
- _statement: A fully formatted annual financial statement in pandas dataframe.
'''
"""
Annual = _pd.DataFrame.from_dict(annual_dicts).set_index("index")
Annual = Annual.reindex(annual_order)
Annual.index = Annual.index.str.replace(r'annual', '')
# Note: balance sheet is the only financial statement with no ttm detail
if (ttm_dicts not in [[], None]) and (ttm_order not in [[], None]):
TTM = _pd.DataFrame.from_dict(ttm_dicts).set_index("index")
TTM = TTM.reindex(ttm_order)
if ttm_dicts and ttm_order:
TTM = _pd.DataFrame.from_dict(ttm_dicts).set_index("index").reindex(ttm_order)
# Add 'TTM' prefix to all column names, so if combined we can tell
# the difference between actuals and TTM (similar to yahoo finance).
TTM.columns = ['TTM ' + str(col) for col in TTM.columns]
@ -351,12 +345,12 @@ def format_annual_financial_statement(level_detail, annual_dicts, annual_order,
def format_quarterly_financial_statement(_statement, level_detail, order):
'''
"""
format_quarterly_financial_statements formats any quarterly financial statement
Returns:
- _statement: A fully formatted quarterly financial statement in pandas dataframe.
'''
"""
_statement = _statement.reindex(order)
_statement.index = camel2title(_statement.T)
_statement['level_detail'] = level_detail
@ -407,7 +401,7 @@ def camel2title(strings: List[str], sep: str = ' ', acronyms: Optional[List[str]
# Apply str.title() to non-acronym words
strings = [s.split(sep) for s in strings]
strings = [[j.title() if not j in acronyms else j for j in s] for s in strings]
strings = [[j.title() if j not in acronyms else j for j in s] for s in strings]
strings = [sep.join(s) for s in strings]
return strings
@ -437,14 +431,14 @@ def _parse_user_dt(dt, exchange_tz):
def _interval_to_timedelta(interval):
if interval == "1mo":
return _dateutil.relativedelta.relativedelta(months=1)
return relativedelta(months=1)
elif interval == "3mo":
return _dateutil.relativedelta.relativedelta(months=3)
return relativedelta(months=3)
elif interval == "1y":
return _dateutil.relativedelta.relativedelta(years=1)
return relativedelta(years=1)
elif interval == "1wk":
return _pd.Timedelta(days=7)
else:
else:
return _pd.Timedelta(interval)
@ -544,8 +538,7 @@ def parse_actions(data):
splits.set_index("date", inplace=True)
splits.index = _pd.to_datetime(splits.index, unit="s")
splits.sort_index(inplace=True)
splits["Stock Splits"] = splits["numerator"] / \
splits["denominator"]
splits["Stock Splits"] = splits["numerator"] / splits["denominator"]
splits = splits[["Stock Splits"]]
if dividends is None:
@ -624,7 +617,7 @@ def fix_Yahoo_returning_live_separate(quotes, interval, tz_exchange):
elif interval == "3mo":
last_rows_same_interval = dt1.year == dt2.year and dt1.quarter == dt2.quarter
else:
last_rows_same_interval = (dt1-dt2) < _pd.Timedelta(interval)
last_rows_same_interval = (dt1 - dt2) < _pd.Timedelta(interval)
if last_rows_same_interval:
# Last two rows are within same interval
@ -680,12 +673,12 @@ def safe_merge_dfs(df_main, df_sub, interval):
df_main = df_main.drop('_date', axis=1)
df_sub = df_sub.drop('_date', axis=1)
else:
indices = _np.searchsorted(_np.append(df_main.index, df_main.index[-1]+td), df_sub.index, side='right')
indices = _np.searchsorted(_np.append(df_main.index, df_main.index[-1] + td), df_sub.index, side='right')
indices -= 1 # Convert from [[i-1], [i]) to [[i], [i+1])
# Numpy.searchsorted does not handle out-of-range well, so handle manually:
for i in range(len(df_sub.index)):
dt = df_sub.index[i]
if dt < df_main.index[0] or dt >= df_main.index[-1]+td:
if dt < df_main.index[0] or dt >= df_main.index[-1] + td:
# Out-of-range
indices[i] = -1
@ -707,7 +700,7 @@ def safe_merge_dfs(df_main, df_sub, interval):
next_interval_end_dt = next_interval_start_dt + td
for i in _np.where(f_outOfRange)[0]:
dt = df_sub.index[i]
if dt >= next_interval_start_dt and dt < next_interval_end_dt:
if next_interval_start_dt <= dt < next_interval_end_dt:
new_dt = next_interval_start_dt
get_yf_logger().debug(f"Adding out-of-range {data_col} @ {dt.date()} in new prices row of NaNs")
empty_row = _pd.DataFrame(data=empty_row_data, index=[dt])
@ -715,12 +708,12 @@ def safe_merge_dfs(df_main, df_sub, interval):
df_main = df_main.sort_index()
# Re-calculate indices
indices = _np.searchsorted(_np.append(df_main.index, df_main.index[-1]+td), df_sub.index, side='right')
indices = _np.searchsorted(_np.append(df_main.index, df_main.index[-1] + td), df_sub.index, side='right')
indices -= 1 # Convert from [[i-1], [i]) to [[i], [i+1])
# Numpy.searchsorted does not handle out-of-range well, so handle manually:
for i in range(len(df_sub.index)):
dt = df_sub.index[i]
if dt < df_main.index[0] or dt >= df_main.index[-1]+td:
if dt < df_main.index[0] or dt >= df_main.index[-1] + td:
# Out-of-range
indices[i] = -1
@ -749,10 +742,11 @@ def safe_merge_dfs(df_main, df_sub, interval):
df = df.groupby("_NewIndex").prod()
df.index.name = None
else:
raise Exception("New index contains duplicates but unsure how to aggregate for '{}'".format(data_col_name))
raise Exception(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
new_index = df_main.index[indices]
df_sub = _reindex_events(df_sub, new_index, data_col)
@ -811,7 +805,7 @@ def format_history_metadata(md, tradingPeriodsOnly=True):
if "tradingPeriods" in md:
tps = md["tradingPeriods"]
if tps == {"pre":[], "post":[]}:
if tps == {"pre": [], "post": []}:
# Ignore
pass
elif isinstance(tps, (list, dict)):
@ -827,8 +821,8 @@ def format_history_metadata(md, tradingPeriodsOnly=True):
post_df = _pd.DataFrame.from_records(_np.hstack(tps["post"]))
regular_df = _pd.DataFrame.from_records(_np.hstack(tps["regular"]))
pre_df = pre_df.rename(columns={"start":"pre_start", "end":"pre_end"}).drop(["timezone", "gmtoffset"], axis=1)
post_df = post_df.rename(columns={"start":"post_start", "end":"post_end"}).drop(["timezone", "gmtoffset"], axis=1)
pre_df = pre_df.rename(columns={"start": "pre_start", "end": "pre_end"}).drop(["timezone", "gmtoffset"], axis=1)
post_df = post_df.rename(columns={"start": "post_start", "end": "post_end"}).drop(["timezone", "gmtoffset"], axis=1)
regular_df = regular_df.drop(["timezone", "gmtoffset"], axis=1)
cols = ["pre_start", "pre_end", "start", "end", "post_start", "post_end"]
@ -845,6 +839,7 @@ def format_history_metadata(md, tradingPeriodsOnly=True):
return md
class ProgressBar:
def __init__(self, iterations, text='completed'):
self.text = text
@ -877,19 +872,16 @@ class ProgressBar:
def update_iteration(self, val=None):
val = val if val is not None else self.elapsed / float(self.iterations)
self.__update_amount(val * 100.0)
self.prog_bar += ' %s of %s %s' % (
self.elapsed, self.iterations, self.text)
self.prog_bar += f" {self.elapsed} of {self.iterations} {self.text}"
def __update_amount(self, new_amount):
percent_done = int(round((new_amount / 100.0) * 100.0))
all_full = self.width - 2
num_hashes = int(round((percent_done / 100.0) * all_full))
self.prog_bar = '[' + self.fill_char * \
num_hashes + ' ' * (all_full - num_hashes) + ']'
self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']'
pct_place = (len(self.prog_bar) // 2) - len(str(percent_done))
pct_string = '%d%%' % percent_done
self.prog_bar = self.prog_bar[0:pct_place] + \
(pct_string + self.prog_bar[pct_place + len(pct_string):])
pct_string = f'{percent_done}%%'
self.prog_bar = self.prog_bar[0:pct_place] + (pct_string + self.prog_bar[pct_place + len(pct_string):])
def __str__(self):
return str(self.prog_bar)
@ -900,7 +892,7 @@ class ProgressBar:
# ---------------------------------
class _KVStore:
"""Simpel Sqlite backed key/value store, key and value are strings. Should be thread safe."""
"""Simple Sqlite backed key/value store, key and value are strings. Should be thread safe."""
def __init__(self, filename):
self._cache_mutex = Lock()
@ -967,8 +959,7 @@ class _TzCache:
try:
self._tz_db = _KVStore(_os.path.join(self._db_dir, "tkr-tz.db"))
except _sqlite3.DatabaseError as err:
raise _TzCacheException("Error creating TzCache folder: '{}' reason: {}"
.format(self._db_dir, err))
raise _TzCacheException(f"Error creating TzCache folder: '{self._db_dir}' reason: {err}")
self._migrate_cache_tkr_tz()
def _setup_cache_folder(self):
@ -976,12 +967,10 @@ class _TzCache:
try:
_os.makedirs(self._db_dir)
except OSError as err:
raise _TzCacheException("Error creating TzCache folder: '{}' reason: {}"
.format(self._db_dir, err))
raise _TzCacheException(f"Error creating TzCache folder: '{self._db_dir}' reason: {err}")
elif not (_os.access(self._db_dir, _os.R_OK) and _os.access(self._db_dir, _os.W_OK)):
raise _TzCacheException("Cannot read and write in TzCache folder: '{}'"
.format(self._db_dir, ))
raise _TzCacheException(f"Cannot read and write in TzCache folder: '{self._db_dir}'")
def lookup(self, tkr):
return self.tz_db.get(tkr)
@ -1022,7 +1011,7 @@ class _TzCache:
else:
# Discard corrupt data:
df = df[~df["Tz"].isna().to_numpy()]
df = df[~(df["Tz"]=='').to_numpy()]
df = df[~(df["Tz"] == '').to_numpy()]
df = df[~df.index.isna()]
if not df.empty:
try:
@ -1061,10 +1050,9 @@ def get_tz_cache():
try:
_tz_cache = _TzCache()
except _TzCacheException as err:
get_yf_logger().info("Failed to create TzCache, reason: %s. "
"TzCache will not be used. "
"Tip: You can direct cache to use a different location with 'set_tz_cache_location(mylocation)'",
err)
get_yf_logger().info(f"Failed to create TzCache, reason: {err}. "
"TzCache will not be used. "
"Tip: You can direct cache to use a different location with 'set_tz_cache_location(mylocation)'")
_tz_cache = _TzCacheDummy()
return _tz_cache