使用 Python 将雅虎财经的历史股价转换为不同的货币

如何解决使用 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。

理想的情况是拥有一个仅包含日期和股票价格(以欧元计)的新数据框。

解决方法

对于这种情况,我们可以

  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,axis=0)

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-