You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Yahoo获取HFT数据存为CSV遇报错,求解决方案

解决Yahoo金融HFT数据获取代码的报错问题

问题背景

尝试用Python从Yahoo获取高频交易(HFT)数据并保存为CSV,已安装Python和pandas,但运行代码时出现多个错误:ModuleNotFoundError(arrow模块未安装)、IndentationError(函数缩进错误)、NameError等,需要修复代码用于回归分析。

原代码:

import requests
import pandas as pd
import arrow
import datetime

def get_quote_data(symbol='SBIN.NS', data_range='1d', data_interval='1m'):
res = requests.get('https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?range={data_range}&interval={data_interval}'.format(**locals()))
data = res.json()
body = data['chart']['result'][0]
dt = datetime.datetime
dt = pd.Series(map(lambda x: arrow.get(x).to('Asia/Calcutta').datetime.replace(tzinfo=None), body['timestamp']), name='Datetime')
df = pd.DataFrame(body['indicators']['quote'][0], index=dt)
dg = pd.DataFrame(body['timestamp'])

return df.loc[:, ('open', 'high', 'low', 'close', 'volume')]
data = get_quote_data('SBIN.NS', '5d', '1m')
data.dropna(inplace=True) #removing NaN rows
print(data)
data.to_csv('output.csv')

报错信息:

>>> import requests
>>> import pandas as pd
>>> import arrow
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'arrow'
>>> import datetime
>>> 
>>> def get_quote_data(symbol='SBIN.NS', data_range='1d', data_interval='1m'):
... res = requests.get('https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?range={data_range}&interval={data_interval}'.format(**locals()))
  File "<stdin>", line 2
    res = requests.get('https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?range={data_range}&interval={data_interval}'.format(**locals()))
    ^
IndentationError: expected an indented block after function definition on line 1
>>> data = res.json()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'res' is not defined
>>> body = data['chart']['result'][0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'data' is not defined
>>> dt = datetime.datetime
>>> dt = pd.Series(map(lambda x: arrow.get(x).to('Asia/Calcutta').datetime.replace(tzinfo=None), body['timestamp']), name='Datetime')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'body' is not defined
>>> df = pd.DataFrame(body['indicators']['quote'][0], index=dt)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'body' is not defined
>>> dg = pd.DataFrame(body['timestamp'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'body' is not defined
>>> 
>>> return df.loc[:, ('open', 'high', 'low', 'close', 'volume')]
  File "<stdin>", line 1
SyntaxError: 'return' outside function
>>> data = get_quote_data('SBIN.NS', '5d', '1m')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'get_quote_data' is not defined
>>> data.dropna(inplace=True) #removing NaN rows
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'data' is not defined
>>> print(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'data' is not defined
>>> data.to_csv('output.csv')

错误原因分析

  1. 缺失依赖包:代码用到arrow和requests模块,但只安装了pandas,导致ModuleNotFoundError
  2. 缩进错误:Python函数内部代码必须缩进(通常4个空格),原代码函数定义后未缩进,触发IndentationError,进而导致后续变量和函数无法识别,出现NameError
  3. 无效代码:dg = pd.DataFrame(body['timestamp'])未被使用,属于冗余代码
  4. 潜在异常风险:未处理API返回失败的情况(如网络问题、接口限制),可能导致后续代码崩溃

修复步骤与完整代码

1. 安装缺失依赖

打开终端/命令提示符,运行以下命令安装所需模块:

pip install requests arrow pandas

2. 修复后的完整代码

import requests
import pandas as pd
import arrow
import datetime

def get_quote_data(symbol='SBIN.NS', data_range='1d', data_interval='1m'):
    # 发送请求获取数据
    url = f'https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?range={data_range}&interval={data_interval}'
    res = requests.get(url)
    res.raise_for_status()  # 检查请求是否成功
    data = res.json()
    
    # 解析返回的JSON数据
    chart_result = data['chart']['result']
    if not chart_result:
        raise ValueError("未获取到有效数据,请检查参数或网络连接")
    body = chart_result[0]
    
    # 处理时间戳,转换为指定时区的datetime
    timestamps = body['timestamp']
    dt_series = pd.Series(
        [arrow.get(ts).to('Asia/Calcutta').datetime.replace(tzinfo=None) for ts in timestamps],
        name='Datetime'
    )
    
    # 构建DataFrame并返回指定列
    quote_data = body['indicators']['quote'][0]
    df = pd.DataFrame(quote_data, index=dt_series)
    return df.loc[:, ['open', 'high', 'low', 'close', 'volume']]

# 调用函数获取数据并保存
try:
    data = get_quote_data('SBIN.NS', '5d', '1m')
    data.dropna(inplace=True)  # 移除含空值的行
    print(data)
    data.to_csv('hft_data.csv')  # 保存为CSV文件
    print("数据已成功保存到hft_data.csv")
except Exception as e:
    print(f"运行出错: {str(e)}")

3. 代码优化说明

  • 用f-string替代format(**locals()),更简洁易读
  • 添加res.raise_for_status()检查请求是否成功,避免后续解析失败
  • 增加空结果判断,提前抛出明确错误
  • 把map改成列表推导式,可读性更好
  • 用try-except捕获运行时异常,方便排查问题
  • 重命名输出文件为hft_data.csv,更直观

4. 运行方法

将修复后的代码保存为get_hft_data.py,在终端/命令提示符中运行:

python get_hft_data.py

运行成功后,当前目录会生成hft_data.csv文件,可直接用于回归分析。

内容的提问来源于stack exchange,提问作者Patrycja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:24:57