Jo, jag använder Yahoo Finance, specifikt Python-biblioteket yfinance. Tyvärr fick jag som sagt problem då jag skulle ladda hem USDSEK, så då fick jag försöka ta den via Riksbankens API istället. Efter mycket trial and error så lyckades jag till sist ladda hem USDSEK från Riksbanken.
import yfinance as yf import pandas as pd import matplotlib.pyplot as plt from datetime import datetime, timedelta # Datumintervall – senaste 365 dagar end_date = datetime.today() start_date = end_date - timedelta(days=365) # Hämta data med auto_adjust=False för tydlighet btc = yf.download("BTC-USD", start=start_date, end=end_date, auto_adjust=False) acwi = yf.download("ACWI", start=start_date, end=end_date, auto_adjust=False)
Tillägg: Nu har jag även lyckats ladda hem USDSEK med yfinance, samt plotta USDSEK i samma graf som BTC-USC och MSCI ACWI. Det går lite lättare när man är någorlunda utvilad på morgonen, istället för att försöka sitta och trilskas till sent in på nätterna.
usdsek = yf.download("SEK=X", start=start_date, end=end_date, auto_adjust=False) # USD/SEK
Tillägg 2: Så där ja. Nu börjar det likna nåt.
Nästa grej är att jag vill beräkna volatiliteten för de fem olika kurvorna, samt göra en volatilitetsviktning mellan Bitcoin i SEK samt MSCI ACWI i SEK.
Tillägg 3: Nu även med volatilitet.
Nedan är Python-koden, för den som är intresserad av vad som händer “under huven”, eller för den som vill bygga vidare på koden.
källkod
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta
# Datumintervall – senaste 365 dagar
end_date = datetime.today()
start_date = end_date - timedelta(days=365)
# Hämta data: BTC i USD, ACWI i USD, och USD/SEK-växelkurs
btc = yf.download("BTC-USD", start=start_date, end=end_date, auto_adjust=False)
print("BTC-USD loaded:", not btc.empty)
acwi = yf.download("ACWI", start=start_date, end=end_date, auto_adjust=False)
print("ACWI loaded:", not acwi.empty)
usdsek = yf.download("SEK=X", start=start_date, end=end_date, auto_adjust=False) # USD/SEK
print("USD/SEK loaded:", not usdsek.empty)
# Säker extraktion av 'Close' även om vi får en DataFrame med MultiIndex (efter nya yfinance-versioner)
if isinstance(btc.columns, pd.MultiIndex):
btc_close = btc.loc[:, ("Close", "BTC-USD")]
else:
btc_close = btc["Close"]
if isinstance(acwi.columns, pd.MultiIndex):
acwi_close = acwi.loc[:, ("Close", "ACWI")]
else:
acwi_close = acwi["Close"]
if isinstance(usdsek.columns, pd.MultiIndex):
usdsek_close = usdsek.loc[:, ("Close", "SEK=X")]
else:
usdsek_close = usdsek["Close"]
# Byt namn på serierna
btc_close.name = "BTC"
acwi_close.name = "ACWI"
usdsek_close.name = "USDSEK"
# Kombinera dem i en gemensam DataFrame
df = pd.concat([btc_close, acwi_close, usdsek_close], axis=1)
# Ta bort alla rader där någon av dem saknas (t.ex. helgdagar eller stängd börs)
df.dropna(inplace=True)
# Kontroll om DataFrame blev tom efter sammanslagningen
if df.empty:
raise ValueError("Inga gemensamma datum – datan kan vara tom eller sakna överlapp.")
# Indexera utvecklingen (börja från 100)
df["BTC_pct"] = (df["BTC"] / df["BTC"].iloc[0]) * 100
df["ACWI_pct"] = (df["ACWI"] / df["ACWI"].iloc[0]) * 100
df["USDSEK_pct"] = (df["USDSEK"] / df["USDSEK"].iloc[0]) * 100
# Omräkna BTC och ACWI till SEK
df["BTC_SEK"] = df["BTC"] * df["USDSEK"]
df["ACWI_SEK"] = df["ACWI"] * df["USDSEK"]
# Indexera även utveckling i SEK
df["BTC_SEK_pct"] = (df["BTC_SEK"] / df["BTC_SEK"].iloc[0]) * 100
df["ACWI_SEK_pct"] = (df["ACWI_SEK"] / df["ACWI_SEK"].iloc[0]) * 100
# Beräkna dagliga logaritmiska avkastningar
log_returns = np.log(df[["BTC", "ACWI", "USDSEK", "BTC_SEK", "ACWI_SEK"]] / df[["BTC", "ACWI", "USDSEK", "BTC_SEK", "ACWI_SEK"]].shift(1))
# Beräkna årlig volatilitet (standardavvikelse * sqrt(252))
volatility = log_returns.std() * np.sqrt(252)
# Konvertera till procent, t.ex. 0.25 → 25.0%
volatility_pct = (volatility * 100).round(2)
# Plot
plt.figure(figsize=(12, 6))
plt.plot(df.index, df["BTC_pct"], label="Bitcoin (BTC) i USD", color="orange")
plt.plot(df.index, df["ACWI_pct"], label="MSCI ACWI (ACWI) i USD", color="blue")
plt.plot(df.index, df["USDSEK_pct"], label="USD/SEK", color="green", linestyle="--")
plt.plot(df.index, df["BTC_SEK_pct"], label="Bitcoin i SEK", color="red", linestyle=":")
plt.plot(df.index, df["ACWI_SEK_pct"], label="MSCI ACWI i SEK", color="purple", linestyle=":")
plt.title("Indexerad utveckling och volatilitet senaste året")
plt.xlabel("Datum")
plt.ylabel("Indexerad utveckling (start = 100)")
plt.legend()
plt.grid(True)
plt.tight_layout()
# Lägg till textetiketter i slutet av varje kurva med volatilitet (%)
last_date = df.index[-1]
offset = 1 # vertikal justering
plt.text(last_date, df["BTC_pct"].iloc[-1] + offset, f"Vol: {volatility_pct['BTC']}%", color="orange")
plt.text(last_date, df["ACWI_pct"].iloc[-1] + offset, f"Vol: {volatility_pct['ACWI']}%", color="blue")
plt.text(last_date, df["USDSEK_pct"].iloc[-1] + offset, f"Vol: {volatility_pct['USDSEK']}%", color="green")
plt.text(last_date, df["BTC_SEK_pct"].iloc[-1] + offset, f"Vol: {volatility_pct['BTC_SEK']}%", color="red")
plt.text(last_date, df["ACWI_SEK_pct"].iloc[-1] + offset, f"Vol: {volatility_pct['ACWI_SEK']}%", color="purple")
plt.show()


