爬取股票全ATick数据
概述
在金融市场分析中,Tick数据是非常重要的资源,它记录了股票在每一交易时间内的价格变动。对于量化交易者和分析师来说,获取并分析这些数据是至关重要的。本文将介绍如何使用Python爬取股票的Tick数据,并将其存储到本地。
环境准备
在开始之前,请确保你已经安装了Python环境以及以下库:
xtquant.xtdata
:用于获取股票行情数据。json
:用于处理JSON数据。multiprocessing
:用于并行处理。csv
:用于操作CSV文件。os
:用于操作系统级别的功能。
步骤1:导入必要的库
这里使用的是迅投qmt系统,本程序也是基于qmt发布的行情,变量SUBSCRIBE_LIST即为订阅的标的代码
from datetime import datetime, timezone, timedelta
import xtquant.xtdata as xd
import json
import multiprocessing as mp
from Account_and_Trader_information import SUBSCRIBE_LIST
import csv
import os
步骤2:设置基础变量
today = datetime.now().strftime('%Y%m%d')
data_latest = {}
这里我们定义了today
变量来存储当前日期,data_latest
用于存储最新的股票数据。
步骤3:定义时间戳转换函数
def timestamp_to_datetime(timestamp):
dt_object = datetime.fromtimestamp(timestamp / 1000.0, tz=timezone(timedelta(hours=8)))
dt_string = dt_object.strftime('%Y-%m-%d %H:%M:%S')
return dt_string
这个函数将时间戳转换为可读的日期时间格式。
步骤4:定义保存数据为JSON的函数
def save_dict_as_json(data, filename):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
步骤5:定义存储股票信息到CSV的函数
def store_stock_info_csv(data):
for stock_id in data.keys():
stock_info = data[stock_id]
filename = f'./data/fiveab/{today}/{stock_id}.csv'
if not os.path.exists(filename):
with open(filename, 'w', newline='') as csvfile:
csvwriter = csv.writer(csvfile)
csvwriter.writerow([...]) # 标题行
else:
with open(filename, 'a', newline='') as csvfile:
csvwriter = csv.writer(csvfile)
try:
b_s = 'B' if stock_info['lastPrice'] > data_latest[stock_id]['bidPrice'][0] else 'S'
except KeyError:
b_s = '0'
tick_d = [timestamp_to_datetime(stock_info['time'])]+list(stock_info.values())[1:]
fenbi_d = [stock_info['volume'] - data_latest[stock_id]['volume'], stock_info['amount'] - data_latest[stock_id]['amount'], b_s] if stock_id in data_latest else [stock_info['volume'], stock_info['amount'], b_s]
csvwriter.writerow(tick_d+fenbi_d)
data_latest.update(**data)
这个函数将股票信息存储到CSV文件中,如果文件不存在则创建,并追加数据。
步骤6:定义回调函数
def on_data(data):
store_stock_info_csv(data)
这个函数是数据回调函数,当有新数据时会被调用。
步骤7:主函数
if __name__ == "__main__":
print('获取行情。。。')
print('订阅数量 ', len(SUBSCRIBE_LIST))
if not os.path.exists(f'./data/fiveab/{today}'):
os.makedirs(f'./data/fiveab/{today}')
xd.subscribe_whole_quote(code_list=SUBSCRIBE_LIST, callback=lambda data: on_data(data))
xd.run()
在主函数中,我们检查并创建必要的目录,然后订阅股票数据,并启动数据接收。
总结
通过上述步骤,你可以成功地爬取股票的Tick数据并将其存储到本地。这为进一步的数据分析和量化交易提供了基础。记得在实际应用中遵守相关法律法规,确保数据的合法使用。
另外本人优快云站资源库每日发布了tick数据,需要的朋友可以自己下载
下附完整代码
"""拿tick数据,存入本地内存"""
from datetime import datetime, timezone, timedelta
import xtquant.xtdata as xd
import json
from Account_and_Trader_information import SUBSCRIBE_LIST
import csv
import os
today = datetime.now().strftime('%Y%m%d')
data_latest = {}
def timestamp_to_datetime(timestamp):
# 将时间戳转换为datetime对象,注意时间戳是以毫秒为单位的
dt_object = datetime.fromtimestamp(timestamp / 1000.0, tz=timezone(timedelta(hours=8)))
# 格式化日期和时间
dt_string = dt_object.strftime('%Y-%m-%d %H:%M:%S')
return dt_string
def save_dict_as_json(data, filename):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def store_stock_info_csv(data):
# 指定CSV文件名
for stock_id in data.keys():
stock_info = data[stock_id]
filename = f'./data/fiveab/{today}/{stock_id}.csv'
# 打开文件,准备追加写入
if not os.path.exists(filename):
# 文件不存在,写入标题行
with open(filename, 'w', newline='') as csvfile:
csvwriter = csv.writer(csvfile)
csvwriter.writerow(
['time', 'lastPrice', 'open', 'high', 'low', 'lastClose', 'amount', 'volume', 'pvolume', 'stockStatus',
'openInt', 'transactionNum', 'lastSettlementPrice', 'settlementPrice', 'pe', 'askPrice', 'bidPrice',
'askVol', 'bidVol', 'volRatio', 'speed1Min', 'speed5Min', 'trascationnum', 'transcationamount', 'direction'])
else:
with open(filename, 'a', newline='') as csvfile:
# 创建CSV写入器
csvwriter = csv.writer(csvfile)
# 写入股票信息
try:
b_s = 'B' if stock_info['lastPrice'] > data_latest[stock_id]['bidPrice'][0] else 'S'
except KeyError:
b_s = '0'
tick_d = [timestamp_to_datetime(stock_info['time'])]+list(stock_info.values())[1:]
fenbi_d = [stock_info['volume'] - data_latest[stock_id]['volume'], stock_info['amount'] - data_latest[stock_id]['amount'], b_s] if stock_id in data_latest else [stock_info['volume'], stock_info['amount'], b_s]
csvwriter.writerow(tick_d+fenbi_d)
data_latest.update(**data)
def on_data(data):
store_stock_info_csv(data)
if __name__ == "__main__":
print('获取行情。。。')
print('订阅数量 ', len(SUBSCRIBE_LIST))
if not os.path.exists(f'./data/fiveab/{today}'):
os.makedirs(f'./data/fiveab/{today}')
# 订阅全推数据
xd.subscribe_whole_quote(code_list=SUBSCRIBE_LIST, callback=lambda data: on_data(data))
xd.run()