金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 303|回复: 6

关于递归的问题

[复制链接]

15

主题

37

帖子

37

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
发表于 2024-9-10 11:23 | 显示全部楼层 |阅读模式
我尝试实现高通滤波的公式,是通过python指标转移过来的
import numpy as np  # 导入NumPy库,用于高效的数值计算def high_pass_3(data, length):    """    实现一个高通滤波器,使用递归方式处理输入数据。        参数:    data : array-like        输入数据,通常是时间序列数据。    length : int        滤波器的长度(影响滤波器的频率响应)。            返回:    hp : array        高通滤波后的数据。    """    # 计算滤波器的频率    f = 1.414 * np.pi / length      # 计算滤波器系数    a1 = np.exp(-f)      c2 = 2 * a1 * np.cos(f)      c3 = -a1 * a1      c1 = (1 + c2 - c3) / 4  # 计算常数c1    # 初始化高通滤波后的数据数组    hp = np.zeros(len(data))        # 通过递归公式计算高通滤波后的数据    for i in range(2, len(data)):        hp += c1 * (data - 2 * data[i-1] + data[i-2])  # 应用差分公式        hp += c2 * hp[i-1]  # 使用前一个滤波值        hp += c3 * hp[i-2]  # 使用前两个滤波值    return hp  # 返回高通滤波后的数据然后我的pel公式如下:
input:N(15,1,100);// 高通滤波器a1 := EXP(-1.414 * 3.14159 / N);b1 := 2 * a1 * COS(1.414 * 180 / N);c2 := b1;c3 := -a1 * a1;c1 := (1 + c2 - c3) / 4;// 如果当前不是前几日,则应用平滑公式VARIABLE:HighPass:=0;IF BARSCOUNT(close) < 4 THEN HighPass := 0;HighPass := c1 * (c - 2 * REF(c, 1) + REF(c, 2))                + c2 * REF(HighPass, 1)                + c3 * REF(HighPass, 2);    lineHighPass:HighPass;


我的问题是1:这个高通滤波器的公式不知道为啥出来的曲线怎么都不对,我感觉是不是数据的问题,内存引入的数据不是从零开始的,导致计算有问题;
2、是我公式写的不对还是怎么?请问有什么办法在金字塔实现高通滤波器吗?
回复

使用道具 举报

15

主题

37

帖子

37

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2024-9-10 11:25 | 显示全部楼层
发布就不能编辑了,这格式不知道为啥这么怪,不好意思
回复

使用道具 举报

15

主题

37

帖子

37

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2024-9-10 13:54 | 显示全部楼层
考虑到格式有些难看,我重新编辑下格式,python代码如下:import numpy as np  # 导入NumPy库,用于高效的数值计算
def high_pass_3(data, length):

    # 计算滤波器的频率
    f = 1.414 * np.pi / length  

    # 计算滤波器系数

    a1 = np.exp(-f)  

    c2 = 2 * a1 * np.cos(f)  

    c3 = -a1 * a1  

    c1 = (1 + c2 - c3) / 4  # 计算常数c1


    # 初始化高通滤波后的数据数组

    hp = np.zeros(len(data))


    # 通过递归公式计算高通滤波后的数据

    for i in range(2, len(data)):

        hp[i] += c1 * (data[i] - 2 * data[i-1] + data[i-2])  # 应用差分公式

        hp[i] += c2 * hp[i-1]  # 使用前一个滤波值

        hp[i] += c3 * hp[i-2]  # 使用前两个滤波值


    return hp  # 返回高通滤波后的数据

我改的PEL公式如下:

input:N(15,1,100);

// 高通滤波器
a1 := EXP(-1.414 * 3.14159 / N);

b1 := 2 * a1 * COS(1.414 * 180 / N);

c2 := b1;

c3 := -a1 * a1;

c1 := (1 + c2 - c3) / 4;


// 如果当前不是前几日,则应用平滑公式

VARIABLE:HighPass:=0;

IF BARSCOUNT(close) < 4 THEN HighPass := 0;


HighPass := c1 * (c - 2 * REF(c, 1) + REF(c, 2))
               + c2 * REF(HighPass, 1)
               + c3 * REF(HighPass, 2);


    lineHighPass:HighPass;


但是从画出的图看明显有些不对;所以麻烦老师看看,如何在金子塔软件中实现高通滤波器;谢谢


回复

使用道具 举报

31

主题

7766

帖子

7776

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2024-9-10 14:20 | 显示全部楼层
您的问题正在查看中,请稍后
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2024-9-10 14:56 | 显示全部楼层
本帖最后由 技术009 于 2024-9-10 14:57 编辑

input:N(15,1,100);

// 高通滤波器
f:=1.414 * 3.14159 / N;
a1 :=EXP(-f);

b1 := 2 * a1 * COS(f);

c2 := b1;

c3 := -a1 * a1;

c1 := (1 + c2 - c3) / 4;


// 如果当前不是前几日,则应用平滑公式

VARIABLE:HighPass:=0;



IF BARSCOUNT(close) <4 THEN HighPass := 0;



HighPass := c1 * (c - 2 * REF(c, 1) + REF(c, 2))
               + c2 * HighPass
               + c3 * REF(HighPass, 1);

lineHighPass:HighPass;


2个地方,b1的定义写错了,另外 全局变量往前回溯,需要留意下,HighPass本身就保持了上次的值,再ref一次那就是前前一个K位置的值了。值是对得上的
截图202409101457201211.png

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

15

主题

37

帖子

37

积分

Rank: 2

等级: 标准版

注册:
2021-12-10
曾用名:
 楼主| 发表于 2024-9-10 15:22 | 显示全部楼层
技术009 发表于 2024-9-10 14:56
input:N(15,1,100);

// 高通滤波器

非常感谢,辛苦了,能不能问下,这个下边的调试输出,是用的那个函数
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2024-9-10 15:22 | 显示全部楼层
那是我py里直接打印的一部分结果。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-12-24 08:08 , Processed in 0.247555 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表