金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 126|回复: 8

python策略在5m级别回测时,30m级别K线无法获取完备(甚至直接为空),什么原因?

[复制链接]

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
发表于 2025-4-17 12:26 | 显示全部楼层 |阅读模式
我的python策略在5m级别回测,30m级别K线无法获取完备(甚至直接为空),这是什么原因?   
我试过history_bars和history_bars_date, 也试过金字塔时区和北京时区, 均存在同样的问题.
附:我是以黄金连续为基准合约的

日志1

日志1
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-4-17 14:54 | 显示全部楼层
直接给测试代码。这种你截图提供这些输出没有意义的。我们无法定位问题。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-4-17 16:20 | 显示全部楼层

说明:我的本地5分钟K线数据是补过的,从2015到20250401
我的测试代码如下:
# 本Python代码主要用于策略交易
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
from PythonApi import *

import datetime
import pandas as pd
import numpy as np
#  参数定义区,这里定义的参数可以直接在context对象中获取。--(选择实现)
#def parameter()
#    input_par(myvalues1,5,1,20,1)
#    input_par(myvalues2,10,1,20,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))
   
#----------------------------------------
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中保存全局变量
    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}")
   
    # print(策略启动) #调试打印输出
   

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


# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
    current_dt = context.now
    symbol = 'AU00' #'RB00'
   
    freq = '5m'
    target_n = 500
    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}")
        
    freq = '30m'
    target_n = 500
    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}")
   
    freq = '30m'  
    end_date = current_dt
    beg_date = current_dt - datetime.timedelta(days=30)
    bars_help = history_bars_date(symbol, beg_date, end_date, freq, ['datetime', 'close'], include_now=True)
    Print(f"history_bars_date({symbol}, {beg_date}, {end_date}, {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}")
     
    pass
   
   
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次。 --(选择实现)
def after_trading(context):
    pass
   

   

打印输出

打印输出
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-4-17 17:24 | 显示全部楼层
在回测起始位置获取不了那么多历史数据。我们回测机制是先按照回测的设置切好数据   切的时候会稍微向历史方向获取一部分数据。切好数据后再针对公式计算回测计算。

例如你要回测 2025年1月1日的 到现在 且确保数据完备

你只能
1.回测区间开始时间大于 2025年1月1日
2.在代码中做日期判定,早于 2025年1月1日 不执行指标。

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

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-4-17 17:59 | 显示全部楼层
你好!
我的策略需要在5分钟级别(回测和运行级别)上, 计算基于30分钟K的某个指标,而这个指标需要大概300多根30分钟K线.  
目前平台的缺陷和限制让我无法在平台实现和运行这个策略,因为:  1.无法获取到足够的30分钟K;  2.即使我自己使用5分钟去组装30分钟K,但5分钟K线不够,从而也无法组装出足够的30分钟K
所以,强烈建议和希望,贵平台能放开这个K线根数限制, 至少放开到1000根吧!
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-4-17 19:42 | 显示全部楼层
本地5分钟K线数据是完备的情况下,  回测起始日是20240219号, 启动后获取不到30m级别的K线, 这明显是个bug吧

日志

日志
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-4-18 08:37 | 显示全部楼层
本帖最后由 技术009 于 2025-4-18 08:41 编辑

请阅读4楼的回复。已经提供了处理方案。也解释了基本的机制,只需要客户代码稍作调整 再配合回测设置 即可规避问题。这个机制目前没有变动的计划。

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

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-4-18 11:59 | 显示全部楼层
这个4楼的方案解决不了问题,  原因我在5楼做了具体说明. 请仔细阅读并测试.  不然真的无法实盘,只能另换平台
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-4-21 18:48 | 显示全部楼层
情况说明: 我们需要商品指数的255根30分钟K, 20150309 是回测起始日, 当天最多只能取49根历史30分钟,  
我需要每天累积直到[20150415 14:00:00]才能累积到足够的30分钟K, 进行指标计算. 这就需要牺牲 20150415 14:00:00时之前的交易机会.
而策略实盘的每次启动,我们都需要浪费这么多天去等待累积到足够的K线,才能进行策略判断. 所以说不放开K线条数,没法实盘
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-1 18:37 , Processed in 0.115263 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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