3.91K 浏览
0

我按照示例,写了一段简陋的代码,+10是模拟简单的取值后计算。如果是我代码的错误,请指出。

from tqsdk import TqApi,TqBacktest,TqReplay
from datetime import date
 #设置合约代码
SYMBOL = "SHFE.rb2005"
 api = TqApi(backtest=TqBacktest(start_dt=date(2020, 3, 2), end_dt=date(2020, 3, 3)))
#api = TqApi(backtest = TqReplay(date(2020,3,2)))
quote = api.get_quote(SYMBOL)
klines = api.get_kline_serial(SYMBOL, 60*15, 20)
def dayinjiage(klines):
    x=klines.high+10
    y=klines.open+10
    z=klines.low+10
    n=klines.close+10
    print("取-2值",x.iloc[-2], y.iloc[-2], z.iloc[-2], n.iloc[-2])
    print("取-1值",x.iloc[-1], y.iloc[-1], z.iloc[-1], n.iloc[-1])
 dayinjiage(klines)
 while True:
    api.wait_update()
    # 每次生成新的K线时重新计算BOLL指标
    if api.is_changing(klines.iloc[-1], "datetime"):
        print("--------------------------------新K线")
        dayinjiage(klines)
     # 每次最新价发生变化时进行判断
    if api.is_changing(quote, "last_price"):
        print("新价")
        dayinjiage(klines)

打印出来的信息,截取自最后几行:

新价
取-2值 3434.0 3430.0 3428.0 3432.0
取-1值 3432.0 3432.0 3432.0 3432.0
新价
取-2值 3434.0 3430.0 3428.0 3432.0
取-1值 3432.0 3432.0 3432.0 3432.0
新价
取-2值 3434.0 3430.0 3428.0 3432.0
取-1值 3432.0 3432.0 3432.0 3432.0
新价
取-2值 3434.0 3430.0 3428.0 3432.0
取-1值 3441.0 3432.0 3426.0 3436.0
——————————–新K线
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
新价
取-2值 3441.0 3432.0 3426.0 3436.0
取-1值 3436.0 3436.0 3436.0 3436.0
——————————–新K线
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3435.0 3435.0 3435.0 3435.0
新价
取-2值 3441.0 3436.0 3431.0 3435.0
取-1值 3439.0 3435.0 3429.0 3431.0
WARNING – 回测结束

观察可知,当新K出现的瞬间,Klines的高开低收都相等,这时候计算指标并取.ilco[-1],将得到的错误的结果。当前新K计算的正确指标出现在最后一笔quote。

进行回测时,建议取值用.ilco[-2]

我也跟踪过天勤的实时行情,当新k出现时,高开低收相等,与回测不同在于,随着quote的推进,四个价会随着改变,会改变。

就是这样/

ringo 已回答的问题 2020年3月6日
1

是因为目前在回测时遵循以下一套回测行情推进规则,kline在生成和结束后各刷新一次 https://doc.shinnytech.com/tqsdk/latest/usage/backtest.html#backtest-rule

ringo 已回答的问题 2020年3月6日