VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 5
声望: 0

description
为什么会出现在当前的bar.datetime时间下,之前的数据与原始值发生了变化,导致连续出现相同的信号
求教有没有大佬能帮忙解决一下这个问题呢

Super Moderator
avatar
加入于:
帖子: 64
声望: 7

在VeighNa平台的CTA策略中,使用ArrayManager计算EMA指标时,随着K线更新导致EMA数值发生变化,这确实与EMA指标的计算方法有关。具体原因如下:

1. EMA指标的计算特性

EMA(指数移动平均)是一种递归计算的指标,其计算公式为:

EMA_today = (Price_today * α) + (EMA_yesterday * (1 - α))

其中,α = 2 / (N + 1)N为EMA的窗口周期。

由于EMA的计算依赖于前一天的EMA值,因此当新的K线数据加入时,EMA的计算会基于最新的价格和前一天的EMA值重新计算,从而导致EMA数值发生变化。

2. 缓存数据长度的影响

增加缓存数据长度(即ArrayManager的初始化长度)可以在一定程度上缓解EMA数值的波动,但并不能完全消除。原因如下:

  • 初始化阶段:如果缓存数据长度较短,EMA的计算可能因为初始数据不足而不稳定。增加缓存长度可以让EMA在初始化阶段更早地收敛到稳定值。
  • 长期影响:即使缓存数据长度足够,EMA仍然会随着新K线的加入而更新,因为EMA的计算本质上是基于最新数据的递归过程。

3. 解决方案

为了减少EMA数值的波动,可以采取以下措施:

  • 增加缓存数据长度:确保ArrayManager的初始化长度足够长(例如设置为EMA窗口周期的2倍以上),以减少初始化阶段的影响。
  • 使用固定长度的历史数据:在策略初始化时,加载足够的历史数据,确保EMA在策略启动时已经收敛到稳定值。
  • 避免频繁更新:如果策略对EMA数值的稳定性要求较高,可以降低K线更新的频率(例如使用更高时间周期的K线)。

4. 代码示例

在策略中,可以通过以下方式设置ArrayManager的缓存长度并计算EMA:

# 初始化ArrayManager,设置缓存长度为1000
self.am = ArrayManager(1000)

# 更新K线数据
self.am.update_bar(bar)

# 计算EMA指标
ema_value = self.am.ema(window=20)  # 假设EMA窗口为20

通过以上方法,可以在一定程度上减少EMA数值的波动,但需要注意EMA本身的递归计算特性。

希望以上解答对您有所帮助!

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】