【问题标题】:Calculating slope in -ve, zero and +ve domains计算 -ve、零和 +ve 域中的斜率
【发布时间】:2009-05-21 06:29:24
【问题描述】:

想象一个围绕零线振荡的正弦波。我的任务是使用相当粗略的 x 轴刻度计算沿波浪的几个随机点的斜率。 (是的,这有一个真正的应用)

当波浪在 +ve 区域(零线以上)时,斜率可以通过以下公式计算:

Slope = (y(n) / y(n-1)) - 1

这会产生 +ve 倾斜值向上和 -ve 向下倾斜。

问题在于,当我们处于 -ve 区域时必须切换它,然后当其中一个值为零时需要另外两个表达式,总共四个表达式必须使用条件语句以编程方式选择。

我想找到一个涵盖所有四个条件的表达式,因为这是一个频繁使用的算法和时钟计数的中心!

我相信这对于数学天才来说是一个微不足道的解决方案,但对于这些疲惫的眼睛来说,它让我望而却步......

添加:

“正弦波”实际上是源自金融市场(随机)价格行为的 MACD 指标。这里有一个例子:

http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_average_conve

斜率(例如下图中的粗黑线)是我需要计算的,这里定义为向上或向下(向上是+ve)

问题是 +ve 和 -ve 斜率都可能出现在零之上和之下。使用越过零线和零线的增量也可能会发生斜率计算。

如果能找到一个不涉及大量 IF 语句的解决方案,那就太好了……例如,将所有 y 值移动一个固定量,使它们变为 +ve,然后计算 +ve 区域中的斜率。我需要选择一个历史上 y 从未低于过的数字,例如几个数量级 (99),然后我可以执行 offest 和一个斜率计算?

【问题讨论】:

  • 该函数不计算斜率,这就是为什么您遇到问题的原因...您是否特别需要斜率,或者上升或下降是否足够?还是您真的想要这个比率,这就是您从方程式中得到的?
  • 斯托博刚刚问了什么。我也想知道这个正弦波是否有一个已知的方程,在这种情况下这甚至不是问题,因为你可以在任何给定的时刻分析计算导数。但也许你有一些测量数据,例如示波器或类似设备?请提供更多信息。
  • >该函数不计算斜率。那它计算什么?不,该图没有已知功能。它可以被认为是随机的。
  • 那么你在这里得到答案了吗?我通读了回复,但我不清楚是否有答案。很高兴看到一个对阅读该帖子的其他人来说清楚的结论。感谢您提出有趣的问题。
  • 不,在这个论坛上,人们似乎更关心囤积积分而不是理解问题。如果工作量太大,他们就会放弃。

标签: algorithm math geometry


【解决方案1】:

“正弦波”是什么意思?您的意思是数学生成的y = a sin(bx) 绘图还是通过样条曲线拟合到某些实验点的平滑曲线,它恰好类似于正弦波,因为它围绕 x 轴振荡?如果是前者,您可以在数学上区分它并在任何点获得精确的斜率。如果是后者,您要查找的公式是

slope(x) = (y(x-delta) - y(x+delta))/(2 * delta)

用不同的 delta 值进行实验。不涉及条件;分子和分母的符号将自动确保您得到正确的斜率符号。

【讨论】:

  • 你不应该除以 2 delta 吗?
  • 感谢您提供非常丰富的答案。我应该解释一下基础数据系列本质上是随机的(见上面添加的)作为函数的差异会是什么样子?
  • mike:斜率的概念要求你的曲线是连续的。如果您的绘图是一系列离散的随机点,您需要首先通过它拟合一条平滑曲线(有关执行此操作的一些方法,请参阅en.wikipedia.org/wiki/Curve_fitting),然后根据您用来生成曲线的方程计算曲线的斜率.如果您对曲线的趋势更感兴趣,可以使用我上面提供的公式。它的作用是在您想要的点周围设置一个窗口(增量),绘制两条垂直线,查看它们与曲线相交的位置并将这些点与一条线连接起来。
  • 嗨,Matin,谢谢您的回复。是的,曲线必须是平滑的。这是用于指标的时间框架和回溯k 的函数。它基本上是平滑的,因为它基于较长时期的移动平均线。垂直线实际上是时间帧的增量(y轴)
  • mike:我认为你需要注意的一件事是通过在 x 周围 取一个窗口而不是右手窗口来计算点 x 的斜率边是 x。此外,如果您的曲线是通过离散刻度绘制的,即使是移动平均线在数学意义上也不是真正“平滑”的,但这对您的目的并不重要。
【解决方案2】:

坡度刚好

slope = y(n)-y(n-1)

或者,如果您在 x 轴上有单位,请将其除以 x 轴步长(即 x(n)-x(n-1))。

这个公式是一种定义,你在 x 轴的哪一边并不重要。 (我在这里说“某种程度的”,因为斜率是这个方程的极限,因为你的样本箱非常接近,所以这个方程是一个近似值,可以使用其他近似值。)

请记住,嘈杂数据的斜率看起来会更加嘈杂。

我怀疑slope page on wikipedia 的前几段会帮助你解决这个问题。

【讨论】:

  • 是的,但是当值为 -ve 时,斜率变为 y(n-1) - y(n)。当一个值是 +ve 或零时,它又是不同的......
  • 不,公式真的没有改变。例如,向上或向下移动曲线,正数或负数不会改变斜率,实际上还是在这个公式中。 (这里有一个小证明:要向上或向下移动,在每个点上添加一个常数,比如 C,所以 Y(n) = y(n) + C。然后 Y(n)-Y(n-1) = ( y(n)+C) - (y(n-1)+C) = y(n)-y(n-1) + C - C = y(n) - y(n-1)。 same 斜率。)也许试着把真实的数据放在一边,然后用真实的正弦曲线试试这种类型的东西,例如。
  • 也许举个例子可以澄清一下?说 y(n)=30 和 y(n-1)=10;那么斜率为 30-10=20。下移20,y(n)=10,y(n-1)=-10;然后斜率 = 10-(-10) = 10+10 = 20。将原图下移 40,y(n)=-10 和 y(n-1)=-30;那么斜率=-10-(-30)=-10+30=20。每次都使用完全相同的公式。
  • 汤姆,你不懂。当曲线在 -ve 域中时,上升斜率具有较小的负 y 值。在 +ve 域中,它具有增加的 y 轴值。意思是,在负域中上升意味着减少 -ve 值,而在正域中上升意味着增加 +ve 值。然后,如果您添加一个值是相反符号或零的情况,您将有 6 种左右的情况需要定义。将值转移到 +ve 域可以解决这个问题。
  • 迈克,我可能误会了。你能给我,或者在你的问题陈述中发布一个使用实际数字的例子,就像我在上面的评论中所做的那样,上面等式中的直接减法没有给出正确的斜率。
【解决方案3】:

如果您正在寻找正弦波的斜率,它是通过标准微积分函数完成的。

f(x)=sin(x) 线的斜率是f'(x)=cos(x)

但是,根据您的公式,我不完全确定这就是您所追求的。也许你需要澄清一下。

但是,如果您想要问题中显示的方法,我认为您对性能的关注在这里是错误的。为了将此计算作为单个算术表达式进行,您将必须乘以 -1,具体取决于您是在 x 轴上方还是下方(以及您是否从 f(n -1) 到 f(n))。

一旦它被编译成机器语言,它可能会比一个简单的 if 语句序列更慢(或至少不快)。

与所有优化一样,您应该先选择最容易开发的方法然后看看它是否存在性能问题。否则,您可能会在前期浪费大量精力来获得不必要的提升。

【讨论】:

  • 非常好的建议。我希望有一个优雅的解决方案,比如将所有值移动一个固定的偏移量,使它们变为 +v,然后计算斜率
【解决方案4】:

你不需要斜坡;你可以这样做:

(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0) ) < 
iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2)

表示减少。其他递增图,前提是:

(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0) ) >0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多