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

算法交易代码报错:'str'对象无'iloc'属性及索引越界

问题分析与修正

错误原因拆解

  1. 'str'对象无'iloc'属性:你的df['close']、df2['open']或df3['open']列是字符串类型,而非数值类型,导致无法用iloc索引后进行数值比较/计算。
  2. 单位置索引器越界:
    • 初始循环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索引两个表必然越界。
  3. 逻辑错误:
    • 做多分支误用short变量(应该用long),利润计算完全错误。
    • 遍历df3时未在触发止损/止盈后退出循环,会重复计算同一笔交易的利润。
    • 用==比较浮点数价格,因精度问题几乎无法命中,应该用区间判断(如>=/<=)。

修正步骤

  1. 转换数据类型:将所有价格列转为数值类型,清理无效数据。
  2. 对齐日期索引:按日期关联三个表的每日数据,避免用整数索引跨表取值。
  3. 修复循环逻辑:移除手动x+=1,按日期分组处理,避免索引越界。
  4. 修正交易逻辑:替换错误变量,触发止损/止盈后立即退出循环,改用区间判断价格。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:40:32