I can't answer your question directly, but maybe I can help? I struggled for a long time reliably getting stock quotes. Finally I settled on using
https://www.tiingo.com/. You have to register (it's free) to get an API key, but then you can programmatically pull down data. I just grab end-of-day prices for tickers I'm interested in and the following scripts creates a *.qif file I then import into KMyMoney.
I manually edit startDate and endDate each time before running. This is get_stock_prices.py:
Code:
#!/usr/bin/env python3
from get_tiingo_quotes import get_data
from datetime import date
import requests
import re
import csv
startDate = date(2022, 11, 22)
endDate = date(2022, 12, 27)
symbols = [
'BND',
'BNDX',
'IXUS',
'SCHB',
'VTI',
'VXUS',
'VTIAX',
'VTSAX',
]
with open('import.qif', 'w') as file:
file.write('!Type:Prices\n')
for symbol in symbols:
# Get data
data = get_data(symbol, startDate, endDate)
for i in range(0, len(data)):
date = data[i]['date'][0:10]
price = data[i]['close']
with open('import.qif', 'a') as file:
file.write('"%s",%.4f,"%s"\n' % (symbol, price, date))
with open('import.qif', 'a') as file:
file.write('^\n')
And it relies on get_tiingo_quotes.py:
Code:
#!/usr/bin/env python3
import requests
api_key = "<your_api_key>"
def get_data(symbol, start_date, end_date):
from datetime import date
headers = {
'Content-Type': 'application/json'
}
if end_date == date.today():
end_date_str = ""
else:
end_date_str = "&endDate=%s" % end_date.isoformat()
url = "https://api.tiingo.com/tiingo/daily/%s/prices?startDate=%s%s&token=%s" % (symbol, start_date.isoformat(), end_date_str, api_key)
requestResponse = requests.get(url, headers=headers)
return requestResponse.json()
if __name__ == '__main__':
import sys
from datetime import date, timedelta
end_date = date.today()
start_date = end_date - timedelta(days=10)
if len(sys.argv) == 1:
print("\nUsage: get_tiingo_quotes.py SYMBOL [SYMBOL...]\n\n")
else:
for i in range(1, len(sys.argv)):
symbol = sys.argv[i]
print("---------------------------------------------")
print("Getting %s" % (symbol))
results = get_data(symbol, start_date, end_date)
print(results)