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

计算熵时触发Runtime Warning的排查与修复咨询

量化脚本熵计算RuntimeWarning的问题分析与修复方案

问题根源

你的代码触发RuntimeWarning的核心原因有两个:

  1. 概率值为负:计算p_sell时,直接用order_flow_imbalance<0的求和结果(负数)除以总订单流,导致p_sell为负,而对数函数np.log2的定义域是正实数,负数输入会触发警告。
  2. 极端值未处理:当某一方向订单流总和为0,或总订单流总和为0时,p_buy/p_sell会变成0或NaN,np.log2(0)返回负无穷、np.log2(NaN)返回NaN,都会触发警告。

修复步骤

  1. 修正概率计算逻辑:计算买入/卖出概率时,取订单流的绝对值,确保概率为正且符合0-1的范围。
  2. 添加极端值防护:对p_buy和p_sell做边界处理,避免0或NaN进入对数计算;同时检查总订单流是否为0,防止除零错误。
  3. 优化熵计算:通过条件判断跳过无效值的计算。

修改后的完整代码

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 获取股票数据
ticker = yf.Ticker("ES=F")
df = ticker.history(interval="2m", period="60d")

# 计算订单流不平衡
df["order_flow_imbalance"] = df["Volume"]
df.loc[df["Close"] > df["Open"], "order_flow_imbalance"] *= -1

# 计算熵值
total_orders = df["order_flow_imbalance"].sum()
# 处理总订单流为0的极端情况
if abs(total_orders) < 1e-9:
    entropy = 0.0
else:
    # 取绝对值计算买入/卖出的总成交量,确保概率为正
    buy_volume = df.loc[df["order_flow_imbalance"] > 0, "order_flow_imbalance"].sum()
    sell_volume = abs(df.loc[df["order_flow_imbalance"] < 0, "order_flow_imbalance"].sum())
    
    p_buy = buy_volume / (buy_volume + sell_volume)
    p_sell = sell_volume / (buy_volume + sell_volume)
    
    # 设置最小阈值,避免log2(0)触发警告
    p_buy = max(p_buy, 1e-10)
    p_sell = max(p_sell, 1e-10)
    
    entropy = -p_buy * np.log2(p_buy) - p_sell * np.log2(p_sell)

df["entropy"] = entropy

# 计算收益率
df["returns"] = (df["Close"] - df["Open"]) / df["Open"]

# 过滤数据
df = df[df["order_flow_imbalance"] > 100000]

# 绘图
sns.scatterplot(x="returns", y="entropy", data=df)
sns.regplot(x="returns", y="entropy", data=df)
plt.show()

关键修改说明

  • 用buy_volume + sell_volume替代原total_orders作为分母,避免因总订单流正负导致的概率异常
  • 对p_buy和p_sell设置最小阈值1e-10,彻底规避log2(0)的警告
  • 添加总订单流为0的判断,直接返回熵值0(无交易时不确定性为0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:45:43