Files
mt5_python_ea_suite/visualize_regimes.py
songkunling 2ad610d8fd add ml
2025-08-14 23:17:12 +08:00

96 lines
3.1 KiB
Python

import pandas as pd
import numpy as np
import plotly.graph_objects as go
import os
# 从 regime_optimizer 脚本中导入状态分类函数
from regime_optimizer import classify_market_regimes
# --- 配置 ---
DATA_FILE = "full_historical_data.parquet"
OUTPUT_HTML_FILE = "regime_visualization.html"
# --- 主函数 ---
def create_regime_candlestick_chart():
"""
加载数据,分类市场状态,并生成一个按状态染色的交互式K线图。
"""
# 1. 加载数据
if not os.path.exists(DATA_FILE):
print(f"错误: 数据文件 {DATA_FILE} 不存在。请先运行 data_downloader.py。")
return
print(f"正在从 {DATA_FILE} 加载数据...")
full_df = pd.read_parquet(DATA_FILE)
print(f"数据加载完成,共 {len(full_df)} 条记录。")
# 2. 分类市场状态
# 这个函数会返回一个带有 'regime' 列的新DataFrame
df_classified = classify_market_regimes(full_df)
print("\n--- 开始生成交互式K线图 ---")
# 3. 创建Plotly图表对象
fig = go.Figure()
# 4. 为每种市场状态分别创建一个K线图层 (Trace)
# 这是处理大数据和分类染色的最高效方法
# 我们通过将不属于当前状态的数据设置为NaN来“隐藏”它们,从而只绘制我们想要的K线
regime_colors = {
"Uptrend": "red",
"Downtrend": "green",
"Ranging": "black"
}
for regime, color in regime_colors.items():
print(f"正在为 {regime} 状态创建图层...")
# 创建一个临时DataFrame用于绘图
df_trace = df_classified.copy()
# 将不属于当前状态的K线数据设置为空值(NaN)
df_trace.loc[df_trace['regime'] != regime, ['open', 'high', 'low', 'close']] = np.nan
# 添加K线图层
fig.add_trace(go.Candlestick(
x=df_trace.index,
open=df_trace['open'],
high=df_trace['high'],
low=df_trace['low'],
close=df_trace['close'],
name=regime,
increasing_line_color=color, # 上涨部分
decreasing_line_color=color # 下跌部分
))
# 5. 更新图表布局和样式
print("正在配置图表样式...")
fig.update_layout(
title={
'text': "市场状态可视化 (XAUUSD - M1)",
'y':0.9,
'x':0.5,
'xanchor': 'center',
'yanchor': 'top'
},
xaxis_title="日期",
yaxis_title="价格",
legend_title="市场状态",
template="plotly_dark", # 使用深色主题
xaxis_rangeslider_visible=False # **关键:为提升性能,禁用底部范围滑块**
)
# 6. 保存为HTML文件
try:
fig.write_html(OUTPUT_HTML_FILE)
print(f"\n--- 图表生成成功! ---")
print(f"已保存到: {os.path.abspath(OUTPUT_HTML_FILE)}")
print("请用您的浏览器打开此文件以进行交互式分析。")
except Exception as e:
print(f"保存HTML文件时出错: {e}")
if __name__ == "__main__":
create_regime_candlestick_chart()