如何解决使用 Python 将雅虎财经的历史股价转换为不同的货币
我正在尝试将非欧元上市公司的历史股价调整为欧元。因此,我想将 Apple 的股价转换为欧元。我已经刮掉了历史汇率以及历史调整后的股票价格。我现在有两个数据框,第一个数据框显示股票的货币和股票价格。我在我的投资组合中使用了多只股票。我这样做是通过使用以下代码:
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。
理想的情况是拥有一个仅包含日期和股票价格(以欧元计)的新数据框。
解决方法
对于这种情况,我们可以
- 单独获取后合并股价和汇率
- 在获取股票价格的同时获取汇率并将其存储在数据框中。
这些方法可能因要收购的股票和货币的数量以及涵盖的时期而异。 我采用的方式是后一种,在获取时获取并存储股票价格和汇率。
原因是汇率在过去没有变化,所以在获取时获取汇率并转换为基准汇率。我们相信这种效果将减少代码量,数据的唯一重用将是提取。
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,axis=0)
应该与 if 和 elif 语句缩进到同一级别,否则最后一个循环的结果总是会覆盖前一个。
编辑 2: 答案中的另一个问题是汇率应该乘以原始货币的价格而不是除以......换句话说,循环应该这样做:
data['price'] = data['Close'] * data['rating']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。