簡體   English   中英

使用 Python 將雅虎財經的歷史股票價格轉換為不同的貨幣

[英]Convert historical stock prices from Yahoo finance to a different currency with Python

我正在嘗試將非歐元上市公司的歷史股價調整為歐元。 因此,我想將蘋果的股價轉換為歐元。 我已經刮掉了歷史匯率以及歷史調整后的股價。 我現在有兩個數據框,第一個數據框顯示股票的貨幣和股票價格。 我將多只股票用於我的投資組合。 我通過使用以下代碼來做到這一點:

assets =  ["^AEX", "AAPL", "AZN.L", "AD.AS ", "ASML.AS"]

.

                     ^AEX   AAPL    AZN.L   AD.AS   ASML.AS    idx
                      EUR   USD     GBP     EUR     EUR         currency
2021-02-02 00:00:00 652.87  134.789 51.46   23.54   457.5       NaN
2021-02-03 00:00:00 654.89  133.74  51.42   23.6    457.15      NaN
2021-02-04 00:00:00 654.38  137.185 50.84   23.46   459.55      NaN
2021-02-05 00:00:00 653.24  136.76  51      23.35   460         NaN
2021-02-08 00:00:00 656.39  135.942 51.48   23.3    467.1       NaN 

第二個數據框顯示了歷史匯率數據。

       Currency code    Currency name   Units per EUR   EUR per Unit    Date
0   0   USD             US Dollar       1.320339        0.757381    2021-02-03
1   1   EUR             Euro            1.000000        1.000000    2021-02-03
2   2   GBP             British Pound   0.812044        1.231461    2021-02-03
3   3   INR             Indian Rupee    72.359647       0.013820    2021-02-03
4   4   AUD             Australian Dollar 1.269889      0.787470    2021-02-03

現在的想法是合並兩個框架,並以歐元顯示股票價格。 我認為我們必須將兩個日期都放在合並的數據框中。

我們需要一個 for 循環來識別股票是否不是歐元,搜索日期匹配,搜索貨幣代碼匹配,如果貨幣代碼是美元,則乘以股票 * 0.757381(如果數據框 1) 中的庫存日期為 2012-02-03。

如果股票是歐元,我們可以乘*1。 例如,如果股票價格以英鎊為單位,則乘以 *1.231461。

理想的情況是有一個新的數據框,其中只有日期和歐元股票價格。

對於這樣的情況,我們可以

  1. 分別獲取股票價格和匯率后合並
  2. 在獲取股票價格的同時獲取匯率並將其存儲在數據框中。

這些方法可能會有所不同,具體取決於要收購的股票和貨幣的數量以及要涵蓋的時期。 我采取的方法是后一種,股票價格和匯率是在獲取時獲取和存儲的。

原因是過去的匯率沒有變化,所以在獲取時獲取匯率並轉換為基准匯率。 我們相信這種效果將減少代碼量,數據的唯一重用將是提取。

import yfinance as yf
import pandas as pd
import numpy as np

start = '2020-07-01'
end = '2021-01-01'

rates = ['USDEUR=X', 'GBPEUR=X']
tickers = yf.Tickers(' '.join(rates))

exchange_rates = []
for i in tickers.tickers:
    exchange_rates.append(tickers.tickers[i].history(start=start, end=end).Close)

ex_df = pd.DataFrame(exchange_rates).T
ex_df.columns = rates
ex_df['EUREUR=X'] = 1.0

assets = {'^AEX':'EUR', 'AAPL':'USD', 'AZN.L':'GBP', 'AD.AS':'EUR', 'ASML.AS':'EUR'}

stock_df = pd.DataFrame()
for k,v in assets.items():
    data = yf.download(k, start=start, end=end, progress=False).Close.to_frame()
    data['ticker'] = k
    if v[:3] == 'EUR':
        data['rating'] = ex_df['EUREUR=X']
        data['price'] = data['Close'] / data['rating'] 
    elif v[:3] == 'USD':
        data['rating'] = ex_df['USDEUR=X']
        data['price'] = data['Close'] / data['rating'] 
    elif v[:3] == 'GBP':
        data['rating'] = ex_df['GBPEUR=X']
        data['price'] = data['Close'] / data['rating'] 
    else:
        data['rating'] = np.NaN
        data['price'] = np.NaN
stock_df = pd.concat([stock_df, data], axis=0)

stock_df
    Close   ticker  rating  price
Date                
2020-06-30  559.729980  ^AEX    1.0     559.729980
2020-07-01  562.669983  ^AEX    1.0     562.669983
2020-07-02  570.750000  ^AEX    1.0     570.750000
2020-07-03  568.630005  ^AEX    1.0     568.630005
2020-07-06  578.520020  ^AEX    1.0     578.520020
...     ...     ...     ...     ...
2020-12-24  393.500000  ASML.AS     1.0     393.500000
2020-12-28  396.850006  ASML.AS     1.0     396.850006
2020-12-29  396.299988  ASML.AS     1.0     396.299988
2020-12-30  398.500000  ASML.AS     1.0     398.500000
2020-12-31  397.549988  ASML.AS     1.0     397.549988

stock_df.loc[stock_df['ticker'] == 'AAPL'].head()

    Close   ticker  rating  price

    Close   ticker  rating  price
Date                
2020-06-30  91.199997   AAPL    0.88911     102.574478
2020-07-01  91.027496   AAPL    0.89000     102.278087
2020-07-02  91.027496   AAPL    0.88878     102.418480
2020-07-06  93.462502   AAPL    0.88911     105.119162
2020-07-07  93.172501   AAPL    0.88395     105.404719

上一個答案在代碼中有一個錯誤。

這一行:

stock_df = pd.concat([stock_df, data], axis=0)

應該縮進到與 if 和 elif 語句相同的級別,否則最后一個循環的結果總是會覆蓋前一個循環。

編輯2:答案中的另一個問題是匯率應該乘以原始貨幣的價格而不是除以......換句話說,循環應該這樣做:

data['price'] = data['Close'] * data['rating']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM