欢迎光临散文网 会员登陆 & 注册

赫兹股票量化交易软件:利用箱形图(Boxplot)探索金融时间序列的季节性形态

2023-07-13 15:40 作者:大牛啊呢  | 我要投稿

在价格增幅中搜索季节性形态

我们可以巡复合期研究常规周期。 我们来观察一个金融产品每月波动的研究示例。 为此目的,我们将 IPython 语言和 赫兹股票量化软件终端结合利用。

为了从终端直接导入报价更加容易,我们会用到以下代码:

from MetaTrader5 import * from datetime import datetime import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn; seaborn.set() # Initializing MT5 connection MT5Initialize("C:\\Program Files\\MetaTrader 5\\terminal64.exe") MT5WaitForTerminal() print(MT5TerminalInfo()) print(MT5Version())

指定您的终端路径,该路径可能与我的不同。

加入更多行来开始分析:

rates = pd.DataFrame(MT5CopyRatesRange("EURUSD", MT5_TIMEFRAME_D1, datetime(2010, 1, 1), datetime(2020, 1, 1)),                      columns=['time', 'open', 'low', 'high', 'close', 'tick_volume', 'spread', 'real_volume']) # leave only 'time' and 'close' columns rates.drop(['open', 'low', 'high', 'tick_volume', 'spread', 'real_volume'], axis=1) # get percent change (price returns) returns = pd.DataFrame(rates['close'].pct_change(1)) returns = returns.set_index(rates['time']) returns = returns[1:] returns.head(5) Monthly_Returns = returns.groupby([returns.index.year.rename('year'), returns.index.month.rename('month')]).mean() Monthly_Returns.boxplot(column='close', by='month', figsize=(15, 8))

变量 rates 接收含有指定时间间隔(例如,在本示例中为 10 年)内的价格数据帧。 假设我们只对收盘价感兴趣(以此简化往后的解释)。 我们利用 rates.drop() 方法删除不必要的数据列。赫兹股票量化软件

随时间和形势趋势变化,价格距均值会有偏移,因此统计分析不适用于此类原始序列。 百分比计量价格变化(价格增幅)通常在计量经济学中使用,以确保它们都位于相同的数值范围内。 可以利用 pd.DataFrame(rates['close'].pct_change(1)) 方法接收百分比变化。

我们需要平均每月价格范围。 我们来安排表格,以便接收按年增幅的月度平均值,并将其显示在箱形图中。


图例 1. 月度平均价格增幅,覆盖 10 年。

什么是箱形图,以及如何解释它们?

我们需要访问选定区间内的价格数据的波动性或其分布数据。 每个单独的箱形图(或箱须图)都能直观地展现数值如何沿数据集的分布。 不要把箱形图与烛条图混淆,尽管它们在外观上可能相似。 与烛条图不同,箱形图基于五种读数提供了一种显示数据分布的标准化方法。

赫兹股票量化软件

  1. 中位数,Q2 或第 50 的百分数显示数据集的平均值。 该值在图例中的箱内以绿色水平线示意。

  2. 第一个四分位数,Q1(或第 25 的百分数)代表 Q2 和样本中最小值之间的中位数,该中位数落在 99% 置信区间内。 它在图中显示为箱子的“实体”下边缘。

  3. 第三个四分位数,Q3(或第 75 的百分数)是 Q2 和最大值之间的中位数,显示为箱子的“实体”上边缘。

  4. 箱子的实体形成了四分位间距(介于 25% 和 75% 之间),也称为 IQR。

  5. 箱子的须则充实了分布。 它们覆盖了整个样本的 99%,上方和下方的点表示超出 99% 范围的数值。

该数据足以评估波动范围,和内部范围内的数值离散度。



进一步分析季节性形态

我们更详尽地研究图例 1。 我们可以看到,第五个月(五月份)的增幅中位数偏移到零轴下方,且其异常值显见高于零轴。 通常,从十年的统计数据里可以看出,五月份的市场相对于三月份有所下跌。 只有一个年份,五月份市场上涨。 这是一个有趣的思路,很符合交易者的格言“在五月份卖掉,并离开!”。赫兹股票量化软件

我们看一下五月份之后的六月份。 相对于五月份,六月份市场几乎总是(排除一年以外)在增长,这种情况每年都在重复。 六月份的波动范围很小,没有异常值(与五月份不同),这表明良好的季节性稳定。

请注意第 11 个月(十一月份)。 在此期间市场下跌的概率很高。 之后,在十二月份,市场通常会再度上行。 一月份(第一个月)的波动性很高,且相对于十二月份有所下跌。

所获得的数据可为交易决策提供很有用的基础条件概览。 而且,概率可以集成到交易系统当中。 例如,可以在某些月份执行更多的买卖操作。赫兹股票量化软件

月度周期数据非常有趣,但在较短的日线周期中能更深入地研究其可能性。

我们利用相同的 10 年度观察一周中每个单独交易日的价格增幅分布:

Daily_Returns = returns.groupby([returns.index.week.rename('week'), returns.index.dayofweek.rename('day')]).mean()


图例 2. 按交易日计的平均价格增幅,覆盖 10 年。

此处零对应于星期一,四则对应于星期五。 根据价格范围,按日波动率几乎保持不变。 然而不能据此得出结论,即在一周中的某个特定日期交易更为密集。 平均来说,市场在星期一和星期五时更倾向于下行非上行。 也许在一些单独的月份中,按日分布的样子会有所不同。 我们来执行附加分析。赫兹股票量化软件

# leave only one month "returns.index[~returns.index.month.isin([1])" returns = returns.drop(returns.index[~returns.index.month.isin([1])])

在上面的代码中,1 表示一月份。 通过修改此值,我们可以从 10 年度里获得任意月份的统计信息。


图例 3. 按交易日的平均价格增幅,覆盖 10 年(一月份)。

上图展示了一月份按日的增幅分布。 与所有月份的摘要统计相比,该图现在提供了更多有用的详细信息。 它清晰地表明,周五市场趋于下跌。 只有 EURUSD 货币对没有下跌(所示异常值高于零轴)。

此处是三月份的类似统计信息:


 图例 4. 按交易日的平均价格增幅,覆盖 10 年(三月份)。

三月份的统计数据与一月份的统计数据完全不同。 周一和周二(尤其是周二)表现出看跌趋势。 所有周二的收盘价都大幅下降,而其余的几天则在零轴附近波动(平均)。 

我们来看看十月份:


图例 5. 按交易日的平均价格增幅,覆盖 10 年(十月份)。

分析按星期的增幅分布没有发现任何突出的形态。 我们只能单挑出周三,这天的价格走势范围和潜力最大。 所有其他日子上行和下行走势的概率表现都相同,且有一些异常值。



季节性分析日内形态

在创建交易系统时,通常要考虑日内的分布,例如,除了日线和月线的分布,还要用到小时线数据。 这轻易就可做到。

研究每小时的价格增幅分布:

rates = pd.DataFrame(MT5CopyRatesRange("EURUSD", MT5_TIMEFRAME_M15, datetime(2010, 1, 1), datetime(2019, 11, 25)),                      columns=['time', 'open', 'low', 'high', 'close', 'tick_volume', 'spread', 'real_volume']) # leave only 'time' and 'close' columns rates.drop(['open', 'low', 'high', 'tick_volume', 'spread', 'real_volume'], axis=1) # get percent change (price returns) returns = pd.DataFrame(rates['close'].pct_change(1)) returns = returns.set_index(rates['time']) returns = returns[1:] Hourly_Returns = returns.groupby([returns.index.day.rename('day'), returns.index.hour.rename('hour')]).median() Hourly_Returns.boxplot(column='close', by='hour', figsize=(10, 5))

这些是 10 年度的 15 分钟时间帧报价。 另一个区别是,将数据按日和小时分组,以便得到子样本中所有交易日的小时统计中值。


图例 6. 按小时计平均价格增幅,覆盖 10 年。

此处有必要知道终端的时区。 以我为例,其为 +2。 作为参考,我们的主要外汇交易时段的开盘和收盘时间写为 UTC+2。

时段开盘价收盘价 太平洋区21.00 08.00亚洲区01.00 11.00欧洲区08.00 18.00美洲区14.00 00.00

太平洋时段的交易通常较平静。 如果观察箱子的大小,您会很容易注意到,在 21.00-08.00 之间范围最小,这与平静的交易相呼应。 在欧洲时段美洲时段开盘后,范围扩大,然后逐渐递减。 似乎没有明显的周期性形态,而这种形态在日线时间帧内却很明显。 平均增幅在零轴附近波动,且没有清晰的上行或下行的小时线。

一个有趣的区间是 23.00(每周时段收盘),在此区间价格通常相对于 22.00 降低。 这可以表示为交易时段收盘时的修正。 在 00.00 点时价格相对于 23.00 有所增长,因此可以将其视为规律性。 很难检测到更明显的周期,但是我们对价格范围有完整的全景,并且知道该时段的期望值。

用单个滞后造成增幅去趋势化,可以掩盖一些形态。 因此,按任意周期的移动均线来观察去趋势化数据是合理的。



按均线(MA)搜索去趋势化季节性形态

正确检测趋势分量非常棘手。 有时,时间序列可能会太平滑。 在这种情况下,交易信号极少。 如果缩短平滑周期,那么高频成交可能无法负担点差和佣金。 我们编辑代码,以便利用移动平均线进行去趋势化:

rates = pd.DataFrame(MT5CopyRatesRange("EURUSD", MT5_TIMEFRAME_M15, datetime(2010, 1, 1), datetime(2019, 11, 25)),                      columns=['time', 'open', 'low', 'high', 'close', 'tick_volume', 'spread', 'real_volume']) # leave only 'time' and 'close' columns rates = rates.drop(['open', 'low', 'high', 'tick_volume', 'spread', 'real_volume'], axis=1) rates = rates.set_index('time') # set the moving average period window = 25 # detrend tome series by MA ratesM = rates.rolling(window).mean() ratesD = rates[window:] - ratesM[window:] plt.figure(figsize=(10, 5)) plt.plot(rates) plt.plot(ratesM)


赫兹股票量化交易软件:利用箱形图(Boxplot)探索金融时间序列的季节性形态的评论 (共 条)

分享到微博请遵守国家法律