移动平均和趋势预测

Posted on Wed 05 April 2023 in Journal

Abstract Journal on 2023-04-05
Authors Walter Fan
 Category    learning note  
Status v1.0
Updated 2023-04-05
License CC-BY-NC-ND 4.0

关于移动平均

Moving average (简称 MA) 是一种技术分析工具,用于平滑价格走势以帮助识别趋势。它是通过计算一段时间内的价格平均值来实现的。

Moving average 有很多种不同的类型,但最常用的是简单移动平均线 (SMA),它是通过计算一段时间内的价格总和并将其除以时间段的长度来计算的。

Triple moving average 是一种比 SMA 更高级的移动平均方法。它使用了三条移动平均线,分别用于表示短期、中期和长期趋势。

具体而言,triple moving average 使用三个不同时间段的 SMA 来计算:

  • 短期 SMA:一般选择 5 天或 10 天的时间段。
  • 中期 SMA:一般选择 20 天或 50 天的时间段。
  • 长期 SMA:一般选择 100 天或 200 天的时间段。

当短期 SMA 线穿过中期 SMA 线并朝上移动时,这通常被视为买入信号,表明市场趋势转为上涨。反之,当短期 SMA 线穿过中期 SMA 线并朝下移动时,这通常被视为卖出信号,表明市场趋势转为下跌。

类似地,当中期 SMA 线穿过长期 SMA 线并朝上移动时,也被视为买入信号;反之,当中期 SMA 线穿过长期 SMA 线并朝下移动时,也被视为卖出信号。

Triple moving average 是一种比单一移动平均线更加准确的趋势跟踪方法,因为它考虑了多个时间段的趋势,能更好地反映市场趋势的变化。

例如

#include <iostream>
#include <vector>

using namespace std;

// Function to calculate the Simple Moving Average (SMA)
double calculateSMA(vector<double> data, int n) {
    double sum = 0;
    for (int i = 0; i < n; i++) {
        sum += data[data.size() - i - 1];
    }
    return sum / n;
}

// Function to calculate the Triple Moving Average (TMA)
double calculateTMA(vector<double> data, int n1, int n2, int n3) {
    double sma1 = calculateSMA(data, n1);
    double sma2 = calculateSMA(data, n2);
    double sma3 = calculateSMA(data, n3);
    return (sma1 + 2 * sma2 + sma3) / 4;
}

// Main function to judge the trend using TMA
int main() {
    // Example data
    vector<double> prices = {100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 190, 180, 170, 160, 150};

    // Calculate the TMA with parameters (5, 10, 15)
    double tma = calculateTMA(prices, 5, 10, 15);

    // Print the TMA
    cout << "Triple Moving Average (TMA): " << tma << endl;

    // Judge the trend based on the TMA
    if (prices.back() > tma) {
        cout << "The trend is UP" << endl;
    } else if (prices.back() < tma) {
        cout << "The trend is DOWN" << endl;
    } else {
        cout << "The trend is FLAT" << endl;
    }

    return 0;
}

执行结果如下

./bin/tma_demo
The trend is DOWN

简单移动平均的优点是简单, 缺点是没有考虑到数据的时效性和权重, 于是我们有了指数移动平均, 代码如下

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

double calculateEMA(vector<double> data, int period) {
    double alpha = 2.0 / (period + 1); // Calculate the smoothing factor alpha
    double ema = data[0]; // Initialize the first EMA value with the first data point
    for (int i = 1; i < data.size(); i++) {
        ema = alpha * data[i] + (1 - alpha) * ema; // Calculate EMA using the previous EMA value
    }
    return ema;
}

double calculateTEMA(vector<double> data, int period) {
    double ema1 = calculateEMA(data, period); // Calculate the first EMA
    double ema2 = calculateEMA(vector<double>(data.begin() + period, data.end()), period); // Calculate the second EMA on the first EMA
    double ema3 = calculateEMA(vector<double>(ema2.begin() + period, ema2.end()), period); // Calculate the third EMA on the second EMA
    double tema = 3 * ema1 - 3 * ema2 + ema3; // Calculate TEMA using the three EMAs
    return tema;
}

int main() {
    // Sample data
    vector<double> data = {10.2, 11.3, 12.1, 13.2, 14.5, 15.3, 16.1, 17.4, 18.5, 19.2};

    // Set the period for the TEMA
    int period = 5;

    // Calculate the TEMA
    double tema = calculateTEMA(data, period);

    // Print the result
    cout << "TEMA: " << tema << endl;

    return 0;
}

参考资料

  • https://www.cashbackforex.com/article/moving-averages
  • https://www.investopedia.com/terms/t/triple-exponential-moving-average.asp

本作品采用 chatgpt 的回答加上我的一点理解