Skip to content

rs-czsc实现中check_fxs 产生大量 "分型时间相同" 警告 #289

@ohydo

Description

@ohydo

Bug Report: check_fxs 产生大量 "分型时间相同" 警告

问题描述

在使用 rs-czsc (Rust 实现) 处理60分钟K线数据时,check_fxs 函数产生大量警告,提示分型时间相同。但在相同数据上使用 Python 实现 (CZSC_USE_PYTHON=1) 时,警告消失。

复现步骤

测试数据

  • 60分钟K线数据
  • 时间精度:分钟级别(无秒信息)
  • 数据时间唯一,无重复

复现代码

import os
import warnings
import pandas as pd
from datetime import datetime
# 使用 Rust 实现(默认)
# os.environ["CZSC_USE_PYTHON"] = "0"  # 或者不设置
from czsc import CZSC
# 加载60分钟K线数据
bars = [...]  # RawBar 列表,时间格式如 2021-12-20 15:00:00
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter("always")
    
    c = CZSC(bars)
    
    # 逐根K线更新
    for bar in bars[500:]:  # 预热后开始
        c.update(bar)
        
    # 检查警告
    check_fxs_warnings = [x for x in w if "check_fxs" in str(x.message)]
    print(f"check_fxs 警告数量: {len(check_fxs_warnings)}")
    
    # 打印前几个警告
    for warning in check_fxs_warnings[:5]:
        print(f"  {warning.message}")
实际输出Rust 实现check_fxs 警告数量: 100+ (大量)
  check_fxs错误: 2021-12-20 15:00:00 UTCGG
  check_fxs错误: 2021-12-21 10:00:00 UTCGG
  ...
警告格式check_fxs错误: <时间> UTC<分型类型1><分型类型2>
关键特征两个分型类型相同 "G,G"),表示检测到两个相同类型的分型在同一时间对比输出Python 实现os.environ["CZSC_USE_PYTHON"] = "1"  # 强制使用 Python 实现
# 相同代码...
输出check_fxs 警告数量: 0
预期行为
check_fxs 不应产生大量 "分型时间相同" 警告因为1. 输入的60分钟K线时间唯一无重复
2. Python 实现处理相同数据无警告
3. 分型时间相同 "G,G"不应出现因为相邻分型类型应该交替顶分型后应为底分型可能原因分析
1. 时间精度处理问题
60分钟K线时间格式为 2021-12-20 15:00:00无秒信息)。
Python 实现 (czsc/py/analyze.py 第107-133):
def check_fxs(fxs: List[FX]) -> None:
    """检查分型列表是否有效"""
    for i in range(1, len(fxs)):
        fx1, fx2 = fxs[i - 1], fxs[i]
        if fx1.dt == fx2.dt:
            warnings.warn(f"check_fxs错误:{fx1.dt}{fx1.mark}{fx2.mark}")
Python 实现简单比较 fx1.dt == fx2.dtRust 实现 可能- 时间比较精度不一致
- 或分型时间生成逻辑有差异
2. 分型生成逻辑差异
分型时间 (fx.dt) 通常取分型中间K线的时间60分钟数据无秒精度时- 分型时间精度分钟级
- 如果相邻分型的中间K线在同一分钟可能导致时间相同
但这种情况理论上不应频繁出现 Python 实现未出现此问题3. 时区处理
警告显示时间带有 UTC 后缀可能存在时区转换问题环境信息
项目	信息
Python 版本	3.10+
rs-czsc 版本	(获取不了具体版本只显示未知)
操作系统	Linux
CZSC 版本	0.10.x
临时解决方案
 Python 代码中设置环境变量强制使用 Python 实现import os
os.environ["CZSC_USE_PYTHON"] = "1"  # 必须在导入 czsc 之前
或使用 spawn 启动方法的子进程import multiprocessing
import pickle
def worker(engine_pickle, symbol):
    os.environ["CZSC_USE_PYTHON"] = "1"
    engine = pickle.loads(engine_pickle)
    return engine.run_symbol(symbol)
ctx = multiprocessing.get_context("spawn")
with ProcessPoolExecutor(mp_context=ctx) as executor:
    results = executor.submit(worker, pickle.dumps(engine), symbol)
相关代码位置
- Python check_fxs 实现czsc/py/analyze.py 第107-133
- Rust check_fxs 实现rs-czsc 库内部
请求
1. 请确认 Rust  check_fxs 的时间比较逻辑
2. 请检查分型时间生成逻辑与 Python 版本的一致性
3. 如有可能请提供修复版本或指导如何调试 Rust 代码
Python check_fxs 实现参考
def check_fxs(fxs: List[FX]) -> None:
    """检查分型列表
    
    分型列表应该满足:
    1. 两个相邻分型的时间不能相同
    2. 两个相邻分型的类型必须相反(顶分型后必须是底分型)
    
    :param fxs: 分型列表
    """
    if len(fxs) == 0:
        return
    
    for i in range(1, len(fxs)):
        fx1, fx2 = fxs[i - 1], fxs[i]
        
        # 检查时间
        if fx1.dt == fx2.dt:
            warnings.warn(f"check_fxs错误:{fx1.dt}{fx1.mark}{fx2.mark}")
        
        # 检查类型交替
        if fx1.mark == fx2.mark:
            warnings.warn(f"check_fxs错误:{fx1.dt}{fx1.mark}{fx2.mark}")
---
感谢维护者的辛勤工作

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions