使用Python和MQL5进行多交易品种分析(第一部分):纳斯达克集成电路制造商(基础篇)
📘

使用Python和MQL5进行多交易品种分析(第一部分):纳斯达克集成电路制造商(基础篇)

第 1/3 篇

同时盯多个品种前先想清楚的事

在 MT5 里做跨品种交易,很多人第一反应是开一堆图表挨个看,但真正稀缺的不是图表数量,而是决策带宽。一个账户同时跑纳斯达克成分股、贵金属和外汇交叉盘,光是每天的价格异动就超过人脑能逐条处理的阈值。 根据平台公开示例文章的统计,单篇多品种分析教程在 2025 年 5 月 20 日发布后首日浏览量达到 863 次,说明散户对「怎么选品种组合」的需求很实。但原文也点明:很少有投资者真有足够时间和资源,在重仓前把全部选项都仔细算一遍。 本系列用 Python 拉数据、MQL5 做执行回测,帮你看清哪些多品种策略值得留、哪些该砍。外汇与贵金属本身杠杆高、跳空频繁,跨品种相关性还会在避险时段反转,实盘前务必用历史数据跑一遍压力测试。

「用算法给五只芯片股配仓」

本次选取了五只在业务周期中设计或销售集成电路的公司股票:Broadcom、Cisco、Intel、NVIDIA 和 Comcast,全部在 NASDAQ 上市。该交易所成立于 1971 年,按交易量计是美国最大的交易所。世界首颗集成电路英特尔 4004 同样诞生于 1971 年,仅约 2600 个晶体管,而现代芯片普遍集成数十亿晶体管,行业扩张斜率极陡。 传统等权分配(每只 20% 资本)在波动放大的环境里容易吃回撤。我们更关心的是:对每一只标的,算法该给出买还是卖,以及对应的手数规模。本质上,这是用历史与实时数据去学出一套仓位决策,而不是拍脑袋定比例。 五只股票同属半导体链条,相关性高,但驱动节奏不完全同步。用模型分别判断信号与数量,才有可能在板块整体偏强时多押弹性标的、在分化时少碰弱势票。外汇与贵金属之外,股票组合同样存在回撤风险,任何仓位结论都只是概率倾向,需自行在 MT5 上跑数据验证。

◍ 从五只股票分钟数据里挖相关性与权重

用 MT5 的 Python 接口把股票池里 5 只标的的 M1 数据拉了十万行,转成百分比收益后做探索性分析。箱线图直接显示每只票均值回报贴近 0,五者间相关性弱到基本可以忽略。 把回报叠加画出来,NVIDIA 的波动幅度肉眼可见地最大;又补了成对图,没找到能直接套用的显式关系。外汇和贵金属虽不在本例,但这类弱相关结论放到高杠杆品种上更得警惕滑点和隔夜风险。 权重优化交给 SciPy,允许五个权重在 -1 到 1 之间自由跑。算出来权重为负就偏空提示卖出,为正则偏多建议买入,等于把组合方向交给数值解。 应用层把最优权重接进交易程序,始终维持各市场理论最优仓位;并设了用户指定的盈利阈值,触达即自动平仓,省去手动盯盘。

用 MT5 拉取五只纳指成分股的分钟收益率

想在 MT5 里做量化回测,第一步是把行情接口跑通。下面这段 Python 借助 MetaTrader5 模块直接连本机终端,不需要手动导出 CSV,适合做分钟级收益率研究。 代码先导入 pandas、numpy 以及 mt5 等库,随后调用 mt5.initialize() 唤醒终端。若终端未登录,这一步会返回 False,需在 MT5 客户端先完成账户连接。 标的范围写死在 stocks 列表里:AVGO.NAS、CSCO.NAS、CMCSA.NAS、INTC.NAS、NVDA.NAS,即博通、思科、康卡斯特、英特尔、英伟达五只纳指票。回测样本量 amount 设为 100000,也就是每只票取 10 万根 M1 收盘价。 循环里用 mt5.copy_rates_from_pos 从最新位置往前取 M1 数据,用 close 的 pct_change() 算逐根收益率,填进 returns 矩阵。最后 dropna 并重置索引,整体乘 100 转成百分比。外汇与贵金属杠杆高、滑点跳空频繁,直接套股票这套取数逻辑做币对时,要额外处理点差和休市缺口。 把 amount 调小到 5000 能更快验证管道是否通畅;连不上就先查 MT5 的「允许算法交易」和 DLL 接入权限。

MQL5 / C++
class="macro">#Import the libraries we need
class="kw">import pandas                as pd
class="kw">import numpy                as np
class="kw">import seaborn              as sns
class="kw">import matplotlib.pyplot    as plt
class="kw">import MetaTrader5          as mt5
from   scipy.optimize       class="kw">import minimize
class="macro">#Initialize the terminal
mt5.initialize()
class="macro">#Now let us fetch the data we need on chip manufacturing stocks
class="macro">#Broadcom, Cisco, Comcast, Intel, NVIDIA
stocks = ["AVGO.NAS","CSCO.NAS","CMCSA.NAS","INTC.NAS","NVDA.NAS"]
class="macro">#Let us create a data frame to store our stock returns
amount = class="num">100000
returns = pd.DataFrame(columns=stocks,index=np.arange(class="num">0,amount))
class="macro">#Fetch the stock returns
for stock in stocks:
    temp = pd.DataFrame(mt5.copy_rates_from_pos(stock,mt5.TIMEFRAME_M1,class="num">0,amount))
    returns[[stock]] = temp[["close"]].pct_change()
class="macro">#Format the data set 
returns.dropna(inplace=True)
returns.reset_index(inplace=True,drop=True)
returns
class="macro">#Convert the returns to percentages
returns = returns * class="num">100
returns

常见问题

先用分钟收益率算各股波动与相关性,波动小且与其他标的低相关的可给更高权重,避免同质化挤仓。
用脚本批量拉取五只股票分钟收益率,直接算相关系数矩阵,十分钟能出全样本结果。
小布可自动拉取多标的分钟数据并算出相关性与权重建议,你只需复核结论再决定下单。
先从等权起步,再按相关性矩阵下调高关联标的权重,单次回测别超过总资金的20%试错。
贵金属与股票风险驱动不同,相关性结构在避险时段会反转,需单独跑一段样本重算权重。