【问题标题】:Convert historical stock prices from Yahoo finance to a different currency with Python使用 Python 将 Yahoo Finance 的历史股票价格转换为不同的货币
【发布时间】:2021-02-08 18:45:37
【问题描述】:

我正在尝试将非欧元上市公司的历史股价调整为欧元。因此,我想将苹果的股价转换为欧元。我已经刮掉了历史汇率以及历史调整后的股价。我现在有两个数据框,第一个数据框显示股票的货币和股票价格。我将多只股票用于我的投资组合。我通过使用以下代码来做到这一点:

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。

理想的情况是有一个新的数据框,其中只有日期和欧元股票价格。

【问题讨论】:

    标签: python stock price


    【解决方案1】:

    上一个答案代码有bug。

    这一行:

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

    应该缩进到与 if 和 elif 语句相同的级别,否则最后一个循环的结果总是会覆盖前面的。

    编辑 2: 答案中的另一个问题是汇率应该乘以原始货币的价格而不是除以......换句话说,循环应该这样做:

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

    【讨论】:

      【解决方案2】:

      针对这种情况,我们可以

      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
      

      【讨论】:

      • 首先,非常感谢。如何添加调整后的价格数据,以便绘制数据?
      • 这是另一个问题吗?这里建议每个问题一个答案。这是因为在一篇文章中包含多个问题和多个答案对寻找问题解决方案的人没有帮助。接受我的回答并发布一个新问题。
      • 这不是一个完全不同的问题,但我没有提到它。问题将是添加日期以绘制和分析数据。我已经发布了这个问题,我从 2013 年开始更改了期间,我不知道这是否会影响您的代码。
      • 我刚刚检查了新问题并注意到了它。日期被省略了,所以我修复了代码。我认为新问题也需要解决。对于给您带来的不便,我深表歉意。
      • 完全没有问题,唯一剩下的问题是我无法正确绘制数据。是否可以只设置第一列的数据,然后在旁边设置代码的名称?日期 AEX':', 'AAPL''AZN.L':'AD.AS' 'ASML.AS' d 2020-07-01 300 200 200 200 200
      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2020-07-08
      • 2023-01-21
      • 1970-01-01
      • 2018-01-02
      • 2021-12-20
      相关资源
      最近更新 更多