使用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