Nordnet har opdateret deres loginprocedure, så her er et dugfrist program til at hente kurser hos Nordnet – eller Morningstar, hvis Nordnet skulle fejle:
# -*- coding: utf-8 -*-
# Author: Morten Helmstedt. E-mail: helmstedt@gmail.com
""" This program extracts historical stock prices from Nordnet (and Morningstar as a fallback) """
import requests
from datetime import datetime
from datetime import date
# Nordnet user account credentials
user = ''
password = ''
# DATE AND STOCK DATA. SHOULD BE EDITED FOR YOUR NEEDS #
# Start date (start of historical price period)
startdate = '2013-01-01'
# List of shares to look up prices for.
# Format is: Name, Morningstar id, Nordnet stock identifier
# See e.g. https://www.nordnet.dk/markedet/aktiekurser/16256554-novo-nordisk-b
# (identifier is 16256554)
# All shares must have a name (whatever you like). To get prices they must
# either have a Nordnet identifier or a Morningstar id
sharelist = [
["Maj Invest Danske Obligationer","F0GBR064UX",16099874],
["Novo Nordisk B A/S","0P0000A5BQ",16256554],
]
# A variable to store historical prices before saving to csv
finalresult = ""
finalresult += '"date";"price";"instrument"' + '\n'
# LOGIN TO NORDNET #
session = requests.Session()
# Setting cookies prior to login by visiting login page
url = 'https://www.nordnet.dk/logind'
request = session.get(url)
# Update headers for login
session.headers['client-id'] = 'NEXT'
session.headers['sub-client-id'] = 'NEXT'
# Actual login
url = 'https://www.nordnet.dk/api/2/authentication/basic/login'
request = session.post(url, data = {'username': user, 'password': password})
# LOOPS TO REQUEST HISTORICAL PRICES AT NORDNET AND MORNINGSTAR #
# Nordnet loop to get historical prices
nordnet_fail = []
for share in sharelist:
# Nordnet stock identifier and market number must both exist
if share[2]:
url = "https://www.nordnet.dk/api/2/instruments/historical/prices/" + str(share[2])
payload = {"from": startdate, "fields": "last"}
data = session.get(url, params=payload)
jsondecode = data.json()
# Sometimes the final date is returned twice. A list is created to check for duplicates.
datelist = []
if jsondecode[0]['prices']:
try:
for value in jsondecode[0]['prices']:
if 'last' in value:
price = str(value['last'])
elif 'close_nav' in value:
price = str(value['close_nav'])
price = price.replace(".",",")
date = datetime.fromtimestamp(value['time'] / 1000)
date = datetime.strftime(date, '%Y-%m-%d')
# Only adds a date if it has not been added before
if date not in datelist:
datelist.append(date)
finalresult += '"' + date + '"' + ";" + '"' + price + '"' + ";" + '"' + share[0] + '"' + "\n"
except Exception as error:
print(error)
breakpoint()
# No price data returned! Try another method!
else:
nordnet_fail.append(share)
if nordnet_fail:
print(nordnet_fail)
# Morningstar loop to get historical prices
for share in nordnet_fail:
# Only runs for one specific fund in this instance
payload = {"id": share[1], "currencyId": "DKK", "idtype": "Morningstar", "frequency": "daily", "startDate": startdate, "outputType": "COMPACTJSON"}
data = requests.get("http://tools.morningstar.dk/api/rest.svc/timeseries_price/nen6ere626", params=payload)
jsondecode = data.json()
for lists in jsondecode:
price = str(lists[1])
price = price.replace(".",",")
date = datetime.fromtimestamp(lists[0] / 1000)
date = datetime.strftime(date, '%Y-%m-%d')
finalresult += '"' + date + '"' + ";" + '"' + price + '"' + ";" + '"' + share[0] + '"' + "\n"
# WRITE CSV OUTPUT TO FILE #
with open("kurser.csv", "w", newline='', encoding='utf8') as fout:
fout.write(finalresult)