Python交易Bot:4根K线信号生成器报错,疑因数据切片问题
基于4根K线的交易信号代码报错排查与解决
报错原因分析
- 切片范围不匹配需求:原代码的
df = dataF[i-1:i+1]仅截取2根K线(pandas切片为左闭右开,实际取索引i-1和i的行),但新逻辑需要4根K线,导致后续访问iloc[-3]时出现索引越界错误——当前DataFrame只有2行数据,不存在倒数第3行。 - 变量赋值错误:
two_open、three_open错误调用了Close列,应使用Open列;three_open和three_close重复使用iloc[-3],未对应到第4根K线的开盘/收盘价;- 原代码中
close = df.Close.iloc[1]逻辑错误,当切片包含多行时,iloc[1]是第二行数据,而非最新K线的收盘价,应改为iloc[-1]。
- 循环起始位置错误:原循环从
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]
- 最新K线:
- 调整循环与信号初始化:先初始化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
相关产品推荐
相关产品推荐

