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

使用f'{col}'的Python函数异常,无法正确生成EWMA列

问题排查与代码修正

原代码核心问题

  • 逻辑终止过早:EWMA函数内遍历索引时,第一次循环就触发return,直接终止函数执行,最终返回None
  • 列匹配错误:遍历p1所有列生成_EWMA列,包含价格列等非目标列,导致生成大量无效列
  • 语法与索引错误:if f'_Ret' in p1.columns末尾多余冒号;i-1的索引方式不适用于非整数型索引
  • 运算类型不兼容:用math.sqrt处理DataFrame数组,该函数仅支持标量运算,无法返回有效结果

修正步骤与代码

步骤1:提取目标工具列

先筛选收益率列,提取对应金融工具名称,避免无差别处理所有列:

import pandas as pd
import numpy as np

# 提前定义平滑系数X(示例值为0.94,可根据需求修改)
lam = 0.94
min_Date = '2018-04-13'

# 筛选p1中的收益率列,提取工具前缀
ret_cols = [col for col in p1.columns if col.endswith('_ret')]
tools = [col.split('_')[0] for col in ret_cols]

步骤2:逐工具计算EWMA

针对每个工具单独递推计算,确保逻辑清晰且仅生成目标列:

# 先按日期排序,简化索引遍历(若p1已排序可跳过)
p1 = p1.sort_values('Date').reset_index(drop=True)

for tool in tools:
    ret_col = f"{tool}_ret"
    # 从seed中提取对应工具的标准差
    sd_val = seed[f"{tool}_SD"].iloc[0]
    ewma_col = f"{tool}_EWMA"
    
    # 初始化EWMA数组
    ewma_vals = np.zeros(len(p1))
    # 计算最早日期的EWMA值
    ewma_vals[0] = np.sqrt(lam * (sd_val ** 2) + (1 - lam) * (p1.iloc[0][ret_col] ** 2))
    
    # 递推计算后续日期的EWMA值
    for i in range(1, len(p1)):
        ewma_vals[i] = np.sqrt(lam * (ewma_vals[i-1] ** 2) + (1 - lam) * (p1.iloc[i][ret_col] ** 2))
    
    # 将结果写入p1
    p1[ewma_col] = ewma_vals

关键说明

  • 仅针对收益率列生成对应_EWMA列,严格控制新增列数量
  • 使用numpy.sqrt替代math.sqrt,支持数组运算
  • 先按日期排序,用整数索引递推,避免复杂的位置查找逻辑
  • 逐工具独立计算,避免批量列操作的混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:52:18