爬取股票全ATick数据

爬取股票全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()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值