背景

用户反馈:拖动K线图表的时候,自编指标的值会发生变化,如下两图:

红绿红绿

红绿红绿红绿

原因是,他的自编指标用到了 DMA 函数:

我们来看一下DMA的函数是怎样的:

由于每一个值依赖前一个值,递归函数类的指标会受到起始值的干扰。用于计算指标的K线数据集不同,指标的值也会产生差异。

目前用于计算指标的K线数据集缓存的逻辑:

  • 图表:PC 图表拖动时,缓存K线和计算指标的逻辑:以图表看得见的左边第一个K线为基准,往前保持至少 1000 个数据点,如果拖动图表导致左边看不见的 K 线数据小于 1000,就会往左边多请求500点。
  • 量化:回测和实盘起始(相当于)预留1000根,随着策略的运行,用到的K线数量会越来越多。如果中间碰到公司行动,就会重新恢复到 1000 根。

究竟缓存多少根,才够用户使用,且图表和量化的误差比较小呢?

最简单的等比数列

$$X_{1} = 10$$

$$X_{2} = X_{1}*b1$$

……

$$X_{n} = X_{n-1}*b1$$

0<b1<1,收敛

b1>1 或 b1<-1,发散

增加一个变量b0

$$X_{1} = 10$$

$$X_{2} = b0+X_{1}*b1$$

……

$$X_{n} = b0+X_{n-1}*b1$$

b1>1 或 b1<-1,发散

-1<b1<1,均值复归

当 b1 为正数时,单向复归,当 b1 为负数时候,震荡复归。

$$复归均值 = \frac{b0}{1-b1}$$

b1与复归速度的关系

可以看出:当数据量足够的时候,确实可以让结果更快趋于平稳,指标值的误差进入一个比较小的状态。

但是当 b1 无限接近 1 的时候,复归速度也会无限慢。我们无法准备无限的K线用于递归类指标的计算。

b1=1,等差数列,无法复归

增加一个随机项

$$X_n = b0+b1*X_{n-1}+epsilon$$

b0:常数

b1:自回归系数

epsilon:随机误差,epsilon~N(0,1)

-1<b1<1,均值复归

当 b1 为正数时,单向复归,当b1为负数时候,震荡复归。

b1与复归速度的关系

b1与复归后的方差的关系

b1无限接近于1时,方差也会无限拉大。

当我们发现拖动图表前后(即用于计算指标的K线数发生变化),指标误差较大时,究竟是源于均值复归速度慢?还是已经复归但方差过大?这也是一个很难判断的事情。

当b0 本身引入随机项的同时,b1趋近于1会放大随机项的影响,导致复归后的方差被拉大。所以简单增加根数并不能保证一定解决问题,观测到误差仍可能很大。

b1=1,随机游走

代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc('font',family='MicroSoft YaHei',weight='bold')  # 设置中文字体

# 定义AR(1)模型的参数
sigma = 1  # 标准差
n = 100  # 样本数


def plot_AR(b1):
    # 生成随机样本
    eps = np.random.normal(loc=0, scale=sigma, size=n)
    # print(eps)
    ar = [10]
    for i in range(1, n):
        ar.append(b1*ar[i-1] + b0 + eps[i])

    # 绘制自回归函数图像
    plt.plot(ar, color=tuple(np.random.rand(3)), label='b0='+str(b0)+';   b1='+str(b1))


if __name__ == '__main__':
    b0 = 5
    plot_AR(b1=0.9)
    plt.title('X_(t)=b0+b1*X_(t-1)+epsilon')  # b1在-1~+1之间都是可以均值复归的
    plt.legend(loc='upper left')
    plt.xlabel('Time')
    plt.ylabel('Value')
    plt.show()
分享到