计算熵时触发Runtime Warning的排查与修复咨询
量化脚本熵计算RuntimeWarning的问题分析与修复方案
问题根源
你的代码触发RuntimeWarning的核心原因有两个:
- 概率值为负:计算
p_sell时,直接用order_flow_imbalance<0的求和结果(负数)除以总订单流,导致p_sell为负,而对数函数np.log2的定义域是正实数,负数输入会触发警告。 - 极端值未处理:当某一方向订单流总和为0,或总订单流总和为0时,
p_buy/p_sell会变成0或NaN,np.log2(0)返回负无穷、np.log2(NaN)返回NaN,都会触发警告。
修复步骤
- 修正概率计算逻辑:计算买入/卖出概率时,取订单流的绝对值,确保概率为正且符合0-1的范围。
- 添加极端值防护:对
p_buy和p_sell做边界处理,避免0或NaN进入对数计算;同时检查总订单流是否为0,防止除零错误。 - 优化熵计算:通过条件判断跳过无效值的计算。
修改后的完整代码
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
相关产品推荐
相关产品推荐

