金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 74|回复: 4

python 5分钟级回测时,history_bars 获取的60m级K线时间戳不对

[复制链接]

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
发表于 2025-4-21 17:05 | 显示全部楼层 |阅读模式
我用'AU30'做基准合约,  5分钟级回测时,history_bars 获取的60m级K线时间戳不对.
我的测试代码如下:

#################################################################
#                   TestLackBars_60m
#################################################################
from PythonApi import *

import datetime
import pandas as pd
import numpy as np  

#DEBUG_OUT_PATH = 'F:\\ml_quant\\CheckData\\Output'  
DEBUG_OUT_PATH = 'D:\\'  

STAMP_INDEX = 0
CLOSE_INDEX = 1

class GlobalCls:
    def _init_(self):
        self.name = 'global var'
g = GlobalCls()

#PS: 确保g.context已经设置         
def Print(content):
    dt_str = g.context.now.strftime('%Y%m%d %H:%M:%S')
    print("[{}] {}".format(dt_str, content))
#无K线时标的文件日志打印           
def FPrint(content):        
    dt_str = g.context.now.strftime('%Y%m%d %H:%M:%S')
    print("[{}] {}".format(dt_str, content))
    #log_debug_info(g.debug_log_file, "{0}".format(content))
    with open(g.debug_log_file, 'a') as file:
        file.write("[{}] {}\n".format(dt_str, content))  

#----------------------------------------
pd.set_option('display.max_columns', None) #解决显示列省略问题
pd.set_option('display.max_rows', None)
pd.set_option('display.width', 1000)   # 控制,使不换行
pd.set_option('display.float_format', lambda x: '%.2f' % x) #取消科学计数显示
#  在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。--(必须实现)
def init(context):
    # 在context中保存全局变量

    current_dt_str = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
    #日志文件
    g.debug_log_file = DEBUG_OUT_PATH + f'\\CheckData_60m_{context.run_info.frequency}_debug_{current_dt_str}.txt'   

    print("------初始化逻辑init(context)-------")
    g.context = context
    g.run_type = context.run_info.run_type
    print(f"context.run_info.base_book_id:{context.run_info.base_book_id}")
    print(f"context.run_info.frequency:{context.run_info.frequency}")



# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
    pass


# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
    current_dt = context.now
    symbol_lst = ['LC00', 'SI00', 'AG00']

    for symbol in symbol_lst:
        freq = '5m'
        target_n = 2
        bars = history_bars(symbol,target_n, freq, ['datetime', 'close'], include_now=True)
        #Print(f"history_bars({symbol}, {target_n}, {freq}, ['datetime', 'close'], include_now=True)")
        if len(bars):
            bar_stamp = PyramidBarStampToDatetime(bars[-1,STAMP_INDEX])
            if bar_stamp != current_dt:
                #FPrint(f"Erro: {symbol} {freq} latest bar {bar_stamp} != current_dt:{current_dt}")
                continue
            #Print(f"\t\t ret bars len:{len(bars)} beg_stamp:{bars[0,0]} end_stamp:{bars[-1,0]}")


        freq = '60m'
        target_n = 2
        bars = history_bars(symbol,target_n, freq, ['datetime', 'close'], include_now=True)
        #Print(f"history_bars({symbol}, {target_n}, {freq}, ['datetime', 'close'], include_now=True)")
        #if len(bars):
        #    Print(f"\t\t ret bars len:{len(bars)} beg_stamp:{bars[0,0]} end_stamp:{bars[-1,0]}")
        #else:
        #    Print(f"\t\t ret bars: {bars}")
        if len(bars):
            #金字塔小时历史数据存在多了yyyymmdd143000数据的bug
            if int(bars[-1,STAMP_INDEX]) % 1000000 == 143000: #and (period_data.period == '1h' or period_data.period == '60m'):
                FPrint(f"Erro: {symbol} {freq} latest bar {bars[-1,STAMP_INDEX]} ")
                continue


# after_trading函数会在每天交易结束后被调用,当天只会被调用一次。 --(选择实现)
def after_trading(context):
    pass

def PyramidBarStampToDatetime(val):
    val = int(val)
    #print("PyramidBarStampToDatetime val:{}".format(val))
    return datetime.datetime(year=int(val//10000000000),
        month= val%10000000000//100000000,
        day=   val%100000000//1000000,
        hour=  val%1000000//10000,
        minute=val%10000//100,
        second=val%100,
        microsecond=0)  


截图202504211700355923.png
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-4-21 17:27 | 显示全部楼层
试下切换下这个划分方式:

截图202504211726591273.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-4-21 18:36 | 显示全部楼层
你好! 是勾选空余周期参与公式计算,  然后选'交易时间划分'对吧?   想请教下,交易时段划分和交易时间划分的区别
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-4-22 09:01 | 显示全部楼层
空余周期设置和这个没关系。


交易时段划分:每个交易时段分别独立,不存在同一根k横跨两个交易时段范围的情况。
交易时间划分:自开盘起,每根k线均按照指定周期数足量划分,直至最后一个k不足指定周期值时,亦单独一根。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-4-22 16:45 | 显示全部楼层
3ks
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-5-1 22:58 , Processed in 0.114971 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表