股市技术指标实际上如何运作?

对股票或加密货币感兴趣的任何人都可以在图表上看到这些附加线。 您可能已经听见了它们不起作用的意见。 但是它们在显示大量重要数据的同时大大提高了我的交易能力。 但是它们实际上是如何工作的? 对谁有用?

如果满足以下条件,您绝对应该阅读以下内容:

  1. 您在日间交易中使用它们
  2. 您打算编写一个交易机器人
  3. 如果您想自己实施交易策略或指标




最常见的技术指标是从股票交易所以UOHLCV格式(统一时间,开盘价,高价,低价,收盘价,成交量)提取的窗口函数,递归函数或价格/数量的加权函数。 指标使用不同的过滤,最小值和最大值或其他指标作为后续计算的基础并不少见。

简单移动平均线(SMA)


在对指标进行编码时,使用功能方法非常方便。 例如,移动平均值只是滚动窗口每个值的平均值。

function sma($close, window) { return rolling(x => mean(x), window, $close); } 

其中平均值是计算数组和滚动平均值的运算,是窗口函数的组合,该函数为数组中的每个现有元素生成最后n个元素的数组,并将该窗口折叠为一个数字的运算

 function rolling(operation, window, array) { let result = []; for (let i = 0; i < array.length; i++) { if (i + 1 < window) { result.push(NaN); } else { result.push(operation(array.slice(i + 1 - window, i + 1))); } } return result; } 

SMA是一个滞后指标,有助于确定趋势。 它绘制为叠加在图表上,通常将第一个值丢弃。 可以将两个移动平均值一起使用以生成交叉信号。

简单移动平均线(SMA)

当一个相对短的移动平均线突破长移动平均线时,就会出现看涨交叉。 在实践中,更经常使用指数加权移动平均值,因为加权窗口函数会减少延迟效果。

标准偏差(STDEV)


如果我们用标准偏差替换SMA中的均值函数,我们将获得滑动标准偏差

 function stdev($close, window) { return rolling(x => sd(x), window, $close); } 

其中sd被认为是方差的平方根,通常没有Bessel校正。 我们将假定每个人都了解如何实现sd

sdx= sqrt frac sumxi hatx2N


之所以使用方差的平方根,是因为方差本身是根据维数理论以美元计,而不是因为有人注册了商标或其他任何东西。

布林乐队(BBAND)


因此,我们已经实现了两个基本指标,可以将它们组合起来并获得新的指标。 例如,如果我们考虑将移动平均值和标准偏差逐点相加乘以2,我们将得到布林带的上部,而如果减去则将得到下部。

 function bb($close, window, mult) { let middle = sma($close, window); let upper = pointwise((a, b) => a + b * mult, middle, stdev($close, window)); let lower = pointwise((a, b) => a - b * mult, middle, stdev($close, window)); return { lower : lower, upper : upper}; } 

函数是另一个有用的函数

 export function pointwise(operation, ...arrays) { let result = []; for (let i = 0, len = arrays[0].length; i < len; i++) { let iarr = (i) => arrays.map(x => x[i]); result[i] = operation(...iarr(i)); } return result; } 

它只是执行几个数组的操作

布林乐队(BBAND)

布林带帮助确定大价格走势之前的平静,并用作在图表上显示波动率的工具,标准差从移动平均线中减去/增加后以在价格上叠加显示在一张图表上。

指数移动平均线(EMA)


我们如何减少简单移动平均线的滞后? 由于它计算的是最后n个收盘价的均值,因此我们可以理解,我们可以进行一定的加权求和并减少旧价格的贡献。

 barx= frac sumxiN= frac sum1 cdotxi sum1 quad Rightarrow quad widetildex= frac sumxiwi sumwi


例如,如果我们选择 wn=qn 和一个常数 q 小于1,那么如果我们从最新的价格开始添加价格,则权重将无限减小。

加权函数

如果我们将窗口扩展到整个长度并假设尾部的贡献很小,也可以近似计算并获得递归方程。

1+q+q2+...+qn\底线n\到 infty\底线q<0= frac11q mathrmEMAcurr= frac sumxiqi sumqi=1q sumxiqi mathrmEMAnext= fracxnext+q cdot sumxiqi1+q cdot sumqi=1q cdot left[xnext+q cdot sumxiqi right] mathrmEMAnext=1q cdotxnext+q cdot mathrmEMAcurr



最后,我们需要一些值α= 1-q作为平滑常数。 有可能证明 ,当我们选择  alpha=2/N+1 上方EMA和SMA权重图的质量中心变得相等。 在代码中,这看起来更加简单。

 function ema($close, window, weight = null) { weight = weight ? weight : 2 / (window + 1); let ema = [ mean($close.slice(0, window)) ]; for (let i = 1; i < $close.length; i++) { ema.push($close[i] * weight + ema[i - 1] * (1 - weight)); }; return ema; } 

通常,这是相同的移动平均线,但更为敏感。

指数移动平均线(EMA)
使用的有效性取决于您的经验和使用的设置。 例如,在站点上,可以很好地选择参数。

移动平均收敛散度(MACD)


1979年,杰拉尔德·阿佩尔(Gerald Appel)提出了最简单,最有效的指标之一。 它将两个趋势EMA指标变成动量指标,并提供了两全其美的方法:趋势跟随和动量。 大致来说,MACD直方图是价格的导数。 它是在新的坐标系统中绘制的,而不是覆盖图,它用两条线和一个直方图表示。

移动平均收敛散度(MACD)

要计算MACD线,我们需要减去空头的多头EMA,仅此而已。 这条线的另一个带有微小窗口的EMA将产生信号线。 直方图是通过两个先前结果之间的差异获得的。

 function macd($close, wshort, wlong, wsig) { let line = pointwise((a, b) => a - b, ema($close, wshort), ema($close, wlong)); let signal = ema(line, wsig); let hist = pointwise((a, b) => a - b, line, signal); return { line : line, signal : signal, hist : hist }; } 

相关矩阵


如果您从事长期投资和投资组合分析,您会发现有用的相关矩阵。

 function cor(f, g) { let Ef = mean(f), Eg = mean(g); let Ef2 = mean(pointwise((a) => a * a, f)); let Eg2 = mean(pointwise((a) => a * a, g)); let Efg = mean(pointwise((a, b) => a * b, f, g)); return (Efg - Ef * Eg) / Math.sqrt((Ef2 - Ef * Ef) * (Eg2 - Eg * Eg)); } 

这里是2个月内不同密码资产的相关矩阵。



指标单元测试


如果我们有准确的指标值表,我们可以精确地测试我们的计算。 有两种方法可以确定这两个函数之间的误差,但是在这种情况下,归一化均方误差比较适合,因为与RMSE相比,它是无量纲的,并且是相对的。

 mathrmNRMSE=\左 sqrt frac sum hatxixi2N middle/ maxxi minxi\对


例如,比特币的价格为20,000美元,而10美元的差异很小,而整个山寨币的价格为1美元,而10美元的差异很大。

 function nrmse(f, g) { let sqrDiff = pointwise((a, b) => (a - b) * (a - b), f, g); return Math.sqrt(mean(sqrDiff)) / (Math.max(...f) - Math.min(...f)); } 

我们也可以使用MAPE,但是它不是可推论的,而且存在接近零的问题。

结论


就是这样。 在几行代码中,我们可以表达基本的技术指标,如果您喜欢这种说明,请检查我在github上的库。 在那里您可以找到更多。 如果您想对机器人使用某些机器学习算法,请选择Zig-Zag指标作为入口点。

参考文献


1. StockCharts-表中包含测试数据的算法列表。
2. Cryptowatch-指标的微调参数。
3. Github-我的源代码。

PS:如果您发现文字有误,请直接告诉我。

Source: https://habr.com/ru/post/zh-CN440090/


All Articles