算法交易代码报错:'str'对象无'iloc'属性及索引越界
问题分析与修正
错误原因拆解
- 'str'对象无'iloc'属性:你的
df['close']、df2['open']或df3['open']列是字符串类型,而非数值类型,导致无法用iloc索引后进行数值比较/计算。 - 单位置索引器越界:
- 初始循环
x从0开始,第一次迭代时x-1=-1,不符合“每日9:20与9:25收盘价对比”的逻辑,还会导致索引混乱。 - 循环内手动执行
x+=1,但for x in range(len(df))本身会自动递增x,造成跳步,容易超出DataFrame索引范围。 df和df2长度可能不匹配(比如df每日2条数据,df2每日1条),用同一个x索引两个表必然越界。
- 初始循环
- 逻辑错误:
- 做多分支误用
short变量(应该用long),利润计算完全错误。 - 遍历
df3时未在触发止损/止盈后退出循环,会重复计算同一笔交易的利润。 - 用
==比较浮点数价格,因精度问题几乎无法命中,应该用区间判断(如>=/<=)。
- 做多分支误用
修正步骤
- 转换数据类型:将所有价格列转为数值类型,清理无效数据。
- 对齐日期索引:按日期关联三个表的每日数据,避免用整数索引跨表取值。
- 修复循环逻辑:移除手动
x+=1,按日期分组处理,避免索引越界。 - 修正交易逻辑:替换错误变量,触发止损/止盈后立即退出循环,改用区间判断价格。
修正后的代码
import pandas as pd # 1. 转换价格列为数值类型,清理无效值 df['close'] = pd.to_numeric(df['close'], errors='coerce').dropna() df2['open'] = pd.to_numeric(df2['open'], errors='coerce').dropna() df3['open'] = pd.to_numeric(df3['open'], errors='coerce').dropna() # 统一日期格式,按日期分组处理 df['date'] = pd.to_datetime(df['date']).dt.date df2['date'] = pd.to_datetime(df2['date']).dt.date df3['date'] = pd.to_datetime(df3['date']).dt.date profit = 0 # 遍历每个交易日 for date in df['date'].unique(): # 获取当日9:20、9:25收盘价 daily_df = df[df['date'] == date] if len(daily_df) < 2: continue # 数据不全跳过 close_920 = daily_df['close'].iloc[0] # 假设第一行是9:20数据 close_925 = daily_df['close'].iloc[1] # 第二行是9:25数据 # 获取当日9:26开盘价 daily_df2 = df2[df2['date'] == date] if daily_df2.empty: continue open_926 = daily_df2['open'].iloc[0] # 获取当日分钟线数据 daily_df3 = df3[df3['date'] == date] if daily_df3.empty: continue # 做空逻辑:9:25收盘价 > 9:20收盘价 if close_925 > close_920: short_price = close_925 sl = open_926 + 50 tgt = open_926 - 50 # 遍历分钟线,触发即退出 for price in daily_df3['open']: if price >= sl: profit += (price - short_price) break elif price <= tgt: profit += (price - short_price) break # 做多逻辑:9:25收盘价 < 9:20收盘价 elif close_925 < close_920: long_price = close_925 sl = open_926 - 50 tgt = open_926 + 50 # 遍历分钟线,触发即退出 for price in daily_df3['open']: if price <= sl: profit += (price - long_price) break elif price >= tgt: profit += (price - long_price) break print(profit)
关键说明
- 用日期分组替代整数索引,彻底解决跨表索引越界问题。
- 转换数值类型时自动处理非数值数据,避免类型错误。
- 分钟线遍历触发后立即
break,防止重复计算利润。 - 改用
>=/<=判断价格,解决浮点数精度导致无法命中的问题。
内容的提问来源于stack exchange,提问作者Raghav Mittal
相关产品推荐
相关产品推荐

