挖掘央行资产负债表数据,描绘全球流动性全貌·综合运用
(3/3)·从原始资产负债表到 MT5 实盘,搭建一套跨市场流动性推导系统
把行情和流动性喂给 MT5 做信号
实盘衔接的核心,是让预测模块直接吃 MT5 的行情,而不是离线 CSV。系统初始化时调一次 mt5.initialize(),之后每日级 K 线通过 copy_rates_from 拉取,输入特征同时混了技术指标和流动性指标,构成一套偏短期的预测集。 下面这段 Python 封装值得直接抄进你的策略工程里看逻辑: import MetaTrader5 as mt5 from datetime import datetime, timedelta class TradingIntegration: def __init__(self, forecaster: ForexLiquidityForecaster): self.forecaster = forecaster mt5.initialize() def fetch_forex_data(self, symbol: str, days: int = 1460) -> pd.DataFrame: """Fetching data from MetaTrader 5.""" utc_from = datetime.now() - timedelta(days=days) rates = mt5.copy_rates_from(symbol, mt5.TIMEFRAME_D1, utc_from, days) if rates is None: return pd.DataFrame() df = pd.DataFrame(rates) df['date'] = pd.to_datetime(df['time'], unit='s') df.set_index('date', inplace=True) return df def generate_trading_signals(self, symbol: str, forecasts: dict) -> dict: """Generating trading signals.""" signals = {} short_term_returns = [f['return'] for h, f in forecasts['forecasts'].items() if h in ['1d', '2d', '3d']] avg_return = np.mean(short_term_returns) if short_term_returns else 0 signals['short_term'] = { 'signal': 'BUY' if avg_return > 0.005 else 'SELL' if avg_return < -0.005 else 'HOLD', 'strength': min(abs(avg_return) * 100, 100) } return signals 逐行拆一下关键点:__init__ 里把预测器存好并初始化 MT5 终端连接;fetch_forex_data 默认回溯 1460 天(约 4 个自然年)的 D1 数据,若终端没返回就丢空表;generate_trading_signals 只取 1d/2d/3d 三档短期预期收益做平均,阈值卡在 ±0.005(即 ±0.5%)决定 BUY/SELL/HOLD,强度按绝对收益乘 100 封顶 100。 外汇和贵金属杠杆高、滑点随机,这套信号只是概率倾向,真要上 MT5 验证,先把 days 改成 300 跑小样本,看信号频率和你的风控是否撞车。
class="kw">import MetaTrader5 as mt5 from class="type">class="kw">datetime class="kw">import class="type">class="kw">datetime, timedelta class TradingIntegration: def __init__(self, forecaster: ForexLiquidityForecaster): self.forecaster = forecaster mt5.initialize() def fetch_forex_data(self, symbol: str, days: class="type">int = class="num">1460) -> pd.DataFrame: """Fetching data from MetaTrader class="num">5.""" utc_from = class="type">class="kw">datetime.now() - timedelta(days=days) rates = mt5.copy_rates_from(symbol, mt5.TIMEFRAME_D1, utc_from, days) if rates is None: class="kw">return pd.DataFrame() df = pd.DataFrame(rates) df[&class="macro">#x27;date&class="macro">#x27;] = pd.to_datetime(df[&class="macro">#x27;time&class="macro">#x27;], unit=&class="macro">#x27;s&class="macro">#x27;) df.set_index(&class="macro">#x27;date&class="macro">#x27;, inplace=True) class="kw">return df def generate_trading_signals(self, symbol: str, forecasts: dict) -> dict: """Generating trading signals.""" signals = {} short_term_returns = [f[&class="macro">#x27;class="kw">return&class="macro">#x27;] for h, f in forecasts[&class="macro">#x27;forecasts&class="macro">#x27;].items() if h in [&class="macro">#x27;1d&class="macro">#x27;, &class="macro">#x27;2d&class="macro">#x27;, &class="macro">#x27;3d&class="macro">#x27;]] avg_return = np.mean(short_term_returns) if short_term_returns else class="num">0 signals[&class="macro">#x27;short_term&class="macro">#x27;] = { &class="macro">#x27;signal&class="macro">#x27;: &class="macro">#x27;BUY&class="macro">#x27; if avg_return > class="num">0.005 else &class="macro">#x27;SELL&class="macro">#x27; if avg_return < -class="num">0.005 else &class="macro">#x27;HOLD&class="macro">#x27;, &class="macro">#x27;strength&class="macro">#x27;: min(abs(avg_return) * class="num">100, class="num">100) } class="kw">return signals
「把流动性和价格联动画成一张图」
做全球盘面的流动性分析,最怕只盯着数字表格。把价格预测曲线、流动性指数走势和特征重要性排在一起,肉眼就能看出哪段行情是流动性推出来的,哪段只是噪声。 上面这段 Python 函数给出了一个可直接跑的可视化骨架:取某品种近 180 天历史,只画最后 60 根收盘线,再把模型输出的预测日期和价格用红色虚线接在后面。图存成 300dpi 的 PNG, MT5 里虽不能直接跑 Python,但你可以把同一组历史导出到本地用这套脚本复刻。 外汇和贵金属杠杆高、跳空频繁,预测曲线只代表模型在已知流动性下的倾向,实盘仍可能偏离。建议每次切换品种时重跑一遍,观察特征重要性排序是否发生明显漂移。
class="kw">import matplotlib.pyplot as plt class="kw">import numpy as np def create_comprehensive_visualization(self, symbol: str): """Building a set of visualizations.""" forecasts = self.forecaster.forecasts.get(symbol, {}) historical_data = self.fetch_forex_data(symbol, days=class="num">180) plt.figure(figsize=(class="num">15, class="num">8)) plt.plot(historical_data.index[-class="num">60:], historical_data[&class="macro">#x27;close&class="macro">#x27;].iloc[-class="num">60:], label=&class="macro">#x27;Historical prices&class="macro">#x27;, linewidth=class="num">2) forecast_dates = [class="type">class="kw">datetime.strptime(f[&class="macro">#x27;date&class="macro">#x27;], &class="macro">#x27;%Y-%m-%d&class="macro">#x27;) for f in forecasts.get(&class="macro">#x27;forecasts&class="macro">#x27;, {}).values()] forecast_prices = [f[&class="macro">#x27;price&class="macro">#x27;] for f in forecasts.get(&class="macro">#x27;forecasts&class="macro">#x27;, {}).values()] if forecast_dates: plt.plot(forecast_dates, forecast_prices, &class="macro">#x27;r--&class="macro">#x27;, label=&class="macro">#x27;Forecast&class="macro">#x27;, linewidth=class="num">2) plt.title(f&class="macro">#x27;{symbol}: Price forecast considering liquidity&class="macro">#x27;, fontsize=class="num">14, fontweight=&class="macro">#x27;bold&class="macro">#x27;) plt.xlabel(&class="macro">#x27;Date&class="macro">#x27;, fontsize=class="num">12) plt.ylabel(&class="macro">#x27;Price&class="macro">#x27;, fontsize=class="num">12) plt.legend() plt.grid(True, alpha=class="num">0.3) plt.savefig(f&class="macro">#x27;forecast_{symbol}.png&class="macro">#x27;, dpi=class="num">300) plt.close()
◍ 最后一句大实话
把央行资产负债表、机器学习和技术分析揉进一个框架,确实能帮有经验的交易者在 MT5 里把全球流动性变成可执行的信号,而不是盯着裸 K 拍脑袋。 但得泼盆冷水:人民银行这类数据源公开有限,只能拿替代指标凑,测算精度天生有缺口;机器学习也不是算命,地缘冲突这种黑天鹅一来,预测大概率失灵。 后续接神经网络啃新闻和社媒、加自适应权重,方向是对的,可外汇和贵金属本身就是高杠杆高风险场子,再聪明的系统也只是提高概率,亏钱永远可能发生。 真要上手,先跑一遍作者放出的 FREED_Predict.py(27.15 KB)回测,别光看结论就冲实盘。