首页 > 编程语言 >EMA算法的C#实现

EMA算法的C#实现

时间:2022-10-24 13:34:56浏览次数:82  
标签:EMA C# 91 算法 X2 X3 X1 X4

EMA表示的是指数平滑移动平均,其函数的定义为Y=EMA(X,N) 则Y=[2*X+(N-1)*Y']/(N+1), 其中Y'表示上一周期Y值。

求X的N日指数平滑移动平均,它真正的公式表达是:当日指数平均值=平滑系数*(当日指数值-昨日指数平均值)+昨日指数平均值;平滑系数=2/(周期单位+1)

EMA引用函数在计算机上使用递归算法很容易实现,但不容易理解。以下,列举分析说明EMA函数。

X是变量,每天的X值都不同,从远到近地标记,它们分别记为X1,X2,X3,….,Xn

当N=1,则EMA(X,1)=[2*X1+(1-1)*Y’]/(1+1)=X1

当N=2,则EMA(X,2)=[2*X2+(2-1)*Y’]/(2+1)=(2/3)*X2+(1/3)X1

当N=3,则EMA(X,3)=[2*X3+(3-1)*Y’]/(3+1)=[2*X3+2*((2/3)*X2+(1/3)*X1)]/4=(1/2)*X3+(1/3)*X2+(1/6)*X1

当N=4,则EMA(X,4)=[2*X4+(4-1)*Y’]/(4+1)=2/5*X4+3/5*((1/2)*X3+(1/3)*X2+(1/6)*X1)=2/5*X4+3/10*X3+1/5*X2+1/10*X1

当N=5,则EMA(X,5)= (1/3)*X5+(4/15)*X4+(3/15)*X3+(2/15)*X2+(1/15)*X1

当N=6,则EMA(X,6)=(2/7)*X6+(5/21)*X5+(4/21)*X4+(3/21)*X3+(2/21)*X2+(1/21)*X1

当N=7,则EMA(X,7)=(2/8)*X7+(6/28)*X6+(5/28)*X5+(4/28)*X4+(3/28)*X3+(2/28)*X2+(1/28)*X1

当N=8,则EMA(X,8)=(2/9)*X8+(36/36)*X36+(6/36)*X6+(5/36)*X5+(4/36)*X4+(3/36)*X3+(2/36)*X2+(1/36)*X1

当N=9,则EMA(X,9)=(2/10)*X9+(8/45)*X8+(45/45)*X45+(6/45)*X6+(5/45)*X5+(4/45)*X4+(3/45)*X3+(2/45)*X2+(1/45)*X1

当N=10,则EMA(X,10)=(2/11)*X10+(9/55)*X9+(8/55)*X8+(55/55)*X55+(6/55)*X6+(5/55)*X5+(4/55)*X4+(3/55)*X3+(2/55)*X2+(1/55)*X1

当N=11,则EMA(X,11)=(2/12)*X11+(10/66)*X10+(9/66)*X9+(8/66)*X8+(7/66)*X7+(6/66)*X6+(5/66)*X5+(4/66)*X4+(3/66)*X3+(2/66)*X2+(1/66)*X1

当N=12,则EMA(X,12)=(2/13)*X12+(11/78)*X11+(10/78)*X10+(9/78)*X9+(8/78)*X8+(7/78)*X7+(6/78)*X6+(5/78)*X5+(4/78)*X4+(3/78)*X3+(2/78)*X2+(1/78)*X1

当N=13,则EMA(X,13)=(2/14)*X13+(12/91)*X12+(11/91)*X11+(10/91)*X10+(9/91)*X9+(8/91)*X8+(7/91)*X7+(6/91)*X6+(5/91)*X5+(4/91)*X4+(3/91)*X3+(2/91)*X2+(1/91)*X1

其他依次循环可得。

其中,系数分母是N*(N+1)/2。而且任何时候系数之和恒为1。当X是常量,每天的X值都不变,则EMA(X,N)=MA(X,N)。

以上公式可以直接作为计算公式。

从以上的列举分析中,我们可以看到时间周期越近的X值它的权重越大,说明EMA函数对近期的X值加强了权重比,更能及时反映近期X值的波动情况。 所以EMA比MA更具参考价值,而EMA也不容易出现死叉和金叉,所以一旦出现要立即作出反映!对周线处理,EMA就更加稳定了。

像EMA它的定义是 Y=[2*X+(N-1)*Y']/(N+1) Y'是上一个周期的计算值。这样的函数是一个递归函数,不断的调用前一个周期的值来参加计算的。我们为了加快计算的速度,没有采用递归的方式。

/// <summary> 
/// Contains calculation results for EMA indicator
/// </summary>
public class EMAResult
{
public List<double> Values { get; set; } /// <summary>
/// Represents the index of input signal at which the indicator starts
/// </summary>
public int StartIndexOffset { get; set; }
}

-------------------------------------------------------------------------------------------------------------------------------

 

/// <summary> 
/// Calculates Exponential Moving Average (EMA) indicator
/// </summary>
/// <param name="input">Input signal</param>
/// <param name="period">Number of periods</param>
/// <returns>Object containing operation results</returns>
public static EMAResult EMA(IEnumerable<double> input, int period)
{
var returnValues = new List<double>(); double multiplier = (2.0 / (period + 1));
double initialSMA = input.Take(period).Average(); returnValues.Add(initialSMA);
var copyInputValues = input.ToList();
for (int i = period; i < copyInputValues.Count; i++)
{
var resultValue = (copyInputValues[i] - returnValues.Last()) * multiplier + returnValues.Last(); returnValues.Add(resultValue);
} var result = new EMAResult()
{
Values = returnValues,
StartIndexOffset = period - 1
}; return result;
}

上述实现代码来自 ​​http://technicalanalysis.codeplex.com/​




标签:EMA,C#,91,算法,X2,X3,X1,X4
From: https://blog.51cto.com/shanyou/5789500

相关文章

  • 【Webpack】418- 深度优化 Webpack 性能,翻倍构建性能
    0.背景随着构建体系不断完善、构建体验不断优化,webpack已经逐渐成为了前端构建体系的一大霸主,对于工作中的真正意义上的前端工程项目,webpack已经成为了我们前端构建技术选......
  • IIS Community Newsletter June 2013
    Announcements​Windows2012ServerR2previewreleasedWindowsServer2012R2providesawiderangeofnewandenhancedfeaturesandcapabilitiesspanningserv......
  • Vmware虚拟机上CentOS8安装教程
    这篇文章介绍如何在Vmware虚拟机上安装CentOS8操作系统,第一章节先介绍了CentOS的特点,第二章节介绍CentOS操作系统下载,虚拟机下载安装,然后开始介绍操作系统的安装过程,配置过......
  • 608Javascript_语法_变量 and 609 JavaScript_语法_变量_typeof
    Javascript_语法_变量 andJavaScript_语法_变量_typeof 变量         变量:一小块存储数据的内存空间         Java语言是强类型语言,而Java......
  • CentOS设置Mono环境变量
    GitHub上有直接通过脚本一键安装Mono的脚本,具体参见​​https://github.com/nathanb/iws-snippets/tree/master/mono-install-scripts/fedora​​。1、安装Mono的最新环境M......
  • ThreadLocal
    Java当中的四种引用强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference)4种,这4种引用的强度依次减弱。一,强引用Java中默......
  • .net core 5在k8s中部署并发问题之redis
    https://www.cnblogs.com/xwb2535/p/16792124.html 在之前的日记中,记录了csredis+freeredis的不足,今天暂时将redis改用StackExchangeRedis,发现相关redis链接不上......
  • Clay: 创建和使用深层次对象图
    Clay是CodePlex上的一个开源项目,帮助我们创建轻松创建对象,就JavaScript或其它动态语言一样简单。Clay项目的网址是http://clay.codeplex.com,Clay......
  • java - allators混淆打包报错[ERROR] STORED entry missing size, compressed size, o
    1.原因这是版本低导致的,低版本与高版本的zip包依赖冲突2.解决官网下载新版的即可,我这里使用8.3版本地址https://allatori.com/点击那个大按钮即可下载最新版本 ......
  • Code还是NoCode,哪种方式适合你?
    NoCode是一种补充技术堆栈中传统编码的工具。只有某些项目非常适合NoCode介绍NoCode是一个伟大的概念,它使非程序员无需成为软件开发人员即可构建应用程序;但是,有些人认为......