算法策略 | 傅里叶滤波结合跨周期波段模型

松鼠宽客
2020-11-01


公众号致力于分享量化策略,培训视频,Python,程序化交易等相关内容如果你喜欢本文,麻烦分享关注一下公众号非常感谢


『正文』

ˇ

一、原理介绍


傅里叶分析和滤波

变换和滤波器是用于处理和分析离散数据的工具,常用在信号处理应用和计算数学中。当数据表示为时间或空间的函数时,傅里叶变换会将数据分解为频率分量。fft 函数使用快速傅里叶变换算法,相对于其他直接实现,这种方式能够减少计算成本。有关傅里叶分析的更多详细介绍,请参阅傅里叶变换。在使用传递函数修改输入数据的幅值或相位时,convfilter 函数也是很有用的工具。


快速傅里叶变换

语法

Y = fft(X)

Y = fft(X,n)

Y = fft(X,n,dim)

说明

示例

Y = fft(X) 用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。

  • 如果 X 是向量,则 fft(X) 返回该向量的傅里叶变换。

  • 如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。

  • 如果 X 是一个多维数组,则 fft(X) 将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。


示例

Y = fft(X,n) 返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。

  • 如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n。

  • 如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n。

  • 如果 X 是矩阵,则每列的处理与在向量情况下相同。

  • 如果 X 为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同。


示例

Y = fft(X,n,dim) 返回沿维度 dim 的傅里叶变换。例如,如果 X 是矩阵,则 fft(X,n,2) 返回每行的 n 点傅里叶变换。


使用傅里叶变换求噪声中隐藏的信号的频率分量。

指定信号的参数,采样频率为 1 kHz,信号持续时间为 1.5 秒。

Fs = 1000; % Sampling frequency                   
T = 1/Fs; % Sampling period       
L = 1500; % Length of signal
t = (0:L-1)*T; % Time vector

构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量。

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);

用均值为零、方差为 4 的白噪声扰乱该信号。

X = S + 2*randn(size(t));

在时域中绘制含噪信号。通过查看信号 X(t) 很难确定频率分量。

plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')


傅里叶变换Python代码

import matplotlib.pyplot as pltimport numpy as npfrom scipy.optimize import   curve_fit
def func(x, a, b, c):    return a * np.exp(-b * x) + c
xdata = np.linspace(0, 4, 50)y = func(xdata,2.5, 1.3, 0.5)np.random.seed(1729)y_noise = 0.2 * np.random.normal(size=xdata.size)ydata = y + y_noiseplt.plot(xdata, ydata, 'b-', label='data')
fft1,popt= curve_fit(func, xdata, ydata,bounds=(0,4.))print("fit",fft1)[a,b,c]=fft1print("[a,b,c]",[a,b,c])
plt.plot(xdata, func(xdata, *fft1), 'r-',         label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(fft1))
fft2,popt= curve_fit(func, xdata, ydata, bounds=(0, [3., 1., 0.5]))#print("fit2",fft2)
plt.plot(xdata, func(xdata, *fft2), 'g--',         label='fit2: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(fft2))plt.xlabel('x')plt.ylabel('y')plt.legend()plt.show()




二、策略开发


目前TBQAUNT内置了快速傅里叶变换的函数,可以直接调用。

我们来看一下效果:



代码示例:


Params   Numeric n(5);Vars   Array<Numeric> x;   Array<Numeric> y;   Array<Integer> wids;   Numeric wn(3);   Numeric yn(10);   Numeric dn(3);   Numeric i;   Series<Numeric> yy;   Series<Numeric> fft;EventsOnBar(ArrayRef<Integer> indexs){   range[0:0]   {    for i=0 to n-1    {      x[i]=Close[n-1-i];    }   FftFliter(x,y,wids,wn,yn,dn);    PlotNumeric("Close",Close,0,red);   PlotNumeric("fft",y[0],0,Yellow);   }
}


红色线为Close,

黄色线为傅里叶过滤后的Close


因为是内置函数,笔者看不到内部写法,就参考了matlab和python的原理,到底是否准确有待商议。我们看到上图中的红色Close线和过滤后的fft黄色线,总感觉和Average函数处理后的均价差别不大,但是我们依然找到它的独特规律将其体现。


步骤1:


设置双数据源,data0和data1,data0为日线周期,data1为5分钟周期

data0:


data1:


注意红框内的data0和data1数据的起始时间,大周期数据要包容小周期数据。


步骤2:

防偷价处理,必须向前一根引用历史数据,不然在实盘的时候fft将会飘移,在历史回测里将会使用未来的收盘数据造成假绩效,跨周期模型的开发中一定要注意这个问题!

代码里y[0]值赋值到序列变量yy,yy向前推一个bar赋值到fft变量。


步骤3:


1.调用日线计算好的fft值;
2.Ft为fft序列前后值的差值,如下图



通过观察副图,绿色柱状与K线图有一个规律就是当趋势出现时,绿色柱子持续放大,震荡时又急速收缩且涨跌不一。
我们利用这个特点来构建交易条件,笔者发现需要将FT进行序列话才能使用,于是:

每一次日线级别的fft2重新计算的时候,我们将Ft保存到序列变量Fts。
显示如下:


步骤4:
构建过滤条件


过滤条件为:
   Fts相比上一个Bar放大即为趋势,Fts相比上一个Bar缩小即为震荡;

步骤5:

开仓条件:KG>0 和 高低点区间

平仓条件:   VWAP移动出场


三、绩效展示

力煤:


苹果:

白银:

焦炭:

螺纹:


结语:

傅里叶函数的利用还有很多方法,这一期是初步的尝试。已经打包好相关的源码和工作区,有兴趣的小伙伴可以拿到后自己研究一下,有问题和改进意见可以在群里沟通交流。

天勤Python,实盘免费


End


源码领取



长按下方二维码

加客服“小松鼠-松鼠宽客”
微信号: viquant01

对话框回复 FFT 咨询源码获得

(俱乐部加入→回复VIP)

加入松鼠俱乐部


----------------往期精彩内容----------------

算法策略专辑:

3.【日内模型】TBquant信号回测版本+python历史回测版源码

2.【日内模型】第二版本基于orderflow的盘口策略(完整源码)

1.【日内模型】基于orderflow的盘口策略开发帖

量化视频专辑:

视频教程 | 手把手系列之"Aberration"策略的优化与升级

视频教程 | 手把手系列之"震荡过滤"突破策略的优化与实现

量化研究专栏:

量化研究 | 残差动量策略刻画与构建(二)

量化研究 | 残差动量策略刻画与构建(一)

量化研究 | 主连复权算法大揭秘[含公式算法]

量化研究 | 策略在指数与主连复权的差异化分析(三)

量化研究 | 策略在指数与主连复权的差异化分析(二)

量化研究 | 策略在指数与主连复权的差异化分析(一)

精品自动交易策略库(近期更新):

【SF21】 | 利用PSY指标,我们来开发一个短线模型?

【SF20】 | 来聊聊平仓离场的方法,如何构建高效,灵活,可靠的出场策略?

【SF19】| 基于VWAP(成交量加权平均价格)开发Alpha均线增强策略

【SF18】| MACD顶底背离+动态区间交易模型源码(技术贴)

【SF17】| 均线波动差构建交易策略

【SF16】| "凹凸"均线形态交易策略源码(技术帖)

【SF15】| 波峰波谷交易策略结合ER降噪过滤

【SF14】| Supertrend“超级趋势线”指标魔改升级(源码)
【SF13】| 实盘策略解密“小品种,小资金”在跑策略源码!

【SF12】| 全新波动率算法,自适应区间+波动率择时!

【SF11】| 成交量来确定阻力支撑点,基于Volume Profile构建交易策略

【SF10】| 如何构建一个胜率超过60%的短线螺纹策略(开发教程)

【SF09】| 资金流向交易策略源码,绩效突出,适应性兼容性强,5分钟短线交易模型;【SF08】| 经典KD指标另类使用有奇效,股指商品双版本策略



祝点击在看的小伙伴,2020发大财


分享