移动平均线
绘制 SMA 和 EMA,观察计算窗口如何随 K 线移动。
收盘价线会跟随每根 K 线的价格变化。如果对连续多个收盘价求平均,得到的线条就不那么曲折。本章用十根 K 线计算两种移动平均线。
计算平均值
三个数的简单平均值,就是它们的和除以三。如果数值为 100、103、101,平均值为:
(100 + 103 + 101) / 3 = 101.333...移动平均线的窗口大小固定,但窗口会随 K 线一起前进。对三根 K 线的窗口来说,下一根到来时,新收盘价进入,最早的一个退出。
如果新收盘价是 105,下一次平均值就是 (103 + 101 + 105) / 3,即 103。最开始的 100 已经不在这个窗口中。
十根 K 线的简单移动平均值需要当前和之前九个收盘价。不是当前再加之前十根:十表示纳入计算的总数。
ta 中的函数
ta 命名空间提供现成的计算。ta.sma(close, 10) 返回十个收盘价的简单移动平均值。SMA 是 “simple moving average” 的缩写。
调用的两个实参:
close:用于求平均的数据源;10:窗口大小,单位是 K 线。
前九根 K 线还没有十个收盘价,所以 SMA 为 na。第十根才出现首个有效值。这个初始阶段也称为预热期。
窗口大小不是秒数。十根日 K 线与十根小时 K 线覆盖的时段不同。
并排观察 SMA 与 EMA
EMA 即指数移动平均,对较新的数值赋予更大权重。ta.ema(close, 10) 同样使用十根的长度参数,但公式不同。
EMA 从第一个完整窗口的简单平均值开始。因此,长度为十时,两条线都在第十根 K 线出现。之后,EMA 将新价格与上一 EMA 的差值乘以一定比例,再加到上一 EMA 上。比例为 2 / (10 + 1)。
创建 moving_averages.py:
"""
@pyne edge
"""
from pynecore.lib import close, color, plot, script, ta
@script.indicator("Two Moving Averages", overlay=True)
def main():
simple_average = ta.sma(close, 10)
exponential_average = ta.ema(close, 10)
plot(simple_average, "SMA 10", color=color.blue, linewidth=2)
plot(exponential_average, "EMA 10", color=color.orange, linewidth=2)用演示数据运行。蓝色 SMA 和橙色 EMA 会显示在价格 K 线旁。拖动图表,观察价格突然转向的位置,两种平均线的反应速度不一定相同。

平均线由历史值计算得来。仅凭线条更平滑,不能判断价格接下来向哪边走。
为什么每根 K 线都要计算?
ta.sma 和 ta.ema 会在连续执行之间使用计算状态。示例中,两个调用都在每根 K 线上运行。
后面我们会写只在某些情况下执行操作的代码,例如收盘价高于平均线才绘制标记。条件与标记一章会介绍。
即便如此,也应在每根 K 线先计算平均值,再决定怎样使用。例如,只在上涨 K 线上调用 ta.sma,其他 K 线就跳过计算,结果可能不同于完整 K 线序列上的平均值。现在先记住:两项平均计算都要逐根执行。
这两条线不需要给自定义变量加 Series:我们只绘制当前值,没有使用 simple_average[1]。以后如果要直接索引自己变量的历史值,再加上 Series[float] 标注。
更长与更短的窗口
长度增加后,更多历史价格参与平均。线条通常更平滑,对价格变化的跟随也更迟。长度缩短时,最新变化会更明显。
在相同数据上试一试:
- 运行两条长度为十的平均线,观察一个容易识别的价格转折。
- 将两个调用的长度都改为 30。
- 将线条标题也改为
SMA 30和EMA 30。 - 再次运行,找到同一时点。
之所以也改标题,是因为 "SMA 10" 只是文字标签。其中的数字不控制计算;真正决定窗口的是调用的第二个实参。
自己试一试
创建两条简单移动平均线,一条使用五根 K 线,另一条使用二十根。短线设为蓝色,长线设为橙色,并为两者写上恰当标题。
参考答案
在 main() 中,将两个计算与绘图部分替换为:
fast_average = ta.sma(close, 5)
slow_average = ta.sma(close, 20)
plot(fast_average, "SMA 5", color=color.blue, linewidth=2)
plot(slow_average, "SMA 20", color=color.orange, linewidth=2)长度为五时,前四根缺值;长度为二十时,前十九根缺值。预热结束后,两条线使用同一组收盘价,只是窗口大小不同。
检查窗口
三根 K 线的 SMA 可以手算验证。将长度设为三,选择连续三个收盘价求平均,图表第三根处应显示同一数值。最开始两根还没有完整窗口。