前段时间我一直在学习backtrader做回测,但将来迟早是要将量化运用到实盘交易中去的,故选择了券商支持的QMT量化系统学习。这个系统目前是支持python和VBA两种编程语言,正好,我用的就是python。
经过前一段时间backtrader的学习,我们知道,写一个量化策略的步骤,第一步是获取数据,第二步是编写策略,第三步是将数据和策略放入回测系统去做回测,最后显示结果及图表,现在换成了QMT,那也从获取数据开始吧。
先别急,动手前先看看官方文档、帮助说明 、API使用说明、函数参数说明……囫囵吞枣地看了一两遍,也记不住那么多,等遇到问题再来查吧,不动手敲敲代码也不行,看起来好像都懂,谁知道代码运行后会报什么错呢,果然,获取数据的代码回测时就没取到数据,而是一个空列表,最初的问题代码如下:
#encoding:gbk
def init(ContextInfo):
pass
def handlebar(ContextInfo):
tradestock = ContextInfo.stockcode
Result = ContextInfo.get_market_data_ex(['close'], stock_code=[tradestock], start_time='20230101', end_time='20231231', period='1d', dividend_type='none')
print(Result)
也没报错,就是Result返回一个空的列表,没有任何数据,很是奇怪。逐行检查吧!
#encoding:gbk 这是编码声明,QMT系统指定了编码为gbk,而且每个策略都把这句代码写在首行。
def init(ContextInfo): 初始化,只运行一次。我这个程序只是练习获取数据,简单,故没写什么,所以用了pass。
def handlebar(ContextInfo): 这是一个交易策略函数,每一根K线都会运行一次。
tradestock = ContextInfo.stockcode 这是获取当前股票代码。
print(Result) 打印数据
Result =
ContextInfo.get_market_data_ex([‘close’], stock_code=[tradestock], start_time=’20230101′, end_time=’20231231′, period=’1d’, dividend_type=’none’) 获取数据。现在没有获取到数据,问题很可能就在get_market_data_ex()这一行代码上,然后又去核查函数参数,看看是不是哪个参数错了。
[‘close’] 收盘价
stock_code=[tradestock] 股票代码
start_time=’20230101′ 数据的开始时间
end_time=’20231231′ 数据的结束时间
period=’1d’ 日线级别
dividend_type=’none’ 不进行任何复权处理,返回原始的交易价格
第一遍查一下来,好像没什么问题,但没有得到数据,就肯定有问题。我反复查不出问题所在后,就去请教了一下帮我开通QMT的券商客户经理,因为他之前说过,有问题可以找他。通过对话,发现他也不是很精通QMT,但是很热情。所以从他那儿,我还是得到了些启发。在他的启发下,我终于发现了问题:
原来get_market_data_ex()的参数中股票代码是一个列表,要写成[600001.SH]这样的格式。我这一句stock_code=[tradestock],只能取得当前股票代码,如600001,却少了后缀“.SH”,格式不对,自然得不到数据,现在把后缀加上,如图所示:

成功得到了数据。

另外,也可以把股票代码、数据的起始日期等写到init()函数中去,同样能获得数据,代码如下:
#encoding:gbk
def init(C):
#C.stock_list = ['600863.SH'] # 可以直接指定股票代码
C.stock_list = [C.stockcode+".SH"] #也可以获取当前股票代码
C.start_time = '20230101'
C.end_time = '20230131'
def handlebar(C):
#Result = C.get_market_data_ex(['close'], stock_code= C.stock_list, start_time='20230101', end_time='20231231', period='1d', dividend_type='none') # 也可以这么写起止日期
Result = C.get_market_data_ex(['close'],C.stock_list, period = "1d", start_time = C.start_time, end_time = C.end_time, dividend_type='none')
print(Result)
'''
# 用下面的代码找出了问题的所在,打印list_code的结果是"000300",少了后缀".SH"
code = C.stockcode
list_code=[code]
print(list_code)
'''
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73464
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!