使用Python将历史股价从Yahoo finance转换为其他货币
我试图将非欧元上市公司的历史股价调整为欧元。因此,我想把苹果的股价换算成欧元。我已经计算了历史汇率和历史调整后的股票价格。我现在有两个数据框,第一个数据框显示股票的货币和股票价格。我在投资组合中使用了多种股票。我通过使用以下代码来实现:使用Python将历史股价从Yahoo finance转换为其他货币,python,stock,price,Python,Stock,Price,我试图将非欧元上市公司的历史股价调整为欧元。因此,我想把苹果的股价换算成欧元。我已经计算了历史汇率和历史调整后的股票价格。我现在有两个数据框,第一个数据框显示股票的货币和股票价格。我在投资组合中使用了多种股票。我通过使用以下代码来实现: assets = ["^AEX", "AAPL", "AZN.L", "AD.AS ", "ASML.AS"] 第二个数据框显示历史汇率数据
assets = ["^AEX", "AAPL", "AZN.L", "AD.AS ", "ASML.AS"]
第二个数据框显示历史汇率数据
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
理想的情况是有一个新的数据框架,只包含日期和欧元股票价格。要处理这种情况,我们可以
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
首先,非常感谢。如何添加调整后价格的数据以绘制数据?这是另一个问题吗?这里建议每个问题回答一个问题。这是因为在一篇文章中有多个问题和多个答案对寻求问题解决方案的人没有帮助。接受我的回答,然后发布一个新问题。这不是一个完全不同的问题,但我没有提到它。问题是添加日期,以便绘制和分析数据。我已经发布了一个问题,从2013年起我更改了时间段,我不知道这是否会影响您的代码。我只是检查了新问题并注意到了它。日期被省略了,所以我修改了代码。我认为这个新问题也需要解决。对于给您带来的不便,我深表歉意。没问题,唯一剩下的问题是我无法正确绘制数据。是否可以只设置第一列数据,并在其旁边设置股票代码的名称?日期AEX’:’,‘AAPL’‘AZN.L’:‘AD.AS’ASML.AS’d 2020-07-01 300 200
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