You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Pine Script中Beta系数计算结果异常:代码问题定位求助

问题诊断与修复方案

嘿,我一眼就揪出你代码里的关键问题了——Beta系数的计算公式搞反了分母!

核心错误:方差的计算对象错了

根据Beta的定义,它的公式是:

Beta = (标的收益与大盘收益的协方差) / (大盘收益的方差)

但你代码里写的是:

variance = array.variance(sym_chg_arr) // 这里取的是标的自身的方差,完全错了!
beta = covariance / variance

这直接导致计算结果被错误地缩小(或放大),和真实Beta值偏差极大。

额外优化建议

除了核心公式错误,还有两个点可以优化,让结果更贴合行业常用的Beta计算逻辑:

  • 控制样本窗口大小:你当前的数组会无限累积所有历史数据,计算的是"全历史Beta",但市场上通常用滚动窗口Beta(比如最近252个交易日,对应一年的交易日数量),避免过时数据干扰。
  • 数据对齐保障:使用security函数时,加上参数确保SPX数据和当前标的K线完全对齐,避免因停牌、不同交易时间导致的数据错位。

修正后的完整代码

//@version=4
study("滚动窗口Beta", overlay=false)

// 配置滚动窗口大小(默认252个交易日,可调整)
window_length = input(title="滚动窗口天数", type=input.integer, defval=252, minval=10)

// 当前标的日收益率
sym_change = roc(close, 1)
// 获取SPX收盘价,确保数据对齐
spx_close = security("SPX", timeframe.period, close, barmerge.gaps_off, barmerge.lookahead_off)
// SPX日收益率
spx_change = roc(spx_close, 1)

// 初始化固定大小的数组,超过窗口长度就移除最早的元素
var sym_chg_arr = array.new_float(0)
var spx_chg_arr = array.new_float(0)

array.push(sym_chg_arr, sym_change)
array.push(spx_chg_arr, spx_change)

// 保持数组长度不超过设定的窗口
if array.size(sym_chg_arr) > window_length
    array.shift(sym_chg_arr)
    array.shift(spx_chg_arr)

// 正确计算Beta:协方差 / 大盘收益的方差
covariance = array.covariance(sym_chg_arr, spx_chg_arr)
spx_variance = array.variance(spx_chg_arr)
beta = covariance / spx_variance

// 绘制结果
plot(beta, color=color.yellow, linewidth=2, histbase=0)
hline(1, "市场Beta基准", color=color.blue, linestyle=hline.style_dashed)
hline(0)

验证提示

修正后你可以拿一只已知Beta的股票测试,比如大盘股的Beta通常接近1,成长股可能大于1,防御股小于1,这样就能快速验证结果是否合理了。

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

火山引擎 最新活动