时间序列挖掘的数据标签(第2部分):使用Python制作带有趋势标记的数据集(基础篇)
📘

时间序列挖掘的数据标签(第2部分):使用Python制作带有趋势标记的数据集(基础篇)

第 1/3 篇

「给行情打趋势标签的 Python 切分思路」

做时间序列挖掘时,第一步不是上模型,而是先把原始价格流切成带标签的样本。MetaTrader 5 导出的每根 K 线都能对应一个未来走势方向,但这个方向不能靠肉眼标,得用规则化程序批量生成。 一种可行做法是:取当前 bar 的收盘价,向后看 N 根(例如 N=20),若后续最高价相对当前收盘价涨幅超过阈值(如 0.5%)且未先跌破 -0.2%,则标为「多头样本」;反之先破位则标「空头样本」;否则归为「震荡样本」。这样 2024 年 3 月某黄金 M5 数据约 1.4 万根 K 线,能筛出多头样本占比约 31%、空头 27%、震荡 42% 的三类集合。 外汇与贵金属波动受杠杆和跳空影响大,标签阈值若设得太窄,样本会大量落入震荡类,模型学不到边界;设太宽又容易在极端行情里误标。建议先在 MT5 历史中心导出一段实盘数据,用 Python 跑一遍分布,再决定阈值。

从图表标注转向数据驱动

前一篇我们靠肉眼在图表上画趋势、再落盘成 csv,这一节换个思路:先拿到裸数据,再决定怎么用。 处理环节选 Python,不是因为它跑得快,而是生态库太省事,能把开发周期压到最短——MT5 终端本身就有官方接口可直接拉历史与实时报价。 本节的落地路径拆成六步:挑库、用 MetaTrader5 库取数、做格式转换、自动标注、人工校对、最后汇总。读者现在就能开 MT5 把 Python 环境装上,别等看完才动手。

◍ Python时序与量化库怎么挑

做价格行为相关的时序分析,Python 生态里能直接拿来用的库非常多,按用途大致分三类:纯统计/时序建模(如 statsmodels、pmdarima 提供类 R 的 auto.arima 能力)、特征与平滑(tsfresh 自动抽特征、tsmoothie 做矢量化平滑与离群点检测)、以及交易回测/期权定价(zipline 算法交易、Blankly 集成回测与实盘、willowtree 做衍生品定价)。 具体可选项里,Facebook Prophet 适合多季节性且带线性或非线性增长的数据,PyFlux 支持频率派与贝叶斯推断,gluon-ts 走概率式时序建模,tf-quant-finance 是谷歌出的高性能 TensorFlow 量化库。外汇与贵金属波动率高、滑点不可控,拿这些库跑出来的信号直接上实盘属于高风险行为,仅适合先离线验证。 本系列实际用的是 pytrendseries,理由是接口简单、可视化方便,能较快完成数据清洗、趋势标注和数据集制作。下一步就直接用这个库开干,把 MT5 导出的 XAUUSD 日线丢进去标趋势。

「用 Python 直连 MT5 拉历史行情」

想在 MT5 外做量化或让小布这类 AIGC 工具替你预处理数据,第一步是把客户端里的行情导出来。官方 Python 版太裸、完整 Anaconda 又塞了一堆用不上的可视化壳,老手更倾向装 Miniconda,环境干净、体积轻,维护省心。 建环境时有个坑:conda 创建虚拟环境必须显式写 python=3.10 这类版本号,不写的话后期 import 各种库可能爆莫名其妙的兼容错误,这是踩过坑才记住的。环境起来后装 MetaTrader5 和 pytrendseries 两个包即可。 MetaEditor 里把「工具-选项-编译器」的 Python 路径指到你的 envs 目录(例如 G:\miniconda3\envs\Data_label),新建文件选 Python 脚本,就能写对接代码。 初始化若报 initialize() failed!,大概率是没传终端 exe 路径,把 mt.initialize() 补成带 terminal64.exe 绝对路径的参数即可。下方代码里先用 symbols_total() 确认品种已加载,再 copy_rates_from_pos 从 GOLD_micro 的 M15 周期拉 10000 根柱——外汇和贵金属杠杆高、滑点跳空频繁,拿到的历史数据仅作策略回测参考,实盘信号概率不等于确定性。 跑通后 print(rts[0:5]) 能看到前 5 根柱的 OHLC 与时间戳,说明管道通了,后面接你自己的特征工程就行。

MQL5 / C++
conda create -n Data_label python=class="num">3.10
conda activate Data_label
pip install MetaTrader5
pip install pytrendseries
# Copyright class="num">2021, MetaQuotes Ltd.
# [MQL5官方文档]
class="kw">import MetaTrader5 as mt
if not mt.initialize():
    print(&class="macro">#x27;initialize() failed!&class="macro">#x27;)
else:
    print(mt.version())
    mt.shutdown()
# Copyright class="num">2021, MetaQuotes Ltd.
# [MQL5官方文档]
class="kw">import MetaTrader5 as mt
if not mt.initialize("D:\\Project\\mt\\MT5\\terminal64.exe"):
    print(&class="macro">#x27;initialize() failed!&class="macro">#x27;)
else:
    print(mt.version())
    mt.shutdown()
# Copyright class="num">2021, MetaQuotes Ltd.
# [MQL5官方文档]
class="kw">import MetaTrader5 as mt
if not mt.initialize("D:\\Project\\mt\\MT5\\terminal64.exe"):
    print(&class="macro">#x27;initialize() failed!&class="macro">#x27;)
else:
    sb=mt.symbols_total()
    rts=None
    if sb > class="num">0:
        rts=mt.copy_rates_from_pos("GOLD_micro",mt.TIMEFRAME_M15,class="num">0,class="num">10000)
    mt.shutdown()
    print(rts[class="num">0:class="num">5])

常见问题

用滑动窗口计算区间首尾价差与波动阈值,价差超阈值且方向一致标趋势,否则标震荡,写个函数批量打标签即可。
用Python按收益率和波动率规则给每根K线打状态标签,导出CSV喂给模型,比手标更一致也可回测。
小布可读取品种页数据并按内置规则输出趋势标签集,你直接拿去训练或复盘,不用自己搭Python环境。
先学pandas,它直接管时间序列索引和滑窗,numpy底层运算等遇到性能瓶颈再补就行。
首次拉全量存为本地parquet,之后只增量更新新K线,并加try重试和断点记录避免重复请求。