我使用以下代码将从雅虎财经获取的每日 OHLC 数据重新采样为每周数据:
import pandas as pd
import yfinance as yf
ticker = yf.Ticker('AAPL')
daily_data = ticker.history(start='2024-04-01', end='2024-05-03', interval='1d')
weekly_data = daily_data.resample('W-Sat').agg({
'Open': 'first',
'High': 'max',
'Low': 'min',
'Close': 'last',
'Volume': 'sum'
}).shift(-1).dropna()
代码有效,每周数据与雅虎财经每周数据相匹配,可通过以下方式获取:
ticker = yf.Ticker('AAPL')
yahoo_weekly_data = ticker.history(
start='2024-04-01', end='2024-05-03', interval='1w')
但是我不明白为什么我必须使用
shift(-1)
才能获得正确的数据。我认为你不应该
shift
。这会让你丢失一行数据。
如果仔细比较输出(没有
shift
):
weekly_data = daily_data.resample('W-Sat').agg({
'Open': 'first',
'High': 'max',
'Low': 'min',
'Close': 'last',
'Volume': 'sum'
})
Open High Low Close Volume
Date
2024-04-06 00:00:00-04:00 171.190002 171.919998 168.229996 169.580002 239021300
2024-04-13 00:00:00-04:00 169.029999 178.360001 167.110001 176.550003 322249600
2024-04-20 00:00:00-04:00 175.360001 176.630005 164.080002 165.000000 309039200
2024-04-27 00:00:00-04:00 165.520004 171.339996 164.770004 169.300003 241302700
2024-05-04 00:00:00-04:00 173.369995 176.029999 169.110001 173.029999 277367900
ticker = yf.Ticker('AAPL')
yahoo_weekly_data = ticker.history(
start='2024-04-01', end='2024-05-03', interval='1wk')
Open High Low Close Volume Dividends Stock Splits
Date
2024-04-01 00:00:00-04:00 171.190002 171.919998 168.229996 169.580002 239021300 0.0 0.0
2024-04-08 00:00:00-04:00 169.029999 178.360001 167.110001 176.550003 322249600 0.0 0.0
2024-04-15 00:00:00-04:00 175.360001 176.630005 164.080002 165.000000 309039200 0.0 0.0
2024-04-22 00:00:00-04:00 165.520004 171.339996 164.770004 169.300003 241302700 0.0 0.0
2024-04-29 00:00:00-04:00 173.369995 176.029999 169.110001 173.029999 277367900 0.0 0.0
值相同,但标签有点不同。
对于
resample
,默认情况下这是右边界,对于 yfinance,这似乎是一周中的星期一。
要获得相同的输出,您可以使用:
weekly_data = daily_data.resample('W-Mon', closed='left', label='left').agg({
'Open': 'first',
'High': 'max',
'Low': 'min',
'Close': 'last',
'Volume': 'sum'
})
Open High Low Close Volume
Date
2024-04-01 00:00:00-04:00 171.190002 171.919998 168.229996 169.580002 239021300
2024-04-08 00:00:00-04:00 169.029999 178.360001 167.110001 176.550003 322249600
2024-04-15 00:00:00-04:00 175.360001 176.630005 164.080002 165.000000 309039200
2024-04-22 00:00:00-04:00 165.520004 171.339996 164.770004 169.300003 241302700
2024-04-29 00:00:00-04:00 173.369995 176.029999 169.110001 173.029999 277367900