【迅投qmt系列】4、获取数据的方式

获取数据是进行策略回测、实时执行的前提,不同的场景下,有相对合适的数据获取方式。

1、只取历史数据

这个场景的内容一般是将历史数据下载下来后,再将数据用于其他用途。因为对效率没有多少要求,代码最简单,它将qmt接口连接、数据下载、数据输出保存都在一个 .py 文件中实现。
在 miniqmt 版中的使用顺序是:

1、运行 miniqmt 并登陆
2、python 中导入 xtdata
3、使用 download_history_data/download_history_data2 将需要的数据下载到本地缓存
4、使用 gmd 系列函数从缓存中读取数据,并转存成本地 .csv 文件,或者保存到指定数据库中

show the code

from xtquant import xtdata

code_list = ['000001.SH', '300750.SZ']
period = '1h'
start_time = '20230101093000'
end_time = '20230201093000'

def on_data(datas):
	print(datas)

xtdata.download_history_data2(code_list, period, start_time, end_time, on_data)

for code in code_list:
	data = xtdata.get_market_data_ex([], [code], period, start_time, end_time)
	print(f'{code}数据保存到本地')
	data[code].to_csv(f'd:/data/{equity_name}.csv')

在 投研版 中的使用顺序是:

1、python 中导入 xtdata、xtdatacenter 
2、载入账户 token
3、使用 download_history_data/download_history_data 将需要的数据下载到本地缓存
4、使用 gmd 系列函数从缓存中读取数据,并转存成本地 .csv 文件,或者保存到指定数据库中

show the code

from xtquant import xtdata
from xtquant import xtdatacenter as xtdc
from const import xt_data_token

xtdc.set_token(xt_data_token)
xtdc.init()

code_list = ['000001.SH', '300750.SZ']
period = '1h'
start_time = '20230101093000'
end_time = '20230201093000'

def on_data(datas):
	print(datas)

xtdata.download_history_data2(code_list, period, start_time, end_time, on_data)

for code in code_list:
	data = xtdata.get_market_data_ex([], [code], period, start_time, end_time)
	print(f'{code}数据保存到本地')
	data[code].to_csv(f'd:/data/{equity_name}.csv')
 

2、只取实时数据

这个场景的内容一般是将日内行情实时落地,或者用于实时的监控、日内(实盘或者模拟)交易。对数据的实时性、代码的执行效率有一定要求。

2.1、资产的数量较少

如果想获取实时数据的资产数量不多,可以将所有内容都在一个 .py 文件中实现。

2.1.1、miniqmt 版

a、运行miniqmt,并登陆。
b、订阅想取实时行情数据的资产,并让代码一直运行,等待所订阅资产最新数据。
c、资产数据有更新时,会被推送过来,立即调用回调函数进行处理。

from xtquant import xtdata

code = '600000.SH'
period = '1m'
start_time = '20240429093000'
end_time = ''
count = -1

def callback_func(data):
    print('回调触发', data[code])
    stock_data = xtdata.get_market_data_ex(
    	field_list=[], 
    	code_list=[code], 
    	start_time=start_time,
    	end_time=end_time,
    	count=count
    )
    # 后接各种指标计算

xtdata.subscribe_quote(
	stock_code=code, 
	period=period, 
	start_time=start_time, 
	end_time=end_time, 
	count=count, 
	callback=callback_func
)
xtdata.run()
2.1.2、投研版

直接在原生 python 中执行以下代码

from xtquant import xtdata
from xtquant import xtdatacenter as xtdc
from const import xt_data_token

xtdc.set_token(xt_data_token)
xtdc.init()

code = '600000.SH'
period = '1m'
start_time = '20240429093000'
end_time = ''
count = -1

def callback_func(data):
    print('回调触发', data[code])
    stock_data = xtdata.get_market_data_ex(
    	field_list=[], 
    	code_list=[code], 
    	start_time=start_time,
    	end_time=end_time,
    	count=count
    )
    # 后接各种指标计算

xtdata.subscribe_quote(
	stock_code=code, 
	period=period, 
	start_time=start_time, 
	end_time=end_time, 
	count=count, 
	callback=callback_func
)
xtdata.run()

注意事项:
a、即使 subscribe_quote 里入参填了起止时间,count 的值也指定取所有数据,但是在回调函数中,也只会推送最新的那条行情,想取起止时间之间完整的数据,必须使用 gmd 函数从本地缓存中取。

2.2、资产数量较多或者多个策略各自有自己的数量要求

如果想获取实时数据的资产数量较大,或者是多个策略各自要获取一些资产的实时数据(不同策略的资产可以有交集,也可以没有),考虑到:
a、迅投qmt是单点登录,对每个用户,在服务器端只允许使用一个进程。
b、对不同的进程,相同资产相同周期的订阅可以合并计算。

因此最好:
a、让数据源在与策略隔离的独立进程中。
b、每个策略单独一个 .py 文件,通过指定端口与本地数据源连接,获取实时数据。
c、实时数据最好全推,不管是tick数据还是分钟数据。

2.2.1、miniqmt 版

a、执行 miniqmt 并登陆(此时就是一个实时数据源),因此没有额外的动作。
b、具体订阅与处理数据的代码,见 2.1.1,可以有多个 .py 文件,每个文件各自取不同股票的实时行情。

2.1.2、投研版

a、新建一个独立的 .py 文件,联通投研版的数据服务器,并开启指定端口向本机内其他 .py 文件提供实时数据的服务。
b、其他 .py 文件通过对接该端口,从本地服务端获取所需的实时数据。
c、show me the code

# 联通投研版数据服务器,提供本地实时数据源的 xtdata_data_center_main.py
from xtquant import xtdatacenter as xtdc
from xtquant import xtdata
from const import xt_data_token, data_center_port

xtdc.set_token(xt_data_token)
xtdc.set_data_home_dir(f'd:/data_tmp/qmt')         # 本地数据缓存地址
xtdc.set_kline_mirror_enabled(True)         # 开启K线全推
xtdc.init(start_local_service=False)        # 连接并启动数据服务。设为 False 使 xtdc 监听的端口为我们自己指定的端口
xtdc.listen(port=data_center_port)          # 开通指定的端口
print(f"服务启动,开放端口:{data_center_port}")

xtdata.run()

# 取数据 xtdata_get_data_sub_01.py
from xtquant import xtdata
from core.const import data_center_port

xtdata.connect(port=data_center_port)   # 链接到主程序获取数据,链接的端口需要一致

# 订阅股票实时行情
code = '600000.SH'
start_time = '20240429093000'
end_time = ''
period = '1m'

# 订阅最新行情
def callback_func(data):
    print('回调触发', data[code])

def thread_function():
    xtdata.subscribe_quote(
        stock_code=code,
        period=period,
        start_time=start_time,
        end_time=end_time,
        count=-1,
        callback=callback_func
    )

xtdata.run()

3、既取历史数据,又取实时数据

这个场景与第2点有相似之处,想实时落地日内行情,或者用于实时监控,或者日内实时交易,同时使用者也想得到一些历史数据,用来计算各类指标。
这类场景的处理方法第2点差不多,只是多了一个历史数据的下载,以及与最新数据的拼接。
具体实现的方法,本帖子看到这里的小伙伴都是有心人了,一定能从本系列帖子内容找到线索,之后实现出来的,加油!

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值