You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python交易Bot:4根K线信号生成器报错,疑因数据切片问题

基于4根K线的交易信号代码报错排查与解决

报错原因分析

  1. 切片范围不匹配需求:原代码的df = dataF[i-1:i+1]仅截取2根K线(pandas切片为左闭右开,实际取索引i-1和i的行),但新逻辑需要4根K线,导致后续访问iloc[-3]时出现索引越界错误——当前DataFrame只有2行数据,不存在倒数第3行。
  2. 变量赋值错误:
    • two_open、three_open错误调用了Close列,应使用Open列;
    • three_open和three_close重复使用iloc[-3],未对应到第4根K线的开盘/收盘价;
    • 原代码中close = df.Close.iloc[1]逻辑错误,当切片包含多行时,iloc[1]是第二行数据,而非最新K线的收盘价,应改为iloc[-1]。
  3. 循环起始位置错误:原循环从i=1开始,此时无法凑齐4根K线,会导致前几次循环的切片数据不足,触发索引错误。

解决方案

  • 修正切片逻辑:将切片改为df = dataF[i-3:i+1],确保每次截取当前K线(i)及之前的3根K线,共4行数据。
  • 修正变量赋值:调整各K线的开盘/收盘价的列和索引,确保对应正确的K线:
    • 最新K线:current_open = df.Open.iloc[-1],current_close = df.Close.iloc[-1]
    • 前1根K线:one_open = df.Open.iloc[-2],one_close = df.Close.iloc[-2]
    • 前2根K线:two_open = df.Open.iloc[-3],two_close = df.Close.iloc[-3]
    • 前3根K线:three_open = df.Open.iloc[-4],three_close = df.Close.iloc[-4]
  • 调整循环与信号初始化:先初始化3个0(前3根K线无法生成4根K线的信号),循环从i=3开始(确保有足够的历史K线)。

修正后的完整代码

import yfinance as yf
import pandas as pd

dataF = yf.download("EURUSD=X", start="2022-12-22", end="2022-12-24", interval='60m')
print(dataF.iloc[:])

def signal_generator(df):
    # 最新K线(第4根)
    current_open = df.Open.iloc[-1]
    current_close = df.Close.iloc[-1]
    # 前1根K线(第3根)
    one_open = df.Open.iloc[-2]
    one_close = df.Close.iloc[-2]
    # 前2根K线(第2根)
    two_open = df.Open.iloc[-3]
    two_close = df.Close.iloc[-3]
    # 前3根K线(第1根)
    three_open = df.Open.iloc[-4]
    three_close = df.Close.iloc[-4]

    # 看跌形态判断
    if (current_open <= current_close and
        one_open > one_close and
        two_open < two_close and
        three_open >= three_close):
        return 1
    # 看涨形态判断
    elif (current_open >= current_close and
          one_open < one_close and
          two_open > two_close and 
          three_open <= three_close):
        return 2
    # 无明确形态
    else:
        return 0

signal = []
# 前3根K线无法生成4根K线的信号,填充0
for _ in range(3):
    signal.append(0)

# 从第4根K线开始循环(索引从3开始)
for i in range(3, len(dataF)):
    df = dataF[i-3:i+1]
    signal.append(signal_generator(df))

dataF["signal"] = signal
print(dataF.signal.value_counts())

内容的提问来源于stack exchange,提问作者AARS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:50:27