-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathyahoo-finance.py
75 lines (53 loc) · 2.48 KB
/
yahoo-finance.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python3
import argparse
import sys
from datetime import timedelta
from datetime import datetime as dt
from dateutil import parser as dup
import yfinance as yf
import pandas as pd
def is_aware(d: dt):
'''
Returns true if the datetime object `d` is timezone-aware, false otherwise.
See https://docs.python.org/3/library/datetime.html#determining-if-an-object-is-aware-or-naive
'''
return d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
def main(argv=None):
if argv is None:
argv = sys.argv
parser = argparse.ArgumentParser(
description='Yahoo Finance OHLCV data downloader')
parser.add_argument('symbol', metavar='SYMBOL', type=str,
help='Ticker symbol (example: ^GSPC)')
parser.add_argument('-i', '--interval', type=str, default='1d',
help='Length of time each candle represents '
'(default: 1d)')
parser.add_argument('-d', '--dt-start', type=lambda x: dup.parse(x),
default=dt.now().astimezone() - timedelta(days=30),
help='Start date and time (default: 30 days ago)')
parser.add_argument('-D', '--dt-end', type=lambda x: dup.parse(x),
default=dt.now().astimezone(),
help='End date and time (default: now)')
parser.add_argument('-f', '--format', type=str, default='',
help='If specified, formats the float values (such as '
'the asset prices) with this format string '
'(e.g. "{:.6f}")')
args = parser.parse_args(argv[1:])
if not is_aware(args.dt_start):
args.dt_start = args.dt_start.astimezone()
if not is_aware(args.dt_end):
args.dt_end = args.dt_end.astimezone()
############################################################################
print(f'Fetching {args.symbol} with yfinance', file=sys.stderr)
# Equivalent of
# https://query1.finance.yahoo.com/v8/finance/chart/...?interval=...&period1=...&period2=...
# See https://finance.yahoo.com/quote/.../history
data: pd.DataFrame = yf.download(
args.symbol, args.dt_start, args.dt_end, interval=args.interval)
if args.format != '':
data = data.apply(lambda col: col.map(
lambda x: args.format.format(x) if isinstance(x, float) else x))
data.to_csv(sys.stdout, lineterminator='\n')
return 0
if __name__ == '__main__':
sys.exit(main())