如何用Python、pandas、yfinance自动转货币为USD并修改图例标签
解决方案:股票指数图表优化与货币转换
一、替换图例为易读的指数名称
你可以先创建一个代码-指数名称的映射字典,通过重命名DataFrame的列名,让绘图时自动显示易读的图例名称,不用手动在plt.plot里逐个指定标签。
修改步骤:
- 定义映射字典,把每个指数代码对应到官方名称
- 用
rename方法修改data['Close']的列名
修改后的核心代码片段:
# 定义指数代码与名称的映射 symbol_names = { '^FTSE': 'FTSE 100 Index (UK)', '^GDAXI': 'DAX Index (Germany)', '^FCHI': 'CAC 40 Index (France)', '^STOXX50E': 'Euro Stoxx 50 Index', '^N100': 'Euronext 100 Index', '^BFX': 'Belgium 20 Index' } # 重命名Close列的标签 data['Close'] = data['Close'].rename(columns=symbol_names) # 绘图时直接用重命名后的列,图例自动显示新名称 plt.figure(figsize=(20,10)) plt.plot(data.index, data['Close']) plt.xlabel("日期") plt.ylabel("价格(原货币)") plt.title("欧洲股指 2000/1/1 - 2023/1/31") plt.legend() plt.show()
二、自动转换指数价格为美元
没有现成的一键转换工具,需要手动配置汇率数据来实现自动转换。核心思路是获取对应货币对的历史汇率,将指数价格乘以同期汇率转换为美元。
具体操作:
- 获取英镑兑美元(
GBPUSD=X)和欧元兑美元(EURUSD=X)的历史汇率数据 - 将汇率数据与股指数据按日期对齐
- FTSE指数用英镑汇率转换,其他欧元计价的指数用欧元汇率转换
完整整合代码:
from pandas_datareader import data as pdr import yfinance as yf import matplotlib.pyplot as plt from datetime import datetime yf.pdr_override() # 股指代码和汇率代码 y_symbols = ['^FTSE', '^GDAXI', '^FCHI', '^STOXX50E','^N100', '^BFX'] fx_symbols = ['GBPUSD=X', 'EURUSD=X'] startdate = datetime(2000,1,1) enddate = datetime(2023,1,31) # 获取股指数据 data = pdr.get_data_yahoo(y_symbols, start=startdate, end=enddate) # 获取汇率数据并填充缺失值 fx_data = pdr.get_data_yahoo(fx_symbols, start=startdate, end=enddate)['Close'] fx_data = fx_data.ffill() # 定义指数名称映射(添加USD标识) symbol_names = { '^FTSE': 'FTSE 100 Index (USD)', '^GDAXI': 'DAX Index (USD)', '^FCHI': 'CAC 40 Index (USD)', '^STOXX50E': 'Euro Stoxx 50 Index (USD)', '^N100': 'Euronext 100 Index (USD)', '^BFX': 'Belgium 20 Index (USD)' } data['Close'] = data['Close'].rename(columns=symbol_names) # 转换货币:FTSE用GBPUSD汇率,其余用EURUSD汇率 data_usd = data['Close'].copy() data_usd['FTSE 100 Index (USD)'] *= fx_data['GBPUSD=X'] # 遍历处理欧元计价指数 euro_indices = list(symbol_names.values())[1:] for idx in euro_indices: data_usd[idx] *= fx_data['EURUSD=X'] # 绘制美元计价的股指图表 plt.figure(figsize=(20,10)) plt.plot(data.index, data_usd) plt.xlabel("日期") plt.ylabel("价格(美元)") plt.title("欧洲股指(美元计价)2000/1/1 - 2023/1/31") plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

