如何从 yfinance 获取特定时间和日期的 1 分钟价格数据?

Posted

技术标签:

【中文标题】如何从 yfinance 获取特定时间和日期的 1 分钟价格数据?【英文标题】:how to get 1 minute price data of a specific time and date from yfinance? 【发布时间】:2021-12-09 17:43:10 【问题描述】:

我想知道如何获取1分钟黄金价格数据特定时间和日期间隔(如10月18日1小时间隔:2021-10 -18 09:30:00 到 2021-10-18 10:30:00) 来自 yfinance 或 python 中的任何其他来源?

我的代码是:

gold = yf.download(tickers="GC=F", period="5d", interval="1m")

似乎可以设置期间,而我想设置特定的日期和时间间隔。 谢谢

【问题讨论】:

1分钟单位的数据只能获取7天。 【参考方案1】:

编辑 2021-10-25

清除我的答案。问题是:

我想设置特定的日期和时间间隔。谢谢

您需要的只是代码文档。 所以startend 可以是日期或_datetime

        start: str
            Download start date string (YYYY-MM-DD) or _datetime.
            Default is 1900-01-01

示例代码:

注意:时区有问题,我尝试通过 start 和 end 传递正确的时区,但 lib 没有正确处理它,我手动完成了转换)

import pandas as pd
import yfinance as yf
import pendulum
pd.options.display.max_rows=10  # To decrease printouts
start = pendulum.parse('2021-10-18 09:30').add(hours=7)  # My tz is UTC+03:00, original TZ UTC-04:00. So adds to my local time 7 hours
end = pendulum.parse('2021-10-18 10:30').add(hours=7)  # Same
print(start)
print(yf.download(tickers="GC=F", interval="1m", start=start, end=end))

结果,您可以传递您想要的任何日期时间范围:

2021-10-18T16:30:00+00:00
[*********************100%***********************]  1 of 1 completed
                                  Open         High          Low        Close  \
Datetime                                                                        
2021-10-18 09:30:00-04:00  1770.099976  1770.099976  1767.400024  1767.800049   
2021-10-18 09:31:00-04:00  1767.900024  1769.099976  1767.800049  1768.500000   
2021-10-18 09:32:00-04:00  1768.599976  1769.300049  1768.199951  1769.199951   
2021-10-18 09:33:00-04:00  1769.300049  1770.199951  1768.900024  1769.099976   
2021-10-18 09:34:00-04:00  1769.199951  1769.300049  1767.599976  1767.800049   
...                                ...          ...          ...          ...   
2021-10-18 10:25:00-04:00  1769.900024  1770.400024  1769.800049  1770.300049   
2021-10-18 10:26:00-04:00  1770.300049  1770.500000  1769.900024  1769.900024   
2021-10-18 10:27:00-04:00  1769.800049  1769.800049  1769.099976  1769.400024   
2021-10-18 10:28:00-04:00  1769.400024  1770.400024  1769.400024  1770.199951   
2021-10-18 10:29:00-04:00  1770.300049  1771.000000  1769.900024  1770.099976   

                             Adj Close  Volume  
Datetime                                        
2021-10-18 09:30:00-04:00  1767.800049       0  
2021-10-18 09:31:00-04:00  1768.500000     459  
2021-10-18 09:32:00-04:00  1769.199951     428  
2021-10-18 09:33:00-04:00  1769.099976     750  
2021-10-18 09:34:00-04:00  1767.800049     549  
...                                ...     ...  
2021-10-18 10:25:00-04:00  1770.300049     134  
2021-10-18 10:26:00-04:00  1769.900024     147  
2021-10-18 10:27:00-04:00  1769.400024     349  
2021-10-18 10:28:00-04:00  1770.199951     258  
2021-10-18 10:29:00-04:00  1770.099976     382  

[60 rows x 6 columns]

PS:startend 没有过去 7 天的限制,但仍然有过去 30 天的限制:

1 Failed download:
- GC=F: 1m data not available for startTime=1631980800 and endTime=1631998800. The requested range must be within the last 30 days.

原创

这个库缺少文档。但这是 python,因此它是某种自我记录的。

在此处阅读下载功能的定义 https://github.com/ranaroussi/yfinance/blob/6654a41a8d5c0c9e869a9b9acb3e143786c765c7/yfinance/multi.py#L32

PS这个函数有start=end=参数希望对你有帮助

【讨论】:

开始和结束只接受日期。 OP 已要求时间范围之间的能力。这没有回答问题 @PacketLoss 这是不正确的。它是接受一个日期时间。请看看我的更新。【参考方案2】:

您对yfinance 的调用会返回一个以datetime 为索引的Pandas DataFrame。我们可以使用它来过滤数据帧以仅在 startend 时间之间的条目。

import yfinance as yf
from datetime import datetime

gold = yf.download(tickers="GC=F", period="5d", interval="1m")

start = datetime(2021, 10, 18, 9, 30, 0)
end = datetime(2021, 10, 18, 10, 30, 0)

filtered = gold[start: end]

输出

                                  Open         High  ...    Adj Close  Volume
Datetime                                             ...                     
2021-10-18 09:30:00-04:00  1770.099976  1770.099976  ...  1767.599976    1035
2021-10-18 09:31:00-04:00  1767.900024  1769.099976  ...  1768.500000     467
2021-10-18 09:32:00-04:00  1768.599976  1769.300049  ...  1769.199951     428
2021-10-18 09:33:00-04:00  1769.300049  1770.199951  ...  1769.099976     750
2021-10-18 09:34:00-04:00  1769.199951  1769.300049  ...  1767.800049     549
...                                ...          ...  ...          ...     ...
2021-10-18 10:26:00-04:00  1770.300049  1770.500000  ...  1769.900024     147
2021-10-18 10:27:00-04:00  1769.800049  1769.800049  ...  1769.400024     349
2021-10-18 10:28:00-04:00  1769.400024  1770.400024  ...  1770.199951     258
2021-10-18 10:29:00-04:00  1770.300049  1771.000000  ...  1770.099976     382
2021-10-18 10:30:00-04:00  1770.300049  1771.000000  ...  1770.900024     180

[61 rows x 6 columns]

【讨论】:

谢谢。如果我想从 i.g. 获得这样的 1 小时间隔数据连续 7 天或 30 天,你知道怎么做吗? 只需修改您的yfinance 下载以延长期限和更改间隔。只要您下载了正确的日期范围,您就可以在返回的结果中简单地过滤您的数据 所以对于 30 天的数据,我应该使用 for 循环运行 30 次过滤?!没有更简单的方法吗? @muhamad 请看看我的更新。您可以将 start 和 end 作为日期时间传递,并获取过去 30 天内所需的任何数据范围。

以上是关于如何从 yfinance 获取特定时间和日期的 1 分钟价格数据?的主要内容,如果未能解决你的问题,请参考以下文章

当我从 api (yfinance) 获取数据时,Numpy Array 缺少日期

yfinance - 将我的结束日期设置为 2021-1-1,但数据的结束日期变为今天日期

无法获取数据,使用包 yfinance 按格式分组下载到熊猫数据框中,仅适用于我的子列表中的特定代码

YFINANCE:检索更多ETF数据

如何根据ios中的特定键从数组中获取字典

如何获取数据列表,特定日期仅从每个日期获取 6 条记录而不是更多