Google sheets GoogleFinance函数用于计算google sheets中的指数移动平均值
我正在使用google sheets和google Finance函数获取股票数据。我能用下面的公式计算一个简单的移动平均线。我试图得到每只股票长度为8,13,21,55的指数移动平均值。关于指数移动平均线公式的任何建议Google sheets GoogleFinance函数用于计算google sheets中的指数移动平均值,google-sheets,google-sheets-formula,moving-average,google-finance,google-finance-api,Google Sheets,Google Sheets Formula,Moving Average,Google Finance,Google Finance Api,我正在使用google sheets和google Finance函数获取股票数据。我能用下面的公式计算一个简单的移动平均线。我试图得到每只股票长度为8,13,21,55的指数移动平均值。关于指数移动平均线公式的任何建议 =AVERAGE(INDEX(GoogleFinance("MSFT","all",WORKDAY(TODAY(),-8),TODAY()),,3)) 编辑: 添加我的谷歌表单体验 我发现这个用户的名字是“Jonathan K 2806” 请尝试以下更简单且可能足够的方法:
=AVERAGE(INDEX(GoogleFinance("MSFT","all",WORKDAY(TODAY(),-8),TODAY()),,3))
编辑:
添加我的谷歌表单体验
我发现这个用户的名字是“Jonathan K 2806”
请尝试以下更简单且可能足够的方法:
/**
* Calculates the EMA of the range.
*
* @param {range} range The range of cells to calculate.
* @param {number} n The number of trailing samples to give higer weight to, e.g. 30.
* @return The EMA of the range.
* @customfunction
*/
function EMA(range, n) {
if (!range.reduce) {
return range;
}
n = Math.min(n, range.length);
var a = 2 / (n + 1);
return range.reduce(function(accumulator, currentValue, index, array) {
return currentValue != "" ? (currentValue * a + accumulator * (1-a)) : accumulator;
}, 0);
}
转到工具->脚本编辑器,将其粘贴到那里,然后点击保存,然后返回电子表格并在单元格中键入=EMA($A2:$A100,10) 或者您希望如何使用它。以下公式用于计算当前指数移动平均值(EMA): 均线=收盘价x衰减\多人游戏+均线(前一天)x (1-U多人游戏) 均线赋予近期价格更高的权重,而常规移动平均线赋予所有价值同等的权重 衰变_多人游戏的选择应大于0且小于1 如果你选择一个更大的数字,就像短期移动平均线(更快的衰减),如果你选择一个更小的数字,就像长期移动平均线 要在google sheet中实现这一点,您必须创建一个新列,表示每天的EMV值。您必须填写第一个EMV值(第一个收盘价),然后使用上述函数根据当前收盘价和以前的EMV值计算每个新的EMV 我在这里创建了一个谷歌表单作为示例:
上述公式在技术上与指数移动平均数不同。 指数衰减函数如下所示。 它通常用于建模随时间衰减的影响,越重的权重越接近的条目(如上所述)。尽管如此,上述公式并不相同 EWMA/EMA的实际形式有所不同,可在此处找到: 上述情况可能被视为指数平滑的一种变体,但实际上并非如此: 就个人而言,我更喜欢使用e^-ax函数加权平均值。我可以控制“a”参数用于早期和后期项目的权重,以便更好地调整权重 currentValueComponent_i=currentValuex*e^-时间_i/Tau 为所需数量的项目添加尽可能多的currentValueComponents。 Tau是元素63%衰减的时间常数,根据加权平均值中包含的项目数,将添加到每个迭代中
资料来源:我是一名工程师。我定期这样做。最简单的方法是,给定一列
X2:X..
和单元格Z1
中的权重系数a,指数移动平均值可以在行Y2:Y..
中递归计算,如下所示:
EMA
=X2
=$Z$1*X3+(1-$Z$1)*(Y2)
=$Z$1*X4+(1-$Z$1)*(Y3)
=$Z$1*X5+(1-$Z$1)*(Y4)
=... # the pattern will repeat itself properly using the drag function
递归公式如下所述:
当然,这只适用于数据点之间的间隔始终相同的情况。对Jonathan K的工作进行了一些改进
- 提高短输入(range.length=1或2)的精度
- 边界检查
- 指定输入数组的预期顺序
- 给出一个可供选择的定义
- 添加一个测试函数
/** *计算范围的EMA。 * *@param{range}range要计算的单元格范围。新值(更高的权重)应位于左侧。 *@param{number}n要赋予更高权重的后续样本数,例如30。 *低于1的值被视为1,它只返回最近的值。 *@返回该范围的EMA。 *@customfunction */ 函数EMA(范围,n){ 如果(!range.reduce){ //无法运行ema-保释 返回范围; }else if(range.flat和range.reverse){ //如果可能,请展平阵列并重新组织,右侧(最后一个)有新值 //注意:删除。如果输入范围最右边的元素是最新的/需要更高的权重,则相反 range=range.flat().reverse(); } n=Math.max(n,1);//n的下界为1 var a=1-(2/(n+1)); //在现有的a设置中,86%的EMA总重量将属于前n个值。
//a的另一个定义,其中n是需要保留的间隔数(我认为您需要添加更多信息,说明您希望该函数如何执行,不仅仅是数学上的,例如,您希望它看起来有多远。以及它是否需要装入一个单元格,或者是否可以(a)使用用户定义的函数和/或(b)将解决方案放在几个单元格/列上。我也想这样做。你做到了吗?我从中获得的值与我在tradingview中获得的值无关。comIt是一个很长的过程,我找到了这个答案的引用,大麦可以记住它。抱歉,这有一个非常严重的错误,它将一个起始值0添加到累加器。换句话说,累加器中的第一个值并没有得到它的全部重量,只有alpha。在极短的范围内(nfully agree@Barett,我刚刚很长时间根据作者Jonathan K 2806提供了答案,没有改变。你的努力得到了重击