Indie Script开发自定义指标时遇'it is forbidden to change the previous values of the series'错误求助
Indie Script开发自定义指标时遇'it is forbidden to change the previous values of the series'错误求助
问题描述
我正在用Indie Script开发一个自定义指标,用来计算波动率和风险调整后的收益率。在修复了最初的公式错误后,现在遇到了这个错误:
it is forbidden to change the previous values of the series
我的目标是计算三个指标:
- 收益率的标准差
- 风险调整后的收益率——夏普比率
- 简化版ARCH波动率
解决方案
嘿,这个坑我之前写Indie Script指标的时候刚好踩过!这个错误的核心原因是Indie Script的系列(Series)对象是严格按K线时序生成的,一旦某根K线对应的系列值计算完成,就绝对不允许再回头修改之前任何一根K线的系列数据了,你肯定是在代码里不小心尝试更新历史位置的系列值了。
针对你要计算的三个指标,给你整理下避坑的实现思路:
1. 收益率标准差
别想着去回溯修改之前的系列值来更新滚动标准差,推荐两种安全的方式:
- 优先用Indie Script内置的
StdDev()滚动函数(如果有对应实现的话),直接传入收益率序列和滚动窗口参数,它会自动按当前K线往前的窗口计算,完全不会碰历史系列值 - 如果要自己实现,就维护一个**普通数组变量(不是Series)**来存储最近N根K线的收益率,每根K线更新这个数组(移除最旧的,加入最新的),然后计算当前窗口的标准差,只赋值给当前K线的输出系列,绝对不要去写
series[barIndex - x] = xxx这种操作历史索引的代码
2. 夏普比率
夏普比率依赖滚动的收益率均值和波动率,同样要遵守「只算当前K线值」的原则:
- 先通过滚动窗口算出当前及前N根K线的超额收益率(收益率减去无风险利率)的均值
- 再用同窗口的收益率标准差作为分母
- 直接把计算结果赋值给当前K线的夏普比率系列,全程不修改任何历史K线的系列数据
3. 简化ARCH波动率
ARCH的递归计算最容易踩这个坑,很多人会想回头调整之前的波动率值,但Indie Script完全不允许这么做。正确的做法是:
- 用一个**普通变量(比如
prevArchVol)**来存储上一根K线的波动率估计值,而不是存在Series里 - 当前K线的波动率用上一根的
prevArchVol加上最新收益率残差的平方项来计算(按简化ARCH的公式) - 计算完成后,把当前的波动率赋值给当前K线的输出系列,同时更新
prevArchVol为当前值,供下一根K线使用
通用排查小贴士
- 全局搜代码里有没有
series[xxx] = ...且xxx是小于当前barIndex的索引,找到就删掉或者改成用普通变量维护状态 - 所有Series的赋值操作,都只针对当前K线(可以直接写
series = 当前计算值,不用指定索引,Indie Script会自动对应到当前K线) - 历史状态的维护用普通变量,不要碰Series的历史位置
备注:内容来源于stack exchange,提问作者liadegver
相关产品推荐
相关产品推荐

