从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')
错误原因分析
- 缺失依赖包:代码用到
arrow和requests模块,但只安装了pandas,导致ModuleNotFoundError - 缩进错误:Python函数内部代码必须缩进(通常4个空格),原代码函数定义后未缩进,触发
IndentationError,进而导致后续变量和函数无法识别,出现NameError - 无效代码:
dg = pd.DataFrame(body['timestamp'])未被使用,属于冗余代码 - 潜在异常风险:未处理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
相关产品推荐
相关产品推荐

