Python Y财务:Don';当选择一小时间隔时,看不到白天的时间

Python Y财务:Don';当选择一小时间隔时,看不到白天的时间,python,yfinance,Python,Yfinance,我使用Python包获取股票的历史股价(在本例中为特斯拉股票) 当我执行以下操作时,以一分钟的间隔获取上周的股价: import yfinance as yf print(yf.Ticker('TSLA').history(period='7d', interval='1m')) import yfinance as yf print(yf.Ticker('TSLA').history(period='7d', interval='1h')) 我明白了 因此,我可以看到每个时间间隔的日期

我使用Python包获取股票的历史股价(在本例中为特斯拉股票)

当我执行以下操作时,以一分钟的间隔获取上周的股价:

import yfinance as yf

print(yf.Ticker('TSLA').history(period='7d', interval='1m'))
import yfinance as yf

print(yf.Ticker('TSLA').history(period='7d', interval='1h'))
我明白了

因此,我可以看到每个时间间隔的日期和时间

但是,当我选择一小时间隔时:

import yfinance as yf

print(yf.Ticker('TSLA').history(period='7d', interval='1m'))
import yfinance as yf

print(yf.Ticker('TSLA').history(period='7d', interval='1h'))
我明白了


也就是说,我不知道不同时间间隔的时间,只知道它们是在哪一天被记录的。怎么会这样?当我选择一分钟的时间间隔时,我会得到一天中的时间,那么为什么我不选择一小时的时间间隔呢?如果使用一个小时的间隔,我是否可以轻松地获得一天中的时间,或者我必须将它们与一分钟的时间间隔进行比较,并试图找出哪个时间间隔对应于哪个小时?

我在我的
\venv\Lib\site packages\yfinance
文件夹中查看了
yfinance
背后的编码,然后我把它弄得乱七八糟,我发现:

base.py
第182行:(yfinance查询其数据)

utils.py
第131行:(yfinance将时间转换为指定格式)

datetimes.py
第605-617行(转换发生的函数)

最后一个函数似乎是发生日期转换的地方,搞乱这些设置除了中断程序外没有任何作用,所以我回到
base.py
继续搞乱那里的东西,直到我发现
yfinance
在第234行进行第二次格式化,如果你把
elif参数[“interval”]=='1h':通过
就在第236行之后,您可以获得您想要的数据,而不需要缺少小时/分钟/秒标记

小心修改您的
yfinance
库可能会破坏某些东西,我不推荐这样做

base.py
第234-243行现在应该如下所示:

if params["interval"][-1] == "m":
    df.index.name = "Datetime"
elif params["interval"] == '1h':
    pass
else:
    df.index = _pd.to_datetime(df.index.date)
    if tz is not None:
        df.index = df.index.tz_localize(tz)
    df.index.name = "Date"
看看你的数据,你会发现一个大问题

最大的问题是,9:30开盘时的数据会增加价值,之后的每小时直到下午4点都是30分钟,而不是00分钟:

                           Open    High      ...  Dividends  Stock Splits
2020-12-03 08:00:00-05:00  592.75  596.28    ...          0             0
2020-12-03 09:00:00-05:00  594.15  594.99    ...          0             0
2020-12-03 09:30:00-05:00  590.02  595.90    ...          0             0
2020-12-03 10:30:00-05:00  588.16  591       ...          0             0
...
2020-12-03 15:30:00-05:00  594.84  596.53    ...          0             0
2020-12-03 16:00:00-05:00  593.33  597.24    ...          0             0
在这一点上,我们可以继续调整
yfinance
,但老实说,我们自己获取数据会更容易。我从picking apart
yfinance
中编写了以下代码,并将其修改为我们需要的代码:

直接从雅虎财经下载1h数据的代码

import requests
import datetime as dt


ticker = 'TSLA'
base_url = 'https://query1.finance.yahoo.com'
url = "{}/v8/finance/chart/{}".format(base_url, ticker)
params = {'interval': '1h', 'range': '7d', 'includePrePost': True}

response = requests.get(url=url, params=params)
data = response.json()

epoch = data['chart']['result'][0]['timestamp']
prices = data['chart']['result'][0]['indicators']['quote'][0]['close']

count = 0
list_of_time_and_price = []

for entry in epoch:
    date_and_time = dt.datetime.fromtimestamp(entry).strftime('%Y-%m-%d %H:%M:%S')

    list_of_time_and_price.append([date_and_time, prices[count]])

    count += 1

print(list_of_time_and_price)
您可以按照自己的规格处理上述内容,目前它返回一个带有日期时间收盘价格的列表,并且它不包含交易日的:30分钟数据

编辑

好在我仔细检查了一下,显然直接从Yahoo Finance获得的1h数据总是会返回:30分钟间隔的交易数据,所以问题不在于python库
yfinance
,而在于网站Yahoo Finance本身。我想解决这个问题的方法是下载1分钟的数据并将其更新到1小时,但是你只能使用上周的数据


如果你只需要股票数据,我建议你检查一下哪些股票有2年的日内数据,并且是免费的,每分钟有5个请求(或者类似的限制)。

试试60m而不是1h-@putty,非常感谢,这就解决了问题!如果你把它作为一个答案发布,我会把它标记为被接受的答案。谢谢你做了所有的游戏!看来你可能已经找到了问题的根源。在putty的评论之后,似乎有人已经为代码中的同一位置创建了一个。有趣的是,您可以看到仅使用
请求的替代解决方案
!没问题!从库中分离出来非常有趣,现在我知道了为什么我的均线指数有点偏离,所以我真的很高兴我决定研究一下。当我查看你添加到答案中的股票数据时,我做了一个有趣的观察,你的区间从
08:00
09:00
开始,这些都是在股票开盘之前,我不明白你为什么会得到这些数据,也不明白当股票应该收盘时,开盘价如何在
08:00
09:00
之间变化。当我按照putty的提示使用间隔
60m
而不是
1h
时,我只得到从
09:30
10:30
11:30
12:30
13:30
14:30
15:30
开始的间隔。你也有从
16:00
开始的间隔,从
16:00
17:00
,在此期间股票关闭。但也许我误解了时间戳,这实际上是间隔结束的时间,而不是开始的时间?普通股实际上从上午4点到晚上8点开放,交易日时间为上午9:30到下午4点。我知道TD Ameritrade/thinkorswim不允许所有经纪人查看交易前/交易后的交易时间数据。当我查询
yfinance
时,我询问了“prepost”数据,这就是为什么我会得到这些额外的时间:
yf.Ticker('TSLA')。历史记录(period='7d',interval='60m',prepost=True)
if params["interval"][-1] == "m":
    df.index.name = "Datetime"
elif params["interval"] == '1h':
    pass
else:
    df.index = _pd.to_datetime(df.index.date)
    if tz is not None:
        df.index = df.index.tz_localize(tz)
    df.index.name = "Date"
                           Open    High      ...  Dividends  Stock Splits
2020-12-03 08:00:00-05:00  592.75  596.28    ...          0             0
2020-12-03 09:00:00-05:00  594.15  594.99    ...          0             0
2020-12-03 09:30:00-05:00  590.02  595.90    ...          0             0
2020-12-03 10:30:00-05:00  588.16  591       ...          0             0
...
2020-12-03 15:30:00-05:00  594.84  596.53    ...          0             0
2020-12-03 16:00:00-05:00  593.33  597.24    ...          0             0
import requests
import datetime as dt


ticker = 'TSLA'
base_url = 'https://query1.finance.yahoo.com'
url = "{}/v8/finance/chart/{}".format(base_url, ticker)
params = {'interval': '1h', 'range': '7d', 'includePrePost': True}

response = requests.get(url=url, params=params)
data = response.json()

epoch = data['chart']['result'][0]['timestamp']
prices = data['chart']['result'][0]['indicators']['quote'][0]['close']

count = 0
list_of_time_and_price = []

for entry in epoch:
    date_and_time = dt.datetime.fromtimestamp(entry).strftime('%Y-%m-%d %H:%M:%S')

    list_of_time_and_price.append([date_and_time, prices[count]])

    count += 1

print(list_of_time_and_price)