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

Indie自定义指标开发中arch_volatility变量初始化的类型错误解决咨询

Indie自定义指标开发中arch_volatility变量初始化的类型错误解决咨询

看起来你遇到的是Indie语言强类型特性带来的典型问题——咱们一步步来解决它!

首先,先拆解错误提示的核心信息:

Error: 26:4 cannot initialize arch_volatility with None; in Indie language optionals are explicit, so to make this assignment, you need to declare arch_volatility as indie.Optional[...]

这个错误说明Indie是强类型语言,不能直接用None初始化未声明为可选类型的变量。而从你后面的代码逻辑来看,你需要对arch_volatility[0]做累加和赋值操作,这说明它应该是一个可变浮点序列(MutSeriesF),和你之前成功使用的returns是同一种类型,完全不需要用可选类型来声明。

具体解决方案

你只需要把arch_volatility的初始化方式改成和returns一致,再微调循环逻辑即可:

  1. 替换错误的初始化代码:
    把 arch_volatility = None 改成 arch_volatility = MutSeriesF.new(0),这样就给变量赋予了正确的类型和初始值0。
  2. 确保循环累加逻辑正确:
    你原来的循环已经可以正常累加,但要注意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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:07:57