金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 416|回复: 5

关于Python程序history_bars_date的获取昨日收盘价问题-2

[复制链接]

12

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2025-4-8
曾用名:
发表于 2025-6-10 22:11 | 显示全部楼层 |阅读模式
老师好!我用如下程序获取获某期货的昨日收盘价,目前报如下错误,请帮忙指正可能的错误,非常感谢!
21:14:35 > 无法获取 M00 在 2025-06-10 的收盘价,可能是数据缺失
21:14:35 > 无法获取 RB00 在 2025-06-10 的收盘价,可能是数据缺失
21:14:35 > 无法获取 FG00 在 2025-06-10 的收盘价,可能是数据缺失
21:14:35 > 无法获取 C00 在 2025-06-10 的收盘价,可能是数据缺失
21:14:35 > 无法获取 HC00 在 2025-06-10 的收盘价,可能是数据缺失
21:14:35 > 无法获取 SA00 在 2025-06-10 的收盘价,可能是数据缺失
21:14:35 > 无法获取 TA00 在 2025-06-10 的收盘价,可能是数据缺失


源程序如下:
def get_previous_day_close(context, contract, current_time):
    """
    获取前一交易日的收盘价(当日 15:00 收盘)。
    逻辑步骤:
    1. 用 get_previous_trading_date 获取前一个实际交易日;
    2. 构造从前一交易日当日 00:00:00 到 次日 00:00:00 的时间区间;
    3. 用 history_bars_date 获取该日的日线数据,取最后一条 close。
    """
    try:
        prev_trading_date = get_previous_trading_date(current_time.date(), 1)
        start_str = prev_trading_date.strftime('%Y-%m-%d') + '00:00:00'
        next_day = prev_trading_date + datetime.timedelta(days=1)
        end_str = next_day.strftime('%Y-%m-%d') + '00:00:00'
        bars = history_bars_date(
            contract,
            start_str,
            end_str,
            '1d',
            ['close'],
            skip_suspended=True,
            include_now=False
        )
        if bars is None or len(bars) < 1:
            print(f"无法获取 {contract} 的前一日收盘价,可能是数据缺失")
            return None
        if isinstance(bars, np.ndarray):
            previous_close = bars[-1, 0] if bars.ndim == 2 else bars[-1]
        elif isinstance(bars, list) and all(isinstance(bar, dict) for bar in bars):
            previous_close = bars[-1]['close']
        else:
            print(f"无法识别 {contract} 的 bars 类型: {type(bars)}")
            return None
        return previous_close
    except Exception as e:
        print(f"获取 {contract} 的前一日收盘价失败: {str(e)}")
        return None


回复

使用道具 举报

37

主题

9998

帖子

6万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-6-11 09:10 | 显示全部楼层
你这个问题有可能是你本地没有10号的日线数据,建议你补充数据后再看下。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

12

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2025-4-8
曾用名:
 楼主| 发表于 2025-6-11 10:16 | 显示全部楼层
目前跑的是实盘交易,目前测出history_bars_date函数无法取回昨日的收盘价,而history_bars可以取回昨日收盘价,但是收盘价与实际实盘不一致,请帮忙告知如何精准取回昨日收盘价。非常感谢!


def get_previous_day_close(context, contract, current_time):
    """获取前一交易日下午收盘价;主方案 + fallback"""
    try:
        prev_day = current_time.date() - datetime.timedelta(days=1)
        start_str = prev_day.strftime('%Y-%m-%d') + ' 00:00:00'
        end_str   = prev_day.strftime('%Y-%m-%d') + ' 23:59:59'

        # 主方案:history_bars_date
        bars = history_bars_date(contract, start_str, end_str, '1d', ['close'],skip_suspended=True, include_now=False)

        # 判断并提取
        if isinstance(bars, np.ndarray):
            if bars.shape[0] >= 1:
                # 2D 数组时首列为 close
                return float(bars[-1,0] if bars.ndim==2 else bars[-1])
        elif isinstance(bars, list) and len(bars) >= 1 and isinstance(bars[-1], dict):
            return float(bars[-1]['close'])

        # 主方案失败,fallback:history_bars 最近2日日线
        fb = history_bars(contract, 2, '1d', ['close'],skip_suspended=True, include_now=False)
        if isinstance(fb, np.ndarray) and fb.shape[0] >= 2:
            return float(fb[-2,0] if fb.ndim==2 else fb[-2])
        if isinstance(fb, list) and len(fb) >= 2 and isinstance(fb[-2], dict):
            return float(fb[-2]['close'])

        # 若仍失败
        print(f"[跳过] {contract} 前一日收盘价不可用")
        return None

    except Exception as e:
        print(f"[异常] 获取 {contract} 前一日收盘价失败:{e}")
        return None
回复

使用道具 举报

12

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2025-4-8
曾用名:
 楼主| 发表于 2025-6-11 10:53 | 显示全部楼层

以下为通过获取history_bars函数返回的昨日收盘价,对应的期货涨跌幅为如下样例,请老师帮忙指正!
始终是当前涨幅第一: AG00, 对应涨幅=7.23%, 跌幅第一: JM00, 对应跌幅=-27.40%。始终是AG00和JM00的涨跌幅最大,这与实际盘面不符。
10:50:30 > 当前时间2025-06-11 10:50:30.242149,期货IDSC0000,当前价477.8999938964844,收盘价539.7000122070312,价差-11.450809137065598

10:50:30 > 合约 ZC00 最新价格数据长度不足
10:50:30 > 当前涨幅第一: AG00, 对应涨幅=7.23%, 跌幅第一: JM00, 对应跌幅=-27.40%
10:50:30 > 当前持仓: {'AG00': {'direction': 'long', 'open_price': 8908.0}, 'JM00': {'direction': 'short', 'open_price': 783.5}}
回复

使用道具 举报

12

主题

49

帖子

49

积分

Rank: 1

等级: 新手上路

注册:
2025-4-8
曾用名:
 楼主| 发表于 2025-6-11 10:59 | 显示全部楼层
以下是针对history_bars和history_bar_date进行联合使用的程序,目前只有history_bars返回值好使,但是返回的收盘价却是不准的。
def get_previous_day_close(context, contract, current_time):
    """获取前一交易日下午15:00的收盘价"""
    try:
        previous_day = current_time.date() - datetime.timedelta(days=1)
        current_day = current_time.date()
        previous_str = previous_day.strftime('%Y-%m-%d') + '00:00:00'
        current_str = current_day.strftime('%Y-%m-%d') + '00:00:00'
        bars = history_bars_date(contract, previous_str, current_str, '1d', ['close'], skip_suspended=True, include_now=False)
        
        if bars is None:
            print(f"无法获取 {contract} 的前一日收盘价,数据为 None")
            return None
        
        if isinstance(bars, np.ndarray):
            if bars.shape[0] >= 1:
                previous_close = float(bars[-1, 0] if bars.ndim == 2 else bars[-1])
            else:
                fb = history_bars(contract, 2, '1d', ['close'],skip_suspended=True, include_now=False)
                if isinstance(fb, np.ndarray) and fb.shape[0] >= 2:
                    return float(fb[-2,0] if fb.ndim==2 else fb[-2])
                if isinstance(fb, list) and len(fb) >= 2 and isinstance(fb[-2], dict):
                    return float(fb[-2]['close'])               
                print(f"无法获取 {contract} 的前一日收盘价,数组长度不足")
                return None
        elif isinstance(bars, list):
            if len(bars) >= 1 and isinstance(bars[-1], dict) and 'close' in bars[-1]:
                previous_close = float(bars[-1]['close'])
            else:
                print(f"无法获取 {contract} 的前一日收盘价,列表数据不符合要求")
                return None
        else:
            print(f"无法获取 {contract} 的前一日收盘价,数据类型未知: {type(bars)}")
            return None
        
        return previous_close
    except Exception as e:
        print(f"获取 {contract} 的前一日收盘价失败: {str(e)}")
        return None
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-6-11 13:32 | 显示全部楼层
前一个交易日,你这里是不能简单说 用当前日期减去一日。你直接减去,你获取的未必是一个交易日日期的。如果今天是周一,你的算法里获取的就是周日。

用get_previous_trading_date  处理前一个交易日日期的问题。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 12:12 , Processed in 0.197057 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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