【迅投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点差不多,只是多了一个历史数据的下载,以及与最新数据的拼接。
具体实现的方法,本帖子看到这里的小伙伴都是有心人了,一定能从本系列帖子内容找到线索,之后实现出来的,加油!

<think>好的,用户想知道QMT支持的文件格式。我需要先回忆一下相关的引用内容。引用[1]提到使用xtdata.get_full_tick获取行情数据,生成DataFrame,可能支持pandas的数据结构,比如CSV、Excel等格式。引用[2]指出QMT支持的Python版本是3.6到3.8,并且有特定的.pyd文件,说明可能主要支持Python脚本。引用[3]提到小白量化模块在QMT上仿大智慧指标,可能涉及自定义指标文件,比如类似大智慧的公式文件。 另外,用户的问题可能隐含他们想导入数据或策略,比如CSV、Excel用于数据导入,Python脚本用于策略,或者特定金融指标文件。需要结合引用内容,整理出QMT支持的文件格式,包括数据格式、策略脚本格式、配置文件等。可能还要提到第三方库如pandas支持的文件,因为引用[1]用了DataFrame,可能暗示CSV支持。此外,策略回测可能需要历史数据文件,比如HDF5、JSON等,但不确定是否有直接支持,可能需要通过Python处理。 需要确保回答覆盖数据文件、策略脚本、配置文件、指标文件等,并引用相关的地方。比如数据导入可能用CSV,策略用.py,指标可能有自定义格式,配置文件可能是INI或YAML,但引用中没有明确提到,可能需要推测。同时注意用户可能需要具体例子,比如代码中使用pd.read_csv,所以支持CSV。 最后,生成相关问题时要围绕文件格式、数据导入导出、策略开发、兼容性等方面提问。</think>QMT系统支持多种文件格式以满足量化交易需求,主要涵盖以下类型: 1. **Python脚本文件(.py)** QMT的核心策略开发基于Python,支持Python 3.6-3.8版本的脚本编写,例如策略回测、订单接口调用等[^2]。示例代码中可见通过`xtdata`模块获取行情数据: ```python data = xtdata.get_full_tick(a_index_etf) df = pd.DataFrame(data) ``` 2. **数据文件格式** - **CSV/Excel**:通过`pandas`库可直接读取结构化数据,如引用[1]中生成的`DataFrame`对象常用于处理CSV或Excel数据。 - **Tick/K线行情文件**:支持订阅实时行情数据并存储为系统内置格式,用于策略回测或分析[^1]。 3. **自定义指标文件** 用户可通过类似大智慧公式的语法编写技术指标,如引用[3]提到的仿大智慧指标回测设计,可能涉及自定义公式文件或配置文件。 4. **二进制依赖文件(.pyd)** QMT依赖特定版本的Python扩展模块,例如`IPythonApiClient.cp38-win_amd64.pyd`等二进制文件,用于接口调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值