1

我正在使用ta库计算指数移动平均线。目前,我使用迭代器添加每个close值。next我想要做的是将 ema 的输入限制为 201 个值(当您在 201 个输入值或例如 500 个输入值上计算 ema200 时,输出是不同的)。这有可能吗?

use ta::indicators::ExponentialMovingAverage as EMA;
use ta::Next;

pub fn main() {
    let mut reader = csv::Reader::from_path("datafile.csv").unwrap();

    let mut ema = EMA::new(200).unwrap();
    
    for record in reader.deserialize() {
        let (timestamp, open, high, low, close, volume): (String, f64, f64, f64, f64, f64) = record.unwrap();

        let ema_val = ema.next(close);

        println!("{} - ema: {}", timestamp, ema_val);
    }
}

我的数据文件看起来像这样:

timestamp,open,high,low,close,volume
2017-01-03,757.919983,758.760010,747.700012,753.669983,3521100
2017-01-04,758.390015,759.679993,754.200012,757.179993,2510500
2017-01-05,761.549988,782.400024,760.260010,780.450012,5830100
2017-01-06,782.359985,799.440002,778.479980,795.989990,5986200
2017-01-09,798.000000,801.770020,791.770020,796.919983,3440100
2017-01-10,796.599976,798.000000,789.539978,795.900024,2558400
2017-01-11,793.659973,799.500000,789.510010,799.020020,2992800
2017-01-12,800.309998,814.130005,799.500000,813.640015,4873900
2017-01-13,814.320007,821.650024,811.400024,817.140015,3791900
2017-01-17,815.700012,816.000000,803.440002,809.719971,3659400
2017-01-18,809.500000,811.729980,804.270020,807.479980,2354200
2017-01-19,810.000000,813.510010,807.320007,809.039978,2540800
2017-01-20,815.280029,816.020020,806.260010,808.330017,3376200
2017-01-23,806.799988,818.500000,805.080017,817.880005,2797500
2017-01-24,822.000000,823.989990,814.500000,822.440002,2971700
2017-01-25,825.789978,837.419983,825.289978,836.520020,3922600
2017-01-26,835.530029,843.840027,833.000000,839.150024,3586300
2017-01-27,839.000000,839.700012,829.440002,835.770020,2998700
2017-01-30,833.000000,833.500000,816.380005,830.380005,3747300
2017-01-31,823.750000,826.989990,819.559998,823.479980,3137200
4

1 回答 1

2

EMA 的全部意义在于,旧输入值的权重永远不会恰好达到 0,而只是呈指数下降。它的定义和实现方式使得更新非常高效,因为调用next对象EMA实际上只涉及更新一个值。

如果我正确理解您想要做什么,那就是计算一个 EMA,其中包括 200 个时间步的硬权重截止。

所以你想要的不是真正的指数移动平均线,而是权重呈指数衰减的移动平均线。有一个细微的差别,因为有了这个要求,您现在必须跟踪所有前面的 200 个权重。

我没有看到一种简单的方法可以将其破解到该板条箱的EMA结构中ta,因此您必须滚动自己的指标。为此,我建议查看源代码,而不是指数移动平均线,而是简单移动平均线,因为它显示了您如何跟踪已经看到的权重:https ://docs.rs/ta/0.5 .0/src/ta/indicators/simple_moving_average.rs.html#44-50

然后你只需要弄清楚如何正确计算权重并进行更新。

但或者,您可以停下来想一想为什么要在您的 EMA 中添加这样一个“窗口”。

于 2021-10-07T15:18:31.397 回答