Indie自定义指标开发中arch_volatility变量初始化的类型错误解决咨询
Indie自定义指标开发中arch_volatility变量初始化的类型错误解决咨询
看起来你遇到的是Indie语言强类型特性带来的典型问题——咱们一步步来解决它!
首先,先拆解错误提示的核心信息:
Error: 26:4 cannot initialize
arch_volatilitywithNone; in Indie language optionals are explicit, so to make this assignment, you need to declarearch_volatilityasindie.Optional[...]
这个错误说明Indie是强类型语言,不能直接用None初始化未声明为可选类型的变量。而从你后面的代码逻辑来看,你需要对arch_volatility[0]做累加和赋值操作,这说明它应该是一个可变浮点序列(MutSeriesF),和你之前成功使用的returns是同一种类型,完全不需要用可选类型来声明。
具体解决方案
你只需要把arch_volatility的初始化方式改成和returns一致,再微调循环逻辑即可:
- 替换错误的初始化代码:
把arch_volatility = None改成arch_volatility = MutSeriesF.new(0),这样就给变量赋予了正确的类型和初始值0。 - 确保循环累加逻辑正确:
你原来的循环已经可以正常累加,但要注意Indie中序列的索引规则——self.close[0]是最新收盘价,self.close[i]是往前第i根K线的收盘价,这个逻辑符合ARCH波动率计算的需求。
修改后的完整代码
# indie:lang_version = 5 import math from indie import indicator, param, plot, color, SeriesF, MutSeriesF from indie.algorithms import StdDev, Sma, Ema @indicator('Advanced Volatility and Risk-Adjusted Return Indicator', overlay_main_pane=True) @param.int('stddev_length', default=20, min=1, title='Standard Deviation Length') @param.int('sma_length', default=20, min=1, title='SMA Length for Sharpe Ratio') @param.float('risk_free_rate', default=0.01, title='Risk-Free Rate') @param.int('arch_lag', default=1, min=1, title='ARCH Lag') @plot.line('Standard Deviation', color=color.YELLOW) @plot.line('Sharpe Ratio', color=color.BLUE) @plot.line('ARCH Volatility', color=color.RED) def Main(self, stddev_length, sma_length, risk_free_rate, arch_lag): # Calculate Standard Deviation stddev = StdDev.new(self.close, stddev_length)[0] # Calculate Sharpe Ratio returns = MutSeriesF.new(0) for i in range(1, sma_length + 1): returns[0] += (self.close[i - 1] - self.close[i]) / self.close[i] avg_returns = returns[0] / sma_length excess_returns = avg_returns - risk_free_rate sharpe_ratio = excess_returns / stddev if stddev != 0 else 0 # 修正:用MutSeriesF初始化,和returns保持一致 arch_volatility = MutSeriesF.new(0) mean_return = Sma.new(self.close, sma_length)[0] for i in range(arch_lag): arch_volatility[0] += (self.close[i] - mean_return) ** 2 arch_volatility[0] = math.sqrt(arch_volatility[0] / arch_lag) return ( plot.Line(stddev), plot.Line(sharpe_ratio), plot.Line(arch_volatility[0]) )
为什么这样能解决问题?
MutSeriesF.new(0)会创建一个可变的浮点序列,初始值为0,完全匹配你后续需要累加、修改的操作需求。- 这样初始化后,变量的类型明确,符合Indie的强类型要求,不会再触发类型错误。
- 同时保持了和你现有代码中
returns变量一致的风格,更容易理解和维护。
备注:内容来源于stack exchange,提问作者liadegver
相关产品推荐
相关产品推荐

