Skip to content

实战教学:构建可解释的变换器模型,精准预测股价波动(一)

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:在本文中,我将带您深入了解如何利用时态融合变换器(TFT)模型来预测股市的短期价格走势。这是这个主题的第一部分,我们将从数据收集和预处理开始,逐步探索如何通过Python和Jupyter Notebook进行数据处理和可视化,并分享如何从超过1500支股票中筛选出流动性最好的100支进行深入分析(封面图为TFT 预测的 $TSLA 股票价格)。

一、背景与动机

股票市场变化莫测,预测其走势颇具挑战。专业的日内交易者不仅依赖于市场预测,更懂得在高风险中寻求高回报。即便交易者仅有一半时间能准确判断股票动向,只要每笔交易的平均盈利超过潜在风险,盈利依然可期。自动化交易系统有助于交易者摆脱情绪干扰,专注于技术分析和系统性决策。

我们的目标并不是要达到完美的预测准确性(这在金融市场中几乎是不可能实现的),而是要开发出一种能够识别高概率走势的模型,同时评估与每个预测相关的风险。通过关注精确度和引入置信区间,时态融合转换器模型可以成为做出更明智交易决策的宝贵工具。

在本部分我们将从这些基础工作开始:介绍什么是TFT,如何收集正确的数据并执行探索性数据分析 (EDA),以了解高频股票数据的趋势、模式和潜在隐患。

二、什么是 TFT?

Temporal Fusion Transformer(TFT)是一种用于时间序列预测的深度学习模型,旨在处理复杂的时间序列数据,尤其是在多变量和长时间跨度的情况下。TFT结合了长短期记忆网络(LSTM)和自注意力机制,能够有效捕捉时间序列中的长期依赖关系和动态变化。

2.1 基本结构

TFT的结构主要由以下几个部分组成:

  • 输入处理层:该层负责将输入的时间序列数据进行预处理,包括归一化和特征选择。它还可以处理缺失值和不同频率的数据。
  • 编码器:编码器部分使用LSTM来提取时间序列的特征,能够捕捉到时间序列中的长期依赖关系。
  • 自注意力机制:TFT引入了自注意力机制,以便在处理时间序列时关注不同时间步之间的关系。这使得模型能够动态调整对不同时间点的关注程度,从而提高预测的准确性。
  • 解码器:解码器部分负责将编码器提取的特征转换为最终的预测结果。它结合了编码器的输出和自注意力机制的结果,以生成更准确的时间序列预测。
  • 输出层:输出层将解码器的结果映射到目标变量,生成最终的预测值。

2.2 工作原理

TFT的工作原理可以分为以下几个步骤:

  • 数据输入:将时间序列数据输入到模型中,进行必要的预处理。
  • 特征提取:通过编码器提取时间序列的特征,捕捉长期依赖关系。
  • 动态关注:利用自注意力机制,模型能够根据当前的上下文动态调整对不同时间步的关注程度。
  • 生成预测:通过解码器将提取的特征转换为预测结果,输出最终的时间序列预测。

2.3 优缺点分析

Temporal Fusion Transformer是一种强大的时间序列预测工具,结合了LSTM和自注意力机制,能够有效处理复杂的时间序列数据。其灵活的结构和动态关注能力使其在金融领域中展现出优越的性能。

三、数据相关工作

我假定您的环境中已经有了 1 分钟历史数据。如果您还没有这些数据,请务必查看我的其他文章,可以通过多种方式和途径去获取数据。推荐文章如下:


3.1 数据收集和准备

在这个项目中,我收集了日均交易量超过 100 万的股票的 1 分钟盘中数据。该数据集涵盖 2024 年 1 月 1 日至 2024 年 7 月 11 日的 6 个月期间,共有 1,500 多支股票。对于每只股票,我都收集了标准的 OHLCV(开盘价、最高价、最低价、收盘价、成交量)数据,记录了整个交易日的每次价格变动。为了简化数据处理过程,我将这些数据保存在一个 .parquet 文件中,以便高效访问和分析。

3.2 数据加载和初步清理

在 Jupyter Notebook 中,我首先导入了用于数据处理、可视化和建模的基本库。下面是一些所用库的示例:

import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from datetime import datetime

然后加载数据集,并将日期设置为基于时间分析的索引:

df = pd.read_parquet("data.parquet")
df.set_index("datetime", inplace=True)
df.sample(10) # print 10 random rows from the dataset

输出:

为了了解我正在处理的数据量,我使用了 df.info() 来获取这些信息:

因此,这个数据帧相当大,包含 6600 多万行,使用的内存超过 4.5 GB。为了使其更易于管理,并过滤掉流动性不高的股票,我使用了 “股票平均名义成交量”,其计算方法是每日成交量中位数乘以平均价格。我只保留平均名义成交量排名前 100 的股票。

def resample_to_daily(group):
    resampled_group = group.resample('D').agg({
        'open': 'first',
        'high': 'max',
        'low': 'min',
        'close': 'last',
        'volume': 'sum'
    }).dropna()
    return resampled_group

# Apply the resampling function to each group
df_daily = df.groupby('symbol').apply(resample_to_daily).reset_index()
df_daily["stock_median_volume"] = df_daily.groupby("symbol")["volume"].transform("median").astype(int)
df_daily["stock_average_price"] = df_daily.groupby("symbol")["close"].transform("mean")
df_daily["stock_average_nominal_volume"] = df_daily["stock_median_volume"] * df_daily["stock_average_price"]
top_100_symbols = df_daily.groupby("symbol")['stock_average_nominal_volume'].median().nlargest(100).index
# Filter the DataFrame to keep only the top 100 stocks by nominal volume
df_daily = df_daily[df_daily['symbol'].isin(list(top_100_symbols))]
df = df[df['symbol'].isin(list(top_100_symbols))]
print(f"Number of total one minute bars after resampling: {df.shape[0]}")
print(f"Symbols: {df_daily.symbol.unique()}")
Number of total one minute bars after resampling: 5165367
Symbols: ['AAL' 'AAPL' 'ABBV' 'ABNB' 'ABT' 'ADBE' 'AMAT' 'AMD' 'AMZN' 'ANET' 'AVGO'
 'AXP' 'BA' 'BAC' 'BMY' 'C' 'CAT' 'CCL' 'CLSK' 'CMCSA' 'COIN' 'COP' 'COST'
 'CRM' 'CRWD' 'CSCO' 'CVNA' 'CVS' 'CVX' 'DAL' 'DELL' 'DHR' 'DIS' 'DKNG'
 'ENPH' 'F' 'FCX' 'GE' 'GEV' 'GM' 'GOOG' 'GOOGL' 'GS' 'HD' 'IBM' 'INTC'
 'JNJ' 'JPM' 'KO' 'LLY' 'MA' 'MARA' 'MCD' 'MDLZ' 'MDT' 'META' 'MRK' 'MRVL'
 'MS' 'MSFT' 'MSTR' 'MU' 'NEE' 'NEM' 'NFLX' 'NKE' 'NOW' 'NVDA' 'ORCL'
 'OXY' 'PANW' 'PEP' 'PFE' 'PG' 'PLTR' 'PM' 'PYPL' 'QCOM' 'RIVN' 'RTX'
 'SBUX' 'SCHW' 'SMCI' 'SNOW' 'SOFI' 'SQ' 'T' 'TGT' 'TJX' 'TMO' 'TMUS'
 'TSLA' 'TXN' 'UBER' 'UNH' 'V' 'VRT' 'WFC' 'WMT' 'XOM']

3.3 EDA 和特征工程

下一步,我将进行探索性数据分析 (EDA),以了解过滤数据集的关键特征,并开始特征工程以提取相关指标。通过对趋势、价格分布和交易量变化的可视化,我旨在发现可指导我们的预测模型的模式和见解。

第一部分到此结束。在下一部分中,我们将深入研究特征工程,并开始为模型训练准备数据集。

四、观点总结

  • 股票价格预测不能完全准确:文章强调了金融市场的不确定性,即使是最先进的模型也不可能完全准确地预测股票价格。
  • 模型的目标是识别高概率走势和风险评估:使用TFT模型的目的在于识别出高概率的市场走势,并通过提供置信区间来帮助交易者进行风险管理。
  • 数据的重要性:高质量数据对于构建有效预测模型的重要性,并详细介绍了如何收集和处理大量的股票交易数据。
  • 自动化和系统化交易的优势:自动化交易算法会帮助交易者消除情绪因素,并专注于技术指标和系统化决策。
  • 数据处理和特征工程的关键作用:文章展示了如何使用Python进行数据加载、清洗和初步的特征工程,为后续的模型训练打下基础。

感谢您阅读到最后,希望本文能给您带来新的收获。祝您投资顺利!如果对文中的内容有任何疑问,请给我留言,必复。


本文内容仅限技术探讨和学习,不构成任何投资建议。

Published inAI&Invest专栏

Be First to Comment

    发表回复