机器学习(三):自相关模型在商品期货中的应用

Author: ianzeng123, Created: 2023-12-01 17:24:07, Updated: 2024-02-28 21:48:20

img

自相关,这个统计学上的小伙伴,可是个时间序列观测的小专家。它专门研究观测值和它的“前世今生”之间的亲密关系。它在各种领域都有一席之地,技术分析交易中更是如此,因为要找出数据中的“蛛丝马迹”,比如模式、趋势和关系。这个小专家可以帮助我们分析过去和现在的相关性,还能洞察数据模式的持久性或可逆性,让我们更好地把握股票价格的走势。

想象一下,如果我们有一个期货价格的记录,每天都记录着收盘价,那么自相关性就是帮我们了解今天的收盘价和昨天或明天的收盘价之间的“默契度”。如果它们关系密切,那就说明有短期动量或趋势跟踪的行为可能发生。聪明的交易者就能利用这种自相关性,根据价格的持续走势来寻找潜在的交易机会。

自相关,可以说是交易中的得力助手,它能帮助我们了解市场动态、预测未来、管理风险,甚至制定更明智的策略。下面就是自相关在交易中的应用小技巧:

  • 模式识别:自相关让我们能够在财务数据中发现有意义的模式和关系。通过比较过去和现在的市场价值,我们可以找出重复出现的趋势和相关性。 预测未来的价格变化:研究过去的自相关模式,我们可以窥见潜在的价格变化,并调整策略来应对。
  • 智能策略开发:利用自相关性,我们可以发现不同时间段内的高相关性或低相关性,来微调我们的交易策略。这样,我们就可以在高度相关的时期利用趋势跟踪方法,或在低相关时期采用均值回归策略。
  • 管理风险:自相关性提供了市场波动性和稳定性的有价值的信息,让我们更好地管理风险。通过评估价格逆转或趋势延续的可能性,我们可以做出更明智的风险管理决策。

所以,无论你是交易新手还是老手,自相关性都是个值得你了解的好帮手。它会让你在交易的世界里更加敏锐!

自相关与偏自相关概念区分

自相关和偏自相关,这两位小伙伴在时间序列的世界里可是大名鼎鼎!它们就像数据的好朋友,帮助我们深入了解数据之间的关系。接下来,我们就来看看它们之间的微妙区别:

自相关,就像一个全能选手,它衡量的是时间序列观测值与它的“老朋友”——滞后值之间的亲密关系。也就是说,它考察的是观测值和它在不同时间点的“前世今生”之间的线性关系。偏自相关,就像一个专注于“直接影响”的小伙伴。它关注的是观测值与它的滞后值之间的直接关系,同时排除了通过中间时间点的“第三方”影响。它帮助我们确定哪些滞后期对当前的观测值有独特贡献。

自相关就像一个全面的侦探,在每个滞后期都仔细查看,测量整体相关性,不考虑中间时间点的“插手”。它帮助我们发现数据中隐藏的模式和趋势。而偏自相关则像一位专注的专家,专注于找出直接影响观测值的特定滞后期,不受其他滞后期的影响。它为我们提供了每个滞后期对当前观测值的独特贡献的见解。

自相关对于检测数据的季节性、识别自回归模型的顺序以及确定适当的滞后值来进行预测都很有帮助。但是偏自相关则对于确定移动平均模型的顺序、识别显著滞后以及构建自回归综合移动平均模型大有用处。

所以,无论你是数据分析的新手还是老手,记得自相关和偏自相关都是你的好朋友。它们会帮助你更好地理解时间序列中的数据关系。

自相关的工作原理

  1. 收集时间序列数据:首先,找到你想要分析的时间序列数据。这些数据可以是任何在固定时间间隔内记录的观察值序列,例如期货价格、销售数据等。

  2. 计算滞后值:对于时间序列中的每个数据点,通过选择特定时间间隔之前的观察值来确定其滞后值。常见的时间间隔有一天、一周、一个月,或基于你的数据的任何其他相关时间段。

  3. 计算相关系数:计算当前数据点与其对应的滞后值之间的相关系数。相关系数衡量了两者之间的关系强度和方向。计算相关系数时,你可以根据数据的性质选择使用皮尔逊相关或斯皮尔曼相关。

  4. 创建自相关函数 (ACF) 图:将相关系数放在y轴上,滞后值放在x轴上,绘制出图。这种可视化表示被称为自相关函数 (ACF) 图。ACF图可以帮助你直观地看到相关模式,并识别不同滞后值下的显著相关性。

  5. 分析ACF图:仔细观察ACF图来解释自相关模式。注意在特定滞后值下的显著相关系数。正相关表示连续数据点之间存在相似的模式,而负相关则表示它们之间存在相反的关系。相关系数的大小反映了关系的强度。

  6. 做出明智的决策:根据自相关分析的结果,为你的交易或分析做出明智的决策。例如,正相关可能意味着你应该采用趋势跟踪策略,而负相关则可能建议你采用均值回归策略。相应地调整你的交易或分析方法。

Python代码实现

现在,让我们来看看如何在交易中使用Python进行自相关分析:

  • 第一步:导入必要的库

首先导入需要的库,包括pandas、matplotlib.pyplot。

import pandas as pd
import matplotlib.pyplot as plt
  • 第二步:获取数据

这里我们使用FMZ的本地回测引擎,可以很方便的获取各个期货品种不同时间段的数据。下面我们定义代码获取2019到2023年这四年的数据。

## 获取数据
import pandas as pd

'''backtest
start: 2020-01-01 09:00:00
end: 2023-11-02 15:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES","depthDeep":20}]
'''
from fmz import *
task = VCtx(__doc__) # 初始化引擎

rlist = []
rlisttime = []
prebartime = 0

while True:
    try:
        exchange.SetContractType('FG888')
        r = exchange.GetRecords()
        if r[-1].Time != prebartime:
            for i in range(len(r) - 1):
                if r[i].Time not in rlisttime:
                    rlist.append(r[i])
                    rlisttime.append(r[i].Time)
            prebartime = r[-1].Time
        else:
            continue
    except:
        print('数据读取完成')
        break

# 将时间列转换为日期时间格式  
for item in rlist:  
    item['Time'] = pd.to_datetime(item['Time'], unit='ms')  
  
df = pd.DataFrame(rlist)  
df = df.set_index('Time')  
print(df)

我们看下获取的数据是什么样子的。

                       Open    High     Low   Close    Volume  OpenInterest
Time                                                                       
2019-06-16 16:00:00  1464.0  1472.0  1457.0  1458.0  176156.0      292810.0
2019-06-17 16:00:00  1458.0  1472.0  1454.0  1466.0  272774.0      302056.0
2019-06-18 16:00:00  1468.0  1482.0  1462.0  1476.0  374476.0      334204.0
2019-06-19 16:00:00  1478.0  1497.0  1472.0  1487.0  424683.0      348460.0
2019-06-20 16:00:00  1487.0  1491.0  1480.0  1485.0  197383.0      337032.0
...                     ...     ...     ...     ...       ...           ...
2023-10-25 16:00:00  1628.0  1631.0  1597.0  1623.0  628154.0      887223.0
2023-10-26 16:00:00  1616.0  1632.0  1607.0  1629.0  633497.0      889020.0
2023-10-29 16:00:00  1624.0  1648.0  1601.0  1630.0  829935.0      888438.0
2023-10-30 16:00:00  1632.0  1651.0  1622.0  1643.0  740393.0      884014.0
2023-10-31 16:00:00  1643.0  1653.0  1614.0  1625.0  744466.0      871320.0

[1064 rows x 6 columns]

接着我们将这一时间段的数据进行画图展示。

import matplotlib.pyplot as plt  

plt.plot(df['Close'])  
plt.xlabel('Time')  
plt.ylabel('Close Price')  
plt.title('Close Price Time Series')  
plt.show()

image.png

  • 第三步:计算63周期自相关 该代码使用 pandas 的滚动函数和自相关方法计算“收盘价”的63(一个季度) 期自相关值。自相关值存储在数据 DataFrame的“autocorr_20”列中。
# 计算20周期的自相关
df['autocorr_63'] = df['Close'].rolling(window=63).apply(lambda x: x.autocorr())

# 根据自相关性和市场方向生成长线(买入)和短线(卖出)信号
threshold = 0.5
  • 第四步 确定交易信号

基于阈值的信号是使用自相关值和趋势方向生成的。通过设置阈值为0.5,当自相关性大于或等于阈值并且价格下跌时,会产生开多(买入)信号。

当自相关性大于或等于阈值并且价格已经上涨时,会产生做空(卖出)信号。这些信号存储在数据 DataFrame 的“long_signal”和“short_signal”列中。

# 开多信号
df['long_signal'] = (df['autocorr_20'] >= threshold) & (df['Close'].diff() < 0)

# 开空信号
df['short_signal'] = (df['autocorr_20'] >= threshold) & (df['Close'].diff() > 0)

  • 第五步 绘制时间序列和信号图

使用plt.subplots创建了一个图形,并绘制了来自数据 DataFrame 的“收盘价”。在相应日期使用向上的箭头(’^’)表示长线(买入)信号,使用向下的箭头(‘v’)表示短线(卖出)信号。

newdf = df.iloc[-63:-1,]

# 绘制时间序列和信号  
fig, ax = plt.subplots(figsize=(10, 6))  
  
# 绘制收盘价格曲线  
newdf['Close'].plot(ax=ax)  
  
# 添加长线买入信号  
long_signal_dates = newdf[newdf['long_signal'] == 1].index  
for date in long_signal_dates:  
    ax.annotate('^', xy=(date, newdf.loc[date, 'Close']), color='green', fontsize=12, ha='center')  
  
# 添加短线卖出信号  
short_signal_dates = newdf[newdf['short_signal'] == 1].index  
for date in short_signal_dates:  
    ax.annotate('v', xy=(date, newdf.loc[date, 'Close']), color='red', fontsize=12, ha='center')  
  
ax.set_xlabel('Date')  
ax.set_ylabel('Close')  
ax.set_title('Time Series Data with Signals')  
plt.show()

这里我们使用一个季度的数据进行一下画图的呈现。

image.png

可以看到,根据自相关系数和阈值的关系,我们标志出来最新一个季度的“开多”和“开空”信号。当然结果更多是具有参考意义,这只是我们使用自相关模型进行的一次有趣的尝试,大家有兴趣可以引入更多的模型和参数调试优化这个模型。

最后总结,自相关是一个统计概念,在技术分析中广泛用于研究金融市场中过去和当前价格变动之间的关系。通过分析价格数据中的自相关性,我们旨在识别有助于预测未来价格变动的模式和趋势。在技术分析中,自相关性通常应用于回报或价格变化,而不是绝对价格水平。通过检查回报的自相关性,我们可以深入了解价格变动的持续性或均值回复性。

本系列课程旨在为大家介绍机器学习技术在商品期货量化交易中的应用,其他相关文章请点击下面链接:


更多内容