yahoo finance python中的错误规模

2024-04-27 14:03:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用雅虎金融下载一些共同基金和ETF的历史价格。我认为雅虎财经有一个错误,它混淆了价格的规模(我不认为这是一个分裂的问题。见下图)

无论如何,这里有一个MWE来重现问题

import yfinance as yf
import pandas as pd 
from pandas_datareader import data as pdr
yf.pdr_override()

tickers = ["0P0001FE43.L", "0P00014IJX.L", "SGLN.L"]

start_date = "2019-01-01" 
today      = "2021-04-27"

def getData(ticker):
        #print (ticker)
        data = pdr.get_data_yahoo(ticker, start=start_date, end=today)
        data["yahoo_ticker"] = ticker
        files.append(data)

files=[]
for tik in tickers:
    getData(tik)

df = pd.concat(files)
df = df[ [ "Adj Close", "yahoo_ticker"]]

仔细观察调整后的价格可以发现:

enter image description here

enter image description here

enter image description here

我想不出任何有系统的方法来纠正这个问题,所以如果有任何帮助,我将不胜感激


Tags: importpandasdfdatadateas价格files
3条回答

为了捕捉和修复一天内的事件,我通常会检查一天内的巨大差距。类似这样的东西,将每次收盘与上一次和下一次收盘进行比较,应该可以解决1/100或1*100问题,但没有任何东西阻止您设置另一个阈值或同时使用多个阈值。当历史序列中的差距是由于管理不善造成的时,多重比较可以避免更正

代码

fixed = [l[0]]

i = 1

while i < len(l) -1:
        
    p = l[i] / l[i-1]
    n = l[i+1] / l[i]

    if p < 0.1 and n >= 100:
        fixed.append(l[i] * 100)      
    elif p >= 100 and n < 0.1:
        fixed.append(round(l[i] / 100, 5))
    else:
        fixed.append(l[i])
    
    i += 1
            
# Last value
        
p =  fixed[-1] / l[-1]

if p >= 100:
    fixed.append(l[i] * 100)      
elif p < 0.1:
    fixed.append(round(l[i] / 100, 5))
else:
    fixed.append(l[i])

输出

l = [171.062, 1.71945, 172.901, 172.184]
[171.062, 171.945, 172.901, 172.184]

l = [1.71062, 1.71945, 172.901, 1.72184]
[1.71062, 1.71945, 1.72901, 1.72184]

虽然这是可行的,但如果你可以下载所有(调整后的)OHLC字段(我使用Bloomberg Professional作为数据提供商,我不知道Yahoo是否支持),你应该始终将它们相互比较,而不是只比较前一个和下一个的收盘价。这将是一种更稳健的方法,同时你也可以检查O和C是否在H-L范围内,以及其他更常见但微妙的错误

我找到了另一个解决方案,我认为它应该比我的另一个答案更可靠。这并不是针对整个历史,而是针对50倍或更大的单日跳变,这永远不会“自然”发生

import yfinance as yf
import pandas as pd
from pandas_datareader import data as pdr
yf.pdr_override()

tickers = ["0P0001FE43.L", "0P00014IJX.L", "SGLN.L"]

start_date = "2019-01-01"
today      = "2021-04-27"

def getData(ticker):
    data = pdr.get_data_yahoo(ticker, start=start_date, end=today)
    data["yahoo_ticker"] = ticker
    # fix faulty yahoo data that jumps 100x
    jumps_up   = data['Adj Close'] / data['Adj Close'].shift() >  50
    jumps_down = data['Adj Close'] / data['Adj Close'].shift() < .02
    correction_factor = 100.**(jumps_down.cumsum() - jumps_up.cumsum())
    data['Adj Close'] *= correction_factor
    print(f"Fixed {sum(correction_factor != 1)}/{len(data)} for ticker {ticker}"
          f" (min: {data['Adj Close'].min()}, max: {data['Adj Close'].max()})")
    return data

df = pd.concat([getData(tik) for tik in tickers])
df = df[["Adj Close", "yahoo_ticker"]]
print(df)
Fixed 5/587 for ticker 0P0001FE43.L (min: 97.52300262451172, max: 174.1580047607422)
Fixed 1/587 for ticker 0P00014IJX.L (min: 169.8939971923828, max: 376.5379943847656)
Fixed 288/586 for ticker SGLN.L (min: 2195.0, max: 3388.9999389648438)

我查看了SGLN。我很快只看到了雅虎的财务页面,而且数据一致。我不是一个市场专家,所以我不能说这里发生了什么,但这些数据似乎是相符的。此外,在这段时间内,音量的上升/下降变得更加不稳定,因此可能与此有关

ScreenShot from Yahoo Finance

相关问题 更多 >