diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..f9872e0a34e60a0ca19fc0e4cd0ab811b3f6461b
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,83 @@
+# Git
+.git
+.gitignore
+.gitattributes
+
+# Documentation
+*.md
+README.md
+LICENSE
+
+# Python
+__pycache__/
+*.py[cod]
+*$py.class
+*.so
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# Virtual environments
+venv/
+env/
+ENV/
+env.bak/
+venv.bak/
+
+# IDE
+.vscode/
+.idea/
+*.swp
+*.swo
+*~
+
+# OS
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# Logs
+*.log
+logs/
+
+# Docker
+Dockerfile*
+docker-compose*
+.dockerignore
+
+# Temporary files
+*.tmp
+*.temp
+temp/
+tmp/
+
+# Test files
+test_*
+*_test.py
+tests/
+
+# Examples (optional - remove if you want to include examples)
+examples/
+
+# Figures (optional - remove if you want to include figures)
+figures/
+
+# Finetune (optional - remove if you want to include finetune)
+finetune/
diff --git a/.gitattributes b/.gitattributes
index a6344aac8c09253b3b630fb776ae94478aa0275b..005db6ebd4dd27d886535fde7ca69601bbb52b78 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
*tfevents* filter=lfs diff=lfs merge=lfs -text
+figures/backtest_result_example.png filter=lfs diff=lfs merge=lfs -text
+figures/logo.png filter=lfs diff=lfs merge=lfs -text
+figures/overview.png filter=lfs diff=lfs merge=lfs -text
+figures/prediction_example.png filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..0dc8d61acc2f9198f3003bda42e10226974d56d2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+/.venv/
+/.idea/Kronos.iml
+/.idea/inspectionProfiles/profiles_settings.xml
+/.idea/AugmentWebviewStateStore.xml
+/examples/eth_usdt_prediction*
+/.idea/misc.xml
+/.idea/vcs.xml
diff --git a/BINANCE_INTEGRATION.md b/BINANCE_INTEGRATION.md
new file mode 100644
index 0000000000000000000000000000000000000000..8190937520b179a0a2658d3f507bd7a7290e5452
--- /dev/null
+++ b/BINANCE_INTEGRATION.md
@@ -0,0 +1,119 @@
+# 币安实时数据集成完成报告
+
+## 🎯 项目目标
+将 Kronos WebUI 中的文件选择功能替换为币安实时数据获取,支持选择不同的交易品种和时间周期。
+
+## ✅ 完成的修改
+
+### 1. 后端修改 (webui/app.py)
+
+#### 新增依赖
+- 添加了 `python-binance` 库用于币安API集成
+- 添加了 `requests` 库用于HTTP请求
+
+#### 新增功能函数
+- `get_available_symbols()`: 获取可用的交易对列表(前100个热门USDT交易对)
+- `get_binance_klines()`: 从币安获取K线数据,支持网络失败时的模拟数据
+- `generate_mock_klines()`: 生成模拟K线数据作为备用方案
+- `get_timeframe_options()`: 获取可用的时间周期选项
+
+#### 修改的API路由
+- `/api/symbols`: 替换原来的 `/api/data-files`,返回交易对列表
+- `/api/timeframes`: 新增API,返回时间周期选项
+- `/api/load-data`: 修改为接收币安数据参数(symbol, interval, limit)
+- `/api/predict`: 修改预测参数,使用币安数据参数替代文件路径
+
+### 2. 前端修改 (webui/templates/index.html)
+
+#### 界面更新
+- 将"选择数据文件"替换为"选择交易对"
+- 添加"选择时间周期"下拉框
+- 添加"数据数量"选择器
+- 按钮文本改为"📈 获取币安数据"
+
+#### JavaScript功能更新
+- 全局变量:`currentDataFile` → `currentSymbol`, `currentInterval`, `currentLimit`
+- 新增函数:`loadSymbols()`, `loadTimeframes()`
+- 修改函数:`loadData()`, `startPrediction()`
+- 更新API调用参数
+
+### 3. 支持的交易对
+包含100个热门USDT交易对,如:
+- BTC/USDT, ETH/USDT, BNB/USDT
+- ADA/USDT, SOL/USDT 等主流币种
+
+### 4. 支持的时间周期
+- 1分钟, 5分钟, 15分钟, 30分钟
+- 1小时, 4小时, 1天, 1周
+
+### 5. 容错机制
+- 网络连接失败时自动切换到模拟数据
+- 模拟数据基于真实价格范围生成随机游走数据
+- 保持与原有预测功能的完全兼容性
+
+## 🧪 测试结果
+
+### API测试 (test_api.py)
+✅ 交易对列表API - 成功获取100个交易对
+✅ 时间周期列表API - 成功获取8个时间周期选项
+✅ 加载币安数据API - 成功获取BTCUSDT数据
+
+### 功能验证
+- 应用程序正常启动在 http://127.0.0.1:7070
+- 所有新API接口响应正常
+- 数据格式与原有系统完全兼容
+
+## 🚀 使用方法
+
+1. 启动应用:
+ ```bash
+ cd webui
+ python app.py
+ ```
+
+2. 访问 http://127.0.0.1:7070
+
+3. 操作流程:
+ - 选择模型并加载
+ - 选择交易对(如 BTC/USDT)
+ - 选择时间周期(如 1小时)
+ - 选择数据数量(如 1000条)
+ - 点击"📈 获取币安数据"
+ - 设置预测参数
+ - 开始预测
+
+## 📋 技术特点
+
+- **实时数据**: 直接从币安获取最新的K线数据
+- **多品种支持**: 支持100+主流加密货币交易对
+- **多时间周期**: 从1分钟到1周的8种时间周期
+- **容错设计**: 网络问题时自动使用模拟数据
+- **向后兼容**: 保持与原有预测模型的完全兼容
+- **用户友好**: 中文界面,操作简单直观
+
+## 🔧 依赖要求
+
+新增依赖包:
+- python-binance>=1.0.19
+- requests>=2.25.0
+
+已在 `webui/requirements.txt` 中更新。
+
+## 📝 注意事项
+
+1. 首次使用需要安装新的依赖包
+2. 币安API使用公开接口,无需API密钥
+3. 网络连接问题时会自动使用模拟数据
+4. 模拟数据基于真实价格范围,适合测试和演示
+
+## 🎉 总结
+
+成功将文件选择功能替换为币安实时数据获取,实现了:
+- ✅ 实时数据获取
+- ✅ 多品种支持
+- ✅ 多时间周期
+- ✅ 容错机制
+- ✅ 用户体验优化
+- ✅ 完全向后兼容
+
+现在用户可以直接选择任意加密货币交易对进行实时数据分析和预测,无需手动准备数据文件。
diff --git a/DOCKER_README.md b/DOCKER_README.md
new file mode 100644
index 0000000000000000000000000000000000000000..dbf280d15a49f62f5f6a49b7a85f565068ec5493
--- /dev/null
+++ b/DOCKER_README.md
@@ -0,0 +1,222 @@
+# Kronos Web UI - Docker Deployment Guide
+
+## 概述
+
+这个文档提供了使用 Docker 部署 Kronos Web UI 的完整指南。
+
+## 快速开始
+
+### 使用 Docker Compose(推荐)
+
+1. **构建并启动服务**
+ ```bash
+ docker-compose up --build
+ ```
+
+2. **后台运行**
+ ```bash
+ docker-compose up -d --build
+ ```
+
+3. **停止服务**
+ ```bash
+ docker-compose down
+ ```
+
+4. **查看日志**
+ ```bash
+ docker-compose logs -f kronos-webui
+ ```
+
+### 使用 Docker 命令
+
+1. **构建镜像**
+ ```bash
+ docker build -t kronos-webui .
+ ```
+
+2. **运行容器**
+ ```bash
+ docker run -d \
+ --name kronos-webui \
+ -p 7070:7070 \
+ -v $(pwd)/webui/prediction_results:/app/webui/prediction_results \
+ kronos-webui
+ ```
+
+3. **查看日志**
+ ```bash
+ docker logs -f kronos-webui
+ ```
+
+4. **停止容器**
+ ```bash
+ docker stop kronos-webui
+ docker rm kronos-webui
+ ```
+
+## 访问应用
+
+启动成功后,通过以下地址访问:
+- **Web UI**: http://localhost:7070
+- **健康检查**: http://localhost:7070/
+
+## 配置说明
+
+### 环境变量
+
+| 变量名 | 默认值 | 说明 |
+|--------|--------|------|
+| `PYTHONPATH` | `/app` | Python 路径 |
+| `FLASK_APP` | `webui/app.py` | Flask 应用入口 |
+| `FLASK_ENV` | `production` | Flask 环境 |
+| `TZ` | `Asia/Shanghai` | 时区设置 |
+
+### 数据持久化
+
+以下目录会被持久化存储:
+- `./webui/prediction_results` - 预测结果文件
+- `./model/data` - 模型数据(如果存在)
+
+### 端口配置
+
+- **容器内端口**: 7070
+- **宿主机端口**: 7070(可在 docker-compose.yml 中修改)
+
+## 生产环境部署
+
+### 使用 Gunicorn
+
+容器会自动检测并使用 Gunicorn 作为生产环境的 WSGI 服务器:
+- 工作进程数:2
+- 超时时间:120秒
+- 绑定地址:0.0.0.0:7070
+
+### 健康检查
+
+容器包含健康检查功能:
+- 检查间隔:30秒
+- 超时时间:10秒
+- 重试次数:3次
+- 启动等待时间:40秒
+
+### 安全配置
+
+- 使用非 root 用户运行(UID: 1000)
+- 最小化镜像大小(多阶段构建)
+- 只安装必要的运行时依赖
+
+## 故障排除
+
+### 常见问题
+
+1. **端口冲突**
+ ```bash
+ # 修改 docker-compose.yml 中的端口映射
+ ports:
+ - "8080:7070" # 使用 8080 端口
+ ```
+
+2. **权限问题**
+ ```bash
+ # 确保预测结果目录有正确权限
+ chmod 755 webui/prediction_results
+ ```
+
+3. **模型加载失败**
+ - 检查网络连接(需要下载 Hugging Face 模型)
+ - 确保有足够的磁盘空间
+ - 查看容器日志了解详细错误信息
+
+### 日志查看
+
+```bash
+# 查看实时日志
+docker-compose logs -f
+
+# 查看特定服务日志
+docker-compose logs kronos-webui
+
+# 查看容器日志
+docker logs kronos-webui
+```
+
+### 进入容器调试
+
+```bash
+# 进入运行中的容器
+docker exec -it kronos-webui /bin/bash
+
+# 或使用 docker-compose
+docker-compose exec kronos-webui /bin/bash
+```
+
+## 性能优化
+
+### 资源限制
+
+在 docker-compose.yml 中添加资源限制:
+
+```yaml
+services:
+ kronos-webui:
+ # ... 其他配置
+ deploy:
+ resources:
+ limits:
+ memory: 2G
+ cpus: '1.0'
+ reservations:
+ memory: 1G
+ cpus: '0.5'
+```
+
+### 缓存优化
+
+- 使用 `.dockerignore` 排除不必要的文件
+- 多阶段构建减少最终镜像大小
+- 合理使用 Docker 层缓存
+
+## 更新和维护
+
+### 更新应用
+
+```bash
+# 重新构建并启动
+docker-compose up --build -d
+
+# 清理旧镜像
+docker image prune -f
+```
+
+### 备份数据
+
+```bash
+# 备份预测结果
+tar -czf prediction_results_backup.tar.gz webui/prediction_results/
+
+# 备份模型数据(如果存在)
+tar -czf model_data_backup.tar.gz model/data/
+```
+
+## 监控
+
+### 容器状态
+
+```bash
+# 查看容器状态
+docker-compose ps
+
+# 查看资源使用情况
+docker stats kronos-webui
+```
+
+### 健康检查
+
+```bash
+# 手动健康检查
+curl -f http://localhost:7070/
+
+# 查看健康检查状态
+docker inspect kronos-webui | grep -A 10 Health
+```
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..7bc6391fbcfbe533a4f1010e3d14074b7def4a8c
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,71 @@
+# Multi-stage build for optimization
+FROM python:3.9-slim as builder
+
+# Install system dependencies for building
+RUN apt-get update && apt-get install -y \
+ build-essential \
+ gcc \
+ g++ \
+ && rm -rf /var/lib/apt/lists/*
+
+# Create virtual environment
+RUN python -m venv /opt/venv
+ENV PATH="/opt/venv/bin:$PATH"
+
+# Copy and install requirements
+COPY requirements.txt /tmp/requirements.txt
+COPY webui/requirements.txt /tmp/webui_requirements.txt
+
+# Install main project dependencies
+RUN pip install --no-cache-dir --upgrade pip && \
+ pip install --no-cache-dir -r /tmp/requirements.txt
+
+# Install webui dependencies
+RUN pip install --no-cache-dir -r /tmp/webui_requirements.txt
+
+# Install production WSGI server
+RUN pip install --no-cache-dir gunicorn
+
+# Production stage
+FROM python:3.9-slim
+
+# Install runtime dependencies
+RUN apt-get update && apt-get install -y \
+ curl \
+ && rm -rf /var/lib/apt/lists/*
+
+# Create non-root user
+RUN useradd -m -u 1000 user && \
+ mkdir -p /app && \
+ chown -R user:user /app
+
+# Copy virtual environment from builder stage
+COPY --from=builder /opt/venv /opt/venv
+ENV PATH="/opt/venv/bin:$PATH"
+
+# Set working directory
+WORKDIR /app
+
+# Copy application code
+COPY --chown=user:user . /app
+
+# Make startup script executable
+RUN chmod +x /app/webui/docker_start.sh
+
+# Switch to non-root user
+USER user
+
+# Expose the correct port (Flask app runs on 7070)
+EXPOSE 7860
+
+# Add health check
+HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
+ CMD curl -f http://localhost:7860/ || exit 1
+
+# Set environment variables
+ENV PYTHONPATH=/app
+ENV FLASK_APP=webui/app.py
+ENV FLASK_ENV=production
+
+# Use the startup script
+CMD ["/app/webui/docker_start.sh"]
\ No newline at end of file
diff --git "a/Kronos\351\241\271\347\233\256\350\257\246\347\273\206\345\210\206\346\236\220\346\226\207\346\241\243.md" "b/Kronos\351\241\271\347\233\256\350\257\246\347\273\206\345\210\206\346\236\220\346\226\207\346\241\243.md"
new file mode 100644
index 0000000000000000000000000000000000000000..08b0578575073bdb2710c87909be6f491fd26fad
--- /dev/null
+++ "b/Kronos\351\241\271\347\233\256\350\257\246\347\273\206\345\210\206\346\236\220\346\226\207\346\241\243.md"
@@ -0,0 +1,850 @@
+# Kronos项目详细分析文档
+
+## 项目概述
+
+**Kronos** 是一个专门为金融市场"语言"(K线序列)设计的解码器专用基础模型家族。与通用时间序列预测模型不同,Kronos专门处理金融数据的独特高噪声特征,采用创新的两阶段框架:
+
+1. **专用分词器**:将连续的多维K线数据(OHLCV)量化为分层离散token
+2. **大型自回归Transformer**:在这些token上进行预训练,作为多种量化任务的统一模型
+
+## 项目结构
+
+```
+E:/Kronos/
+├── LICENSE # MIT许可证
+├── README.md # 项目说明文档
+├── requirements.txt # Python依赖包列表
+├── examples/ # 示例代码目录
+│ ├── data/ # 示例数据
+│ │ └── XSHG_5min_600977.csv
+│ ├── prediction_example.py # 完整预测示例(包含成交量)
+│ └── prediction_wo_vol_example.py # 无成交量预测示例
+├── figures/ # 图片资源
+│ ├── logo.png
+│ ├── overview.png
+│ ├── prediction_example.png
+│ └── backtest_result_example.png
+├── model/ # 核心模型代码
+│ ├── __init__.py # 模型导入接口
+│ ├── kronos.py # 主要模型类定义
+│ └── module.py # 核心模块组件
+└── finetune/ # 微调训练代码
+ ├── config.py # 配置文件
+ ├── dataset.py # 数据集处理
+ ├── train_tokenizer.py # 分词器训练
+ ├── train_predictor.py # 预测器训练
+ ├── qlib_data_preprocess.py # Qlib数据预处理
+ ├── qlib_test.py # Qlib测试
+ └── utils/ # 训练工具函数
+```
+
+## 核心架构
+
+### 1. 两阶段框架
+
+#### 阶段一:KronosTokenizer(分词器)
+- **功能**:将连续的OHLCV数据转换为离散token
+- **核心技术**:Binary Spherical Quantization (BSQ)
+- **架构**:编码器-解码器结构 + BSQuantizer
+
+#### 阶段二:Kronos(预测模型)
+- **功能**:基于token序列进行自回归预测
+- **架构**:Transformer解码器 + 分层嵌入 + 依赖感知层
+
+### 2. 关键技术组件
+
+#### Binary Spherical Quantization (BSQ)
+```python
+class BSQuantizer(nn.Module):
+ def __init__(self, s1_bits, s2_bits, beta, gamma0, gamma, zeta, group_size):
+ # s1_bits: 第一级量化位数
+ # s2_bits: 第二级量化位数
+ # beta: 提交损失权重
+ # gamma0, gamma, zeta: 熵惩罚权重
+```
+
+**特点**:
+- 分层量化:将数据分为两个层次(s1和s2)
+- 球面约束:在单位球面上进行量化
+- 熵正则化:防止码本坍塌
+
+#### 分层嵌入 (HierarchicalEmbedding)
+```python
+class HierarchicalEmbedding(nn.Module):
+ def __init__(self, s1_bits, s2_bits, d_model=256):
+ self.emb_s1 = nn.Embedding(2**s1_bits, d_model) # 第一级嵌入
+ self.emb_s2 = nn.Embedding(2**s2_bits, d_model) # 第二级嵌入
+ self.fusion_proj = nn.Linear(d_model * 2, d_model) # 融合投影
+```
+
+#### 依赖感知层 (DependencyAwareLayer)
+```python
+class DependencyAwareLayer(nn.Module):
+ def __init__(self, d_model, n_heads=4):
+ self.cross_attn = MultiHeadCrossAttentionWithRoPE(d_model, n_heads)
+ self.norm = RMSNorm(d_model)
+```
+
+**功能**:处理s1和s2 token之间的依赖关系
+
+#### 旋转位置编码 (RoPE)
+- 所有注意力机制都使用RoPE进行位置编码
+- 支持更好的长序列建模能力
+
+### 3. 模型规格
+
+#### 可用模型
+- **Kronos-small**: 小型模型,适合快速推理
+- **Kronos-base**: 基础模型,平衡性能和效率
+- **最大上下文长度**: 512个时间步
+
+#### 分词器规格
+- **Kronos-Tokenizer-base**: 基础分词器
+- 支持OHLCV数据的分层量化
+
+## 数据处理流程
+
+### 1. 输入数据格式
+```python
+# 必需列
+price_cols = ['open', 'high', 'low', 'close']
+# 可选列
+vol_col = 'volume'
+amt_col = 'amount'
+# 时间戳
+timestamp_col = 'timestamps'
+```
+
+### 2. 数据预处理
+```python
+# 标准化
+x_mean, x_std = np.mean(x, axis=0), np.std(x, axis=0)
+x = (x - x_mean) / (x_std + 1e-5)
+# 裁剪异常值
+x = np.clip(x, -clip_value, clip_value)
+```
+
+### 3. 时间特征工程
+```python
+def calc_time_stamps(timestamps):
+ # 提取时间特征:分钟、小时、星期、日、月
+ return pd.DataFrame({
+ 'minute': timestamps.dt.minute,
+ 'hour': timestamps.dt.hour,
+ 'weekday': timestamps.dt.weekday,
+ 'day': timestamps.dt.day,
+ 'month': timestamps.dt.month
+ })
+```
+
+## 训练流程
+
+### 1. 分词器训练 (train_tokenizer.py)
+```python
+# 损失函数
+recon_loss_pre = F.mse_loss(z_pre, batch_x) # 重构损失(s1)
+recon_loss_all = F.mse_loss(z, batch_x) # 重构损失(全部)
+recon_loss = recon_loss_pre + recon_loss_all
+loss = (recon_loss + bsq_loss) / 2
+```
+
+**训练目标**:
+- 最小化重构误差
+- 优化量化码本
+- 平衡压缩率和重构质量
+
+### 2. 预测器训练 (train_predictor.py)
+```python
+# 分层预测损失
+s1_loss = F.cross_entropy(s1_logits.view(-1, s1_vocab_size), s1_targets.view(-1))
+s2_loss = F.cross_entropy(s2_logits.view(-1, s2_vocab_size), s2_targets.view(-1))
+loss = s1_loss + s2_loss
+```
+
+**训练目标**:
+- 学习token序列的自回归模式
+- 优化分层预测准确性
+
+### 3. 配置参数 (config.py)
+```python
+# 数据参数
+lookback_window = 90 # 历史窗口长度
+predict_window = 10 # 预测窗口长度
+max_context = 512 # 最大上下文长度
+
+# 训练参数
+epochs = 30
+batch_size = 50
+tokenizer_learning_rate = 2e-4
+predictor_learning_rate = 4e-5
+clip = 5.0 # 数据裁剪阈值
+```
+
+## 推理流程
+
+### 1. 模型加载
+```python
+from model import Kronos, KronosTokenizer, KronosPredictor
+
+# 从Hugging Face Hub加载
+tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
+model = Kronos.from_pretrained("NeoQuasar/Kronos-small")
+
+# 创建预测器
+predictor = KronosPredictor(model, tokenizer, device="cpu", max_context=512)
+```
+
+### 2. 数据准备
+```python
+# 历史数据
+x_df = df.loc[:lookback-1, ['open', 'high', 'low', 'close', 'volume', 'amount']]
+x_timestamp = df.loc[:lookback-1, 'timestamps']
+# 预测时间戳
+y_timestamp = df.loc[lookback:lookback+pred_len-1, 'timestamps']
+```
+
+### 3. 生成预测
+```python
+pred_df = predictor.predict(
+ df=x_df,
+ x_timestamp=x_timestamp,
+ y_timestamp=y_timestamp,
+ pred_len=pred_len,
+ T=1.0, # 采样温度
+ top_p=0.9, # 核采样概率
+ sample_count=1 # 采样路径数量
+)
+```
+
+### 4. 采样策略
+- **温度采样 (T)**: 控制预测的随机性
+- **核采样 (top_p)**: 只从累积概率前p%的token中采样
+- **多路径采样**: 生成多个预测路径并平均
+
+## 技术特色
+
+### 1. 分层量化
+- **优势**: 更好地捕获金融数据的多尺度特征
+- **实现**: BSQ将连续数据映射到分层离散空间
+
+### 2. 依赖感知建模
+- **问题**: 传统方法忽略token间的内在依赖
+- **解决**: DependencyAwareLayer显式建模s1和s2的关系
+
+### 3. 时间感知
+- **时间嵌入**: 显式编码时间信息(分钟、小时、日期等)
+- **位置编码**: RoPE提供更好的序列位置感知
+
+### 4. 鲁棒性设计
+- **数据裁剪**: 处理金融数据的极端异常值
+- **实例标准化**: 每个样本独立标准化
+- **梯度累积**: 支持大批次训练
+
+## 应用场景
+
+### 1. 价格预测
+- 股票价格预测
+- 外汇汇率预测
+- 商品期货预测
+
+### 2. 风险管理
+- 波动率预测
+- VaR计算
+- 压力测试
+
+### 3. 量化交易
+- 信号生成
+- 组合优化
+- 回测分析
+
+## 性能特点
+
+### 1. 优势
+- **专门优化**: 针对金融数据特点设计
+- **统一框架**: 一个模型处理多种任务
+- **可扩展性**: 支持不同规模的模型
+
+### 2. 限制
+- **上下文长度**: 最大512个时间步
+- **计算资源**: 需要足够的GPU/CPU资源
+- **数据质量**: 对输入数据质量敏感
+
+## 依赖环境
+
+### Python包依赖
+```
+numpy
+pandas
+torch
+einops==0.8.1
+huggingface_hub==0.33.1
+matplotlib==3.9.3
+tqdm==4.67.1
+safetensors # 模型加载必需
+```
+
+### 硬件要求
+- **CPU**: 支持CPU推理(较慢)
+- **GPU**: 推荐CUDA兼容GPU(更快)
+- **内存**: 至少8GB RAM
+- **存储**: 模型文件约100MB
+
+## 许可证
+MIT License - 允许商业和非商业使用
+
+## 详细代码分析
+
+### 1. KronosTokenizer类详解
+
+#### 核心参数
+```python
+def __init__(self, d_in, d_model, n_heads, ff_dim, n_enc_layers, n_dec_layers,
+ ffn_dropout_p, attn_dropout_p, resid_dropout_p, s1_bits, s2_bits,
+ beta, gamma0, gamma, zeta, group_size):
+```
+
+**参数说明**:
+- `d_in`: 输入维度(通常为6,对应OHLCVA)
+- `d_model`: 模型隐藏维度
+- `n_heads`: 注意力头数
+- `ff_dim`: 前馈网络维度
+- `n_enc_layers/n_dec_layers`: 编码器/解码器层数
+- `s1_bits/s2_bits`: 分层量化位数
+- `beta, gamma0, gamma, zeta`: BSQ损失权重
+
+#### 前向传播流程
+```python
+def forward(self, x):
+ # 1. 输入嵌入
+ z = self.embed(x) # [B, T, d_in] -> [B, T, d_model]
+
+ # 2. 编码器处理
+ for layer in self.encoder:
+ z = layer(z)
+
+ # 3. 量化准备
+ z = self.quant_embed(z) # [B, T, d_model] -> [B, T, codebook_dim]
+
+ # 4. BSQ量化
+ bsq_loss, quantized, z_indices = self.tokenizer(z)
+
+ # 5. 分层解码
+ quantized_pre = quantized[:, :, :self.s1_bits] # s1部分
+ z_pre = self.post_quant_embed_pre(quantized_pre)
+ z = self.post_quant_embed(quantized) # 完整量化
+
+ # 6. 解码器重构
+ for layer in self.decoder:
+ z_pre = layer(z_pre)
+ z = layer(z)
+
+ z_pre = self.head(z_pre) # s1重构
+ z = self.head(z) # 完整重构
+
+ return (z_pre, z), bsq_loss, quantized, z_indices
+```
+
+### 2. Kronos预测模型详解
+
+#### 模型初始化
+```python
+def __init__(self, d_model, n_heads, ff_dim, n_layers, s1_bits, s2_bits,
+ ffn_dropout_p, attn_dropout_p, resid_dropout_p, token_dropout_p, learn_te):
+```
+
+#### 关键组件
+1. **分层嵌入层**: 处理s1和s2 token的嵌入
+2. **时间嵌入层**: 编码时间特征
+3. **Transformer层**: 多层自注意力机制
+4. **依赖感知层**: 处理token间依赖
+5. **双头输出**: 分别预测s1和s2
+
+#### 生成过程
+```python
+def generate(self, x, x_stamp, y_stamp, pred_len, T=1.0, top_k=0, top_p=0.9,
+ sample_count=1, verbose=True):
+ # 1. 编码历史数据
+ s1_ids, s2_ids = self.tokenizer.encode(x, half=True)
+
+ # 2. 自回归生成
+ for i in range(pred_len):
+ # 获取当前上下文
+ context_s1 = s1_ids[:, -self.max_context:]
+ context_s2 = s2_ids[:, -self.max_context:]
+
+ # 预测下一个token
+ s1_logits, s2_logits = self.forward(context_s1, context_s2, ...)
+
+ # 采样策略
+ next_s1 = self.sample_token(s1_logits[:, -1], T, top_k, top_p)
+ next_s2 = self.sample_token(s2_logits[:, -1], T, top_k, top_p)
+
+ # 更新序列
+ s1_ids = torch.cat([s1_ids, next_s1.unsqueeze(1)], dim=1)
+ s2_ids = torch.cat([s2_ids, next_s2.unsqueeze(1)], dim=1)
+
+ # 3. 解码为原始数据
+ pred_tokens = torch.cat([s1_ids[:, -pred_len:], s2_ids[:, -pred_len:]], dim=-1)
+ predictions = self.tokenizer.decode(pred_tokens)
+
+ return predictions
+```
+
+### 3. BSQ量化算法详解
+
+#### 核心思想
+Binary Spherical Quantization将连续向量量化到单位球面上的二进制点:
+
+```python
+def quantize(self, z):
+ # 1. 球面归一化
+ z = F.normalize(z, dim=-1)
+
+ # 2. 二进制量化
+ zhat = torch.where(z > 0,
+ torch.tensor(1, dtype=z.dtype, device=z.device),
+ torch.tensor(-1, dtype=z.dtype, device=z.device))
+
+ # 3. 直通估计器
+ return z + (zhat - z).detach()
+```
+
+#### 损失函数组成
+```python
+def forward(self, z):
+ # 1. 量化
+ zq = self.quantize(z)
+
+ # 2. 提交损失(commitment loss)
+ commit_loss = self.beta * torch.mean(((zq.detach() - z) ** 2).sum(dim=-1))
+
+ # 3. 熵正则化
+ entropy_penalty = self.compute_entropy_penalty(z)
+
+ # 4. 总损失
+ total_loss = commit_loss + self.zeta * entropy_penalty / self.inv_temperature
+
+ return zq, total_loss, metrics
+```
+
+### 4. 数据集处理详解
+
+#### QlibDataset类
+```python
+class QlibDataset(Dataset):
+ def __init__(self, data_type='train'):
+ # 加载预处理数据
+ with open(self.data_path, 'rb') as f:
+ self.data = pickle.load(f)
+
+ # 预计算所有可能的起始索引
+ self.valid_start_indices = []
+ for symbol_data in self.data:
+ seq_len = len(symbol_data['feature'])
+ max_start = seq_len - self.config.lookback_window - self.config.predict_window
+ if max_start > 0:
+ self.valid_start_indices.extend([
+ (symbol_idx, start_idx)
+ for start_idx in range(max_start)
+ ])
+```
+
+#### 数据采样策略
+```python
+def __getitem__(self, index):
+ # 随机选择起始位置
+ symbol_idx, start_idx = self.py_rng.choice(self.valid_start_indices)
+
+ # 提取特征和时间戳
+ symbol_data = self.data[symbol_idx]
+ end_idx = start_idx + self.config.lookback_window
+
+ x = symbol_data['feature'][start_idx:end_idx]
+ x_stamp = symbol_data['time_feature'][start_idx:end_idx]
+
+ # 实例级标准化
+ x_mean, x_std = np.mean(x, axis=0), np.std(x, axis=0)
+ x = (x - x_mean) / (x_std + 1e-5)
+ x = np.clip(x, -self.config.clip, self.config.clip)
+
+ return torch.from_numpy(x), torch.from_numpy(x_stamp)
+```
+
+### 5. 训练优化策略
+
+#### 梯度累积
+```python
+for j in range(config['accumulation_steps']):
+ # 分批处理
+ start_idx = j * (batch_size // config['accumulation_steps'])
+ end_idx = (j + 1) * (batch_size // config['accumulation_steps'])
+ mini_batch = batch[start_idx:end_idx]
+
+ # 前向传播
+ loss = model(mini_batch)
+ loss_scaled = loss / config['accumulation_steps']
+
+ # 反向传播
+ loss_scaled.backward()
+
+# 参数更新
+optimizer.step()
+optimizer.zero_grad()
+```
+
+#### 学习率调度
+```python
+scheduler = torch.optim.lr_scheduler.OneCycleLR(
+ optimizer=optimizer,
+ max_lr=config['learning_rate'],
+ steps_per_epoch=len(train_loader),
+ epochs=config['epochs'],
+ pct_start=0.03, # 3%的时间用于warm-up
+ div_factor=10 # 初始学习率 = max_lr / div_factor
+)
+```
+
+### 6. 分布式训练支持
+
+#### DDP设置
+```python
+def setup_ddp(rank, world_size):
+ os.environ['MASTER_ADDR'] = 'localhost'
+ os.environ['MASTER_PORT'] = '12355'
+ dist.init_process_group("nccl", rank=rank, world_size=world_size)
+ torch.cuda.set_device(rank)
+
+# 模型包装
+model = DDP(model, device_ids=[local_rank], find_unused_parameters=False)
+
+# 数据采样器
+train_sampler = DistributedSampler(train_dataset, num_replicas=world_size, rank=rank)
+```
+
+### 7. 实验监控
+
+#### Comet ML集成
+```python
+if config.use_comet:
+ comet_logger = comet_ml.Experiment(
+ api_key=config.comet_config['api_key'],
+ project_name=config.comet_config['project_name'],
+ workspace=config.comet_config['workspace']
+ )
+ comet_logger.add_tag(config.comet_tag)
+ comet_logger.set_name(config.comet_name)
+```
+
+#### 指标记录
+```python
+# 训练指标
+comet_logger.log_metric("train_loss", loss.item(), step=batch_idx_global_train)
+comet_logger.log_metric("learning_rate", scheduler.get_last_lr()[0], step=batch_idx_global_train)
+
+# 验证指标
+comet_logger.log_metric("val_loss", val_loss, step=epoch_idx)
+comet_logger.log_metric("val_recon_loss", val_recon_loss, step=epoch_idx)
+```
+
+### 8. 模型评估与回测
+
+#### 预测质量评估
+```python
+def evaluate_predictions(y_true, y_pred):
+ # 价格预测指标
+ mse = np.mean((y_true - y_pred) ** 2)
+ mae = np.mean(np.abs(y_true - y_pred))
+ mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
+
+ # 方向准确率
+ direction_acc = np.mean(
+ np.sign(y_true[1:] - y_true[:-1]) ==
+ np.sign(y_pred[1:] - y_pred[:-1])
+ )
+
+ return {
+ 'MSE': mse,
+ 'MAE': mae,
+ 'MAPE': mape,
+ 'Direction_Accuracy': direction_acc
+ }
+```
+
+#### 回测框架
+```python
+class BacktestEngine:
+ def __init__(self, config):
+ self.n_symbol_hold = config.backtest_n_symbol_hold
+ self.n_symbol_drop = config.backtest_n_symbol_drop
+ self.hold_thresh = config.backtest_hold_thresh
+
+ def run_backtest(self, predictions, prices, timestamps):
+ # 1. 信号生成
+ signals = self.generate_signals(predictions)
+
+ # 2. 组合构建
+ portfolio = self.build_portfolio(signals)
+
+ # 3. 收益计算
+ returns = self.calculate_returns(portfolio, prices)
+
+ # 4. 风险指标
+ metrics = self.calculate_risk_metrics(returns)
+
+ return metrics
+```
+
+### 9. 部署与生产使用
+
+#### 模型服务化
+```python
+class KronosPredictor:
+ def __init__(self, model_path, tokenizer_path, device="cpu"):
+ self.device = device
+ self.tokenizer = KronosTokenizer.from_pretrained(tokenizer_path)
+ self.model = Kronos.from_pretrained(model_path)
+ self.tokenizer.eval().to(device)
+ self.model.eval().to(device)
+
+ @torch.no_grad()
+ def predict_batch(self, batch_data):
+ """批量预测接口"""
+ predictions = []
+ for data in batch_data:
+ pred = self.predict(
+ df=data['features'],
+ x_timestamp=data['timestamps'],
+ y_timestamp=data['target_timestamps'],
+ pred_len=data['pred_len']
+ )
+ predictions.append(pred)
+ return predictions
+```
+
+#### API接口设计
+```python
+from flask import Flask, request, jsonify
+
+app = Flask(__name__)
+predictor = KronosPredictor("model_path", "tokenizer_path")
+
+@app.route('/predict', methods=['POST'])
+def predict():
+ try:
+ data = request.json
+
+ # 数据验证
+ required_fields = ['features', 'timestamps', 'pred_len']
+ if not all(field in data for field in required_fields):
+ return jsonify({'error': 'Missing required fields'}), 400
+
+ # 预测
+ result = predictor.predict(
+ df=pd.DataFrame(data['features']),
+ x_timestamp=pd.to_datetime(data['timestamps']),
+ y_timestamp=pd.to_datetime(data['target_timestamps']),
+ pred_len=data['pred_len']
+ )
+
+ return jsonify({
+ 'predictions': result.to_dict('records'),
+ 'status': 'success'
+ })
+
+ except Exception as e:
+ return jsonify({'error': str(e)}), 500
+```
+
+### 10. 性能优化建议
+
+#### 推理优化
+```python
+# 1. 模型量化
+model = torch.quantization.quantize_dynamic(
+ model, {torch.nn.Linear}, dtype=torch.qint8
+)
+
+# 2. 批处理优化
+def batch_predict(self, batch_data, batch_size=32):
+ results = []
+ for i in range(0, len(batch_data), batch_size):
+ batch = batch_data[i:i+batch_size]
+ with torch.no_grad():
+ batch_results = self.model(batch)
+ results.extend(batch_results)
+ return results
+
+# 3. 缓存机制
+from functools import lru_cache
+
+@lru_cache(maxsize=1000)
+def cached_tokenize(self, data_hash):
+ return self.tokenizer.encode(data)
+```
+
+#### 内存优化
+```python
+# 1. 梯度检查点
+model = torch.utils.checkpoint.checkpoint_sequential(model, segments=4)
+
+# 2. 混合精度训练
+from torch.cuda.amp import autocast, GradScaler
+
+scaler = GradScaler()
+with autocast():
+ loss = model(batch)
+scaler.scale(loss).backward()
+scaler.step(optimizer)
+scaler.update()
+```
+
+### 11. 故障排除指南
+
+#### 常见问题及解决方案
+
+1. **CUDA内存不足**
+```python
+# 解决方案:减少批次大小或使用梯度累积
+config['batch_size'] = 16 # 减小批次
+config['accumulation_steps'] = 4 # 增加累积步数
+```
+
+2. **模型加载失败**
+```python
+# 检查依赖
+pip install safetensors huggingface_hub
+
+# 检查模型路径
+if not os.path.exists(model_path):
+ print(f"Model path {model_path} does not exist")
+```
+
+3. **数据格式错误**
+```python
+# 确保时间戳格式正确
+df['timestamps'] = pd.to_datetime(df['timestamps'])
+
+# 检查必需列
+required_cols = ['open', 'high', 'low', 'close']
+missing_cols = [col for col in required_cols if col not in df.columns]
+if missing_cols:
+ raise ValueError(f"Missing columns: {missing_cols}")
+```
+
+4. **预测结果异常**
+```python
+# 检查输入数据范围
+print(f"Data range: {df.min()} to {df.max()}")
+
+# 检查标准化
+if df.std().min() < 1e-6:
+ print("Warning: Very small standard deviation detected")
+```
+
+### 12. 扩展开发指南
+
+#### 自定义损失函数
+```python
+class CustomLoss(nn.Module):
+ def __init__(self, alpha=1.0, beta=1.0):
+ super().__init__()
+ self.alpha = alpha
+ self.beta = beta
+
+ def forward(self, pred, target):
+ # 价格损失
+ price_loss = F.mse_loss(pred[:, :, :4], target[:, :, :4])
+
+ # 成交量损失(可选权重)
+ volume_loss = F.mse_loss(pred[:, :, 4:], target[:, :, 4:])
+
+ return self.alpha * price_loss + self.beta * volume_loss
+```
+
+#### 新增特征
+```python
+def add_technical_indicators(df):
+ """添加技术指标特征"""
+ # 移动平均
+ df['ma_5'] = df['close'].rolling(5).mean()
+ df['ma_20'] = df['close'].rolling(20).mean()
+
+ # RSI
+ delta = df['close'].diff()
+ gain = (delta.where(delta > 0, 0)).rolling(14).mean()
+ loss = (-delta.where(delta < 0, 0)).rolling(14).mean()
+ df['rsi'] = 100 - (100 / (1 + gain / loss))
+
+ # MACD
+ exp1 = df['close'].ewm(span=12).mean()
+ exp2 = df['close'].ewm(span=26).mean()
+ df['macd'] = exp1 - exp2
+
+ return df
+```
+
+### 13. 最佳实践
+
+#### 数据质量控制
+```python
+def validate_data_quality(df):
+ """数据质量检查"""
+ issues = []
+
+ # 检查缺失值
+ if df.isnull().any().any():
+ issues.append("Contains missing values")
+
+ # 检查异常值
+ for col in ['open', 'high', 'low', 'close']:
+ if (df[col] <= 0).any():
+ issues.append(f"Non-positive values in {col}")
+
+ # 检查价格逻辑
+ if (df['high'] < df['low']).any():
+ issues.append("High price less than low price")
+
+ if (df['high'] < df['close']).any() or (df['low'] > df['close']).any():
+ issues.append("Close price outside high-low range")
+
+ return issues
+```
+
+#### 模型版本管理
+```python
+class ModelVersionManager:
+ def __init__(self, base_path):
+ self.base_path = base_path
+
+ def save_model(self, model, version, metadata):
+ """保存模型版本"""
+ version_path = os.path.join(self.base_path, f"v{version}")
+ os.makedirs(version_path, exist_ok=True)
+
+ # 保存模型
+ model.save_pretrained(version_path)
+
+ # 保存元数据
+ with open(os.path.join(version_path, "metadata.json"), 'w') as f:
+ json.dump(metadata, f, indent=2)
+
+ def load_model(self, version):
+ """加载指定版本模型"""
+ version_path = os.path.join(self.base_path, f"v{version}")
+ return Kronos.from_pretrained(version_path)
+```
+
+---
+
+## 总结
+
+Kronos项目是一个专门为金融时间序列预测设计的先进深度学习框架,具有以下核心优势:
+
+1. **专业性**: 专门针对金融数据的特点进行优化
+2. **创新性**: 采用分层量化和依赖感知的新颖架构
+3. **实用性**: 提供完整的训练、推理和部署解决方案
+4. **可扩展性**: 支持自定义扩展和优化
+
+该项目为量化金融领域提供了一个强大的工具,可以应用于价格预测、风险管理、算法交易等多个场景。通过合理的配置和优化,可以在实际生产环境中获得良好的性能表现。
+
+*本文档基于Kronos项目代码分析生成,详细技术实现请参考源代码。*
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..667923e783a5a3d41531f8602c4dcf131d93bbf6
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 ShiYu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 6b9afd6d463c93b0fe336f32439120faa0b9a312..564e77be85b74b342b6d93bf0bd03829de9af3be 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,333 @@
----
-title: Crypt
-emoji: 😻
-colorFrom: green
-colorTo: green
-sdk: docker
-pinned: false
-license: apache-2.0
----
-
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+
+
Kronos: A Foundation Model for the Language of Financial Markets
+
+
+
+
+
+
+
+
+
+
+
+
+
+> Kronos is the **first open-source foundation model** for financial candlesticks (K-lines),
+> trained on data from over **45 global exchanges**.
+
+
+
+
+## 📰 News
+* 🚩 **[2025.08.17]** We have released the scripts for fine-tuning! Check them out to adapt Kronos to your own tasks.
+* 🚩 **[2025.08.02]** Our paper is now available on [arXiv](https://arxiv.org/abs/2508.02739)!
+
+
+
+## 📜 Introduction
+
+**Kronos** is a family of decoder-only foundation models, pre-trained specifically for the "language" of financial markets—K-line sequences. Unlike general-purpose TSFMs, Kronos is designed to handle the unique, high-noise characteristics of financial data. It leverages a novel two-stage framework:
+1. A specialized tokenizer first quantizes continuous, multi-dimensional K-line data (OHLCV) into **hierarchical discrete tokens**.
+2. A large, autoregressive Transformer is then pre-trained on these tokens, enabling it to serve as a unified model for diverse quantitative tasks.
+
+
+
+
+
+## ✨ Live Demo
+We have set up a live demo to visualize Kronos's forecasting results. The webpage showcases a forecast for the **BTC/USDT** trading pair over the next 24 hours.
+
+**👉 [Access the Live Demo Here](https://shiyu-coder.github.io/Kronos-demo/)**
+
+## 📦 Model Zoo
+We release a family of pre-trained models with varying capacities to suit different computational and application needs. All models are readily accessible from the Hugging Face Hub.
+
+| Model | Tokenizer | Context length | Param | Open-source |
+|--------------|---------------------------------------------------------------------------------| -------------- | ------ |---------------------------------------------------------------------------|
+| Kronos-mini | [Kronos-Tokenizer-2k](https://huggingface.co/NeoQuasar/Kronos-Tokenizer-2k) | 2048 | 4.1M | ✅ [NeoQuasar/Kronos-mini](https://huggingface.co/NeoQuasar/Kronos-mini) |
+| Kronos-small | [Kronos-Tokenizer-base](https://huggingface.co/NeoQuasar/Kronos-Tokenizer-base) | 512 | 24.7M | ✅ [NeoQuasar/Kronos-small](https://huggingface.co/NeoQuasar/Kronos-small) |
+| Kronos-base | [Kronos-Tokenizer-base](https://huggingface.co/NeoQuasar/Kronos-Tokenizer-base) | 512 | 102.3M | ✅ [NeoQuasar/Kronos-base](https://huggingface.co/NeoQuasar/Kronos-base) |
+| Kronos-large | [Kronos-Tokenizer-base](https://huggingface.co/NeoQuasar/Kronos-Tokenizer-base) | 512 | 499.2M | ❌ |
+
+
+## 🚀 Getting Started
+
+### Installation
+
+1. Install Python 3.10+, and then install the dependencies:
+
+```shell
+pip install -r requirements.txt
+```
+
+### 📈 Making Forecasts
+
+Forecasting with Kronos is straightforward using the `KronosPredictor` class. It handles data preprocessing, normalization, prediction, and inverse normalization, allowing you to get from raw data to forecasts in just a few lines of code.
+
+**Important Note**: The `max_context` for `Kronos-small` and `Kronos-base` is **512**. This is the maximum sequence length the model can process. For optimal performance, it is recommended that your input data length (i.e., `lookback`) does not exceed this limit. The `KronosPredictor` will automatically handle truncation for longer contexts.
+
+Here is a step-by-step guide to making your first forecast.
+
+#### 1. Load the Tokenizer and Model
+
+First, load a pre-trained Kronos model and its corresponding tokenizer from the Hugging Face Hub.
+
+```python
+from model import Kronos, KronosTokenizer, KronosPredictor
+
+# Load from Hugging Face Hub
+tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
+model = Kronos.from_pretrained("NeoQuasar/Kronos-small")
+```
+
+#### 2. Instantiate the Predictor
+
+Create an instance of `KronosPredictor`, passing the model, tokenizer, and desired device.
+
+```python
+# Initialize the predictor
+predictor = KronosPredictor(model, tokenizer, device="cuda:0", max_context=512)
+```
+
+#### 3. Prepare Input Data
+
+The `predict` method requires three main inputs:
+- `df`: A pandas DataFrame containing the historical K-line data. It must include columns `['open', 'high', 'low', 'close']`. `volume` and `amount` are optional.
+- `x_timestamp`: A pandas Series of timestamps corresponding to the historical data in `df`.
+- `y_timestamp`: A pandas Series of timestamps for the future periods you want to predict.
+
+```python
+import pandas as pd
+
+# Load your data
+df = pd.read_csv("./data/XSHG_5min_600977.csv")
+df['timestamps'] = pd.to_datetime(df['timestamps'])
+
+# Define context window and prediction length
+lookback = 400
+pred_len = 120
+
+# Prepare inputs for the predictor
+x_df = df.loc[:lookback-1, ['open', 'high', 'low', 'close', 'volume', 'amount']]
+x_timestamp = df.loc[:lookback-1, 'timestamps']
+y_timestamp = df.loc[lookback:lookback+pred_len-1, 'timestamps']
+```
+
+#### 4. Generate Forecasts
+
+Call the `predict` method to generate forecasts. You can control the sampling process with parameters like `T`, `top_p`, and `sample_count` for probabilistic forecasting.
+
+```python
+# Generate predictions
+pred_df = predictor.predict(
+ df=x_df,
+ x_timestamp=x_timestamp,
+ y_timestamp=y_timestamp,
+ pred_len=pred_len,
+ T=1.0, # Temperature for sampling
+ top_p=0.9, # Nucleus sampling probability
+ sample_count=1 # Number of forecast paths to generate and average
+)
+
+print("Forecasted Data Head:")
+print(pred_df.head())
+```
+
+The `predict` method returns a pandas DataFrame containing the forecasted values for `open`, `high`, `low`, `close`, `volume`, and `amount`, indexed by the `y_timestamp` you provided.
+
+For efficient processing of multiple time series, Kronos provides a `predict_batch` method that enables parallel prediction on multiple datasets simultaneously. This is particularly useful when you need to forecast multiple assets or time periods at once.
+
+```python
+# Prepare multiple datasets for batch prediction
+df_list = [df1, df2, df3] # List of DataFrames
+x_timestamp_list = [x_ts1, x_ts2, x_ts3] # List of historical timestamps
+y_timestamp_list = [y_ts1, y_ts2, y_ts3] # List of future timestamps
+
+# Generate batch predictions
+pred_df_list = predictor.predict_batch(
+ df_list=df_list,
+ x_timestamp_list=x_timestamp_list,
+ y_timestamp_list=y_timestamp_list,
+ pred_len=pred_len,
+ T=1.0,
+ top_p=0.9,
+ sample_count=1,
+ verbose=True
+)
+
+# pred_df_list contains prediction results in the same order as input
+for i, pred_df in enumerate(pred_df_list):
+ print(f"Predictions for series {i}:")
+ print(pred_df.head())
+```
+
+**Important Requirements for Batch Prediction:**
+- All series must have the same historical length (lookback window)
+- All series must have the same prediction length (`pred_len`)
+- Each DataFrame must contain the required columns: `['open', 'high', 'low', 'close']`
+- `volume` and `amount` columns are optional and will be filled with zeros if missing
+
+The `predict_batch` method leverages GPU parallelism for efficient processing and automatically handles normalization and denormalization for each series independently.
+
+#### 5. Example and Visualization
+
+For a complete, runnable script that includes data loading, prediction, and plotting, please see [`examples/prediction_example.py`](examples/prediction_example.py).
+
+Running this script will generate a plot comparing the ground truth data against the model's forecast, similar to the one shown below:
+
+
+
+
+
+Additionally, we also provide a script that makes predictions without Volume and Amount data, which can be found in [`examples/prediction_wo_vol_example.py`](examples/prediction_wo_vol_example.py).
+
+
+## 🔧 Finetuning on Your Own Data (A-Share Market Example)
+
+We provide a complete pipeline for finetuning Kronos on your own datasets. As an example, we demonstrate how to use [Qlib](https://github.com/microsoft/qlib) to prepare data from the Chinese A-share market and conduct a simple backtest.
+
+> **Disclaimer:** This pipeline is intended as a demonstration to illustrate the finetuning process. It is a simplified example and not a production-ready quantitative trading system. A robust quantitative strategy requires more sophisticated techniques, such as portfolio optimization and risk factor neutralization, to achieve stable alpha.
+
+The finetuning process is divided into four main steps:
+
+1. **Configuration**: Set up paths and hyperparameters.
+2. **Data Preparation**: Process and split your data using Qlib.
+3. **Model Finetuning**: Finetune the Tokenizer and the Predictor models.
+4. **Backtesting**: Evaluate the finetuned model's performance.
+
+### Prerequisites
+
+1. First, ensure you have all dependencies from `requirements.txt` installed.
+2. This pipeline relies on `qlib`. Please install it:
+ ```shell
+ pip install pyqlib
+ ```
+3. You will need to prepare your Qlib data. Follow the [official Qlib guide](https://github.com/microsoft/qlib) to download and set up your data locally. The example scripts assume you are using daily frequency data.
+
+### Step 1: Configure Your Experiment
+
+All settings for data, training, and model paths are centralized in `finetune/config.py`. Before running any scripts, please **modify the following paths** according to your environment:
+
+* `qlib_data_path`: Path to your local Qlib data directory.
+* `dataset_path`: Directory where the processed train/validation/test pickle files will be saved.
+* `save_path`: Base directory for saving model checkpoints.
+* `backtest_result_path`: Directory for saving backtesting results.
+* `pretrained_tokenizer_path` and `pretrained_predictor_path`: Paths to the pre-trained models you want to start from (can be local paths or Hugging Face model names).
+
+You can also adjust other parameters like `instrument`, `train_time_range`, `epochs`, and `batch_size` to fit your specific task. If you don't use [Comet.ml](https://www.comet.com/), set `use_comet = False`.
+
+### Step 2: Prepare the Dataset
+
+Run the data preprocessing script. This script will load raw market data from your Qlib directory, process it, split it into training, validation, and test sets, and save them as pickle files.
+
+```shell
+python finetune/qlib_data_preprocess.py
+```
+
+After running, you will find `train_data.pkl`, `val_data.pkl`, and `test_data.pkl` in the directory specified by `dataset_path` in your config.
+
+### Step 3: Run the Finetuning
+
+The finetuning process consists of two stages: finetuning the tokenizer and then the predictor. Both training scripts are designed for multi-GPU training using `torchrun`.
+
+#### 3.1 Finetune the Tokenizer
+
+This step adjusts the tokenizer to the data distribution of your specific domain.
+
+```shell
+# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2)
+torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_tokenizer.py
+```
+
+The best tokenizer checkpoint will be saved to the path configured in `config.py` (derived from `save_path` and `tokenizer_save_folder_name`).
+
+#### 3.2 Finetune the Predictor
+
+This step finetunes the main Kronos model for the forecasting task.
+
+```shell
+# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2)
+torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_predictor.py
+```
+
+The best predictor checkpoint will be saved to the path configured in `config.py`.
+
+### Step 4: Evaluate with Backtesting
+
+Finally, run the backtesting script to evaluate your finetuned model. This script loads the models, performs inference on the test set, generates prediction signals (e.g., forecasted price change), and runs a simple top-K strategy backtest.
+
+```shell
+# Specify the GPU for inference
+python finetune/qlib_test.py --device cuda:0
+```
+
+The script will output a detailed performance analysis in your console and generate a plot showing the cumulative return curves of your strategy against the benchmark, similar to the one below:
+
+
+
+
+
+### 💡 From Demo to Production: Important Considerations
+
+* **Raw Signals vs. Pure Alpha**: The signals generated by the model in this demo are raw predictions. In a real-world quantitative workflow, these signals would typically be fed into a portfolio optimization model. This model would apply constraints to neutralize exposure to common risk factors (e.g., market beta, style factors like size and value), thereby isolating the **"pure alpha"** and improving the strategy's robustness.
+* **Data Handling**: The provided `QlibDataset` is an example. For different data sources or formats, you will need to adapt the data loading and preprocessing logic.
+* **Strategy and Backtesting Complexity**: The simple top-K strategy used here is a basic starting point. Production-level strategies often incorporate more complex logic for portfolio construction, dynamic position sizing, and risk management (e.g., stop-loss/take-profit rules). Furthermore, a high-fidelity backtest should meticulously model transaction costs, slippage, and market impact to provide a more accurate estimate of real-world performance.
+
+> **📝 AI-Generated Comments**: Please note that many of the code comments within the `finetune/` directory were generated by an AI assistant (Gemini 2.5 Pro) for explanatory purposes. While they aim to be helpful, they may contain inaccuracies. We recommend treating the code itself as the definitive source of logic.
+
+## 📖 Citation
+
+If you use Kronos in your research, we would appreciate a citation to our [paper](https://arxiv.org/abs/2508.02739):
+
+```
+@misc{shi2025kronos,
+ title={Kronos: A Foundation Model for the Language of Financial Markets},
+ author={Yu Shi and Zongliang Fu and Shuo Chen and Bohan Zhao and Wei Xu and Changshui Zhang and Jian Li},
+ year={2025},
+ eprint={2508.02739},
+ archivePrefix={arXiv},
+ primaryClass={q-fin.ST},
+ url={https://arxiv.org/abs/2508.02739},
+}
+```
+
+## 📜 License
+This project is licensed under the [MIT License](./LICENSE).
+
+
+
+
+
+
+
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..26aff23eaa4c3dc8d53e11a6f01e6aee5df3c8e9
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,38 @@
+version: '3.8'
+
+services:
+ kronos-webui:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: kronos-webui
+ ports:
+ - "7070:7070"
+ environment:
+ - PYTHONPATH=/app
+ - FLASK_APP=webui/app.py
+ - FLASK_ENV=production
+ - TZ=Asia/Shanghai
+ volumes:
+ # Mount prediction results directory for persistence
+ - ./webui/prediction_results:/app/webui/prediction_results
+ # Mount model data directory if you have local models
+ - ./model/data:/app/model/data
+ restart: unless-stopped
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://localhost:7070/"]
+ interval: 30s
+ timeout: 10s
+ retries: 3
+ start_period: 40s
+ networks:
+ - kronos-network
+
+networks:
+ kronos-network:
+ driver: bridge
+
+# Optional: Add a volume for persistent data
+volumes:
+ kronos-data:
+ driver: local
diff --git a/examples/data/XSHG_5min_600977.csv b/examples/data/XSHG_5min_600977.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e59cd042011f31deed6b5bb3cdf9685e8172a824
--- /dev/null
+++ b/examples/data/XSHG_5min_600977.csv
@@ -0,0 +1,2501 @@
+timestamps,open,high,low,close,volume,amount
+2024-06-18 11:15:00,11.27,11.28,11.26,11.27,379.0,427161.0
+2024-06-18 11:20:00,11.27,11.28,11.27,11.27,277.0,312192.0
+2024-06-18 11:25:00,11.27,11.27,11.26,11.27,380.0,427954.0
+2024-06-18 11:30:00,11.26,11.27,11.26,11.27,761.0,856971.0
+2024-06-18 13:05:00,11.27,11.27,11.25,11.26,1439.0,1620733.0
+2024-06-18 13:10:00,11.26,11.26,11.25,11.25,529.0,595311.0
+2024-06-18 13:15:00,11.26,11.27,11.25,11.26,389.0,438017.0
+2024-06-18 13:20:00,11.26,11.32,11.26,11.32,4459.0,5037553.0
+2024-06-18 13:25:00,11.32,11.32,11.3,11.31,2551.0,2886053.0
+2024-06-18 13:30:00,11.31,11.33,11.3,11.32,1185.0,1340985.0
+2024-06-18 13:35:00,11.32,11.33,11.31,11.32,1296.0,1467314.0
+2024-06-18 13:40:00,11.33,11.33,11.3,11.3,1229.0,1390698.0
+2024-06-18 13:45:00,11.31,11.31,11.3,11.3,568.0,641846.0
+2024-06-18 13:50:00,11.3,11.32,11.3,11.31,1168.0,1321141.0
+2024-06-18 13:55:00,11.31,11.31,11.29,11.29,867.0,979738.0
+2024-06-18 14:00:00,11.3,11.3,11.28,11.29,1026.0,1158037.0
+2024-06-18 14:05:00,11.28,11.3,11.28,11.29,752.0,849034.0
+2024-06-18 14:10:00,11.29,11.3,11.28,11.29,284.0,320630.0
+2024-06-18 14:15:00,11.29,11.3,11.29,11.29,485.0,547861.0
+2024-06-18 14:20:00,11.29,11.3,11.29,11.29,246.0,277867.0
+2024-06-18 14:25:00,11.3,11.3,11.29,11.3,188.0,212415.0
+2024-06-18 14:30:00,11.29,11.31,11.29,11.3,469.0,529984.0
+2024-06-18 14:35:00,11.3,11.31,11.29,11.3,935.0,1057044.0
+2024-06-18 14:40:00,11.3,11.32,11.3,11.31,978.0,1106460.0
+2024-06-18 14:45:00,11.32,11.32,11.31,11.31,524.0,592817.0
+2024-06-18 14:50:00,11.32,11.33,11.31,11.31,1758.0,1990407.0
+2024-06-18 14:55:00,11.31,11.33,11.31,11.31,1173.0,1327496.0
+2024-06-18 15:00:00,11.31,11.32,11.31,11.32,2019.0,2284686.0
+2024-06-19 09:35:00,11.36,11.37,11.32,11.35,5606.0,6361534.0
+2024-06-19 09:40:00,11.35,11.35,11.3,11.3,1773.0,2006819.0
+2024-06-19 09:45:00,11.31,11.34,11.31,11.33,1108.0,1254369.0
+2024-06-19 09:50:00,11.34,11.35,11.31,11.33,1162.0,1316325.0
+2024-06-19 09:55:00,11.33,11.34,11.31,11.31,940.0,1064577.0
+2024-06-19 10:00:00,11.31,11.32,11.3,11.31,902.0,1019926.0
+2024-06-19 10:05:00,11.31,11.31,11.28,11.28,1996.0,2253586.0
+2024-06-19 10:10:00,11.28,11.3,11.27,11.28,1654.0,1865591.0
+2024-06-19 10:15:00,11.28,11.3,11.27,11.27,1256.0,1416821.0
+2024-06-19 10:20:00,11.27,11.28,11.26,11.26,1431.0,1612514.0
+2024-06-19 10:25:00,11.26,11.27,11.25,11.26,1885.0,2121914.0
+2024-06-19 10:30:00,11.26,11.27,11.25,11.25,631.0,710455.0
+2024-06-19 10:35:00,11.25,11.27,11.25,11.26,339.0,381780.0
+2024-06-19 10:40:00,11.26,11.27,11.26,11.26,659.0,742174.0
+2024-06-19 10:45:00,11.26,11.27,11.25,11.26,582.0,655187.0
+2024-06-19 10:50:00,11.27,11.27,11.25,11.26,846.0,952340.0
+2024-06-19 10:55:00,11.26,11.27,11.24,11.24,880.0,989908.0
+2024-06-19 11:00:00,11.24,11.25,11.23,11.25,1588.0,1784353.0
+2024-06-19 11:05:00,11.25,11.25,11.24,11.25,268.0,301270.0
+2024-06-19 11:10:00,11.24,11.25,11.23,11.23,803.0,902030.0
+2024-06-19 11:15:00,11.23,11.24,11.22,11.22,760.0,853730.0
+2024-06-19 11:20:00,11.23,11.23,11.22,11.23,579.0,649687.0
+2024-06-19 11:25:00,11.23,11.23,11.22,11.22,330.0,370407.0
+2024-06-19 11:30:00,11.22,11.24,11.22,11.22,439.0,492948.0
+2024-06-19 13:05:00,11.24,11.24,11.21,11.21,2163.0,2426493.0
+2024-06-19 13:10:00,11.22,11.23,11.21,11.21,1298.0,1455405.0
+2024-06-19 13:15:00,11.22,11.22,11.2,11.2,969.0,1085634.0
+2024-06-19 13:20:00,11.21,11.22,11.19,11.19,1506.0,1687003.0
+2024-06-19 13:25:00,11.2,11.2,11.18,11.2,780.0,872818.0
+2024-06-19 13:30:00,11.2,11.2,11.18,11.19,626.0,700545.0
+2024-06-19 13:35:00,11.2,11.22,11.19,11.21,584.0,654510.0
+2024-06-19 13:40:00,11.22,11.22,11.19,11.19,846.0,948063.0
+2024-06-19 13:45:00,11.2,11.2,11.19,11.19,1161.0,1299253.0
+2024-06-19 13:50:00,11.19,11.2,11.19,11.19,601.0,672581.0
+2024-06-19 13:55:00,11.19,11.21,11.19,11.2,608.0,680712.0
+2024-06-19 14:00:00,11.21,11.21,11.19,11.2,429.0,480088.0
+2024-06-19 14:05:00,11.2,11.21,11.19,11.19,483.0,541090.0
+2024-06-19 14:10:00,11.19,11.2,11.18,11.18,1202.0,1344822.0
+2024-06-19 14:15:00,11.18,11.19,11.18,11.19,1254.0,1402314.0
+2024-06-19 14:20:00,11.18,11.2,11.18,11.18,661.0,739534.0
+2024-06-19 14:25:00,11.18,11.19,11.17,11.17,749.0,837431.0
+2024-06-19 14:30:00,11.17,11.17,11.16,11.17,895.0,999475.0
+2024-06-19 14:35:00,11.17,11.18,11.16,11.18,979.0,1093029.0
+2024-06-19 14:40:00,11.17,11.18,11.17,11.18,371.0,414729.0
+2024-06-19 14:45:00,11.18,11.19,11.17,11.17,497.0,555470.0
+2024-06-19 14:50:00,11.18,11.19,11.17,11.18,1001.0,1118551.0
+2024-06-19 14:55:00,11.18,11.18,11.16,11.16,1411.0,1575333.0
+2024-06-19 15:00:00,11.16,11.19,11.16,11.16,2763.0,3086089.0
+2024-06-20 09:35:00,11.13,11.15,11.07,11.13,3450.0,3833838.0
+2024-06-20 09:40:00,11.13,11.15,11.13,11.14,1725.0,1920516.0
+2024-06-20 09:45:00,11.14,11.14,11.09,11.09,2419.0,2688742.0
+2024-06-20 09:50:00,11.09,11.11,11.07,11.08,2499.0,2771114.0
+2024-06-20 09:55:00,11.1,11.11,11.09,11.1,1985.0,2204227.0
+2024-06-20 10:00:00,11.11,11.11,11.08,11.08,661.0,733097.0
+2024-06-20 10:05:00,11.08,11.08,11.06,11.07,1747.0,1934268.0
+2024-06-20 10:10:00,11.08,11.1,11.08,11.1,1065.0,1180734.0
+2024-06-20 10:15:00,11.09,11.1,11.06,11.06,1017.0,1126598.0
+2024-06-20 10:20:00,11.07,11.08,11.04,11.06,3125.0,3457253.0
+2024-06-20 10:25:00,11.06,11.07,11.06,11.07,992.0,1097960.0
+2024-06-20 10:30:00,11.08,11.1,11.07,11.1,481.0,533086.0
+2024-06-20 10:35:00,11.09,11.1,11.08,11.09,320.0,354944.0
+2024-06-20 10:40:00,11.1,11.1,11.08,11.09,541.0,599728.0
+2024-06-20 10:45:00,11.09,11.09,11.08,11.09,251.0,278128.0
+2024-06-20 10:50:00,11.09,11.1,11.07,11.07,731.0,810352.0
+2024-06-20 10:55:00,11.08,11.08,11.05,11.05,1405.0,1554667.0
+2024-06-20 11:00:00,11.06,11.07,11.05,11.06,941.0,1040747.0
+2024-06-20 11:05:00,11.05,11.07,11.05,11.05,381.0,421282.0
+2024-06-20 11:10:00,11.06,11.06,11.04,11.05,781.0,862948.0
+2024-06-20 11:15:00,11.05,11.05,11.04,11.05,339.0,374531.0
+2024-06-20 11:20:00,11.06,11.06,11.02,11.03,2889.0,3187747.0
+2024-06-20 11:25:00,11.03,11.05,11.03,11.04,577.0,636955.0
+2024-06-20 11:30:00,11.04,11.05,11.02,11.03,1163.0,1282943.0
+2024-06-20 13:05:00,11.02,11.04,11.01,11.04,1011.0,1114505.0
+2024-06-20 13:10:00,11.04,11.04,11.0,11.01,1951.0,2149164.0
+2024-06-20 13:15:00,11.01,11.02,11.0,11.02,1587.0,1746325.0
+2024-06-20 13:20:00,11.02,11.02,11.0,11.0,833.0,916817.0
+2024-06-20 13:25:00,11.0,11.0,10.98,11.0,2833.0,3114174.0
+2024-06-20 13:30:00,10.99,10.99,10.97,10.99,2393.0,2627686.0
+2024-06-20 13:35:00,10.99,10.99,10.98,10.98,803.0,882552.0
+2024-06-20 13:40:00,10.98,11.0,10.98,11.0,1150.0,1263279.0
+2024-06-20 13:45:00,11.0,11.03,11.0,11.01,1019.0,1122062.0
+2024-06-20 13:50:00,11.02,11.03,11.0,11.03,710.0,782386.0
+2024-06-20 13:55:00,11.03,11.03,11.01,11.03,388.0,427694.0
+2024-06-20 14:00:00,11.01,11.02,11.01,11.02,100.0,110378.0
+2024-06-20 14:05:00,11.03,11.05,11.02,11.02,1151.0,1269851.0
+2024-06-20 14:10:00,11.03,11.03,11.0,11.01,840.0,925112.0
+2024-06-20 14:15:00,11.01,11.01,11.0,11.0,648.0,712856.0
+2024-06-20 14:20:00,11.0,11.01,10.99,11.0,691.0,760290.0
+2024-06-20 14:25:00,11.0,11.01,11.0,11.01,587.0,645966.0
+2024-06-20 14:30:00,11.01,11.02,11.0,11.01,659.0,725653.0
+2024-06-20 14:35:00,11.02,11.02,10.99,10.99,946.0,1040515.0
+2024-06-20 14:40:00,10.99,11.02,10.99,11.01,1963.0,2159046.0
+2024-06-20 14:45:00,10.99,11.01,10.99,11.01,626.0,688232.0
+2024-06-20 14:50:00,11.01,11.02,11.0,11.01,523.0,575829.0
+2024-06-20 14:55:00,11.01,11.02,11.0,11.01,637.0,701307.0
+2024-06-20 15:00:00,11.01,11.01,11.0,11.0,1376.0,1513737.0
+2024-06-21 09:35:00,10.98,11.01,10.95,10.98,2649.0,2907158.0
+2024-06-21 09:40:00,10.98,11.04,10.98,11.03,1901.0,2093535.0
+2024-06-21 09:45:00,11.03,11.05,11.02,11.05,738.0,814164.0
+2024-06-21 09:50:00,11.06,11.08,11.05,11.07,1639.0,1814054.0
+2024-06-21 09:55:00,11.07,11.08,11.03,11.07,1445.0,1598150.0
+2024-06-21 10:00:00,11.07,11.08,11.05,11.07,634.0,701575.0
+2024-06-21 10:05:00,11.06,11.09,11.05,11.09,1222.0,1353174.0
+2024-06-21 10:10:00,11.09,11.1,11.06,11.07,717.0,794627.0
+2024-06-21 10:15:00,11.07,11.08,11.05,11.06,487.0,538835.0
+2024-06-21 10:20:00,11.06,11.06,11.02,11.02,584.0,644683.0
+2024-06-21 10:25:00,11.03,11.05,11.02,11.05,979.0,1080786.0
+2024-06-21 10:30:00,11.05,11.06,11.04,11.06,1236.0,1365238.0
+2024-06-21 10:35:00,11.06,11.06,11.03,11.05,342.0,377693.0
+2024-06-21 10:40:00,11.05,11.06,11.04,11.06,461.0,509531.0
+2024-06-21 10:45:00,11.06,11.06,11.03,11.04,394.0,435047.0
+2024-06-21 10:50:00,11.04,11.05,11.03,11.05,505.0,557412.0
+2024-06-21 10:55:00,11.05,11.06,11.03,11.05,728.0,804172.0
+2024-06-21 11:00:00,11.05,11.05,11.03,11.04,275.0,303638.0
+2024-06-21 11:05:00,11.03,11.05,11.03,11.03,260.0,286971.0
+2024-06-21 11:10:00,11.03,11.04,11.02,11.04,464.0,511921.0
+2024-06-21 11:15:00,11.04,11.05,11.03,11.05,493.0,544347.0
+2024-06-21 11:20:00,11.05,11.06,11.04,11.05,662.0,731504.0
+2024-06-21 11:25:00,11.05,11.05,11.03,11.04,312.0,344655.0
+2024-06-21 11:30:00,11.04,11.06,11.04,11.04,547.0,604516.0
+2024-06-21 13:05:00,11.04,11.04,11.03,11.04,360.0,397271.0
+2024-06-21 13:10:00,11.04,11.04,11.02,11.03,825.0,909626.0
+2024-06-21 13:15:00,11.03,11.03,11.02,11.02,285.0,314136.0
+2024-06-21 13:20:00,11.02,11.05,11.02,11.05,734.0,809721.0
+2024-06-21 13:25:00,11.05,11.08,11.03,11.07,982.0,1085879.0
+2024-06-21 13:30:00,11.07,11.07,11.05,11.06,211.0,233313.0
+2024-06-21 13:35:00,11.05,11.07,11.04,11.07,2775.0,3059822.0
+2024-06-21 13:40:00,11.07,11.08,11.06,11.07,887.0,981700.0
+2024-06-21 13:45:00,11.06,11.06,11.04,11.04,464.0,512905.0
+2024-06-21 13:50:00,11.05,11.07,11.04,11.07,818.0,903752.0
+2024-06-21 13:55:00,11.06,11.07,11.04,11.06,892.0,986208.0
+2024-06-21 14:00:00,11.06,11.06,11.04,11.06,381.0,421175.0
+2024-06-21 14:05:00,11.06,11.07,11.04,11.07,1200.0,1326678.0
+2024-06-21 14:10:00,11.07,11.07,11.04,11.04,1830.0,2021572.0
+2024-06-21 14:15:00,11.04,11.05,11.03,11.04,375.0,414093.0
+2024-06-21 14:20:00,11.04,11.05,11.03,11.05,352.0,388879.0
+2024-06-21 14:25:00,11.04,11.07,11.04,11.07,651.0,719623.0
+2024-06-21 14:30:00,11.05,11.07,11.05,11.07,256.0,283273.0
+2024-06-21 14:35:00,11.07,11.07,11.05,11.06,287.0,317430.0
+2024-06-21 14:40:00,11.06,11.06,11.05,11.06,440.0,486507.0
+2024-06-21 14:45:00,11.06,11.06,11.04,11.05,1263.0,1395975.0
+2024-06-21 14:50:00,11.04,11.05,11.04,11.04,1068.0,1179463.0
+2024-06-21 14:55:00,11.05,11.05,11.04,11.04,1384.0,1529031.0
+2024-06-21 15:00:00,11.04,11.06,11.04,11.05,1374.0,1518557.0
+2024-06-24 09:35:00,11.0,11.0,10.92,10.93,4093.0,4483667.0
+2024-06-24 09:40:00,10.93,10.97,10.92,10.95,3212.0,3512061.0
+2024-06-24 09:45:00,10.95,10.96,10.94,10.96,1298.0,1420804.0
+2024-06-24 09:50:00,10.96,10.96,10.89,10.89,6825.0,7460077.0
+2024-06-24 09:55:00,10.89,10.93,10.88,10.91,2557.0,2786688.0
+2024-06-24 10:00:00,10.89,10.89,10.87,10.89,3179.0,3459864.0
+2024-06-24 10:05:00,10.9,10.9,10.86,10.86,3257.0,3542590.0
+2024-06-24 10:10:00,10.87,10.87,10.82,10.85,2953.0,3203466.0
+2024-06-24 10:15:00,10.84,10.86,10.83,10.83,2526.0,2738528.0
+2024-06-24 10:20:00,10.82,10.85,10.8,10.81,3692.0,3995308.0
+2024-06-24 10:25:00,10.81,10.84,10.79,10.81,2544.0,2750965.0
+2024-06-24 10:30:00,10.81,10.84,10.8,10.81,1475.0,1594938.0
+2024-06-24 10:35:00,10.8,10.81,10.78,10.79,1369.0,1477893.0
+2024-06-24 10:40:00,10.78,10.8,10.76,10.78,1532.0,1651515.0
+2024-06-24 10:45:00,10.77,10.79,10.76,10.76,949.0,1021939.0
+2024-06-24 10:50:00,10.75,10.76,10.73,10.75,1542.0,1657182.0
+2024-06-24 10:55:00,10.75,10.77,10.74,10.76,874.0,939985.0
+2024-06-24 11:00:00,10.76,10.79,10.76,10.77,546.0,588261.0
+2024-06-24 11:05:00,10.77,10.79,10.76,10.76,1067.0,1149959.0
+2024-06-24 11:10:00,10.77,10.79,10.76,10.78,547.0,589417.0
+2024-06-24 11:15:00,10.79,10.83,10.77,10.82,1516.0,1636842.0
+2024-06-24 11:20:00,10.82,10.83,10.79,10.82,717.0,775248.0
+2024-06-24 11:25:00,10.82,10.84,10.8,10.83,632.0,683842.0
+2024-06-24 11:30:00,10.82,10.85,10.81,10.84,718.0,778040.0
+2024-06-24 13:05:00,10.84,10.85,10.82,10.82,786.0,852256.0
+2024-06-24 13:10:00,10.82,10.88,10.81,10.87,1170.0,1268216.0
+2024-06-24 13:15:00,10.87,10.89,10.87,10.88,1253.0,1363942.0
+2024-06-24 13:20:00,10.88,10.9,10.88,10.9,663.0,722203.0
+2024-06-24 13:25:00,10.88,10.9,10.87,10.88,566.0,615831.0
+2024-06-24 13:30:00,10.89,10.89,10.87,10.89,231.0,251370.0
+2024-06-24 13:35:00,10.89,10.89,10.87,10.89,158.0,171900.0
+2024-06-24 13:40:00,10.89,10.89,10.86,10.86,337.0,366327.0
+2024-06-24 13:45:00,10.87,10.87,10.85,10.85,431.0,468176.0
+2024-06-24 13:50:00,10.86,10.86,10.84,10.86,567.0,615070.0
+2024-06-24 13:55:00,10.85,10.86,10.83,10.84,231.0,250355.0
+2024-06-24 14:00:00,10.84,10.85,10.83,10.83,302.0,327148.0
+2024-06-24 14:05:00,10.83,10.86,10.83,10.85,485.0,526018.0
+2024-06-24 14:10:00,10.85,10.87,10.84,10.86,480.0,521290.0
+2024-06-24 14:15:00,10.87,10.87,10.83,10.84,432.0,468658.0
+2024-06-24 14:20:00,10.84,10.87,10.83,10.86,1034.0,1122480.0
+2024-06-24 14:25:00,10.86,10.88,10.85,10.86,1110.0,1206399.0
+2024-06-24 14:30:00,10.86,10.86,10.83,10.84,548.0,593955.0
+2024-06-24 14:35:00,10.84,10.85,10.82,10.85,1095.0,1185831.0
+2024-06-24 14:40:00,10.84,10.85,10.8,10.81,1270.0,1373275.0
+2024-06-24 14:45:00,10.81,10.83,10.79,10.81,1512.0,1633749.0
+2024-06-24 14:50:00,10.81,10.83,10.78,10.8,1368.0,1477133.0
+2024-06-24 14:55:00,10.8,10.8,10.78,10.79,1715.0,1850578.0
+2024-06-24 15:00:00,10.79,10.8,10.78,10.8,1971.0,2127522.0
+2024-06-25 09:35:00,10.78,10.86,10.78,10.84,2874.0,3109932.0
+2024-06-25 09:40:00,10.84,10.84,10.79,10.81,2942.0,3183972.0
+2024-06-25 09:45:00,10.8,10.82,10.79,10.8,1435.0,1549700.0
+2024-06-25 09:50:00,10.79,10.82,10.77,10.82,965.0,1041231.0
+2024-06-25 09:55:00,10.81,10.84,10.8,10.84,1078.0,1166544.0
+2024-06-25 10:00:00,10.83,10.84,10.82,10.82,786.0,850954.0
+2024-06-25 10:05:00,10.83,10.83,10.79,10.79,407.0,439813.0
+2024-06-25 10:10:00,10.79,10.8,10.77,10.77,1036.0,1117023.0
+2024-06-25 10:15:00,10.77,10.78,10.76,10.78,560.0,603166.0
+2024-06-25 10:20:00,10.78,10.81,10.77,10.8,850.0,917452.0
+2024-06-25 10:25:00,10.8,10.8,10.78,10.78,591.0,637801.0
+2024-06-25 10:30:00,10.78,10.78,10.75,10.75,1049.0,1129614.0
+2024-06-25 10:35:00,10.76,10.76,10.75,10.75,378.0,406524.0
+2024-06-25 10:40:00,10.75,10.75,10.73,10.74,794.0,853389.0
+2024-06-25 10:45:00,10.75,10.75,10.74,10.75,534.0,573806.0
+2024-06-25 10:50:00,10.74,10.77,10.74,10.75,688.0,739694.0
+2024-06-25 10:55:00,10.76,10.77,10.75,10.76,267.0,287269.0
+2024-06-25 11:00:00,10.76,10.77,10.75,10.77,413.0,444269.0
+2024-06-25 11:05:00,10.77,10.77,10.75,10.76,354.0,381125.0
+2024-06-25 11:10:00,10.76,10.77,10.75,10.76,548.0,589246.0
+2024-06-25 11:15:00,10.76,10.77,10.75,10.77,161.0,173244.0
+2024-06-25 11:20:00,10.76,10.76,10.74,10.75,717.0,770739.0
+2024-06-25 11:25:00,10.75,10.77,10.74,10.75,1060.0,1139564.0
+2024-06-25 11:30:00,10.74,10.76,10.74,10.75,1763.0,1895320.0
+2024-06-25 13:05:00,10.76,10.76,10.74,10.76,1084.0,1165763.0
+2024-06-25 13:10:00,10.75,10.78,10.75,10.77,530.0,570865.0
+2024-06-25 13:15:00,10.77,10.78,10.76,10.76,196.0,211041.0
+2024-06-25 13:20:00,10.76,10.79,10.75,10.79,1804.0,1943814.0
+2024-06-25 13:25:00,10.79,10.82,10.79,10.81,1035.0,1118848.0
+2024-06-25 13:30:00,10.81,10.82,10.79,10.79,547.0,591019.0
+2024-06-25 13:35:00,10.79,10.8,10.78,10.78,427.0,460616.0
+2024-06-25 13:40:00,10.78,10.79,10.77,10.78,203.0,218877.0
+2024-06-25 13:45:00,10.78,10.79,10.77,10.78,215.0,231756.0
+2024-06-25 13:50:00,10.79,10.79,10.77,10.77,247.0,266268.0
+2024-06-25 13:55:00,10.78,10.78,10.77,10.77,535.0,576217.0
+2024-06-25 14:00:00,10.77,10.77,10.75,10.75,783.0,842646.0
+2024-06-25 14:05:00,10.76,10.76,10.74,10.74,1477.0,1587487.0
+2024-06-25 14:10:00,10.74,10.75,10.73,10.73,1833.0,1968273.0
+2024-06-25 14:15:00,10.73,10.73,10.7,10.71,3718.0,3984256.0
+2024-06-25 14:20:00,10.7,10.7,10.68,10.69,2073.0,2216308.0
+2024-06-25 14:25:00,10.69,10.71,10.68,10.71,1095.0,1170831.0
+2024-06-25 14:30:00,10.71,10.74,10.71,10.72,1847.0,1980159.0
+2024-06-25 14:35:00,10.72,10.74,10.7,10.74,794.0,851325.0
+2024-06-25 14:40:00,10.74,10.74,10.72,10.73,794.0,851965.0
+2024-06-25 14:45:00,10.73,10.74,10.71,10.73,789.0,845945.0
+2024-06-25 14:50:00,10.72,10.74,10.72,10.73,589.0,631873.0
+2024-06-25 14:55:00,10.73,10.74,10.71,10.72,842.0,902657.0
+2024-06-25 15:00:00,10.71,10.74,10.71,10.74,1360.0,1460355.0
+2024-06-26 09:35:00,10.73,10.74,10.69,10.73,1885.0,2020689.0
+2024-06-26 09:40:00,10.72,10.8,10.72,10.8,2518.0,2710537.0
+2024-06-26 09:45:00,10.79,10.83,10.78,10.81,3320.0,3586272.0
+2024-06-26 09:50:00,10.81,10.82,10.78,10.8,1598.0,1725584.0
+2024-06-26 09:55:00,10.79,10.8,10.76,10.78,888.0,957446.0
+2024-06-26 10:00:00,10.77,10.77,10.75,10.75,1257.0,1352415.0
+2024-06-26 10:05:00,10.73,10.75,10.73,10.74,1306.0,1402518.0
+2024-06-26 10:10:00,10.73,10.75,10.72,10.74,1359.0,1458216.0
+2024-06-26 10:15:00,10.74,10.74,10.71,10.72,698.0,748870.0
+2024-06-26 10:20:00,10.72,10.73,10.71,10.72,447.0,479240.0
+2024-06-26 10:25:00,10.72,10.73,10.7,10.71,914.0,978891.0
+2024-06-26 10:30:00,10.72,10.73,10.71,10.73,473.0,507032.0
+2024-06-26 10:35:00,10.72,10.74,10.72,10.72,446.0,478580.0
+2024-06-26 10:40:00,10.72,10.75,10.72,10.73,481.0,516539.0
+2024-06-26 10:45:00,10.73,10.75,10.72,10.72,253.0,271442.0
+2024-06-26 10:50:00,10.72,10.73,10.7,10.7,1425.0,1526537.0
+2024-06-26 10:55:00,10.7,10.71,10.69,10.69,730.0,781014.0
+2024-06-26 11:00:00,10.69,10.7,10.68,10.7,559.0,597502.0
+2024-06-26 11:05:00,10.71,10.72,10.7,10.71,109.0,116781.0
+2024-06-26 11:10:00,10.7,10.7,10.7,10.7,198.0,211860.0
+2024-06-26 11:15:00,10.71,10.72,10.7,10.71,204.0,218628.0
+2024-06-26 11:20:00,10.71,10.73,10.71,10.73,59.0,63252.0
+2024-06-26 11:25:00,10.73,10.75,10.71,10.72,642.0,689040.0
+2024-06-26 11:30:00,10.72,10.74,10.72,10.74,284.0,304706.0
+2024-06-26 13:05:00,10.74,10.76,10.73,10.76,364.0,391056.0
+2024-06-26 13:10:00,10.76,10.8,10.76,10.79,1440.0,1552878.0
+2024-06-26 13:15:00,10.8,10.84,10.79,10.84,4283.0,4631720.0
+2024-06-26 13:20:00,10.84,10.84,10.79,10.8,1986.0,2148668.0
+2024-06-26 13:25:00,10.8,10.84,10.78,10.84,2430.0,2627411.0
+2024-06-26 13:30:00,10.84,10.9,10.83,10.86,3791.0,4118709.0
+2024-06-26 13:35:00,10.86,10.89,10.85,10.86,1377.0,1496493.0
+2024-06-26 13:40:00,10.86,10.9,10.86,10.88,1180.0,1283888.0
+2024-06-26 13:45:00,10.88,10.9,10.87,10.89,1529.0,1665466.0
+2024-06-26 13:50:00,10.89,10.89,10.86,10.86,410.0,445491.0
+2024-06-26 13:55:00,10.86,10.89,10.86,10.88,644.0,700660.0
+2024-06-26 14:00:00,10.88,10.91,10.88,10.91,1248.0,1359552.0
+2024-06-26 14:05:00,10.91,10.93,10.9,10.93,2252.0,2458953.0
+2024-06-26 14:10:00,10.92,10.93,10.91,10.93,1526.0,1666662.0
+2024-06-26 14:15:00,10.94,10.95,10.94,10.94,1239.0,1355751.0
+2024-06-26 14:20:00,10.95,10.96,10.94,10.95,1395.0,1527981.0
+2024-06-26 14:25:00,10.95,10.96,10.91,10.91,1933.0,2113366.0
+2024-06-26 14:30:00,10.93,10.95,10.92,10.93,1343.0,1468562.0
+2024-06-26 14:35:00,10.94,10.95,10.94,10.95,757.0,828489.0
+2024-06-26 14:40:00,10.95,10.95,10.92,10.93,2880.0,3151406.0
+2024-06-26 14:45:00,10.93,10.94,10.91,10.93,584.0,638099.0
+2024-06-26 14:50:00,10.94,10.94,10.92,10.93,935.0,1021768.0
+2024-06-26 14:55:00,10.92,10.95,10.92,10.95,1161.0,1269548.0
+2024-06-26 15:00:00,10.94,10.95,10.93,10.94,1533.0,1677121.0
+2024-06-27 09:35:00,10.9,10.95,10.88,10.89,3492.0,3812685.0
+2024-06-27 09:40:00,10.89,10.94,10.88,10.92,1614.0,1761373.0
+2024-06-27 09:45:00,10.92,10.95,10.91,10.94,1960.0,2142719.0
+2024-06-27 09:50:00,10.95,10.95,10.89,10.89,1450.0,1582764.0
+2024-06-27 09:55:00,10.9,10.92,10.86,10.87,1386.0,1509366.0
+2024-06-27 10:00:00,10.87,10.89,10.87,10.87,773.0,840578.0
+2024-06-27 10:05:00,10.86,10.87,10.83,10.84,1459.0,1583599.0
+2024-06-27 10:10:00,10.84,10.86,10.83,10.85,1578.0,1710919.0
+2024-06-27 10:15:00,10.85,10.85,10.83,10.83,834.0,903790.0
+2024-06-27 10:20:00,10.83,10.84,10.81,10.82,1468.0,1588873.0
+2024-06-27 10:25:00,10.83,10.85,10.83,10.84,626.0,678759.0
+2024-06-27 10:30:00,10.84,10.84,10.83,10.84,429.0,464880.0
+2024-06-27 10:35:00,10.83,10.84,10.82,10.83,571.0,618513.0
+2024-06-27 10:40:00,10.83,10.84,10.82,10.82,637.0,689486.0
+2024-06-27 10:45:00,10.82,10.84,10.81,10.83,767.0,829810.0
+2024-06-27 10:50:00,10.84,10.85,10.83,10.83,531.0,575489.0
+2024-06-27 10:55:00,10.83,10.84,10.82,10.84,1098.0,1188825.0
+2024-06-27 11:00:00,10.84,10.84,10.82,10.82,990.0,1071990.0
+2024-06-27 11:05:00,10.83,10.84,10.82,10.84,477.0,516567.0
+2024-06-27 11:10:00,10.83,10.84,10.82,10.82,345.0,373557.0
+2024-06-27 11:15:00,10.83,10.83,10.8,10.81,782.0,845658.0
+2024-06-27 11:20:00,10.82,10.82,10.8,10.81,361.0,390229.0
+2024-06-27 11:25:00,10.81,10.84,10.8,10.84,1289.0,1394340.0
+2024-06-27 11:30:00,10.84,10.86,10.84,10.86,528.0,572640.0
+2024-06-27 13:05:00,10.85,10.89,10.85,10.86,1160.0,1261480.0
+2024-06-27 13:10:00,10.87,10.88,10.84,10.85,351.0,381111.0
+2024-06-27 13:15:00,10.84,10.87,10.84,10.85,348.0,377656.0
+2024-06-27 13:20:00,10.85,10.88,10.85,10.87,780.0,847791.0
+2024-06-27 13:25:00,10.86,10.88,10.86,10.86,444.0,482768.0
+2024-06-27 13:30:00,10.87,10.87,10.85,10.85,292.0,317012.0
+2024-06-27 13:35:00,10.84,10.88,10.84,10.87,1277.0,1386244.0
+2024-06-27 13:40:00,10.87,10.89,10.86,10.88,972.0,1058158.0
+2024-06-27 13:45:00,10.88,10.9,10.88,10.88,593.0,645736.0
+2024-06-27 13:50:00,10.88,10.9,10.88,10.88,426.0,464056.0
+2024-06-27 13:55:00,10.88,10.89,10.87,10.89,358.0,389543.0
+2024-06-27 14:00:00,10.88,10.89,10.86,10.86,356.0,387207.0
+2024-06-27 14:05:00,10.87,10.87,10.85,10.87,634.0,688281.0
+2024-06-27 14:10:00,10.85,10.87,10.83,10.84,611.0,662522.0
+2024-06-27 14:15:00,10.84,10.87,10.84,10.84,466.0,505737.0
+2024-06-27 14:20:00,10.84,10.87,10.83,10.87,339.0,367770.0
+2024-06-27 14:25:00,10.87,10.88,10.86,10.87,841.0,914280.0
+2024-06-27 14:30:00,10.88,10.88,10.85,10.86,184.0,199877.0
+2024-06-27 14:35:00,10.87,10.88,10.85,10.86,729.0,792089.0
+2024-06-27 14:40:00,10.86,10.87,10.84,10.85,872.0,946593.0
+2024-06-27 14:45:00,10.84,10.85,10.82,10.83,1211.0,1310930.0
+2024-06-27 14:50:00,10.83,10.85,10.82,10.84,522.0,565554.0
+2024-06-27 14:55:00,10.85,10.85,10.83,10.85,1092.0,1183811.0
+2024-06-27 15:00:00,10.85,10.87,10.82,10.82,1977.0,2142644.0
+2024-06-28 09:35:00,10.81,10.88,10.81,10.85,4912.0,5327352.0
+2024-06-28 09:40:00,10.85,10.86,10.83,10.85,895.0,970401.0
+2024-06-28 09:45:00,10.86,10.9,10.85,10.88,3102.0,3374576.0
+2024-06-28 09:50:00,10.88,10.91,10.85,10.89,2160.0,2350604.0
+2024-06-28 09:55:00,10.89,10.92,10.89,10.91,936.0,1021115.0
+2024-06-28 10:00:00,10.9,10.93,10.89,10.92,1766.0,1927493.0
+2024-06-28 10:05:00,10.92,10.92,10.89,10.9,1859.0,2027228.0
+2024-06-28 10:10:00,10.9,10.91,10.89,10.91,822.0,895634.0
+2024-06-28 10:15:00,10.89,10.92,10.89,10.9,627.0,684177.0
+2024-06-28 10:20:00,10.9,10.91,10.89,10.89,755.0,822679.0
+2024-06-28 10:25:00,10.91,10.94,10.91,10.93,1589.0,1735513.0
+2024-06-28 10:30:00,10.93,10.94,10.92,10.94,1229.0,1344131.0
+2024-06-28 10:35:00,10.94,10.95,10.93,10.94,744.0,813853.0
+2024-06-28 10:40:00,10.93,10.95,10.93,10.94,969.0,1060256.0
+2024-06-28 10:45:00,10.93,10.94,10.92,10.92,380.0,415348.0
+2024-06-28 10:50:00,10.93,10.93,10.92,10.93,405.0,442304.0
+2024-06-28 10:55:00,10.92,10.94,10.92,10.93,876.0,956799.0
+2024-06-28 11:00:00,10.93,10.95,10.92,10.95,555.0,606735.0
+2024-06-28 11:05:00,10.94,10.94,10.91,10.91,520.0,568139.0
+2024-06-28 11:10:00,10.91,10.91,10.88,10.89,693.0,754878.0
+2024-06-28 11:15:00,10.89,10.89,10.88,10.88,417.0,453945.0
+2024-06-28 11:20:00,10.88,10.9,10.88,10.89,84.0,91487.0
+2024-06-28 11:25:00,10.89,10.9,10.89,10.89,206.0,224402.0
+2024-06-28 11:30:00,10.9,10.91,10.88,10.9,427.0,465291.0
+2024-06-28 13:05:00,10.9,10.92,10.89,10.89,730.0,795760.0
+2024-06-28 13:10:00,10.88,10.89,10.86,10.86,1419.0,1542736.0
+2024-06-28 13:15:00,10.86,10.87,10.83,10.83,2459.0,2666148.0
+2024-06-28 13:20:00,10.83,10.84,10.81,10.83,2862.0,3097616.0
+2024-06-28 13:25:00,10.82,10.83,10.8,10.8,3794.0,4101393.0
+2024-06-28 13:30:00,10.8,10.81,10.78,10.78,3307.0,3568649.0
+2024-06-28 13:35:00,10.78,10.85,10.78,10.84,3147.0,3402105.0
+2024-06-28 13:40:00,10.84,10.84,10.82,10.82,1210.0,1310800.0
+2024-06-28 13:45:00,10.82,10.85,10.82,10.84,823.0,891992.0
+2024-06-28 13:50:00,10.84,10.85,10.82,10.83,713.0,772348.0
+2024-06-28 13:55:00,10.83,10.84,10.82,10.83,569.0,616388.0
+2024-06-28 14:00:00,10.83,10.84,10.82,10.82,303.0,328051.0
+2024-06-28 14:05:00,10.82,10.82,10.8,10.82,853.0,922428.0
+2024-06-28 14:10:00,10.82,10.82,10.8,10.81,541.0,584618.0
+2024-06-28 14:15:00,10.81,10.81,10.78,10.78,1736.0,1872809.0
+2024-06-28 14:20:00,10.78,10.78,10.75,10.76,1780.0,1916475.0
+2024-06-28 14:25:00,10.76,10.76,10.73,10.75,1769.0,1900646.0
+2024-06-28 14:30:00,10.75,10.76,10.74,10.75,1964.0,2112329.0
+2024-06-28 14:35:00,10.75,10.76,10.74,10.76,889.0,955913.0
+2024-06-28 14:40:00,10.76,10.76,10.73,10.74,1368.0,1469670.0
+2024-06-28 14:45:00,10.74,10.77,10.74,10.75,1597.0,1717275.0
+2024-06-28 14:50:00,10.76,10.79,10.75,10.78,2367.0,2549263.0
+2024-06-28 14:55:00,10.79,10.8,10.77,10.78,1092.0,1177700.0
+2024-06-28 15:00:00,10.78,10.79,10.76,10.76,1138.0,1226174.0
+2024-07-01 09:35:00,10.77,10.8,10.72,10.79,1843.0,1983491.0
+2024-07-01 09:40:00,10.78,10.8,10.73,10.75,2053.0,2211558.0
+2024-07-01 09:45:00,10.75,10.76,10.71,10.72,2141.0,2296754.0
+2024-07-01 09:50:00,10.72,10.75,10.72,10.74,422.0,453171.0
+2024-07-01 09:55:00,10.74,10.77,10.73,10.74,2113.0,2271409.0
+2024-07-01 10:00:00,10.74,10.76,10.74,10.75,860.0,924122.0
+2024-07-01 10:05:00,10.74,10.74,10.7,10.7,2021.0,2166129.0
+2024-07-01 10:10:00,10.71,10.72,10.69,10.71,1744.0,1866950.0
+2024-07-01 10:15:00,10.71,10.71,10.68,10.68,966.0,1032992.0
+2024-07-01 10:20:00,10.68,10.7,10.68,10.68,939.0,1003284.0
+2024-07-01 10:25:00,10.68,10.69,10.66,10.67,1190.0,1270220.0
+2024-07-01 10:30:00,10.67,10.71,10.66,10.71,1555.0,1661395.0
+2024-07-01 10:35:00,10.71,10.71,10.68,10.69,1030.0,1101921.0
+2024-07-01 10:40:00,10.7,10.71,10.68,10.68,883.0,944105.0
+2024-07-01 10:45:00,10.69,10.72,10.69,10.71,1303.0,1395304.0
+2024-07-01 10:50:00,10.71,10.74,10.71,10.74,470.0,504170.0
+2024-07-01 10:55:00,10.74,10.79,10.72,10.78,1239.0,1332198.0
+2024-07-01 11:00:00,10.78,10.8,10.76,10.79,2881.0,3104504.0
+2024-07-01 11:05:00,10.79,10.8,10.78,10.78,923.0,995611.0
+2024-07-01 11:10:00,10.77,10.79,10.77,10.78,856.0,922008.0
+2024-07-01 11:15:00,10.78,10.82,10.78,10.81,1393.0,1504310.0
+2024-07-01 11:20:00,10.82,10.82,10.8,10.8,1352.0,1461419.0
+2024-07-01 11:25:00,10.82,10.83,10.81,10.82,575.0,622260.0
+2024-07-01 11:30:00,10.82,10.82,10.8,10.8,329.0,355652.0
+2024-07-01 13:05:00,10.81,10.85,10.8,10.85,2159.0,2335760.0
+2024-07-01 13:10:00,10.85,10.86,10.84,10.84,1177.0,1277255.0
+2024-07-01 13:15:00,10.84,10.86,10.84,10.85,1510.0,1638095.0
+2024-07-01 13:20:00,10.85,10.89,10.85,10.88,1759.0,1911621.0
+2024-07-01 13:25:00,10.88,10.9,10.87,10.88,1562.0,1699652.0
+2024-07-01 13:30:00,10.88,10.89,10.87,10.88,675.0,734717.0
+2024-07-01 13:35:00,10.89,10.9,10.89,10.9,852.0,928114.0
+2024-07-01 13:40:00,10.9,10.9,10.86,10.88,3273.0,3561026.0
+2024-07-01 13:45:00,10.89,10.89,10.88,10.89,562.0,611946.0
+2024-07-01 13:50:00,10.9,10.9,10.87,10.89,930.0,1012251.0
+2024-07-01 13:55:00,10.88,10.89,10.87,10.88,863.0,939220.0
+2024-07-01 14:00:00,10.89,10.9,10.88,10.9,732.0,797117.0
+2024-07-01 14:05:00,10.9,10.91,10.89,10.91,1105.0,1204559.0
+2024-07-01 14:10:00,10.91,10.93,10.9,10.92,1160.0,1266631.0
+2024-07-01 14:15:00,10.92,10.92,10.91,10.92,1205.0,1315452.0
+2024-07-01 14:20:00,10.93,10.93,10.89,10.89,631.0,688207.0
+2024-07-01 14:25:00,10.9,10.9,10.87,10.88,868.0,944568.0
+2024-07-01 14:30:00,10.88,10.89,10.87,10.88,931.0,1012567.0
+2024-07-01 14:35:00,10.89,10.9,10.88,10.89,1463.0,1593692.0
+2024-07-01 14:40:00,10.89,10.9,10.89,10.9,635.0,691936.0
+2024-07-01 14:45:00,10.9,10.9,10.88,10.89,1453.0,1581718.0
+2024-07-01 14:50:00,10.88,10.88,10.86,10.87,1703.0,1851587.0
+2024-07-01 14:55:00,10.87,10.89,10.87,10.87,1211.0,1317142.0
+2024-07-01 15:00:00,10.87,10.88,10.86,10.86,1491.0,1620192.0
+2024-07-02 09:35:00,10.86,10.88,10.83,10.88,2350.0,2550744.0
+2024-07-02 09:40:00,10.87,10.92,10.85,10.91,2451.0,2666168.0
+2024-07-02 09:45:00,10.91,10.92,10.87,10.9,1437.0,1566519.0
+2024-07-02 09:50:00,10.9,10.9,10.88,10.9,1131.0,1231876.0
+2024-07-02 09:55:00,10.89,10.9,10.87,10.88,962.0,1047022.0
+2024-07-02 10:00:00,10.88,10.92,10.88,10.91,4629.0,5043863.0
+2024-07-02 10:05:00,10.91,10.93,10.89,10.92,2042.0,2227941.0
+2024-07-02 10:10:00,10.92,10.93,10.91,10.93,1417.0,1547975.0
+2024-07-02 10:15:00,10.94,10.94,10.93,10.94,1455.0,1591295.0
+2024-07-02 10:20:00,10.94,10.95,10.92,10.94,1895.0,2072046.0
+2024-07-02 10:25:00,10.95,10.95,10.94,10.94,1225.0,1340405.0
+2024-07-02 10:30:00,10.94,10.94,10.91,10.94,1871.0,2044786.0
+2024-07-02 10:35:00,10.94,10.94,10.92,10.92,377.0,411965.0
+2024-07-02 10:40:00,10.92,10.93,10.91,10.91,499.0,544570.0
+2024-07-02 10:45:00,10.91,10.92,10.91,10.91,463.0,505263.0
+2024-07-02 10:50:00,10.91,10.92,10.9,10.91,461.0,502944.0
+2024-07-02 10:55:00,10.91,10.92,10.9,10.91,465.0,507185.0
+2024-07-02 11:00:00,10.91,10.91,10.9,10.91,638.0,695653.0
+2024-07-02 11:05:00,10.91,10.91,10.9,10.91,636.0,693330.0
+2024-07-02 11:10:00,10.9,10.92,10.89,10.9,707.0,771306.0
+2024-07-02 11:15:00,10.9,10.91,10.89,10.9,539.0,587560.0
+2024-07-02 11:20:00,10.9,10.91,10.9,10.9,164.0,178837.0
+2024-07-02 11:25:00,10.9,10.9,10.88,10.89,1739.0,1893178.0
+2024-07-02 11:30:00,10.88,10.9,10.88,10.9,532.0,579222.0
+2024-07-02 13:05:00,10.89,10.92,10.89,10.9,918.0,1000783.0
+2024-07-02 13:10:00,10.91,10.92,10.89,10.89,304.0,331509.0
+2024-07-02 13:15:00,10.9,10.92,10.9,10.91,686.0,748691.0
+2024-07-02 13:20:00,10.9,10.92,10.9,10.9,525.0,572586.0
+2024-07-02 13:25:00,10.9,10.9,10.89,10.89,1325.0,1443307.0
+2024-07-02 13:30:00,10.9,10.91,10.89,10.9,390.0,424906.0
+2024-07-02 13:35:00,10.89,10.91,10.89,10.91,242.0,263782.0
+2024-07-02 13:40:00,10.91,10.92,10.9,10.92,264.0,288026.0
+2024-07-02 13:45:00,10.9,10.92,10.9,10.91,504.0,549897.0
+2024-07-02 13:50:00,10.91,10.92,10.9,10.91,244.0,266258.0
+2024-07-02 13:55:00,10.9,10.92,10.9,10.92,319.0,347982.0
+2024-07-02 14:00:00,10.92,10.93,10.9,10.93,810.0,884580.0
+2024-07-02 14:05:00,10.92,10.93,10.9,10.9,1088.0,1187904.0
+2024-07-02 14:10:00,10.91,10.92,10.89,10.91,335.0,365319.0
+2024-07-02 14:15:00,10.9,10.91,10.9,10.9,298.0,325000.0
+2024-07-02 14:20:00,10.91,10.92,10.89,10.91,680.0,741484.0
+2024-07-02 14:25:00,10.9,10.91,10.89,10.89,540.0,588405.0
+2024-07-02 14:30:00,10.89,10.89,10.87,10.88,880.0,957618.0
+2024-07-02 14:35:00,10.88,10.89,10.86,10.87,1035.0,1125292.0
+2024-07-02 14:40:00,10.86,10.89,10.86,10.89,982.0,1067704.0
+2024-07-02 14:45:00,10.88,10.89,10.87,10.89,525.0,571385.0
+2024-07-02 14:50:00,10.88,10.89,10.88,10.88,553.0,601783.0
+2024-07-02 14:55:00,10.88,10.91,10.88,10.9,1483.0,1615999.0
+2024-07-02 15:00:00,10.89,10.91,10.88,10.88,1357.0,1478047.0
+2024-07-03 09:35:00,10.9,10.9,10.83,10.87,2668.0,2894960.0
+2024-07-03 09:40:00,10.87,10.9,10.84,10.88,1946.0,2114180.0
+2024-07-03 09:45:00,10.87,10.92,10.87,10.91,2077.0,2261673.0
+2024-07-03 09:50:00,10.92,10.94,10.89,10.93,2481.0,2707589.0
+2024-07-03 09:55:00,10.94,10.96,10.93,10.94,2154.0,2357499.0
+2024-07-03 10:00:00,10.93,10.95,10.92,10.93,616.0,673423.0
+2024-07-03 10:05:00,10.92,10.93,10.91,10.93,894.0,976005.0
+2024-07-03 10:10:00,10.93,10.94,10.92,10.93,474.0,518108.0
+2024-07-03 10:15:00,10.93,10.94,10.91,10.93,471.0,514682.0
+2024-07-03 10:20:00,10.93,10.93,10.91,10.92,612.0,668570.0
+2024-07-03 10:25:00,10.92,10.93,10.91,10.92,833.0,909668.0
+2024-07-03 10:30:00,10.92,10.93,10.92,10.92,297.0,324550.0
+2024-07-03 10:35:00,10.93,10.98,10.93,10.95,3374.0,3694639.0
+2024-07-03 10:40:00,10.96,10.97,10.95,10.97,1358.0,1487605.0
+2024-07-03 10:45:00,10.96,11.0,10.95,10.98,4770.0,5235244.0
+2024-07-03 10:50:00,10.99,10.99,10.97,10.98,1261.0,1385074.0
+2024-07-03 10:55:00,10.97,10.99,10.97,10.97,1781.0,1955678.0
+2024-07-03 11:00:00,10.98,10.99,10.97,10.97,643.0,706141.0
+2024-07-03 11:05:00,10.97,10.99,10.97,10.98,475.0,521517.0
+2024-07-03 11:10:00,10.98,11.03,10.98,11.02,3665.0,4032758.0
+2024-07-03 11:15:00,11.02,11.04,11.02,11.02,1743.0,1922504.0
+2024-07-03 11:20:00,11.03,11.03,11.02,11.02,625.0,689271.0
+2024-07-03 11:25:00,11.03,11.03,11.02,11.03,1001.0,1103543.0
+2024-07-03 11:30:00,11.02,11.04,11.02,11.04,944.0,1040906.0
+2024-07-03 13:05:00,11.03,11.04,11.02,11.03,1794.0,1979049.0
+2024-07-03 13:10:00,11.03,11.04,11.01,11.04,1801.0,1985668.0
+2024-07-03 13:15:00,11.04,11.05,11.03,11.05,1056.0,1166313.0
+2024-07-03 13:20:00,11.05,11.06,11.04,11.05,955.0,1055373.0
+2024-07-03 13:25:00,11.05,11.05,11.03,11.03,565.0,623412.0
+2024-07-03 13:30:00,11.04,11.04,11.02,11.03,459.0,506244.0
+2024-07-03 13:35:00,11.03,11.04,11.02,11.02,439.0,483979.0
+2024-07-03 13:40:00,11.02,11.03,11.01,11.02,554.0,610289.0
+2024-07-03 13:45:00,11.02,11.04,11.01,11.03,791.0,872429.0
+2024-07-03 13:50:00,11.02,11.02,11.0,11.0,1116.0,1228673.0
+2024-07-03 13:55:00,11.0,11.01,11.0,11.01,364.0,400625.0
+2024-07-03 14:00:00,11.0,11.01,10.99,11.01,684.0,752139.0
+2024-07-03 14:05:00,11.01,11.01,10.98,10.98,1352.0,1485817.0
+2024-07-03 14:10:00,10.98,11.0,10.98,11.0,644.0,707314.0
+2024-07-03 14:15:00,11.0,11.01,10.99,10.99,288.0,316750.0
+2024-07-03 14:20:00,10.99,11.0,10.98,11.0,230.0,252763.0
+2024-07-03 14:25:00,10.99,11.0,10.98,10.99,192.0,211087.0
+2024-07-03 14:30:00,10.99,10.99,10.97,10.98,539.0,591943.0
+2024-07-03 14:35:00,10.97,10.99,10.95,10.96,1520.0,1666866.0
+2024-07-03 14:40:00,10.96,10.96,10.95,10.96,590.0,646263.0
+2024-07-03 14:45:00,10.96,10.97,10.94,10.96,804.0,880802.0
+2024-07-03 14:50:00,10.96,10.97,10.95,10.97,468.0,512907.0
+2024-07-03 14:55:00,10.97,10.97,10.95,10.97,1271.0,1392839.0
+2024-07-03 15:00:00,10.96,10.97,10.95,10.97,1166.0,1278675.0
+2024-07-04 09:35:00,10.97,10.99,10.93,10.95,2908.0,3185297.0
+2024-07-04 09:40:00,10.95,10.96,10.92,10.93,2122.0,2320994.0
+2024-07-04 09:45:00,10.92,10.94,10.9,10.92,2221.0,2425223.0
+2024-07-04 09:50:00,10.92,10.92,10.89,10.91,1707.0,1860848.0
+2024-07-04 09:55:00,10.91,10.92,10.88,10.88,2087.0,2275084.0
+2024-07-04 10:00:00,10.88,10.91,10.88,10.89,1221.0,1329311.0
+2024-07-04 10:05:00,10.88,10.89,10.87,10.88,1005.0,1093321.0
+2024-07-04 10:10:00,10.88,10.89,10.86,10.88,1772.0,1926686.0
+2024-07-04 10:15:00,10.88,10.88,10.85,10.86,1120.0,1215925.0
+2024-07-04 10:20:00,10.86,10.89,10.85,10.85,1028.0,1117315.0
+2024-07-04 10:25:00,10.85,10.89,10.85,10.89,299.0,325167.0
+2024-07-04 10:30:00,10.88,10.88,10.85,10.86,571.0,620344.0
+2024-07-04 10:35:00,10.88,10.88,10.84,10.85,718.0,779223.0
+2024-07-04 10:40:00,10.85,10.86,10.84,10.85,580.0,629634.0
+2024-07-04 10:45:00,10.86,10.88,10.85,10.86,278.0,302131.0
+2024-07-04 10:50:00,10.88,10.89,10.87,10.87,374.0,406773.0
+2024-07-04 10:55:00,10.87,10.89,10.87,10.88,227.0,246962.0
+2024-07-04 11:00:00,10.88,10.88,10.85,10.86,870.0,945393.0
+2024-07-04 11:05:00,10.86,10.86,10.85,10.86,204.0,221481.0
+2024-07-04 11:10:00,10.85,10.86,10.8,10.83,5286.0,5718791.0
+2024-07-04 11:15:00,10.82,10.83,10.81,10.82,473.0,511678.0
+2024-07-04 11:20:00,10.82,10.83,10.81,10.81,667.0,721307.0
+2024-07-04 11:25:00,10.81,10.81,10.79,10.8,1105.0,1193721.0
+2024-07-04 11:30:00,10.8,10.81,10.78,10.8,926.0,999458.0
+2024-07-04 13:05:00,10.8,10.8,10.76,10.77,1494.0,1610863.0
+2024-07-04 13:10:00,10.76,10.79,10.76,10.77,550.0,592508.0
+2024-07-04 13:15:00,10.77,10.79,10.76,10.77,739.0,796143.0
+2024-07-04 13:20:00,10.78,10.78,10.75,10.76,1670.0,1797548.0
+2024-07-04 13:25:00,10.76,10.76,10.73,10.74,1551.0,1666356.0
+2024-07-04 13:30:00,10.74,10.75,10.73,10.74,845.0,907448.0
+2024-07-04 13:35:00,10.74,10.75,10.73,10.75,598.0,642714.0
+2024-07-04 13:40:00,10.75,10.76,10.74,10.75,1111.0,1193679.0
+2024-07-04 13:45:00,10.74,10.75,10.72,10.72,846.0,908185.0
+2024-07-04 13:50:00,10.73,10.78,10.73,10.77,2348.0,2525284.0
+2024-07-04 13:55:00,10.77,10.79,10.75,10.78,1835.0,1973901.0
+2024-07-04 14:00:00,10.78,10.78,10.74,10.75,1611.0,1733331.0
+2024-07-04 14:05:00,10.74,10.76,10.73,10.73,708.0,760666.0
+2024-07-04 14:10:00,10.74,10.74,10.72,10.72,1858.0,1994322.0
+2024-07-04 14:15:00,10.72,10.72,10.67,10.69,4016.0,4295928.0
+2024-07-04 14:20:00,10.69,10.71,10.67,10.69,2172.0,2321910.0
+2024-07-04 14:25:00,10.7,10.7,10.67,10.68,2667.0,2847859.0
+2024-07-04 14:30:00,10.68,10.69,10.66,10.66,1717.0,1832183.0
+2024-07-04 14:35:00,10.66,10.72,10.66,10.72,1645.0,1757163.0
+2024-07-04 14:40:00,10.71,10.73,10.7,10.72,640.0,685517.0
+2024-07-04 14:45:00,10.71,10.72,10.69,10.7,449.0,480879.0
+2024-07-04 14:50:00,10.7,10.72,10.69,10.71,1501.0,1606579.0
+2024-07-04 14:55:00,10.71,10.71,10.68,10.69,2019.0,2160223.0
+2024-07-04 15:00:00,10.68,10.69,10.67,10.67,2405.0,2567338.0
+2024-07-05 09:35:00,10.68,10.72,10.6,10.66,3161.0,3366769.0
+2024-07-05 09:40:00,10.66,10.69,10.64,10.68,2463.0,2625213.0
+2024-07-05 09:45:00,10.68,10.7,10.66,10.69,2495.0,2665274.0
+2024-07-05 09:50:00,10.7,10.74,10.7,10.71,1778.0,1905634.0
+2024-07-05 09:55:00,10.71,10.74,10.71,10.71,1488.0,1594736.0
+2024-07-05 10:00:00,10.7,10.71,10.67,10.69,1812.0,1936095.0
+2024-07-05 10:05:00,10.69,10.72,10.69,10.72,1749.0,1871469.0
+2024-07-05 10:10:00,10.71,10.77,10.71,10.76,1947.0,2090957.0
+2024-07-05 10:15:00,10.75,10.76,10.75,10.75,1137.0,1222993.0
+2024-07-05 10:20:00,10.76,10.77,10.75,10.77,1506.0,1620865.0
+2024-07-05 10:25:00,10.77,10.78,10.75,10.77,1493.0,1606745.0
+2024-07-05 10:30:00,10.78,10.78,10.76,10.77,1052.0,1133115.0
+2024-07-05 10:35:00,10.77,10.77,10.75,10.75,751.0,807640.0
+2024-07-05 10:40:00,10.74,10.77,10.73,10.76,878.0,944093.0
+2024-07-05 10:45:00,10.76,10.81,10.76,10.8,3378.0,3642878.0
+2024-07-05 10:50:00,10.79,10.82,10.79,10.81,2307.0,2492394.0
+2024-07-05 10:55:00,10.8,10.86,10.8,10.82,4341.0,4699027.0
+2024-07-05 11:00:00,10.82,10.84,10.79,10.79,408.0,441170.0
+2024-07-05 11:05:00,10.78,10.8,10.78,10.79,364.0,392802.0
+2024-07-05 11:10:00,10.79,10.8,10.77,10.78,313.0,337487.0
+2024-07-05 11:15:00,10.78,10.78,10.77,10.77,1081.0,1164748.0
+2024-07-05 11:20:00,10.77,10.79,10.77,10.78,454.0,489356.0
+2024-07-05 11:25:00,10.78,10.8,10.78,10.8,243.0,262197.0
+2024-07-05 11:30:00,10.79,10.8,10.78,10.79,225.0,242796.0
+2024-07-05 13:05:00,10.8,10.8,10.77,10.77,749.0,807655.0
+2024-07-05 13:10:00,10.77,10.77,10.75,10.77,1738.0,1869854.0
+2024-07-05 13:15:00,10.76,10.77,10.75,10.75,487.0,524031.0
+2024-07-05 13:20:00,10.75,10.77,10.75,10.76,178.0,191452.0
+2024-07-05 13:25:00,10.76,10.76,10.73,10.73,1402.0,1506560.0
+2024-07-05 13:30:00,10.73,10.73,10.71,10.71,724.0,776165.0
+2024-07-05 13:35:00,10.73,10.75,10.72,10.73,474.0,509063.0
+2024-07-05 13:40:00,10.73,10.74,10.72,10.74,157.0,168488.0
+2024-07-05 13:45:00,10.73,10.75,10.72,10.73,397.0,426257.0
+2024-07-05 13:50:00,10.73,10.75,10.73,10.75,1288.0,1383100.0
+2024-07-05 13:55:00,10.74,10.78,10.74,10.76,317.0,341254.0
+2024-07-05 14:00:00,10.75,10.78,10.75,10.78,690.0,743447.0
+2024-07-05 14:05:00,10.78,10.8,10.76,10.8,624.0,673278.0
+2024-07-05 14:10:00,10.81,10.82,10.8,10.8,974.0,1052312.0
+2024-07-05 14:15:00,10.81,10.81,10.78,10.78,506.0,546040.0
+2024-07-05 14:20:00,10.8,10.8,10.77,10.77,715.0,770621.0
+2024-07-05 14:25:00,10.76,10.78,10.76,10.77,277.0,298213.0
+2024-07-05 14:30:00,10.77,10.78,10.76,10.76,281.0,302536.0
+2024-07-05 14:35:00,10.76,10.77,10.76,10.76,387.0,416490.0
+2024-07-05 14:40:00,10.76,10.77,10.76,10.76,256.0,275539.0
+2024-07-05 14:45:00,10.76,10.77,10.75,10.77,291.0,313032.0
+2024-07-05 14:50:00,10.77,10.77,10.75,10.77,582.0,626238.0
+2024-07-05 14:55:00,10.76,10.78,10.76,10.78,887.0,955312.0
+2024-07-05 15:00:00,10.78,10.78,10.77,10.78,877.0,945279.0
+2024-07-08 09:35:00,10.79,10.79,10.72,10.76,1876.0,2018440.0
+2024-07-08 09:40:00,10.76,10.77,10.74,10.74,1263.0,1357394.0
+2024-07-08 09:45:00,10.72,10.74,10.69,10.7,3051.0,3268825.0
+2024-07-08 09:50:00,10.68,10.69,10.64,10.68,3518.0,3752900.0
+2024-07-08 09:55:00,10.67,10.68,10.65,10.66,1892.0,2017920.0
+2024-07-08 10:00:00,10.66,10.68,10.64,10.66,1456.0,1551789.0
+2024-07-08 10:05:00,10.66,10.66,10.63,10.64,2583.0,2749035.0
+2024-07-08 10:10:00,10.64,10.66,10.62,10.63,2696.0,2867337.0
+2024-07-08 10:15:00,10.63,10.65,10.62,10.65,858.0,912904.0
+2024-07-08 10:20:00,10.65,10.65,10.62,10.62,1596.0,1696404.0
+2024-07-08 10:25:00,10.63,10.64,10.62,10.62,954.0,1013744.0
+2024-07-08 10:30:00,10.62,10.63,10.61,10.61,1685.0,1788394.0
+2024-07-08 10:35:00,10.61,10.62,10.58,10.59,4104.0,4349515.0
+2024-07-08 10:40:00,10.59,10.6,10.56,10.58,1954.0,2066674.0
+2024-07-08 10:45:00,10.57,10.58,10.56,10.58,2405.0,2541312.0
+2024-07-08 10:50:00,10.57,10.59,10.57,10.58,2566.0,2713309.0
+2024-07-08 10:55:00,10.58,10.6,10.58,10.6,268.0,283905.0
+2024-07-08 11:00:00,10.6,10.61,10.59,10.61,368.0,390201.0
+2024-07-08 11:05:00,10.61,10.62,10.6,10.61,669.0,709951.0
+2024-07-08 11:10:00,10.61,10.64,10.6,10.64,430.0,456618.0
+2024-07-08 11:15:00,10.64,10.65,10.61,10.61,417.0,443354.0
+2024-07-08 11:20:00,10.62,10.62,10.6,10.6,293.0,310772.0
+2024-07-08 11:25:00,10.61,10.62,10.6,10.61,452.0,479455.0
+2024-07-08 11:30:00,10.62,10.62,10.6,10.6,197.0,208974.0
+2024-07-08 13:05:00,10.61,10.61,10.59,10.59,841.0,891530.0
+2024-07-08 13:10:00,10.59,10.6,10.58,10.59,478.0,506142.0
+2024-07-08 13:15:00,10.59,10.6,10.58,10.6,385.0,407836.0
+2024-07-08 13:20:00,10.6,10.6,10.59,10.59,65.0,68868.0
+2024-07-08 13:25:00,10.59,10.6,10.58,10.59,313.0,331507.0
+2024-07-08 13:30:00,10.59,10.59,10.54,10.57,2369.0,2502370.0
+2024-07-08 13:35:00,10.55,10.59,10.55,10.59,512.0,541240.0
+2024-07-08 13:40:00,10.58,10.59,10.58,10.59,600.0,635092.0
+2024-07-08 13:45:00,10.59,10.59,10.56,10.57,598.0,632597.0
+2024-07-08 13:50:00,10.56,10.57,10.56,10.57,128.0,135200.0
+2024-07-08 13:55:00,10.57,10.57,10.53,10.53,1943.0,2047839.0
+2024-07-08 14:00:00,10.54,10.54,10.53,10.54,567.0,597378.0
+2024-07-08 14:05:00,10.53,10.55,10.53,10.55,1149.0,1210370.0
+2024-07-08 14:10:00,10.54,10.55,10.52,10.53,501.0,527967.0
+2024-07-08 14:15:00,10.53,10.54,10.53,10.53,170.0,179111.0
+2024-07-08 14:20:00,10.54,10.55,10.52,10.53,912.0,960400.0
+2024-07-08 14:25:00,10.53,10.53,10.52,10.53,787.0,828251.0
+2024-07-08 14:30:00,10.53,10.54,10.52,10.52,491.0,516804.0
+2024-07-08 14:35:00,10.53,10.54,10.52,10.53,1049.0,1105195.0
+2024-07-08 14:40:00,10.54,10.54,10.51,10.52,1191.0,1253437.0
+2024-07-08 14:45:00,10.51,10.52,10.5,10.51,1641.0,1724603.0
+2024-07-08 14:50:00,10.52,10.53,10.5,10.52,996.0,1047557.0
+2024-07-08 14:55:00,10.53,10.55,10.52,10.54,1867.0,1967797.0
+2024-07-08 15:00:00,10.55,10.55,10.53,10.54,1298.0,1368185.0
+2024-07-09 09:35:00,10.53,10.62,10.53,10.57,3327.0,3519619.0
+2024-07-09 09:40:00,10.58,10.61,10.56,10.61,1912.0,2021866.0
+2024-07-09 09:45:00,10.6,10.62,10.57,10.58,1393.0,1476300.0
+2024-07-09 09:50:00,10.56,10.6,10.55,10.57,1555.0,1643491.0
+2024-07-09 09:55:00,10.57,10.59,10.54,10.55,861.0,909491.0
+2024-07-09 10:00:00,10.55,10.55,10.48,10.49,1522.0,1600408.0
+2024-07-09 10:05:00,10.49,10.49,10.46,10.46,2169.0,2271516.0
+2024-07-09 10:10:00,10.46,10.46,10.41,10.41,3412.0,3560018.0
+2024-07-09 10:15:00,10.42,10.42,10.39,10.41,2996.0,3117497.0
+2024-07-09 10:20:00,10.41,10.41,10.37,10.4,2092.0,2173427.0
+2024-07-09 10:25:00,10.4,10.4,10.37,10.38,1564.0,1624253.0
+2024-07-09 10:30:00,10.38,10.38,10.33,10.33,3070.0,3179748.0
+2024-07-09 10:35:00,10.33,10.34,10.32,10.33,3269.0,3375685.0
+2024-07-09 10:40:00,10.32,10.33,10.29,10.31,4209.0,4339847.0
+2024-07-09 10:45:00,10.3,10.31,10.28,10.28,1749.0,1801003.0
+2024-07-09 10:50:00,10.28,10.3,10.26,10.28,2003.0,2058711.0
+2024-07-09 10:55:00,10.29,10.29,10.27,10.29,1121.0,1152321.0
+2024-07-09 11:00:00,10.29,10.29,10.24,10.27,2202.0,2260881.0
+2024-07-09 11:05:00,10.27,10.34,10.27,10.34,1361.0,1403514.0
+2024-07-09 11:10:00,10.34,10.36,10.34,10.35,1242.0,1285195.0
+2024-07-09 11:15:00,10.35,10.36,10.32,10.35,1260.0,1302408.0
+2024-07-09 11:20:00,10.36,10.46,10.35,10.45,3189.0,3323332.0
+2024-07-09 11:25:00,10.45,10.47,10.4,10.4,2023.0,2113503.0
+2024-07-09 11:30:00,10.4,10.41,10.37,10.41,534.0,555030.0
+2024-07-09 13:05:00,10.4,10.46,10.4,10.46,1252.0,1307531.0
+2024-07-09 13:10:00,10.46,10.47,10.43,10.44,975.0,1018822.0
+2024-07-09 13:15:00,10.44,10.44,10.4,10.4,2434.0,2535575.0
+2024-07-09 13:20:00,10.42,10.44,10.41,10.43,340.0,354460.0
+2024-07-09 13:25:00,10.42,10.45,10.42,10.44,859.0,896813.0
+2024-07-09 13:30:00,10.44,10.45,10.41,10.45,931.0,971144.0
+2024-07-09 13:35:00,10.45,10.49,10.45,10.49,1330.0,1393022.0
+2024-07-09 13:40:00,10.48,10.49,10.47,10.49,1090.0,1142862.0
+2024-07-09 13:45:00,10.48,10.54,10.48,10.54,1861.0,1955380.0
+2024-07-09 13:50:00,10.54,10.55,10.52,10.54,1949.0,2053176.0
+2024-07-09 13:55:00,10.53,10.55,10.51,10.52,2865.0,3015859.0
+2024-07-09 14:00:00,10.52,10.54,10.51,10.52,1025.0,1078670.0
+2024-07-09 14:05:00,10.53,10.57,10.53,10.57,1519.0,1604052.0
+2024-07-09 14:10:00,10.57,10.58,10.56,10.56,1369.0,1446944.0
+2024-07-09 14:15:00,10.57,10.57,10.55,10.57,1367.0,1444127.0
+2024-07-09 14:20:00,10.57,10.58,10.56,10.57,576.0,608714.0
+2024-07-09 14:25:00,10.56,10.57,10.56,10.56,1204.0,1272133.0
+2024-07-09 14:30:00,10.55,10.57,10.55,10.56,744.0,785809.0
+2024-07-09 14:35:00,10.57,10.57,10.56,10.56,1162.0,1227687.0
+2024-07-09 14:40:00,10.56,10.57,10.52,10.53,1375.0,1449840.0
+2024-07-09 14:45:00,10.53,10.54,10.52,10.53,564.0,594052.0
+2024-07-09 14:50:00,10.53,10.54,10.52,10.52,864.0,909501.0
+2024-07-09 14:55:00,10.52,10.56,10.52,10.55,2702.0,2847419.0
+2024-07-09 15:00:00,10.55,10.55,10.54,10.54,1159.0,1222271.0
+2024-07-10 09:35:00,10.48,10.48,10.35,10.37,7327.0,7624027.0
+2024-07-10 09:40:00,10.38,10.44,10.37,10.44,3427.0,3561567.0
+2024-07-10 09:45:00,10.44,10.46,10.42,10.43,1839.0,1919385.0
+2024-07-10 09:50:00,10.43,10.5,10.43,10.5,3730.0,3900131.0
+2024-07-10 09:55:00,10.49,10.5,10.47,10.47,2522.0,2643842.0
+2024-07-10 10:00:00,10.48,10.51,10.46,10.46,1508.0,1581131.0
+2024-07-10 10:05:00,10.46,10.47,10.46,10.47,1008.0,1054384.0
+2024-07-10 10:10:00,10.47,10.47,10.45,10.45,1695.0,1773182.0
+2024-07-10 10:15:00,10.46,10.46,10.43,10.44,2095.0,2187845.0
+2024-07-10 10:20:00,10.45,10.45,10.42,10.43,1326.0,1383375.0
+2024-07-10 10:25:00,10.43,10.43,10.39,10.39,2020.0,2102798.0
+2024-07-10 10:30:00,10.4,10.4,10.31,10.33,7663.0,7927625.0
+2024-07-10 10:35:00,10.32,10.35,10.31,10.33,4948.0,5109220.0
+2024-07-10 10:40:00,10.32,10.33,10.18,10.22,11024.0,11308732.0
+2024-07-10 10:45:00,10.23,10.26,10.21,10.25,4788.0,4898809.0
+2024-07-10 10:50:00,10.25,10.25,10.22,10.23,1916.0,1960327.0
+2024-07-10 10:55:00,10.22,10.24,10.22,10.23,1679.0,1717372.0
+2024-07-10 11:00:00,10.24,10.24,10.19,10.21,3998.0,4079745.0
+2024-07-10 11:05:00,10.22,10.22,10.2,10.21,1206.0,1230683.0
+2024-07-10 11:10:00,10.21,10.23,10.19,10.23,1522.0,1553598.0
+2024-07-10 11:15:00,10.22,10.23,10.2,10.23,1236.0,1262112.0
+2024-07-10 11:20:00,10.22,10.23,10.22,10.23,502.0,513275.0
+2024-07-10 11:25:00,10.23,10.24,10.23,10.23,439.0,449215.0
+2024-07-10 11:30:00,10.24,10.25,10.23,10.25,839.0,859406.0
+2024-07-10 13:05:00,10.25,10.25,10.22,10.23,1124.0,1150912.0
+2024-07-10 13:10:00,10.23,10.27,10.23,10.25,988.0,1012692.0
+2024-07-10 13:15:00,10.25,10.31,10.25,10.3,1245.0,1280532.0
+2024-07-10 13:20:00,10.31,10.31,10.26,10.27,985.0,1012555.0
+2024-07-10 13:25:00,10.27,10.3,10.27,10.29,666.0,684428.0
+2024-07-10 13:30:00,10.28,10.3,10.28,10.3,872.0,897523.0
+2024-07-10 13:35:00,10.29,10.31,10.27,10.27,1014.0,1043868.0
+2024-07-10 13:40:00,10.27,10.28,10.25,10.25,730.0,749619.0
+2024-07-10 13:45:00,10.25,10.27,10.24,10.25,800.0,820310.0
+2024-07-10 13:50:00,10.25,10.26,10.24,10.24,607.0,622273.0
+2024-07-10 13:55:00,10.24,10.25,10.24,10.25,2173.0,2226728.0
+2024-07-10 14:00:00,10.25,10.25,10.22,10.24,716.0,732822.0
+2024-07-10 14:05:00,10.24,10.25,10.24,10.25,534.0,547038.0
+2024-07-10 14:10:00,10.25,10.26,10.24,10.26,1312.0,1344641.0
+2024-07-10 14:15:00,10.27,10.27,10.24,10.24,468.0,480032.0
+2024-07-10 14:20:00,10.25,10.25,10.22,10.24,1692.0,1731958.0
+2024-07-10 14:25:00,10.23,10.24,10.23,10.24,594.0,608098.0
+2024-07-10 14:30:00,10.24,10.25,10.23,10.23,1043.0,1068429.0
+2024-07-10 14:35:00,10.24,10.24,10.22,10.22,806.0,823985.0
+2024-07-10 14:40:00,10.22,10.23,10.21,10.21,2392.0,2443490.0
+2024-07-10 14:45:00,10.22,10.22,10.21,10.22,560.0,572084.0
+2024-07-10 14:50:00,10.23,10.24,10.22,10.23,2508.0,2565081.0
+2024-07-10 14:55:00,10.22,10.23,10.22,10.23,1823.0,1863991.0
+2024-07-10 15:00:00,10.22,10.23,10.22,10.23,1693.0,1731757.0
+2024-07-11 09:35:00,10.37,10.45,10.36,10.39,15451.0,16076145.0
+2024-07-11 09:40:00,10.4,10.41,10.38,10.38,3316.0,3445046.0
+2024-07-11 09:45:00,10.38,10.4,10.36,10.38,3623.0,3760284.0
+2024-07-11 09:50:00,10.39,10.41,10.38,10.38,1804.0,1874715.0
+2024-07-11 09:55:00,10.38,10.39,10.34,10.35,2627.0,2720927.0
+2024-07-11 10:00:00,10.35,10.37,10.33,10.33,5360.0,5545112.0
+2024-07-11 10:05:00,10.34,10.37,10.32,10.35,3118.0,3224468.0
+2024-07-11 10:10:00,10.37,10.39,10.35,10.37,2541.0,2634754.0
+2024-07-11 10:15:00,10.37,10.39,10.36,10.38,3289.0,3412126.0
+2024-07-11 10:20:00,10.38,10.39,10.36,10.38,2615.0,2713296.0
+2024-07-11 10:25:00,10.38,10.39,10.36,10.37,2505.0,2597944.0
+2024-07-11 10:30:00,10.36,10.38,10.36,10.37,608.0,630535.0
+2024-07-11 10:35:00,10.38,10.42,10.38,10.4,3609.0,3754553.0
+2024-07-11 10:40:00,10.4,10.43,10.4,10.43,1709.0,1779939.0
+2024-07-11 10:45:00,10.43,10.43,10.41,10.42,849.0,884675.0
+2024-07-11 10:50:00,10.43,10.45,10.43,10.44,2267.0,2366587.0
+2024-07-11 10:55:00,10.44,10.45,10.42,10.42,1657.0,1729169.0
+2024-07-11 11:00:00,10.42,10.42,10.41,10.42,1027.0,1069510.0
+2024-07-11 11:05:00,10.41,10.43,10.39,10.39,2318.0,2410859.0
+2024-07-11 11:10:00,10.39,10.44,10.39,10.44,2385.0,2483740.0
+2024-07-11 11:15:00,10.43,10.44,10.42,10.43,2234.0,2330490.0
+2024-07-11 11:20:00,10.44,10.46,10.43,10.43,2098.0,2191337.0
+2024-07-11 11:25:00,10.44,10.45,10.43,10.43,884.0,922938.0
+2024-07-11 11:30:00,10.43,10.44,10.42,10.43,820.0,855092.0
+2024-07-11 13:05:00,10.44,10.44,10.41,10.41,807.0,840857.0
+2024-07-11 13:10:00,10.41,10.42,10.4,10.42,889.0,925712.0
+2024-07-11 13:15:00,10.41,10.42,10.4,10.4,589.0,613095.0
+2024-07-11 13:20:00,10.41,10.42,10.38,10.38,1164.0,1210140.0
+2024-07-11 13:25:00,10.38,10.41,10.38,10.4,1043.0,1084039.0
+2024-07-11 13:30:00,10.39,10.41,10.39,10.4,620.0,644277.0
+2024-07-11 13:35:00,10.38,10.4,10.38,10.4,837.0,869493.0
+2024-07-11 13:40:00,10.39,10.4,10.38,10.4,1468.0,1524782.0
+2024-07-11 13:45:00,10.39,10.4,10.38,10.39,757.0,786392.0
+2024-07-11 13:50:00,10.4,10.4,10.38,10.38,904.0,938948.0
+2024-07-11 13:55:00,10.39,10.41,10.38,10.4,731.0,759609.0
+2024-07-11 14:00:00,10.4,10.41,10.39,10.41,684.0,710669.0
+2024-07-11 14:05:00,10.39,10.41,10.39,10.39,851.0,884721.0
+2024-07-11 14:10:00,10.39,10.4,10.38,10.38,1533.0,1592735.0
+2024-07-11 14:15:00,10.38,10.4,10.38,10.38,662.0,687339.0
+2024-07-11 14:20:00,10.38,10.39,10.37,10.39,943.0,978965.0
+2024-07-11 14:25:00,10.38,10.39,10.38,10.38,940.0,976071.0
+2024-07-11 14:30:00,10.38,10.39,10.37,10.39,349.0,362390.0
+2024-07-11 14:35:00,10.39,10.4,10.38,10.39,1748.0,1816188.0
+2024-07-11 14:40:00,10.38,10.4,10.38,10.38,578.0,600427.0
+2024-07-11 14:45:00,10.38,10.4,10.38,10.39,960.0,997348.0
+2024-07-11 14:50:00,10.39,10.4,10.38,10.39,643.0,668252.0
+2024-07-11 14:55:00,10.4,10.4,10.38,10.4,2594.0,2695804.0
+2024-07-11 15:00:00,10.4,10.4,10.38,10.4,1530.0,1590637.0
+2024-07-12 09:35:00,10.38,10.42,10.35,10.41,3569.0,3707440.0
+2024-07-12 09:40:00,10.4,10.45,10.38,10.45,3707.0,3857691.0
+2024-07-12 09:45:00,10.44,10.48,10.43,10.46,2525.0,2640921.0
+2024-07-12 09:50:00,10.46,10.47,10.42,10.44,1591.0,1661426.0
+2024-07-12 09:55:00,10.44,10.48,10.44,10.48,3042.0,3183222.0
+2024-07-12 10:00:00,10.47,10.47,10.44,10.46,1159.0,1211614.0
+2024-07-12 10:05:00,10.46,10.46,10.42,10.42,1104.0,1152444.0
+2024-07-12 10:10:00,10.42,10.45,10.42,10.45,1072.0,1118806.0
+2024-07-12 10:15:00,10.46,10.46,10.45,10.45,1132.0,1183301.0
+2024-07-12 10:20:00,10.46,10.48,10.45,10.45,1352.0,1414504.0
+2024-07-12 10:25:00,10.46,10.46,10.43,10.44,848.0,885988.0
+2024-07-12 10:30:00,10.44,10.44,10.42,10.43,2063.0,2152426.0
+2024-07-12 10:35:00,10.43,10.44,10.42,10.42,970.0,1011724.0
+2024-07-12 10:40:00,10.42,10.43,10.4,10.41,2793.0,2908562.0
+2024-07-12 10:45:00,10.4,10.42,10.4,10.42,914.0,951601.0
+2024-07-12 10:50:00,10.41,10.42,10.41,10.41,1222.0,1272142.0
+2024-07-12 10:55:00,10.4,10.4,10.37,10.39,1625.0,1687756.0
+2024-07-12 11:00:00,10.38,10.39,10.36,10.38,2283.0,2369528.0
+2024-07-12 11:05:00,10.38,10.39,10.38,10.38,549.0,570314.0
+2024-07-12 11:10:00,10.39,10.39,10.37,10.38,605.0,627914.0
+2024-07-12 11:15:00,10.38,10.38,10.37,10.37,315.0,326905.0
+2024-07-12 11:20:00,10.37,10.38,10.36,10.36,522.0,541173.0
+2024-07-12 11:25:00,10.36,10.38,10.36,10.38,411.0,426237.0
+2024-07-12 11:30:00,10.38,10.38,10.36,10.37,393.0,407609.0
+2024-07-12 13:05:00,10.37,10.38,10.37,10.37,766.0,794328.0
+2024-07-12 13:10:00,10.38,10.38,10.37,10.38,459.0,476210.0
+2024-07-12 13:15:00,10.37,10.39,10.37,10.39,445.0,462018.0
+2024-07-12 13:20:00,10.39,10.39,10.36,10.37,713.0,739329.0
+2024-07-12 13:25:00,10.36,10.37,10.36,10.36,226.0,234345.0
+2024-07-12 13:30:00,10.36,10.37,10.36,10.37,254.0,263374.0
+2024-07-12 13:35:00,10.37,10.38,10.36,10.37,1014.0,1051480.0
+2024-07-12 13:40:00,10.37,10.39,10.36,10.38,1520.0,1575883.0
+2024-07-12 13:45:00,10.38,10.4,10.37,10.4,717.0,744450.0
+2024-07-12 13:50:00,10.4,10.41,10.39,10.41,1381.0,1437015.0
+2024-07-12 13:55:00,10.41,10.45,10.41,10.44,2454.0,2560872.0
+2024-07-12 14:00:00,10.44,10.44,10.42,10.44,573.0,597841.0
+2024-07-12 14:05:00,10.44,10.46,10.42,10.45,2195.0,2291424.0
+2024-07-12 14:10:00,10.45,10.48,10.45,10.48,3091.0,3235293.0
+2024-07-12 14:15:00,10.48,10.5,10.46,10.49,2388.0,2502943.0
+2024-07-12 14:20:00,10.49,10.5,10.47,10.47,1458.0,1528983.0
+2024-07-12 14:25:00,10.47,10.49,10.47,10.48,515.0,539640.0
+2024-07-12 14:30:00,10.47,10.47,10.44,10.45,1175.0,1228654.0
+2024-07-12 14:35:00,10.47,10.47,10.42,10.42,1056.0,1101947.0
+2024-07-12 14:40:00,10.43,10.44,10.41,10.43,1018.0,1060727.0
+2024-07-12 14:45:00,10.44,10.44,10.41,10.41,333.0,347016.0
+2024-07-12 14:50:00,10.42,10.43,10.41,10.43,601.0,626257.0
+2024-07-12 14:55:00,10.43,10.43,10.42,10.42,835.0,870464.0
+2024-07-12 15:00:00,10.43,10.45,10.42,10.43,2173.0,2267683.0
+2024-07-15 09:35:00,10.47,10.71,10.47,10.68,19564.0,20789180.0
+2024-07-15 09:40:00,10.68,10.72,10.63,10.64,10866.0,11612143.0
+2024-07-15 09:45:00,10.64,10.64,10.6,10.61,3702.0,3929983.0
+2024-07-15 09:50:00,10.6,10.61,10.58,10.6,3645.0,3862960.0
+2024-07-15 09:55:00,10.59,10.62,10.59,10.61,2195.0,2327797.0
+2024-07-15 10:00:00,10.6,10.61,10.57,10.58,2565.0,2716577.0
+2024-07-15 10:05:00,10.57,10.57,10.54,10.55,2552.0,2692938.0
+2024-07-15 10:10:00,10.55,10.56,10.53,10.54,2513.0,2649679.0
+2024-07-15 10:15:00,10.53,10.63,10.53,10.6,4871.0,5159016.0
+2024-07-15 10:20:00,10.61,10.61,10.57,10.57,1299.0,1374835.0
+2024-07-15 10:25:00,10.58,10.58,10.56,10.56,1523.0,1610194.0
+2024-07-15 10:30:00,10.56,10.57,10.55,10.55,543.0,573275.0
+2024-07-15 10:35:00,10.55,10.55,10.52,10.53,1155.0,1216506.0
+2024-07-15 10:40:00,10.53,10.55,10.53,10.54,1392.0,1466441.0
+2024-07-15 10:45:00,10.54,10.54,10.52,10.52,752.0,792283.0
+2024-07-15 10:50:00,10.53,10.53,10.51,10.53,866.0,911133.0
+2024-07-15 10:55:00,10.52,10.53,10.51,10.52,338.0,355649.0
+2024-07-15 11:00:00,10.52,10.53,10.51,10.52,1313.0,1381018.0
+2024-07-15 11:05:00,10.52,10.52,10.48,10.48,1870.0,1963117.0
+2024-07-15 11:10:00,10.49,10.54,10.49,10.53,1480.0,1555231.0
+2024-07-15 11:15:00,10.54,10.56,10.51,10.51,1578.0,1663424.0
+2024-07-15 11:20:00,10.52,10.55,10.51,10.55,1052.0,1107327.0
+2024-07-15 11:25:00,10.55,10.56,10.53,10.53,649.0,684511.0
+2024-07-15 11:30:00,10.54,10.54,10.51,10.54,629.0,661965.0
+2024-07-15 13:05:00,10.54,10.56,10.52,10.56,1066.0,1124135.0
+2024-07-15 13:10:00,10.56,10.58,10.53,10.53,1355.0,1430689.0
+2024-07-15 13:15:00,10.54,10.54,10.51,10.52,832.0,875558.0
+2024-07-15 13:20:00,10.52,10.53,10.51,10.52,938.0,987245.0
+2024-07-15 13:25:00,10.52,10.53,10.51,10.52,299.0,314509.0
+2024-07-15 13:30:00,10.51,10.52,10.51,10.52,304.0,319705.0
+2024-07-15 13:35:00,10.52,10.53,10.5,10.5,1073.0,1127731.0
+2024-07-15 13:40:00,10.5,10.53,10.49,10.53,1476.0,1551089.0
+2024-07-15 13:45:00,10.53,10.53,10.5,10.5,1663.0,1748948.0
+2024-07-15 13:50:00,10.49,10.5,10.45,10.47,3136.0,3285101.0
+2024-07-15 13:55:00,10.46,10.48,10.45,10.48,851.0,890384.0
+2024-07-15 14:00:00,10.48,10.51,10.47,10.5,978.0,1025134.0
+2024-07-15 14:05:00,10.5,10.5,10.48,10.49,384.0,402918.0
+2024-07-15 14:10:00,10.49,10.51,10.48,10.5,462.0,485007.0
+2024-07-15 14:15:00,10.51,10.52,10.5,10.52,657.0,690632.0
+2024-07-15 14:20:00,10.52,10.52,10.5,10.52,887.0,932741.0
+2024-07-15 14:25:00,10.51,10.52,10.49,10.5,1398.0,1468094.0
+2024-07-15 14:30:00,10.5,10.5,10.48,10.5,873.0,915692.0
+2024-07-15 14:35:00,10.5,10.5,10.48,10.48,585.0,613793.0
+2024-07-15 14:40:00,10.49,10.51,10.48,10.51,979.0,1027161.0
+2024-07-15 14:45:00,10.51,10.52,10.5,10.5,1895.0,1991216.0
+2024-07-15 14:50:00,10.52,10.52,10.5,10.51,1048.0,1101838.0
+2024-07-15 14:55:00,10.5,10.5,10.49,10.5,1447.0,1518688.0
+2024-07-15 15:00:00,10.5,10.51,10.49,10.5,1463.0,1536046.0
+2024-07-16 09:35:00,10.51,10.53,10.38,10.44,7816.0,8165307.0
+2024-07-16 09:40:00,10.44,10.52,10.44,10.5,3729.0,3907407.0
+2024-07-16 09:45:00,10.51,10.58,10.5,10.58,3909.0,4116014.0
+2024-07-16 09:50:00,10.57,10.57,10.51,10.53,2082.0,2195202.0
+2024-07-16 09:55:00,10.52,10.53,10.49,10.5,1453.0,1526729.0
+2024-07-16 10:00:00,10.5,10.51,10.49,10.5,947.0,994257.0
+2024-07-16 10:05:00,10.5,10.51,10.49,10.5,946.0,993503.0
+2024-07-16 10:10:00,10.5,10.52,10.49,10.52,1514.0,1589328.0
+2024-07-16 10:15:00,10.52,10.53,10.5,10.51,619.0,650593.0
+2024-07-16 10:20:00,10.51,10.51,10.48,10.48,2161.0,2267970.0
+2024-07-16 10:25:00,10.48,10.49,10.46,10.46,1655.0,1733308.0
+2024-07-16 10:30:00,10.46,10.48,10.45,10.47,982.0,1027034.0
+2024-07-16 10:35:00,10.46,10.5,10.46,10.5,591.0,619352.0
+2024-07-16 10:40:00,10.5,10.5,10.48,10.48,738.0,774260.0
+2024-07-16 10:45:00,10.49,10.5,10.48,10.49,325.0,340925.0
+2024-07-16 10:50:00,10.5,10.51,10.49,10.5,459.0,482009.0
+2024-07-16 10:55:00,10.5,10.51,10.49,10.5,692.0,726639.0
+2024-07-16 11:00:00,10.5,10.51,10.5,10.5,107.0,112396.0
+2024-07-16 11:05:00,10.5,10.5,10.48,10.48,189.0,198371.0
+2024-07-16 11:10:00,10.48,10.49,10.47,10.47,280.0,293366.0
+2024-07-16 11:15:00,10.47,10.47,10.46,10.46,719.0,752511.0
+2024-07-16 11:20:00,10.46,10.47,10.46,10.46,323.0,337876.0
+2024-07-16 11:25:00,10.46,10.47,10.46,10.47,676.0,707383.0
+2024-07-16 11:30:00,10.46,10.48,10.46,10.48,897.0,939113.0
+2024-07-16 13:05:00,10.48,10.53,10.47,10.51,2728.0,2863349.0
+2024-07-16 13:10:00,10.51,10.54,10.5,10.53,5306.0,5585616.0
+2024-07-16 13:15:00,10.53,10.54,10.51,10.52,925.0,973819.0
+2024-07-16 13:20:00,10.53,10.53,10.5,10.51,405.0,426035.0
+2024-07-16 13:25:00,10.5,10.51,10.5,10.51,192.0,201778.0
+2024-07-16 13:30:00,10.5,10.51,10.49,10.51,614.0,644670.0
+2024-07-16 13:35:00,10.51,10.53,10.51,10.52,642.0,675225.0
+2024-07-16 13:40:00,10.53,10.53,10.51,10.53,481.0,506078.0
+2024-07-16 13:45:00,10.53,10.54,10.53,10.54,1114.0,1173596.0
+2024-07-16 13:50:00,10.54,10.54,10.52,10.52,1088.0,1145952.0
+2024-07-16 13:55:00,10.52,10.53,10.51,10.51,1119.0,1176370.0
+2024-07-16 14:00:00,10.52,10.52,10.5,10.5,2070.0,2173949.0
+2024-07-16 14:05:00,10.5,10.51,10.48,10.48,1271.0,1333599.0
+2024-07-16 14:10:00,10.48,10.49,10.46,10.46,1990.0,2085511.0
+2024-07-16 14:15:00,10.46,10.48,10.46,10.47,938.0,982201.0
+2024-07-16 14:20:00,10.47,10.48,10.46,10.47,1406.0,1472048.0
+2024-07-16 14:25:00,10.48,10.48,10.45,10.46,2145.0,2244508.0
+2024-07-16 14:30:00,10.46,10.46,10.45,10.45,1142.0,1193570.0
+2024-07-16 14:35:00,10.46,10.46,10.43,10.43,2160.0,2254821.0
+2024-07-16 14:40:00,10.43,10.44,10.42,10.43,2385.0,2486861.0
+2024-07-16 14:45:00,10.43,10.44,10.42,10.44,3285.0,3424673.0
+2024-07-16 14:50:00,10.43,10.45,10.42,10.45,2194.0,2288156.0
+2024-07-16 14:55:00,10.46,10.48,10.45,10.48,937.0,980316.0
+2024-07-16 15:00:00,10.47,10.48,10.46,10.46,904.0,946192.0
+2024-07-17 09:35:00,10.49,10.52,10.45,10.48,3110.0,3262932.0
+2024-07-17 09:40:00,10.48,10.54,10.48,10.51,5297.0,5571323.0
+2024-07-17 09:45:00,10.51,10.52,10.48,10.48,1542.0,1618979.0
+2024-07-17 09:50:00,10.48,10.48,10.46,10.47,1200.0,1256573.0
+2024-07-17 09:55:00,10.47,10.47,10.45,10.47,1463.0,1530026.0
+2024-07-17 10:00:00,10.47,10.47,10.45,10.46,763.0,798037.0
+2024-07-17 10:05:00,10.46,10.49,10.45,10.46,1703.0,1783315.0
+2024-07-17 10:10:00,10.47,10.47,10.46,10.47,192.0,200955.0
+2024-07-17 10:15:00,10.46,10.46,10.43,10.44,1858.0,1941142.0
+2024-07-17 10:20:00,10.45,10.46,10.44,10.46,349.0,364627.0
+2024-07-17 10:25:00,10.46,10.46,10.45,10.46,470.0,491561.0
+2024-07-17 10:30:00,10.47,10.48,10.46,10.48,544.0,569752.0
+2024-07-17 10:35:00,10.48,10.49,10.47,10.47,203.0,212665.0
+2024-07-17 10:40:00,10.48,10.49,10.47,10.48,486.0,509440.0
+2024-07-17 10:45:00,10.49,10.5,10.48,10.5,614.0,644302.0
+2024-07-17 10:50:00,10.5,10.5,10.48,10.49,335.0,351435.0
+2024-07-17 10:55:00,10.48,10.49,10.47,10.49,963.0,1009205.0
+2024-07-17 11:00:00,10.49,10.5,10.47,10.47,1311.0,1373486.0
+2024-07-17 11:05:00,10.48,10.48,10.47,10.47,225.0,235688.0
+2024-07-17 11:10:00,10.49,10.5,10.47,10.5,2217.0,2323890.0
+2024-07-17 11:15:00,10.49,10.52,10.49,10.51,1529.0,1605667.0
+2024-07-17 11:20:00,10.51,10.56,10.5,10.55,5555.0,5852251.0
+2024-07-17 11:25:00,10.55,10.58,10.55,10.56,2816.0,2974165.0
+2024-07-17 11:30:00,10.55,10.57,10.54,10.56,3296.0,3477444.0
+2024-07-17 13:05:00,10.56,10.56,10.54,10.55,1224.0,1291952.0
+2024-07-17 13:10:00,10.55,10.56,10.53,10.54,1813.0,1911252.0
+2024-07-17 13:15:00,10.54,10.55,10.54,10.55,536.0,565138.0
+2024-07-17 13:20:00,10.54,10.55,10.54,10.54,987.0,1040963.0
+2024-07-17 13:25:00,10.54,10.55,10.53,10.53,396.0,417059.0
+2024-07-17 13:30:00,10.52,10.54,10.52,10.52,985.0,1037275.0
+2024-07-17 13:35:00,10.53,10.55,10.52,10.54,726.0,764853.0
+2024-07-17 13:40:00,10.54,10.55,10.53,10.54,1170.0,1233424.0
+2024-07-17 13:45:00,10.53,10.54,10.53,10.54,256.0,269734.0
+2024-07-17 13:50:00,10.53,10.54,10.52,10.54,2420.0,2547211.0
+2024-07-17 13:55:00,10.54,10.55,10.53,10.53,1155.0,1217299.0
+2024-07-17 14:00:00,10.53,10.55,10.53,10.53,2078.0,2190501.0
+2024-07-17 14:05:00,10.54,10.54,10.53,10.54,2614.0,2753828.0
+2024-07-17 14:10:00,10.53,10.54,10.53,10.54,432.0,455234.0
+2024-07-17 14:15:00,10.53,10.54,10.53,10.54,1895.0,1997147.0
+2024-07-17 14:20:00,10.54,10.54,10.53,10.54,282.0,297193.0
+2024-07-17 14:25:00,10.54,10.54,10.52,10.54,887.0,934047.0
+2024-07-17 14:30:00,10.53,10.55,10.53,10.54,1787.0,1883324.0
+2024-07-17 14:35:00,10.54,10.55,10.53,10.54,1684.0,1774950.0
+2024-07-17 14:40:00,10.54,10.54,10.53,10.54,1001.0,1054331.0
+2024-07-17 14:45:00,10.54,10.54,10.53,10.53,1325.0,1395878.0
+2024-07-17 14:50:00,10.54,10.54,10.53,10.54,1330.0,1401324.0
+2024-07-17 14:55:00,10.54,10.54,10.52,10.53,2495.0,2627625.0
+2024-07-17 15:00:00,10.53,10.53,10.51,10.51,1927.0,2025513.0
+2024-07-18 09:35:00,10.53,10.53,10.42,10.45,6903.0,7230731.0
+2024-07-18 09:40:00,10.45,10.48,10.44,10.45,1520.0,1589609.0
+2024-07-18 09:45:00,10.45,10.47,10.44,10.44,1256.0,1312756.0
+2024-07-18 09:50:00,10.44,10.44,10.41,10.42,3255.0,3392651.0
+2024-07-18 09:55:00,10.42,10.42,10.37,10.41,4231.0,4396935.0
+2024-07-18 10:00:00,10.41,10.43,10.4,10.42,1199.0,1248177.0
+2024-07-18 10:05:00,10.42,10.48,10.42,10.42,2014.0,2103165.0
+2024-07-18 10:10:00,10.42,10.43,10.4,10.41,2226.0,2318149.0
+2024-07-18 10:15:00,10.41,10.43,10.4,10.41,426.0,443762.0
+2024-07-18 10:20:00,10.41,10.42,10.41,10.42,488.0,508293.0
+2024-07-18 10:25:00,10.41,10.42,10.4,10.4,1271.0,1322659.0
+2024-07-18 10:30:00,10.42,10.45,10.41,10.44,665.0,693552.0
+2024-07-18 10:35:00,10.44,10.46,10.43,10.46,1236.0,1290918.0
+2024-07-18 10:40:00,10.46,10.46,10.44,10.44,596.0,622810.0
+2024-07-18 10:45:00,10.44,10.45,10.43,10.44,202.0,210859.0
+2024-07-18 10:50:00,10.44,10.45,10.43,10.45,407.0,424662.0
+2024-07-18 10:55:00,10.44,10.45,10.43,10.45,375.0,391568.0
+2024-07-18 11:00:00,10.45,10.45,10.43,10.43,647.0,675899.0
+2024-07-18 11:05:00,10.43,10.45,10.42,10.42,431.0,449681.0
+2024-07-18 11:10:00,10.44,10.44,10.42,10.42,635.0,661931.0
+2024-07-18 11:15:00,10.42,10.43,10.41,10.42,831.0,865580.0
+2024-07-18 11:20:00,10.43,10.44,10.41,10.43,778.0,810948.0
+2024-07-18 11:25:00,10.43,10.43,10.41,10.41,758.0,789939.0
+2024-07-18 11:30:00,10.42,10.43,10.41,10.43,438.0,456320.0
+2024-07-18 13:05:00,10.42,10.44,10.41,10.44,509.0,530006.0
+2024-07-18 13:10:00,10.45,10.47,10.44,10.44,1250.0,1307347.0
+2024-07-18 13:15:00,10.45,10.5,10.45,10.5,1766.0,1850252.0
+2024-07-18 13:20:00,10.5,10.51,10.49,10.49,1228.0,1289387.0
+2024-07-18 13:25:00,10.49,10.51,10.49,10.49,702.0,736814.0
+2024-07-18 13:30:00,10.5,10.5,10.49,10.5,212.0,222532.0
+2024-07-18 13:35:00,10.5,10.53,10.5,10.53,1432.0,1506231.0
+2024-07-18 13:40:00,10.53,10.53,10.5,10.51,1031.0,1084249.0
+2024-07-18 13:45:00,10.51,10.53,10.51,10.51,1617.0,1700920.0
+2024-07-18 13:50:00,10.52,10.52,10.49,10.5,873.0,917258.0
+2024-07-18 13:55:00,10.5,10.51,10.49,10.5,857.0,900252.0
+2024-07-18 14:00:00,10.49,10.53,10.49,10.52,1077.0,1132610.0
+2024-07-18 14:05:00,10.53,10.53,10.51,10.52,363.0,381494.0
+2024-07-18 14:10:00,10.51,10.52,10.5,10.5,401.0,421394.0
+2024-07-18 14:15:00,10.5,10.52,10.5,10.51,1049.0,1102742.0
+2024-07-18 14:20:00,10.51,10.52,10.5,10.51,788.0,828183.0
+2024-07-18 14:25:00,10.52,10.52,10.5,10.52,1049.0,1102751.0
+2024-07-18 14:30:00,10.51,10.53,10.51,10.53,536.0,563965.0
+2024-07-18 14:35:00,10.53,10.53,10.52,10.52,366.0,385092.0
+2024-07-18 14:40:00,10.52,10.52,10.5,10.51,633.0,665176.0
+2024-07-18 14:45:00,10.51,10.51,10.48,10.5,912.0,956680.0
+2024-07-18 14:50:00,10.49,10.5,10.49,10.5,218.0,228788.0
+2024-07-18 14:55:00,10.49,10.52,10.49,10.52,3605.0,3787001.0
+2024-07-18 15:00:00,10.51,10.53,10.51,10.51,2779.0,2922266.0
+2024-07-19 09:35:00,10.45,10.57,10.45,10.55,6163.0,6495367.0
+2024-07-19 09:40:00,10.56,10.6,10.56,10.57,4926.0,5213031.0
+2024-07-19 09:45:00,10.58,10.59,10.55,10.55,1243.0,1313234.0
+2024-07-19 09:50:00,10.56,10.57,10.54,10.55,1337.0,1411033.0
+2024-07-19 09:55:00,10.56,10.56,10.53,10.54,1454.0,1532641.0
+2024-07-19 10:00:00,10.53,10.54,10.5,10.51,1509.0,1587040.0
+2024-07-19 10:05:00,10.52,10.52,10.49,10.51,1069.0,1122246.0
+2024-07-19 10:10:00,10.51,10.53,10.5,10.52,872.0,917109.0
+2024-07-19 10:15:00,10.53,10.54,10.52,10.52,1359.0,1431685.0
+2024-07-19 10:20:00,10.52,10.53,10.51,10.52,554.0,582810.0
+2024-07-19 10:25:00,10.52,10.52,10.51,10.52,166.0,174612.0
+2024-07-19 10:30:00,10.51,10.52,10.5,10.51,814.0,855443.0
+2024-07-19 10:35:00,10.5,10.51,10.5,10.51,605.0,635789.0
+2024-07-19 10:40:00,10.52,10.52,10.51,10.52,367.0,386021.0
+2024-07-19 10:45:00,10.52,10.54,10.52,10.54,508.0,534802.0
+2024-07-19 10:50:00,10.54,10.56,10.53,10.55,1681.0,1773511.0
+2024-07-19 10:55:00,10.54,10.56,10.54,10.56,639.0,674248.0
+2024-07-19 11:00:00,10.56,10.56,10.54,10.55,189.0,199406.0
+2024-07-19 11:05:00,10.55,10.57,10.55,10.56,731.0,771909.0
+2024-07-19 11:10:00,10.56,10.56,10.54,10.54,470.0,495855.0
+2024-07-19 11:15:00,10.55,10.56,10.55,10.56,372.0,392650.0
+2024-07-19 11:20:00,10.56,10.56,10.53,10.56,1929.0,2034934.0
+2024-07-19 11:25:00,10.56,10.57,10.56,10.56,599.0,632730.0
+2024-07-19 11:30:00,10.56,10.56,10.55,10.56,205.0,216367.0
+2024-07-19 13:05:00,10.55,10.56,10.55,10.55,1112.0,1174256.0
+2024-07-19 13:10:00,10.56,10.56,10.55,10.56,982.0,1036511.0
+2024-07-19 13:15:00,10.56,10.56,10.53,10.54,1049.0,1106121.0
+2024-07-19 13:20:00,10.53,10.56,10.53,10.55,816.0,860713.0
+2024-07-19 13:25:00,10.54,10.55,10.54,10.54,377.0,397650.0
+2024-07-19 13:30:00,10.55,10.58,10.54,10.57,3272.0,3456861.0
+2024-07-19 13:35:00,10.57,10.58,10.56,10.56,750.0,792588.0
+2024-07-19 13:40:00,10.56,10.58,10.55,10.58,679.0,717716.0
+2024-07-19 13:45:00,10.57,10.58,10.56,10.57,908.0,959813.0
+2024-07-19 13:50:00,10.57,10.57,10.55,10.56,985.0,1040036.0
+2024-07-19 13:55:00,10.55,10.57,10.55,10.56,1412.0,1490916.0
+2024-07-19 14:00:00,10.55,10.56,10.54,10.55,467.0,492673.0
+2024-07-19 14:05:00,10.54,10.56,10.54,10.55,921.0,971170.0
+2024-07-19 14:10:00,10.54,10.56,10.54,10.54,604.0,637080.0
+2024-07-19 14:15:00,10.55,10.56,10.53,10.56,1864.0,1965255.0
+2024-07-19 14:20:00,10.56,10.57,10.55,10.57,914.0,965084.0
+2024-07-19 14:25:00,10.57,10.57,10.55,10.56,627.0,662184.0
+2024-07-19 14:30:00,10.55,10.55,10.54,10.55,535.0,564260.0
+2024-07-19 14:35:00,10.55,10.56,10.55,10.56,543.0,572920.0
+2024-07-19 14:40:00,10.55,10.57,10.54,10.57,1682.0,1775952.0
+2024-07-19 14:45:00,10.56,10.57,10.55,10.57,1334.0,1408516.0
+2024-07-19 14:50:00,10.56,10.58,10.55,10.58,1592.0,1682427.0
+2024-07-19 14:55:00,10.58,10.58,10.57,10.58,2252.0,2380613.0
+2024-07-19 15:00:00,10.58,10.59,10.57,10.58,3659.0,3871778.0
+2024-07-22 09:35:00,10.57,10.6,10.52,10.54,4471.0,4718470.0
+2024-07-22 09:40:00,10.53,10.53,10.45,10.47,4986.0,5227783.0
+2024-07-22 09:45:00,10.47,10.48,10.43,10.44,3567.0,3727637.0
+2024-07-22 09:50:00,10.43,10.47,10.41,10.46,4905.0,5114770.0
+2024-07-22 09:55:00,10.46,10.46,10.45,10.45,966.0,1010351.0
+2024-07-22 10:00:00,10.46,10.49,10.46,10.46,1960.0,2053052.0
+2024-07-22 10:05:00,10.47,10.48,10.46,10.46,1000.0,1046668.0
+2024-07-22 10:10:00,10.46,10.47,10.45,10.46,666.0,696697.0
+2024-07-22 10:15:00,10.46,10.48,10.46,10.46,660.0,691030.0
+2024-07-22 10:20:00,10.47,10.49,10.46,10.47,1234.0,1292054.0
+2024-07-22 10:25:00,10.47,10.51,10.47,10.5,926.0,971762.0
+2024-07-22 10:30:00,10.5,10.52,10.49,10.52,702.0,737690.0
+2024-07-22 10:35:00,10.51,10.55,10.51,10.51,1030.0,1084519.0
+2024-07-22 10:40:00,10.51,10.52,10.5,10.51,426.0,447846.0
+2024-07-22 10:45:00,10.51,10.52,10.51,10.51,519.0,545592.0
+2024-07-22 10:50:00,10.52,10.53,10.5,10.52,765.0,804169.0
+2024-07-22 10:55:00,10.52,10.53,10.51,10.52,575.0,604815.0
+2024-07-22 11:00:00,10.53,10.53,10.51,10.53,769.0,808927.0
+2024-07-22 11:05:00,10.52,10.54,10.52,10.53,1321.0,1391018.0
+2024-07-22 11:10:00,10.53,10.55,10.53,10.53,1367.0,1440859.0
+2024-07-22 11:15:00,10.53,10.55,10.53,10.55,587.0,618390.0
+2024-07-22 11:20:00,10.53,10.54,10.52,10.54,578.0,608734.0
+2024-07-22 11:25:00,10.52,10.54,10.52,10.53,498.0,524206.0
+2024-07-22 11:30:00,10.53,10.55,10.52,10.55,2017.0,2126333.0
+2024-07-22 13:05:00,10.54,10.56,10.53,10.53,651.0,686494.0
+2024-07-22 13:10:00,10.54,10.54,10.5,10.51,1071.0,1126231.0
+2024-07-22 13:15:00,10.51,10.52,10.5,10.52,460.0,483148.0
+2024-07-22 13:20:00,10.5,10.51,10.49,10.49,446.0,468384.0
+2024-07-22 13:25:00,10.5,10.51,10.49,10.51,892.0,937056.0
+2024-07-22 13:30:00,10.51,10.51,10.49,10.5,360.0,377817.0
+2024-07-22 13:35:00,10.5,10.52,10.49,10.5,767.0,806112.0
+2024-07-22 13:40:00,10.5,10.51,10.5,10.51,234.0,245737.0
+2024-07-22 13:45:00,10.5,10.51,10.5,10.5,628.0,659641.0
+2024-07-22 13:50:00,10.51,10.51,10.49,10.5,655.0,688017.0
+2024-07-22 13:55:00,10.5,10.52,10.5,10.5,782.0,821795.0
+2024-07-22 14:00:00,10.51,10.51,10.49,10.5,1244.0,1306153.0
+2024-07-22 14:05:00,10.5,10.5,10.47,10.49,1167.0,1223545.0
+2024-07-22 14:10:00,10.49,10.49,10.48,10.49,531.0,556830.0
+2024-07-22 14:15:00,10.49,10.51,10.49,10.5,609.0,639354.0
+2024-07-22 14:20:00,10.5,10.51,10.49,10.51,920.0,965735.0
+2024-07-22 14:25:00,10.51,10.52,10.5,10.52,436.0,458320.0
+2024-07-22 14:30:00,10.51,10.52,10.5,10.51,699.0,734581.0
+2024-07-22 14:35:00,10.51,10.52,10.5,10.52,674.0,708563.0
+2024-07-22 14:40:00,10.52,10.53,10.51,10.53,957.0,1007022.0
+2024-07-22 14:45:00,10.52,10.53,10.52,10.53,520.0,547301.0
+2024-07-22 14:50:00,10.53,10.54,10.52,10.54,1638.0,1724863.0
+2024-07-22 14:55:00,10.54,10.54,10.53,10.54,895.0,942739.0
+2024-07-22 15:00:00,10.54,10.54,10.52,10.52,1958.0,2061312.0
+2024-07-23 09:35:00,10.53,10.54,10.46,10.49,2289.0,2403085.0
+2024-07-23 09:40:00,10.5,10.51,10.49,10.5,749.0,786865.0
+2024-07-23 09:45:00,10.5,10.51,10.49,10.49,742.0,778888.0
+2024-07-23 09:50:00,10.49,10.53,10.49,10.52,706.0,742465.0
+2024-07-23 09:55:00,10.52,10.52,10.49,10.5,1091.0,1145815.0
+2024-07-23 10:00:00,10.49,10.5,10.47,10.47,1447.0,1517564.0
+2024-07-23 10:05:00,10.47,10.48,10.46,10.47,1342.0,1404492.0
+2024-07-23 10:10:00,10.48,10.48,10.45,10.47,2055.0,2150373.0
+2024-07-23 10:15:00,10.45,10.47,10.45,10.46,915.0,956649.0
+2024-07-23 10:20:00,10.45,10.48,10.45,10.46,769.0,804580.0
+2024-07-23 10:25:00,10.46,10.48,10.46,10.46,362.0,379019.0
+2024-07-23 10:30:00,10.47,10.48,10.46,10.46,1094.0,1145243.0
+2024-07-23 10:35:00,10.46,10.48,10.46,10.47,755.0,790031.0
+2024-07-23 10:40:00,10.48,10.48,10.46,10.47,219.0,229316.0
+2024-07-23 10:45:00,10.47,10.48,10.45,10.45,1731.0,1810590.0
+2024-07-23 10:50:00,10.45,10.45,10.44,10.44,364.0,380098.0
+2024-07-23 10:55:00,10.44,10.45,10.42,10.43,1789.0,1865882.0
+2024-07-23 11:00:00,10.44,10.44,10.42,10.42,645.0,672903.0
+2024-07-23 11:05:00,10.43,10.44,10.42,10.44,269.0,280589.0
+2024-07-23 11:10:00,10.44,10.44,10.43,10.44,219.0,228607.0
+2024-07-23 11:15:00,10.44,10.45,10.43,10.44,350.0,365391.0
+2024-07-23 11:20:00,10.44,10.44,10.43,10.44,368.0,383900.0
+2024-07-23 11:25:00,10.43,10.44,10.39,10.4,4352.0,4528741.0
+2024-07-23 11:30:00,10.4,10.41,10.39,10.39,1428.0,1484411.0
+2024-07-23 13:05:00,10.4,10.4,10.37,10.38,1896.0,1969108.0
+2024-07-23 13:10:00,10.37,10.4,10.37,10.39,1418.0,1472554.0
+2024-07-23 13:15:00,10.39,10.4,10.38,10.39,611.0,634838.0
+2024-07-23 13:20:00,10.39,10.4,10.37,10.37,895.0,929364.0
+2024-07-23 13:25:00,10.37,10.39,10.37,10.38,1099.0,1140723.0
+2024-07-23 13:30:00,10.39,10.39,10.38,10.38,538.0,558817.0
+2024-07-23 13:35:00,10.38,10.39,10.38,10.38,335.0,347931.0
+2024-07-23 13:40:00,10.39,10.39,10.38,10.38,904.0,938891.0
+2024-07-23 13:45:00,10.38,10.39,10.38,10.38,433.0,449640.0
+2024-07-23 13:50:00,10.39,10.39,10.37,10.37,1274.0,1321579.0
+2024-07-23 13:55:00,10.38,10.38,10.36,10.37,755.0,782916.0
+2024-07-23 14:00:00,10.37,10.38,10.36,10.38,644.0,667869.0
+2024-07-23 14:05:00,10.38,10.4,10.37,10.38,938.0,973790.0
+2024-07-23 14:10:00,10.38,10.39,10.38,10.38,255.0,264928.0
+2024-07-23 14:15:00,10.38,10.39,10.37,10.37,927.0,961956.0
+2024-07-23 14:20:00,10.37,10.38,10.36,10.37,1913.0,1983527.0
+2024-07-23 14:25:00,10.37,10.37,10.36,10.36,1299.0,1346063.0
+2024-07-23 14:30:00,10.36,10.37,10.35,10.36,812.0,841359.0
+2024-07-23 14:35:00,10.37,10.37,10.33,10.33,1981.0,2050570.0
+2024-07-23 14:40:00,10.33,10.34,10.32,10.33,1072.0,1107298.0
+2024-07-23 14:45:00,10.33,10.34,10.3,10.31,2478.0,2557077.0
+2024-07-23 14:50:00,10.31,10.33,10.31,10.32,1418.0,1462794.0
+2024-07-23 14:55:00,10.32,10.32,10.28,10.28,3397.0,3498854.0
+2024-07-23 15:00:00,10.28,10.28,10.27,10.27,2799.0,2874964.0
+2024-07-24 09:35:00,10.28,10.31,10.22,10.27,4835.0,4960139.0
+2024-07-24 09:40:00,10.28,10.34,10.26,10.3,4669.0,4806575.0
+2024-07-24 09:45:00,10.3,10.35,10.26,10.26,2104.0,2169485.0
+2024-07-24 09:50:00,10.26,10.3,10.25,10.28,1331.0,1366638.0
+2024-07-24 09:55:00,10.27,10.29,10.25,10.28,2076.0,2130929.0
+2024-07-24 10:00:00,10.26,10.28,10.26,10.27,794.0,815337.0
+2024-07-24 10:05:00,10.26,10.28,10.25,10.25,834.0,855779.0
+2024-07-24 10:10:00,10.25,10.29,10.25,10.29,1481.0,1520112.0
+2024-07-24 10:15:00,10.29,10.3,10.29,10.3,765.0,787450.0
+2024-07-24 10:20:00,10.3,10.3,10.28,10.29,296.0,304554.0
+2024-07-24 10:25:00,10.29,10.29,10.26,10.27,678.0,696729.0
+2024-07-24 10:30:00,10.26,10.26,10.25,10.25,760.0,779543.0
+2024-07-24 10:35:00,10.25,10.25,10.23,10.23,790.0,808791.0
+2024-07-24 10:40:00,10.23,10.24,10.21,10.22,2667.0,2726204.0
+2024-07-24 10:45:00,10.22,10.24,10.22,10.22,886.0,906044.0
+2024-07-24 10:50:00,10.23,10.23,10.21,10.21,1281.0,1308948.0
+2024-07-24 10:55:00,10.21,10.22,10.2,10.21,2605.0,2658378.0
+2024-07-24 11:00:00,10.22,10.26,10.22,10.24,2031.0,2080133.0
+2024-07-24 11:05:00,10.23,10.27,10.23,10.26,938.0,961793.0
+2024-07-24 11:10:00,10.26,10.26,10.23,10.25,730.0,748301.0
+2024-07-24 11:15:00,10.25,10.25,10.23,10.25,381.0,390211.0
+2024-07-24 11:20:00,10.25,10.27,10.24,10.26,409.0,419803.0
+2024-07-24 11:25:00,10.28,10.28,10.26,10.26,377.0,387254.0
+2024-07-24 11:30:00,10.26,10.3,10.26,10.29,762.0,783145.0
+2024-07-24 13:05:00,10.28,10.32,10.28,10.3,1826.0,1880479.0
+2024-07-24 13:10:00,10.3,10.32,10.28,10.28,535.0,551029.0
+2024-07-24 13:15:00,10.29,10.3,10.28,10.28,419.0,431304.0
+2024-07-24 13:20:00,10.28,10.3,10.28,10.29,444.0,456696.0
+2024-07-24 13:25:00,10.28,10.3,10.27,10.27,758.0,779747.0
+2024-07-24 13:30:00,10.27,10.28,10.27,10.27,534.0,548643.0
+2024-07-24 13:35:00,10.27,10.29,10.27,10.28,1719.0,1766959.0
+2024-07-24 13:40:00,10.27,10.28,10.27,10.27,384.0,394632.0
+2024-07-24 13:45:00,10.27,10.28,10.26,10.26,803.0,824726.0
+2024-07-24 13:50:00,10.26,10.29,10.26,10.27,930.0,955590.0
+2024-07-24 13:55:00,10.26,10.27,10.26,10.27,365.0,374663.0
+2024-07-24 14:00:00,10.26,10.3,10.26,10.29,1191.0,1224104.0
+2024-07-24 14:05:00,10.3,10.3,10.27,10.28,643.0,661236.0
+2024-07-24 14:10:00,10.28,10.29,10.27,10.27,507.0,521308.0
+2024-07-24 14:15:00,10.27,10.27,10.25,10.25,638.0,654960.0
+2024-07-24 14:20:00,10.25,10.26,10.24,10.24,621.0,636337.0
+2024-07-24 14:25:00,10.24,10.25,10.24,10.24,708.0,725072.0
+2024-07-24 14:30:00,10.23,10.24,10.23,10.24,816.0,835279.0
+2024-07-24 14:35:00,10.24,10.24,10.22,10.23,773.0,790798.0
+2024-07-24 14:40:00,10.23,10.24,10.2,10.21,2472.0,2523945.0
+2024-07-24 14:45:00,10.22,10.25,10.21,10.24,1751.0,1791836.0
+2024-07-24 14:50:00,10.23,10.24,10.21,10.21,1099.0,1123861.0
+2024-07-24 14:55:00,10.22,10.23,10.2,10.2,1448.0,1478756.0
+2024-07-24 15:00:00,10.2,10.22,10.2,10.22,1297.0,1324662.0
+2024-07-25 09:35:00,10.2,10.22,10.13,10.19,3168.0,3222564.0
+2024-07-25 09:40:00,10.18,10.21,10.15,10.21,2458.0,2500748.0
+2024-07-25 09:45:00,10.2,10.24,10.19,10.19,912.0,931541.0
+2024-07-25 09:50:00,10.19,10.22,10.17,10.17,786.0,801188.0
+2024-07-25 09:55:00,10.17,10.2,10.17,10.18,1266.0,1289201.0
+2024-07-25 10:00:00,10.18,10.19,10.18,10.18,944.0,961330.0
+2024-07-25 10:05:00,10.18,10.21,10.17,10.19,950.0,968245.0
+2024-07-25 10:10:00,10.19,10.23,10.18,10.23,2199.0,2242645.0
+2024-07-25 10:15:00,10.23,10.27,10.23,10.26,1258.0,1289229.0
+2024-07-25 10:20:00,10.27,10.27,10.24,10.27,1074.0,1100921.0
+2024-07-25 10:25:00,10.26,10.29,10.26,10.26,1285.0,1320370.0
+2024-07-25 10:30:00,10.26,10.28,10.25,10.25,500.0,513354.0
+2024-07-25 10:35:00,10.25,10.27,10.25,10.25,484.0,496289.0
+2024-07-25 10:40:00,10.25,10.27,10.24,10.26,311.0,318695.0
+2024-07-25 10:45:00,10.26,10.27,10.25,10.26,971.0,994845.0
+2024-07-25 10:50:00,10.26,10.27,10.26,10.27,463.0,475271.0
+2024-07-25 10:55:00,10.27,10.33,10.26,10.3,3899.0,4011716.0
+2024-07-25 11:00:00,10.3,10.32,10.3,10.31,1391.0,1433451.0
+2024-07-25 11:05:00,10.31,10.33,10.3,10.3,1991.0,2053576.0
+2024-07-25 11:10:00,10.3,10.35,10.3,10.34,1594.0,1647117.0
+2024-07-25 11:15:00,10.35,10.36,10.34,10.36,1411.0,1460293.0
+2024-07-25 11:20:00,10.35,10.4,10.35,10.39,2372.0,2461581.0
+2024-07-25 11:25:00,10.39,10.4,10.38,10.38,1572.0,1632376.0
+2024-07-25 11:30:00,10.38,10.4,10.38,10.39,2290.0,2379362.0
+2024-07-25 13:05:00,10.39,10.4,10.37,10.38,1446.0,1501578.0
+2024-07-25 13:10:00,10.37,10.37,10.34,10.34,504.0,521826.0
+2024-07-25 13:15:00,10.35,10.35,10.33,10.34,526.0,543635.0
+2024-07-25 13:20:00,10.33,10.35,10.33,10.33,448.0,462964.0
+2024-07-25 13:25:00,10.33,10.37,10.33,10.34,1049.0,1085641.0
+2024-07-25 13:30:00,10.35,10.35,10.34,10.34,238.0,246194.0
+2024-07-25 13:35:00,10.34,10.34,10.32,10.33,647.0,668398.0
+2024-07-25 13:40:00,10.32,10.35,10.32,10.34,636.0,657495.0
+2024-07-25 13:45:00,10.34,10.34,10.32,10.33,300.0,309949.0
+2024-07-25 13:50:00,10.34,10.37,10.33,10.36,1115.0,1153825.0
+2024-07-25 13:55:00,10.36,10.37,10.35,10.35,1145.0,1186495.0
+2024-07-25 14:00:00,10.35,10.36,10.34,10.35,1484.0,1535918.0
+2024-07-25 14:05:00,10.35,10.37,10.35,10.36,657.0,680298.0
+2024-07-25 14:10:00,10.36,10.36,10.32,10.32,836.0,864211.0
+2024-07-25 14:15:00,10.33,10.33,10.27,10.3,2443.0,2516842.0
+2024-07-25 14:20:00,10.29,10.32,10.29,10.32,894.0,921421.0
+2024-07-25 14:25:00,10.32,10.33,10.32,10.33,233.0,240561.0
+2024-07-25 14:30:00,10.32,10.33,10.31,10.31,765.0,789186.0
+2024-07-25 14:35:00,10.31,10.32,10.3,10.3,578.0,595751.0
+2024-07-25 14:40:00,10.3,10.31,10.29,10.29,353.0,363590.0
+2024-07-25 14:45:00,10.3,10.32,10.29,10.31,740.0,762550.0
+2024-07-25 14:50:00,10.31,10.33,10.3,10.31,2518.0,2596719.0
+2024-07-25 14:55:00,10.31,10.32,10.3,10.31,668.0,688613.0
+2024-07-25 15:00:00,10.3,10.31,10.3,10.31,1225.0,1262682.0
+2024-07-26 09:35:00,10.29,10.33,10.29,10.33,2320.0,2391702.0
+2024-07-26 09:40:00,10.33,10.34,10.32,10.33,1189.0,1228248.0
+2024-07-26 09:45:00,10.34,10.38,10.33,10.38,1090.0,1129248.0
+2024-07-26 09:50:00,10.38,10.39,10.36,10.37,931.0,965834.0
+2024-07-26 09:55:00,10.37,10.4,10.36,10.37,2364.0,2453955.0
+2024-07-26 10:00:00,10.37,10.38,10.36,10.37,1030.0,1068430.0
+2024-07-26 10:05:00,10.37,10.38,10.35,10.36,1378.0,1428603.0
+2024-07-26 10:10:00,10.36,10.38,10.34,10.34,1069.0,1107049.0
+2024-07-26 10:15:00,10.34,10.36,10.33,10.35,581.0,600987.0
+2024-07-26 10:20:00,10.34,10.35,10.32,10.33,778.0,803529.0
+2024-07-26 10:25:00,10.34,10.34,10.32,10.33,624.0,644468.0
+2024-07-26 10:30:00,10.33,10.34,10.31,10.33,337.0,348005.0
+2024-07-26 10:35:00,10.34,10.36,10.33,10.35,848.0,877357.0
+2024-07-26 10:40:00,10.35,10.35,10.34,10.35,436.0,450998.0
+2024-07-26 10:45:00,10.35,10.36,10.35,10.35,271.0,280622.0
+2024-07-26 10:50:00,10.35,10.36,10.34,10.35,619.0,640692.0
+2024-07-26 10:55:00,10.35,10.36,10.33,10.34,396.0,409598.0
+2024-07-26 11:00:00,10.34,10.35,10.33,10.35,247.0,255551.0
+2024-07-26 11:05:00,10.35,10.37,10.34,10.37,1033.0,1069955.0
+2024-07-26 11:10:00,10.37,10.38,10.36,10.38,703.0,728998.0
+2024-07-26 11:15:00,10.38,10.4,10.37,10.39,796.0,826817.0
+2024-07-26 11:20:00,10.4,10.41,10.39,10.41,1313.0,1365586.0
+2024-07-26 11:25:00,10.41,10.41,10.38,10.39,1175.0,1222030.0
+2024-07-26 11:30:00,10.39,10.4,10.38,10.39,375.0,389553.0
+2024-07-26 13:05:00,10.39,10.4,10.36,10.38,771.0,800103.0
+2024-07-26 13:10:00,10.38,10.42,10.38,10.41,1697.0,1765280.0
+2024-07-26 13:15:00,10.41,10.41,10.39,10.39,104.0,108161.0
+2024-07-26 13:20:00,10.39,10.42,10.39,10.42,1041.0,1083617.0
+2024-07-26 13:25:00,10.42,10.46,10.42,10.45,3026.0,3160659.0
+2024-07-26 13:30:00,10.46,10.46,10.42,10.43,1186.0,1238516.0
+2024-07-26 13:35:00,10.43,10.44,10.41,10.41,331.0,345141.0
+2024-07-26 13:40:00,10.41,10.44,10.41,10.43,832.0,867992.0
+2024-07-26 13:45:00,10.42,10.43,10.4,10.42,634.0,659973.0
+2024-07-26 13:50:00,10.42,10.42,10.41,10.42,338.0,352076.0
+2024-07-26 13:55:00,10.41,10.42,10.4,10.41,627.0,652812.0
+2024-07-26 14:00:00,10.42,10.43,10.42,10.43,296.0,308170.0
+2024-07-26 14:05:00,10.42,10.42,10.4,10.41,595.0,619621.0
+2024-07-26 14:10:00,10.42,10.42,10.4,10.4,423.0,440225.0
+2024-07-26 14:15:00,10.4,10.4,10.39,10.4,719.0,747514.0
+2024-07-26 14:20:00,10.4,10.41,10.4,10.41,220.0,228829.0
+2024-07-26 14:25:00,10.4,10.41,10.39,10.4,745.0,774792.0
+2024-07-26 14:30:00,10.4,10.43,10.4,10.41,704.0,733094.0
+2024-07-26 14:35:00,10.41,10.43,10.41,10.42,378.0,393808.0
+2024-07-26 14:40:00,10.42,10.42,10.4,10.41,789.0,821777.0
+2024-07-26 14:45:00,10.4,10.42,10.4,10.42,521.0,542422.0
+2024-07-26 14:50:00,10.42,10.43,10.41,10.42,991.0,1032817.0
+2024-07-26 14:55:00,10.42,10.43,10.41,10.42,1553.0,1618226.0
+2024-07-26 15:00:00,10.42,10.43,10.42,10.43,1172.0,1222086.0
+2024-07-29 09:35:00,10.44,10.44,10.34,10.34,3854.0,4003183.0
+2024-07-29 09:40:00,10.34,10.34,10.29,10.32,3710.0,3827804.0
+2024-07-29 09:45:00,10.31,10.34,10.31,10.34,1147.0,1183964.0
+2024-07-29 09:50:00,10.33,10.35,10.31,10.35,1152.0,1191121.0
+2024-07-29 09:55:00,10.36,10.37,10.34,10.35,944.0,977541.0
+2024-07-29 10:00:00,10.36,10.37,10.33,10.33,847.0,877016.0
+2024-07-29 10:05:00,10.33,10.33,10.31,10.31,1094.0,1129000.0
+2024-07-29 10:10:00,10.31,10.36,10.31,10.35,886.0,916261.0
+2024-07-29 10:15:00,10.35,10.35,10.31,10.33,794.0,819853.0
+2024-07-29 10:20:00,10.33,10.35,10.33,10.34,447.0,462130.0
+2024-07-29 10:25:00,10.34,10.35,10.34,10.34,152.0,157215.0
+2024-07-29 10:30:00,10.35,10.35,10.33,10.34,355.0,367120.0
+2024-07-29 10:35:00,10.34,10.36,10.33,10.36,816.0,844126.0
+2024-07-29 10:40:00,10.37,10.38,10.36,10.36,526.0,545097.0
+2024-07-29 10:45:00,10.37,10.4,10.37,10.39,857.0,889862.0
+2024-07-29 10:50:00,10.39,10.42,10.39,10.41,1619.0,1684587.0
+2024-07-29 10:55:00,10.41,10.41,10.4,10.4,228.0,237312.0
+2024-07-29 11:00:00,10.41,10.42,10.4,10.41,1007.0,1048436.0
+2024-07-29 11:05:00,10.41,10.42,10.4,10.4,221.0,230123.0
+2024-07-29 11:10:00,10.4,10.4,10.38,10.39,775.0,804802.0
+2024-07-29 11:15:00,10.38,10.41,10.38,10.39,376.0,390905.0
+2024-07-29 11:20:00,10.41,10.41,10.39,10.4,510.0,530148.0
+2024-07-29 11:25:00,10.4,10.42,10.4,10.42,895.0,931752.0
+2024-07-29 11:30:00,10.41,10.42,10.41,10.42,201.0,209354.0
+2024-07-29 13:05:00,10.41,10.41,10.38,10.39,532.0,553225.0
+2024-07-29 13:10:00,10.4,10.4,10.39,10.39,156.0,162224.0
+2024-07-29 13:15:00,10.39,10.4,10.38,10.38,173.0,179733.0
+2024-07-29 13:20:00,10.38,10.39,10.38,10.38,362.0,376095.0
+2024-07-29 13:25:00,10.39,10.39,10.36,10.36,746.0,774090.0
+2024-07-29 13:30:00,10.36,10.39,10.36,10.38,632.0,655442.0
+2024-07-29 13:35:00,10.37,10.4,10.37,10.38,841.0,873036.0
+2024-07-29 13:40:00,10.38,10.38,10.37,10.38,58.0,60199.0
+2024-07-29 13:45:00,10.38,10.38,10.37,10.38,551.0,571571.0
+2024-07-29 13:50:00,10.38,10.39,10.38,10.38,750.0,778534.0
+2024-07-29 13:55:00,10.39,10.39,10.37,10.37,517.0,536732.0
+2024-07-29 14:00:00,10.37,10.38,10.36,10.37,684.0,709250.0
+2024-07-29 14:05:00,10.36,10.38,10.36,10.38,341.0,354180.0
+2024-07-29 14:10:00,10.38,10.38,10.36,10.37,384.0,397674.0
+2024-07-29 14:15:00,10.37,10.38,10.36,10.37,500.0,518250.0
+2024-07-29 14:20:00,10.37,10.38,10.36,10.38,528.0,547634.0
+2024-07-29 14:25:00,10.38,10.41,10.38,10.39,1872.0,1946896.0
+2024-07-29 14:30:00,10.39,10.4,10.39,10.39,308.0,320222.0
+2024-07-29 14:35:00,10.4,10.4,10.39,10.4,247.0,256855.0
+2024-07-29 14:40:00,10.39,10.4,10.39,10.4,853.0,886622.0
+2024-07-29 14:45:00,10.4,10.4,10.39,10.39,492.0,511371.0
+2024-07-29 14:50:00,10.4,10.4,10.38,10.39,500.0,519606.0
+2024-07-29 14:55:00,10.39,10.4,10.38,10.38,1141.0,1185204.0
+2024-07-29 15:00:00,10.38,10.39,10.37,10.37,993.0,1030268.0
+2024-07-30 09:35:00,10.37,10.4,10.33,10.36,1574.0,1631701.0
+2024-07-30 09:40:00,10.35,10.36,10.33,10.35,617.0,638176.0
+2024-07-30 09:45:00,10.34,10.35,10.33,10.35,969.0,1001796.0
+2024-07-30 09:50:00,10.35,10.39,10.35,10.38,959.0,994693.0
+2024-07-30 09:55:00,10.37,10.37,10.33,10.34,1015.0,1051652.0
+2024-07-30 10:00:00,10.33,10.34,10.31,10.31,1542.0,1592192.0
+2024-07-30 10:05:00,10.3,10.32,10.28,10.32,2493.0,2568052.0
+2024-07-30 10:10:00,10.32,10.33,10.3,10.31,2902.0,2989948.0
+2024-07-30 10:15:00,10.31,10.34,10.31,10.34,765.0,789878.0
+2024-07-30 10:20:00,10.34,10.35,10.33,10.34,176.0,181976.0
+2024-07-30 10:25:00,10.34,10.35,10.33,10.33,279.0,288484.0
+2024-07-30 10:30:00,10.33,10.36,10.33,10.33,680.0,703502.0
+2024-07-30 10:35:00,10.34,10.38,10.34,10.37,2359.0,2443172.0
+2024-07-30 10:40:00,10.36,10.38,10.35,10.38,581.0,602439.0
+2024-07-30 10:45:00,10.38,10.41,10.37,10.41,1294.0,1344757.0
+2024-07-30 10:50:00,10.41,10.44,10.39,10.4,1839.0,1915015.0
+2024-07-30 10:55:00,10.41,10.42,10.4,10.42,520.0,541477.0
+2024-07-30 11:00:00,10.41,10.42,10.39,10.41,809.0,841804.0
+2024-07-30 11:05:00,10.41,10.41,10.4,10.4,315.0,327748.0
+2024-07-30 11:10:00,10.4,10.41,10.4,10.41,152.0,158167.0
+2024-07-30 11:15:00,10.41,10.41,10.4,10.41,266.0,276732.0
+2024-07-30 11:20:00,10.41,10.41,10.39,10.39,327.0,340102.0
+2024-07-30 11:25:00,10.39,10.42,10.39,10.41,645.0,671246.0
+2024-07-30 11:30:00,10.41,10.42,10.39,10.4,474.0,493265.0
+2024-07-30 13:05:00,10.41,10.41,10.39,10.39,110.0,114376.0
+2024-07-30 13:10:00,10.4,10.4,10.37,10.37,474.0,492168.0
+2024-07-30 13:15:00,10.37,10.37,10.36,10.37,221.0,229156.0
+2024-07-30 13:20:00,10.36,10.37,10.35,10.37,327.0,338839.0
+2024-07-30 13:25:00,10.37,10.38,10.36,10.37,332.0,344283.0
+2024-07-30 13:30:00,10.37,10.38,10.37,10.37,78.0,80902.0
+2024-07-30 13:35:00,10.38,10.39,10.36,10.37,441.0,457577.0
+2024-07-30 13:40:00,10.37,10.38,10.37,10.37,108.0,112015.0
+2024-07-30 13:45:00,10.39,10.42,10.38,10.4,932.0,969059.0
+2024-07-30 13:50:00,10.4,10.4,10.38,10.38,294.0,305710.0
+2024-07-30 13:55:00,10.38,10.38,10.36,10.38,495.0,513474.0
+2024-07-30 14:00:00,10.37,10.38,10.37,10.37,89.0,92322.0
+2024-07-30 14:05:00,10.37,10.38,10.36,10.37,436.0,451957.0
+2024-07-30 14:10:00,10.38,10.38,10.36,10.36,74.0,76722.0
+2024-07-30 14:15:00,10.36,10.37,10.35,10.35,239.0,247570.0
+2024-07-30 14:20:00,10.35,10.37,10.35,10.37,522.0,540932.0
+2024-07-30 14:25:00,10.38,10.38,10.36,10.36,408.0,422954.0
+2024-07-30 14:30:00,10.37,10.37,10.36,10.36,54.0,55996.0
+2024-07-30 14:35:00,10.37,10.38,10.36,10.37,388.0,402328.0
+2024-07-30 14:40:00,10.38,10.38,10.37,10.37,738.0,765834.0
+2024-07-30 14:45:00,10.37,10.38,10.37,10.38,393.0,407607.0
+2024-07-30 14:50:00,10.38,10.38,10.37,10.37,452.0,468909.0
+2024-07-30 14:55:00,10.37,10.39,10.37,10.39,1596.0,1656756.0
+2024-07-30 15:00:00,10.39,10.39,10.37,10.38,1165.0,1209586.0
+2024-07-31 09:35:00,10.37,10.49,10.37,10.46,4769.0,4982458.0
+2024-07-31 09:40:00,10.47,10.52,10.47,10.5,4991.0,5237909.0
+2024-07-31 09:45:00,10.5,10.6,10.49,10.57,6856.0,7233100.0
+2024-07-31 09:50:00,10.57,10.61,10.56,10.59,5984.0,6331238.0
+2024-07-31 09:55:00,10.59,10.62,10.58,10.6,5142.0,5452830.0
+2024-07-31 10:00:00,10.6,10.64,10.59,10.61,3738.0,3966675.0
+2024-07-31 10:05:00,10.6,10.61,10.58,10.58,1801.0,1907277.0
+2024-07-31 10:10:00,10.58,10.6,10.58,10.6,1697.0,1797176.0
+2024-07-31 10:15:00,10.6,10.63,10.6,10.61,1780.0,1889728.0
+2024-07-31 10:20:00,10.62,10.63,10.61,10.63,1237.0,1313655.0
+2024-07-31 10:25:00,10.63,10.63,10.61,10.61,1355.0,1439525.0
+2024-07-31 10:30:00,10.61,10.62,10.59,10.6,1704.0,1807025.0
+2024-07-31 10:35:00,10.61,10.64,10.61,10.63,1472.0,1564728.0
+2024-07-31 10:40:00,10.63,10.65,10.62,10.64,1515.0,1611608.0
+2024-07-31 10:45:00,10.65,10.65,10.62,10.63,2117.0,2251622.0
+2024-07-31 10:50:00,10.63,10.64,10.63,10.63,1036.0,1101733.0
+2024-07-31 10:55:00,10.64,10.64,10.63,10.64,934.0,993451.0
+2024-07-31 11:00:00,10.64,10.66,10.63,10.66,1630.0,1735747.0
+2024-07-31 11:05:00,10.66,10.67,10.65,10.66,1342.0,1430692.0
+2024-07-31 11:10:00,10.66,10.66,10.64,10.65,580.0,617827.0
+2024-07-31 11:15:00,10.65,10.66,10.64,10.64,695.0,740393.0
+2024-07-31 11:20:00,10.65,10.67,10.64,10.67,993.0,1058547.0
+2024-07-31 11:25:00,10.67,10.69,10.65,10.69,2134.0,2277288.0
+2024-07-31 11:30:00,10.69,10.7,10.67,10.69,1374.0,1468191.0
+2024-07-31 13:05:00,10.69,10.71,10.67,10.7,5171.0,5525590.0
+2024-07-31 13:10:00,10.7,10.71,10.68,10.68,1718.0,1837401.0
+2024-07-31 13:15:00,10.69,10.72,10.68,10.71,2408.0,2577143.0
+2024-07-31 13:20:00,10.72,10.75,10.71,10.73,2636.0,2829322.0
+2024-07-31 13:25:00,10.73,10.75,10.72,10.73,2417.0,2594630.0
+2024-07-31 13:30:00,10.73,10.75,10.73,10.73,1478.0,1586859.0
+2024-07-31 13:35:00,10.73,10.74,10.7,10.7,1952.0,2091734.0
+2024-07-31 13:40:00,10.7,10.71,10.69,10.7,804.0,860136.0
+2024-07-31 13:45:00,10.7,10.71,10.69,10.7,631.0,675299.0
+2024-07-31 13:50:00,10.7,10.72,10.7,10.72,1240.0,1328562.0
+2024-07-31 13:55:00,10.73,10.74,10.72,10.74,2214.0,2376301.0
+2024-07-31 14:00:00,10.74,10.74,10.72,10.73,456.0,489311.0
+2024-07-31 14:05:00,10.72,10.73,10.71,10.72,1022.0,1095574.0
+2024-07-31 14:10:00,10.71,10.73,10.71,10.72,480.0,514482.0
+2024-07-31 14:15:00,10.72,10.73,10.72,10.73,488.0,523203.0
+2024-07-31 14:20:00,10.72,10.73,10.71,10.72,669.0,717101.0
+2024-07-31 14:25:00,10.72,10.72,10.71,10.72,693.0,742664.0
+2024-07-31 14:30:00,10.72,10.72,10.7,10.72,890.0,952913.0
+2024-07-31 14:35:00,10.72,10.73,10.72,10.72,970.0,1039970.0
+2024-07-31 14:40:00,10.73,10.74,10.72,10.74,2730.0,2930120.0
+2024-07-31 14:45:00,10.74,10.74,10.72,10.74,2271.0,2438008.0
+2024-07-31 14:50:00,10.74,10.74,10.72,10.74,2161.0,2319775.0
+2024-07-31 14:55:00,10.74,10.75,10.73,10.74,3865.0,4149381.0
+2024-07-31 15:00:00,10.74,10.74,10.73,10.74,2912.0,3126952.0
+2024-08-01 09:35:00,10.74,10.82,10.72,10.77,7529.0,8108541.0
+2024-08-01 09:40:00,10.77,10.77,10.73,10.73,1920.0,2063299.0
+2024-08-01 09:45:00,10.73,10.75,10.71,10.71,2291.0,2457718.0
+2024-08-01 09:50:00,10.72,10.74,10.69,10.7,2613.0,2799686.0
+2024-08-01 09:55:00,10.71,10.71,10.68,10.7,1429.0,1528418.0
+2024-08-01 10:00:00,10.69,10.73,10.68,10.71,1557.0,1666869.0
+2024-08-01 10:05:00,10.71,10.73,10.69,10.7,1218.0,1304031.0
+2024-08-01 10:10:00,10.71,10.72,10.69,10.7,721.0,772034.0
+2024-08-01 10:15:00,10.7,10.72,10.7,10.71,843.0,902609.0
+2024-08-01 10:20:00,10.7,10.72,10.7,10.72,327.0,350141.0
+2024-08-01 10:25:00,10.72,10.73,10.71,10.72,729.0,781471.0
+2024-08-01 10:30:00,10.71,10.73,10.69,10.7,1229.0,1316175.0
+2024-08-01 10:35:00,10.7,10.7,10.68,10.7,909.0,971667.0
+2024-08-01 10:40:00,10.7,10.7,10.69,10.69,482.0,515489.0
+2024-08-01 10:45:00,10.69,10.71,10.69,10.71,524.0,560770.0
+2024-08-01 10:50:00,10.71,10.71,10.69,10.69,554.0,592940.0
+2024-08-01 10:55:00,10.71,10.71,10.68,10.68,773.0,826247.0
+2024-08-01 11:00:00,10.68,10.69,10.67,10.68,834.0,890613.0
+2024-08-01 11:05:00,10.68,10.69,10.66,10.68,1525.0,1627421.0
+2024-08-01 11:10:00,10.68,10.69,10.67,10.68,500.0,533838.0
+2024-08-01 11:15:00,10.68,10.68,10.66,10.67,460.0,490876.0
+2024-08-01 11:20:00,10.67,10.69,10.66,10.68,1415.0,1509637.0
+2024-08-01 11:25:00,10.66,10.68,10.66,10.68,733.0,781649.0
+2024-08-01 11:30:00,10.68,10.7,10.67,10.68,1009.0,1077881.0
+2024-08-01 13:05:00,10.7,10.71,10.68,10.7,455.0,486340.0
+2024-08-01 13:10:00,10.71,10.73,10.71,10.72,821.0,879934.0
+2024-08-01 13:15:00,10.73,10.75,10.72,10.73,2328.0,2499265.0
+2024-08-01 13:20:00,10.74,10.75,10.73,10.73,679.0,728793.0
+2024-08-01 13:25:00,10.73,10.74,10.73,10.74,631.0,677361.0
+2024-08-01 13:30:00,10.74,10.75,10.73,10.73,513.0,550899.0
+2024-08-01 13:35:00,10.73,10.74,10.73,10.73,238.0,255379.0
+2024-08-01 13:40:00,10.73,10.74,10.73,10.73,653.0,700717.0
+2024-08-01 13:45:00,10.73,10.74,10.73,10.73,477.0,512018.0
+2024-08-01 13:50:00,10.74,10.74,10.71,10.73,839.0,899823.0
+2024-08-01 13:55:00,10.72,10.75,10.72,10.74,1317.0,1414292.0
+2024-08-01 14:00:00,10.74,10.74,10.73,10.74,335.0,359566.0
+2024-08-01 14:05:00,10.74,10.74,10.7,10.7,1496.0,1603366.0
+2024-08-01 14:10:00,10.71,10.72,10.7,10.7,624.0,668189.0
+2024-08-01 14:15:00,10.71,10.71,10.7,10.71,243.0,260094.0
+2024-08-01 14:20:00,10.71,10.71,10.7,10.7,275.0,294276.0
+2024-08-01 14:25:00,10.7,10.72,10.7,10.71,898.0,961729.0
+2024-08-01 14:30:00,10.71,10.72,10.7,10.7,1071.0,1146554.0
+2024-08-01 14:35:00,10.71,10.72,10.7,10.7,648.0,693897.0
+2024-08-01 14:40:00,10.7,10.71,10.7,10.7,276.0,295369.0
+2024-08-01 14:45:00,10.71,10.71,10.69,10.69,799.0,855012.0
+2024-08-01 14:50:00,10.71,10.71,10.7,10.71,704.0,753602.0
+2024-08-01 14:55:00,10.71,10.71,10.7,10.71,728.0,779331.0
+2024-08-01 15:00:00,10.7,10.72,10.7,10.7,1044.0,1117644.0
+2024-08-02 09:35:00,10.67,10.72,10.63,10.71,4585.0,4899332.0
+2024-08-02 09:40:00,10.7,10.75,10.67,10.72,2819.0,3018534.0
+2024-08-02 09:45:00,10.72,10.75,10.71,10.74,1794.0,1925603.0
+2024-08-02 09:50:00,10.74,10.77,10.73,10.73,2331.0,2506990.0
+2024-08-02 09:55:00,10.73,10.77,10.73,10.76,1878.0,2019187.0
+2024-08-02 10:00:00,10.76,10.77,10.75,10.75,1081.0,1162979.0
+2024-08-02 10:05:00,10.76,10.77,10.73,10.77,1507.0,1620501.0
+2024-08-02 10:10:00,10.77,10.77,10.75,10.75,1223.0,1315129.0
+2024-08-02 10:15:00,10.76,10.76,10.74,10.74,1562.0,1677792.0
+2024-08-02 10:20:00,10.75,10.78,10.74,10.78,3135.0,3375362.0
+2024-08-02 10:25:00,10.77,10.78,10.75,10.75,567.0,610466.0
+2024-08-02 10:30:00,10.75,10.76,10.73,10.75,1532.0,1644738.0
+2024-08-02 10:35:00,10.75,10.76,10.73,10.74,928.0,997338.0
+2024-08-02 10:40:00,10.74,10.74,10.71,10.73,1005.0,1077919.0
+2024-08-02 10:45:00,10.74,10.74,10.72,10.73,386.0,414278.0
+2024-08-02 10:50:00,10.73,10.73,10.71,10.71,1545.0,1655816.0
+2024-08-02 10:55:00,10.72,10.73,10.69,10.69,725.0,776086.0
+2024-08-02 11:00:00,10.7,10.71,10.69,10.71,282.0,301779.0
+2024-08-02 11:05:00,10.71,10.72,10.69,10.72,1036.0,1109267.0
+2024-08-02 11:10:00,10.71,10.73,10.71,10.73,786.0,842591.0
+2024-08-02 11:15:00,10.73,10.74,10.72,10.73,423.0,453916.0
+2024-08-02 11:20:00,10.73,10.75,10.72,10.75,663.0,711800.0
+2024-08-02 11:25:00,10.74,10.74,10.72,10.73,557.0,597658.0
+2024-08-02 11:30:00,10.73,10.74,10.72,10.74,248.0,266097.0
+2024-08-02 13:05:00,10.74,10.76,10.73,10.76,1040.0,1117676.0
+2024-08-02 13:10:00,10.76,10.78,10.75,10.76,2050.0,2206629.0
+2024-08-02 13:15:00,10.76,10.78,10.76,10.78,1360.0,1464827.0
+2024-08-02 13:20:00,10.78,10.78,10.73,10.73,769.0,828121.0
+2024-08-02 13:25:00,10.74,10.75,10.73,10.74,389.0,417727.0
+2024-08-02 13:30:00,10.74,10.74,10.7,10.71,1664.0,1783735.0
+2024-08-02 13:35:00,10.71,10.72,10.7,10.71,440.0,471085.0
+2024-08-02 13:40:00,10.71,10.72,10.7,10.72,467.0,500167.0
+2024-08-02 13:45:00,10.72,10.74,10.72,10.72,1074.0,1152297.0
+2024-08-02 13:50:00,10.72,10.73,10.7,10.71,680.0,728569.0
+2024-08-02 13:55:00,10.71,10.72,10.69,10.69,1380.0,1477234.0
+2024-08-02 14:00:00,10.69,10.7,10.68,10.69,1076.0,1150237.0
+2024-08-02 14:05:00,10.69,10.7,10.68,10.69,596.0,637139.0
+2024-08-02 14:10:00,10.69,10.69,10.67,10.68,1057.0,1128842.0
+2024-08-02 14:15:00,10.68,10.68,10.66,10.66,734.0,783046.0
+2024-08-02 14:20:00,10.66,10.67,10.64,10.66,1214.0,1293599.0
+2024-08-02 14:25:00,10.66,10.68,10.66,10.68,699.0,745750.0
+2024-08-02 14:30:00,10.66,10.68,10.66,10.68,372.0,396951.0
+2024-08-02 14:35:00,10.68,10.68,10.65,10.65,798.0,851389.0
+2024-08-02 14:40:00,10.65,10.66,10.64,10.65,835.0,889173.0
+2024-08-02 14:45:00,10.65,10.66,10.64,10.66,1468.0,1562840.0
+2024-08-02 14:50:00,10.66,10.68,10.65,10.68,854.0,910349.0
+2024-08-02 14:55:00,10.66,10.68,10.65,10.67,1182.0,1259981.0
+2024-08-02 15:00:00,10.65,10.67,10.64,10.64,2722.0,2897627.0
+2024-08-05 09:35:00,10.59,10.77,10.57,10.75,8525.0,9119507.0
+2024-08-05 09:40:00,10.76,10.82,10.76,10.81,4463.0,4812048.0
+2024-08-05 09:45:00,10.81,10.86,10.8,10.83,6369.0,6897333.0
+2024-08-05 09:50:00,10.84,10.94,10.83,10.92,10184.0,11084367.0
+2024-08-05 09:55:00,10.92,10.93,10.86,10.86,4322.0,4706626.0
+2024-08-05 10:00:00,10.86,10.86,10.83,10.83,2051.0,2223008.0
+2024-08-05 10:05:00,10.84,10.84,10.77,10.79,2195.0,2371267.0
+2024-08-05 10:10:00,10.8,10.82,10.78,10.78,1843.0,1989085.0
+2024-08-05 10:15:00,10.78,10.78,10.76,10.77,1403.0,1511923.0
+2024-08-05 10:20:00,10.78,10.82,10.78,10.78,1243.0,1342701.0
+2024-08-05 10:25:00,10.78,10.81,10.77,10.79,1534.0,1654306.0
+2024-08-05 10:30:00,10.8,10.85,10.79,10.83,1168.0,1263744.0
+2024-08-05 10:35:00,10.84,10.84,10.8,10.8,1149.0,1243426.0
+2024-08-05 10:40:00,10.8,10.81,10.8,10.8,223.0,240958.0
+2024-08-05 10:45:00,10.79,10.83,10.79,10.82,2498.0,2697672.0
+2024-08-05 10:50:00,10.82,10.83,10.8,10.83,678.0,733057.0
+2024-08-05 10:55:00,10.83,10.86,10.82,10.84,1195.0,1296055.0
+2024-08-05 11:00:00,10.84,10.84,10.81,10.82,945.0,1023635.0
+2024-08-05 11:05:00,10.82,10.84,10.82,10.83,550.0,595778.0
+2024-08-05 11:10:00,10.83,10.84,10.81,10.83,275.0,297729.0
+2024-08-05 11:15:00,10.83,10.87,10.83,10.84,2960.0,3211333.0
+2024-08-05 11:20:00,10.84,10.85,10.84,10.85,682.0,739696.0
+2024-08-05 11:25:00,10.85,10.87,10.85,10.86,1314.0,1426553.0
+2024-08-05 11:30:00,10.86,10.87,10.86,10.87,698.0,758575.0
+2024-08-05 13:05:00,10.87,10.87,10.8,10.83,1975.0,2140390.0
+2024-08-05 13:10:00,10.82,10.82,10.77,10.77,1377.0,1486835.0
+2024-08-05 13:15:00,10.77,10.78,10.77,10.78,1069.0,1151360.0
+2024-08-05 13:20:00,10.78,10.78,10.74,10.74,2305.0,2479766.0
+2024-08-05 13:25:00,10.75,10.75,10.73,10.74,1181.0,1268215.0
+2024-08-05 13:30:00,10.74,10.75,10.73,10.74,810.0,870000.0
+2024-08-05 13:35:00,10.73,10.74,10.69,10.69,1429.0,1531073.0
+2024-08-05 13:40:00,10.69,10.72,10.66,10.69,1798.0,1920712.0
+2024-08-05 13:45:00,10.7,10.72,10.68,10.69,793.0,848511.0
+2024-08-05 13:50:00,10.69,10.7,10.68,10.68,1573.0,1681313.0
+2024-08-05 13:55:00,10.68,10.69,10.66,10.68,1547.0,1650985.0
+2024-08-05 14:00:00,10.69,10.69,10.63,10.63,1700.0,1809842.0
+2024-08-05 14:05:00,10.64,10.67,10.62,10.65,1478.0,1572992.0
+2024-08-05 14:10:00,10.65,10.68,10.65,10.66,577.0,615183.0
+2024-08-05 14:15:00,10.66,10.66,10.62,10.63,1282.0,1363308.0
+2024-08-05 14:20:00,10.64,10.68,10.63,10.68,1035.0,1102397.0
+2024-08-05 14:25:00,10.68,10.68,10.65,10.66,597.0,636236.0
+2024-08-05 14:30:00,10.66,10.67,10.64,10.65,1782.0,1898593.0
+2024-08-05 14:35:00,10.65,10.68,10.65,10.68,1273.0,1356550.0
+2024-08-05 14:40:00,10.68,10.68,10.65,10.67,978.0,1043306.0
+2024-08-05 14:45:00,10.68,10.7,10.66,10.67,980.0,1045683.0
+2024-08-05 14:50:00,10.66,10.68,10.66,10.68,974.0,1039330.0
+2024-08-05 14:55:00,10.67,10.68,10.64,10.65,1842.0,1963252.0
+2024-08-05 15:00:00,10.64,10.65,10.64,10.64,1924.0,2047554.0
+2024-08-06 09:35:00,10.7,10.78,10.7,10.71,5472.0,5875415.0
+2024-08-06 09:40:00,10.71,10.73,10.7,10.71,3524.0,3776819.0
+2024-08-06 09:45:00,10.72,10.79,10.71,10.78,2591.0,2784419.0
+2024-08-06 09:50:00,10.78,10.78,10.74,10.76,1398.0,1504073.0
+2024-08-06 09:55:00,10.76,10.84,10.75,10.82,3828.0,4134812.0
+2024-08-06 10:00:00,10.82,10.85,10.82,10.82,2497.0,2704744.0
+2024-08-06 10:05:00,10.82,10.83,10.76,10.77,3786.0,4086059.0
+2024-08-06 10:10:00,10.76,10.78,10.75,10.76,2754.0,2964167.0
+2024-08-06 10:15:00,10.76,10.77,10.74,10.74,1320.0,1419944.0
+2024-08-06 10:20:00,10.74,10.75,10.72,10.73,1146.0,1230462.0
+2024-08-06 10:25:00,10.74,10.75,10.73,10.75,423.0,454365.0
+2024-08-06 10:30:00,10.75,10.77,10.74,10.76,1038.0,1116867.0
+2024-08-06 10:35:00,10.76,10.77,10.75,10.76,1216.0,1308332.0
+2024-08-06 10:40:00,10.77,10.77,10.75,10.76,789.0,848915.0
+2024-08-06 10:45:00,10.76,10.76,10.74,10.74,478.0,513689.0
+2024-08-06 10:50:00,10.74,10.76,10.74,10.76,533.0,572856.0
+2024-08-06 10:55:00,10.76,10.76,10.75,10.76,385.0,414174.0
+2024-08-06 11:00:00,10.76,10.79,10.76,10.78,1266.0,1363947.0
+2024-08-06 11:05:00,10.78,10.81,10.78,10.79,1141.0,1231716.0
+2024-08-06 11:10:00,10.8,10.82,10.8,10.8,837.0,904416.0
+2024-08-06 11:15:00,10.8,10.81,10.79,10.79,930.0,1004559.0
+2024-08-06 11:20:00,10.8,10.82,10.79,10.81,1403.0,1516033.0
+2024-08-06 11:25:00,10.8,10.81,10.79,10.79,406.0,438195.0
+2024-08-06 11:30:00,10.79,10.8,10.78,10.79,443.0,477967.0
+2024-08-06 13:05:00,10.79,10.79,10.76,10.78,605.0,651923.0
+2024-08-06 13:10:00,10.78,10.79,10.74,10.74,1761.0,1896340.0
+2024-08-06 13:15:00,10.75,10.75,10.74,10.75,364.0,391204.0
+2024-08-06 13:20:00,10.75,10.77,10.74,10.77,496.0,533279.0
+2024-08-06 13:25:00,10.77,10.81,10.76,10.81,1960.0,2114239.0
+2024-08-06 13:30:00,10.8,10.82,10.79,10.82,1977.0,2137582.0
+2024-08-06 13:35:00,10.82,10.82,10.78,10.8,2702.0,2917856.0
+2024-08-06 13:40:00,10.81,10.82,10.8,10.81,1823.0,1971064.0
+2024-08-06 13:45:00,10.82,10.82,10.81,10.82,1051.0,1136626.0
+2024-08-06 13:50:00,10.82,10.82,10.79,10.81,1433.0,1549230.0
+2024-08-06 13:55:00,10.79,10.79,10.77,10.77,719.0,774917.0
+2024-08-06 14:00:00,10.77,10.79,10.77,10.78,1033.0,1113748.0
+2024-08-06 14:05:00,10.78,10.8,10.78,10.79,555.0,598945.0
+2024-08-06 14:10:00,10.8,10.8,10.79,10.8,329.0,355273.0
+2024-08-06 14:15:00,10.8,10.81,10.8,10.8,678.0,732441.0
+2024-08-06 14:20:00,10.81,10.81,10.8,10.8,681.0,735628.0
+2024-08-06 14:25:00,10.79,10.81,10.79,10.8,1254.0,1354221.0
+2024-08-06 14:30:00,10.8,10.83,10.8,10.81,2052.0,2219252.0
+2024-08-06 14:35:00,10.81,10.84,10.81,10.84,1802.0,1951728.0
+2024-08-06 14:40:00,10.84,10.85,10.84,10.84,2227.0,2414687.0
+2024-08-06 14:45:00,10.85,10.87,10.84,10.85,2595.0,2816150.0
+2024-08-06 14:50:00,10.86,10.86,10.84,10.86,1470.0,1595403.0
+2024-08-06 14:55:00,10.86,10.86,10.85,10.86,1892.0,2054267.0
+2024-08-06 15:00:00,10.85,10.87,10.85,10.87,3313.0,3599202.0
+2024-08-07 09:35:00,10.88,10.89,10.77,10.82,3185.0,3440831.0
+2024-08-07 09:40:00,10.82,10.86,10.78,10.78,2234.0,2415783.0
+2024-08-07 09:45:00,10.78,10.81,10.77,10.8,2851.0,3075594.0
+2024-08-07 09:50:00,10.82,10.85,10.8,10.83,1880.0,2034531.0
+2024-08-07 09:55:00,10.83,10.83,10.8,10.83,1247.0,1348582.0
+2024-08-07 10:00:00,10.82,10.82,10.78,10.79,1604.0,1731782.0
+2024-08-07 10:05:00,10.8,10.8,10.79,10.79,719.0,775993.0
+2024-08-07 10:10:00,10.8,10.8,10.76,10.78,1773.0,1910241.0
+2024-08-07 10:15:00,10.78,10.79,10.77,10.79,809.0,872124.0
+2024-08-07 10:20:00,10.79,10.8,10.78,10.79,416.0,448807.0
+2024-08-07 10:25:00,10.79,10.79,10.78,10.79,161.0,173670.0
+2024-08-07 10:30:00,10.79,10.79,10.77,10.77,588.0,634174.0
+2024-08-07 10:35:00,10.77,10.79,10.76,10.76,506.0,545060.0
+2024-08-07 10:40:00,10.76,10.78,10.75,10.78,1903.0,2048647.0
+2024-08-07 10:45:00,10.78,10.78,10.76,10.77,943.0,1015553.0
+2024-08-07 10:50:00,10.77,10.79,10.77,10.78,658.0,708972.0
+2024-08-07 10:55:00,10.78,10.79,10.77,10.78,293.0,315845.0
+2024-08-07 11:00:00,10.78,10.79,10.77,10.79,283.0,305269.0
+2024-08-07 11:05:00,10.78,10.79,10.77,10.77,381.0,410708.0
+2024-08-07 11:10:00,10.77,10.78,10.76,10.76,1110.0,1195766.0
+2024-08-07 11:15:00,10.76,10.77,10.75,10.75,1054.0,1133595.0
+2024-08-07 11:20:00,10.75,10.76,10.72,10.74,2607.0,2797323.0
+2024-08-07 11:25:00,10.73,10.76,10.73,10.75,893.0,959632.0
+2024-08-07 11:30:00,10.75,10.75,10.74,10.74,306.0,328665.0
+2024-08-07 13:05:00,10.74,10.76,10.74,10.76,538.0,578298.0
+2024-08-07 13:10:00,10.75,10.77,10.75,10.76,251.0,270083.0
+2024-08-07 13:15:00,10.76,10.77,10.76,10.77,340.0,365858.0
+2024-08-07 13:20:00,10.76,10.79,10.76,10.79,675.0,727271.0
+2024-08-07 13:25:00,10.79,10.8,10.77,10.79,1071.0,1154993.0
+2024-08-07 13:30:00,10.79,10.79,10.78,10.78,67.0,72249.0
+2024-08-07 13:35:00,10.79,10.81,10.78,10.79,744.0,803095.0
+2024-08-07 13:40:00,10.8,10.8,10.78,10.78,711.0,767128.0
+2024-08-07 13:45:00,10.78,10.78,10.76,10.76,373.0,401806.0
+2024-08-07 13:50:00,10.76,10.77,10.76,10.77,523.0,562994.0
+2024-08-07 13:55:00,10.77,10.78,10.76,10.76,1148.0,1236354.0
+2024-08-07 14:00:00,10.76,10.77,10.75,10.76,648.0,697307.0
+2024-08-07 14:05:00,10.77,10.77,10.75,10.75,285.0,306584.0
+2024-08-07 14:10:00,10.76,10.77,10.74,10.74,1156.0,1242804.0
+2024-08-07 14:15:00,10.74,10.75,10.73,10.74,1077.0,1156306.0
+2024-08-07 14:20:00,10.73,10.74,10.73,10.73,833.0,894252.0
+2024-08-07 14:25:00,10.74,10.74,10.73,10.74,525.0,563687.0
+2024-08-07 14:30:00,10.74,10.75,10.73,10.75,969.0,1040476.0
+2024-08-07 14:35:00,10.76,10.76,10.73,10.73,744.0,799035.0
+2024-08-07 14:40:00,10.74,10.74,10.72,10.73,807.0,865759.0
+2024-08-07 14:45:00,10.73,10.74,10.71,10.71,2336.0,2504013.0
+2024-08-07 14:50:00,10.71,10.74,10.71,10.74,835.0,895682.0
+2024-08-07 14:55:00,10.73,10.74,10.72,10.73,1336.0,1433003.0
+2024-08-07 15:00:00,10.74,10.74,10.71,10.71,1884.0,2019683.0
+2024-08-08 09:35:00,10.74,10.75,10.7,10.74,2684.0,2877392.0
+2024-08-08 09:40:00,10.74,10.75,10.71,10.71,2203.0,2363399.0
+2024-08-08 09:45:00,10.7,10.71,10.68,10.7,1546.0,1653859.0
+2024-08-08 09:50:00,10.7,10.71,10.68,10.7,1108.0,1184773.0
+2024-08-08 09:55:00,10.69,10.71,10.68,10.69,534.0,571025.0
+2024-08-08 10:00:00,10.69,10.72,10.69,10.7,1167.0,1249488.0
+2024-08-08 10:05:00,10.69,10.69,10.66,10.66,1685.0,1798454.0
+2024-08-08 10:10:00,10.67,10.68,10.65,10.67,887.0,946154.0
+2024-08-08 10:15:00,10.68,10.69,10.65,10.65,1371.0,1462231.0
+2024-08-08 10:20:00,10.66,10.68,10.65,10.67,467.0,497969.0
+2024-08-08 10:25:00,10.67,10.68,10.66,10.66,923.0,984344.0
+2024-08-08 10:30:00,10.66,10.68,10.66,10.67,526.0,561056.0
+2024-08-08 10:35:00,10.66,10.71,10.66,10.7,1209.0,1292509.0
+2024-08-08 10:40:00,10.7,10.78,10.7,10.77,2802.0,3009779.0
+2024-08-08 10:45:00,10.77,10.84,10.76,10.79,5584.0,6038441.0
+2024-08-08 10:50:00,10.8,10.82,10.78,10.8,3043.0,3287230.0
+2024-08-08 10:55:00,10.79,10.81,10.77,10.8,1226.0,1323931.0
+2024-08-08 11:00:00,10.81,10.82,10.8,10.82,1534.0,1659179.0
+2024-08-08 11:05:00,10.83,10.84,10.8,10.81,1750.0,1893980.0
+2024-08-08 11:10:00,10.81,10.86,10.81,10.82,2621.0,2841688.0
+2024-08-08 11:15:00,10.82,10.86,10.82,10.86,1712.0,1856989.0
+2024-08-08 11:20:00,10.86,10.87,10.83,10.86,1694.0,1838329.0
+2024-08-08 11:25:00,10.86,10.87,10.84,10.86,937.0,1017298.0
+2024-08-08 11:30:00,10.85,10.87,10.85,10.86,1086.0,1179460.0
+2024-08-08 13:05:00,10.87,10.9,10.84,10.84,4134.0,4496565.0
+2024-08-08 13:10:00,10.83,10.85,10.82,10.85,713.0,772596.0
+2024-08-08 13:15:00,10.85,10.86,10.84,10.84,288.0,312409.0
+2024-08-08 13:20:00,10.85,10.85,10.83,10.83,548.0,593300.0
+2024-08-08 13:25:00,10.83,10.87,10.82,10.85,1264.0,1371021.0
+2024-08-08 13:30:00,10.85,10.86,10.85,10.85,397.0,430817.0
+2024-08-08 13:35:00,10.85,10.86,10.83,10.86,1776.0,1927884.0
+2024-08-08 13:40:00,10.84,10.84,10.82,10.83,426.0,461616.0
+2024-08-08 13:45:00,10.83,10.84,10.82,10.83,520.0,563461.0
+2024-08-08 13:50:00,10.83,10.87,10.83,10.87,3778.0,4099148.0
+2024-08-08 13:55:00,10.87,10.88,10.85,10.87,991.0,1077025.0
+2024-08-08 14:00:00,10.87,10.87,10.85,10.85,340.0,369199.0
+2024-08-08 14:05:00,10.86,10.87,10.84,10.84,813.0,882466.0
+2024-08-08 14:10:00,10.84,10.85,10.84,10.84,244.0,264513.0
+2024-08-08 14:15:00,10.85,10.88,10.85,10.86,1563.0,1698365.0
+2024-08-08 14:20:00,10.86,10.87,10.85,10.86,484.0,525397.0
+2024-08-08 14:25:00,10.86,10.86,10.85,10.85,543.0,589319.0
+2024-08-08 14:30:00,10.85,10.86,10.84,10.85,573.0,621609.0
+2024-08-08 14:35:00,10.86,10.86,10.84,10.85,381.0,413423.0
+2024-08-08 14:40:00,10.86,10.86,10.84,10.86,440.0,477558.0
+2024-08-08 14:45:00,10.85,10.86,10.84,10.85,581.0,630158.0
+2024-08-08 14:50:00,10.84,10.85,10.83,10.85,951.0,1030978.0
+2024-08-08 14:55:00,10.85,10.85,10.84,10.84,1195.0,1296184.0
+2024-08-08 15:00:00,10.84,10.85,10.84,10.84,1523.0,1651033.0
+2024-08-09 09:35:00,10.85,10.87,10.77,10.79,5844.0,6316928.0
+2024-08-09 09:40:00,10.79,10.82,10.78,10.81,2381.0,2571795.0
+2024-08-09 09:45:00,10.8,10.81,10.79,10.8,1960.0,2115520.0
+2024-08-09 09:50:00,10.81,10.84,10.8,10.83,1728.0,1869057.0
+2024-08-09 09:55:00,10.83,10.83,10.8,10.81,727.0,786482.0
+2024-08-09 10:00:00,10.81,10.82,10.8,10.8,756.0,816832.0
+2024-08-09 10:05:00,10.8,10.81,10.79,10.8,859.0,927208.0
+2024-08-09 10:10:00,10.79,10.81,10.79,10.8,200.0,216008.0
+2024-08-09 10:15:00,10.8,10.82,10.8,10.81,363.0,392281.0
+2024-08-09 10:20:00,10.8,10.8,10.78,10.79,1167.0,1259260.0
+2024-08-09 10:25:00,10.78,10.78,10.73,10.74,4217.0,4536883.0
+2024-08-09 10:30:00,10.76,10.77,10.75,10.76,130.0,139892.0
+2024-08-09 10:35:00,10.76,10.78,10.75,10.77,1450.0,1560025.0
+2024-08-09 10:40:00,10.78,10.78,10.77,10.77,214.0,230505.0
+2024-08-09 10:45:00,10.77,10.79,10.77,10.79,293.0,315780.0
+2024-08-09 10:50:00,10.79,10.8,10.78,10.78,875.0,943927.0
+2024-08-09 10:55:00,10.78,10.79,10.77,10.78,595.0,641230.0
+2024-08-09 11:00:00,10.78,10.79,10.75,10.76,1246.0,1341539.0
+2024-08-09 11:05:00,10.76,10.76,10.74,10.75,1533.0,1647200.0
+2024-08-09 11:10:00,10.75,10.76,10.74,10.76,473.0,508338.0
+2024-08-09 11:15:00,10.75,10.76,10.75,10.75,483.0,519344.0
+2024-08-09 11:20:00,10.75,10.76,10.75,10.75,401.0,431287.0
+2024-08-09 11:25:00,10.76,10.76,10.74,10.75,3346.0,3596701.0
+2024-08-09 11:30:00,10.74,10.75,10.7,10.71,1565.0,1678063.0
+2024-08-09 13:05:00,10.72,10.72,10.69,10.69,1942.0,2078552.0
+2024-08-09 13:10:00,10.69,10.69,10.67,10.68,1592.0,1700312.0
+2024-08-09 13:15:00,10.68,10.7,10.68,10.69,624.0,667166.0
+2024-08-09 13:20:00,10.7,10.7,10.69,10.69,352.0,376413.0
+2024-08-09 13:25:00,10.7,10.7,10.69,10.69,338.0,361623.0
+2024-08-09 13:30:00,10.69,10.7,10.69,10.7,555.0,593456.0
+2024-08-09 13:35:00,10.7,10.7,10.69,10.7,672.0,718815.0
+2024-08-09 13:40:00,10.7,10.71,10.69,10.69,300.0,320962.0
+2024-08-09 13:45:00,10.69,10.7,10.68,10.68,1167.0,1247251.0
+2024-08-09 13:50:00,10.68,10.69,10.67,10.68,1250.0,1334697.0
+2024-08-09 13:55:00,10.68,10.68,10.67,10.67,574.0,612649.0
+2024-08-09 14:00:00,10.67,10.68,10.66,10.66,1268.0,1353080.0
+2024-08-09 14:05:00,10.66,10.67,10.66,10.67,713.0,760474.0
+2024-08-09 14:10:00,10.67,10.68,10.66,10.67,1009.0,1076765.0
+2024-08-09 14:15:00,10.66,10.67,10.62,10.64,3534.0,3760861.0
+2024-08-09 14:20:00,10.64,10.64,10.63,10.63,1784.0,1896554.0
+2024-08-09 14:25:00,10.62,10.63,10.62,10.63,1602.0,1702115.0
+2024-08-09 14:30:00,10.63,10.64,10.62,10.64,1138.0,1209883.0
+2024-08-09 14:35:00,10.64,10.65,10.63,10.65,1975.0,2100840.0
+2024-08-09 14:40:00,10.63,10.66,10.63,10.65,685.0,729386.0
+2024-08-09 14:45:00,10.65,10.65,10.64,10.64,852.0,907163.0
+2024-08-09 14:50:00,10.64,10.66,10.64,10.64,1272.0,1354093.0
+2024-08-09 14:55:00,10.65,10.65,10.64,10.64,1290.0,1373219.0
+2024-08-09 15:00:00,10.64,10.66,10.63,10.63,2282.0,2427328.0
+2024-08-12 09:35:00,10.6,10.61,10.53,10.57,7803.0,8246589.0
+2024-08-12 09:40:00,10.57,10.57,10.53,10.55,2936.0,3097309.0
+2024-08-12 09:45:00,10.55,10.57,10.53,10.55,1857.0,1959038.0
+2024-08-12 09:50:00,10.55,10.57,10.51,10.52,3601.0,3793826.0
+2024-08-12 09:55:00,10.53,10.56,10.53,10.56,1337.0,1410021.0
+2024-08-12 10:00:00,10.56,10.56,10.54,10.56,735.0,775530.0
+2024-08-12 10:05:00,10.55,10.59,10.55,10.59,1128.0,1192955.0
+2024-08-12 10:10:00,10.59,10.59,10.56,10.57,844.0,892608.0
+2024-08-12 10:15:00,10.58,10.62,10.58,10.61,1247.0,1321882.0
+2024-08-12 10:20:00,10.61,10.64,10.6,10.64,959.0,1017981.0
+2024-08-12 10:25:00,10.64,10.68,10.62,10.65,1995.0,2124782.0
+2024-08-12 10:30:00,10.65,10.68,10.64,10.67,962.0,1025105.0
+2024-08-12 10:35:00,10.67,10.7,10.66,10.68,922.0,984254.0
+2024-08-12 10:40:00,10.69,10.69,10.66,10.69,1484.0,1584355.0
+2024-08-12 10:45:00,10.69,10.7,10.65,10.67,926.0,988787.0
+2024-08-12 10:50:00,10.66,10.7,10.66,10.69,824.0,880200.0
+2024-08-12 10:55:00,10.68,10.69,10.66,10.66,342.0,365074.0
+2024-08-12 11:00:00,10.67,10.67,10.63,10.63,349.0,371649.0
+2024-08-12 11:05:00,10.63,10.65,10.62,10.64,796.0,846497.0
+2024-08-12 11:10:00,10.63,10.64,10.62,10.63,113.0,120115.0
+2024-08-12 11:15:00,10.64,10.64,10.62,10.63,296.0,314597.0
+2024-08-12 11:20:00,10.63,10.64,10.63,10.63,159.0,169045.0
+2024-08-12 11:25:00,10.63,10.65,10.63,10.64,637.0,677792.0
+2024-08-12 11:30:00,10.63,10.65,10.63,10.64,348.0,370087.0
+2024-08-12 13:05:00,10.65,10.67,10.62,10.67,556.0,591514.0
+2024-08-12 13:10:00,10.67,10.67,10.63,10.65,179.0,190575.0
+2024-08-12 13:15:00,10.65,10.66,10.64,10.64,450.0,479238.0
+2024-08-12 13:20:00,10.65,10.66,10.64,10.64,123.0,131005.0
+2024-08-12 13:25:00,10.64,10.66,10.64,10.64,438.0,466459.0
+2024-08-12 13:30:00,10.64,10.65,10.64,10.65,88.0,93681.0
+2024-08-12 13:35:00,10.65,10.65,10.62,10.63,413.0,439190.0
+2024-08-12 13:40:00,10.63,10.64,10.62,10.62,244.0,259230.0
+2024-08-12 13:45:00,10.62,10.63,10.61,10.61,322.0,341944.0
+2024-08-12 13:50:00,10.61,10.63,10.61,10.62,858.0,911116.0
+2024-08-12 13:55:00,10.62,10.63,10.61,10.62,275.0,291938.0
+2024-08-12 14:00:00,10.61,10.62,10.6,10.6,643.0,681845.0
+2024-08-12 14:05:00,10.61,10.61,10.59,10.6,1149.0,1216301.0
+2024-08-12 14:10:00,10.6,10.63,10.6,10.61,668.0,709118.0
+2024-08-12 14:15:00,10.61,10.62,10.59,10.61,374.0,396700.0
+2024-08-12 14:20:00,10.62,10.62,10.59,10.59,447.0,474174.0
+2024-08-12 14:25:00,10.6,10.6,10.58,10.59,431.0,456503.0
+2024-08-12 14:30:00,10.59,10.6,10.59,10.59,372.0,394080.0
+2024-08-12 14:35:00,10.59,10.61,10.59,10.59,924.0,979330.0
+2024-08-12 14:40:00,10.59,10.6,10.58,10.6,203.0,215003.0
+2024-08-12 14:45:00,10.6,10.6,10.58,10.59,618.0,654440.0
+2024-08-12 14:50:00,10.59,10.61,10.58,10.61,1267.0,1342716.0
+2024-08-12 14:55:00,10.62,10.62,10.6,10.61,283.0,300167.0
+2024-08-12 15:00:00,10.61,10.62,10.6,10.62,1107.0,1174848.0
+2024-08-13 09:35:00,10.58,10.67,10.54,10.54,2531.0,2677092.0
+2024-08-13 09:40:00,10.54,10.55,10.51,10.51,2335.0,2458889.0
+2024-08-13 09:45:00,10.52,10.55,10.49,10.54,3952.0,4152949.0
+2024-08-13 09:50:00,10.55,10.56,10.48,10.48,1717.0,1804275.0
+2024-08-13 09:55:00,10.49,10.51,10.47,10.48,1913.0,2006734.0
+2024-08-13 10:00:00,10.47,10.48,10.46,10.47,1246.0,1304511.0
+2024-08-13 10:05:00,10.48,10.5,10.46,10.49,1172.0,1227381.0
+2024-08-13 10:10:00,10.49,10.53,10.48,10.53,1279.0,1343939.0
+2024-08-13 10:15:00,10.54,10.54,10.5,10.51,966.0,1016158.0
+2024-08-13 10:20:00,10.52,10.53,10.51,10.52,1105.0,1162204.0
+2024-08-13 10:25:00,10.52,10.53,10.51,10.53,485.0,510076.0
+2024-08-13 10:30:00,10.52,10.53,10.52,10.53,508.0,534790.0
+2024-08-13 10:35:00,10.53,10.53,10.5,10.51,485.0,509769.0
+2024-08-13 10:40:00,10.5,10.51,10.5,10.5,323.0,339384.0
+2024-08-13 10:45:00,10.5,10.51,10.5,10.5,811.0,851578.0
+2024-08-13 10:50:00,10.49,10.51,10.49,10.5,447.0,469139.0
+2024-08-13 10:55:00,10.51,10.52,10.5,10.52,807.0,848237.0
+2024-08-13 11:00:00,10.52,10.52,10.51,10.52,259.0,272276.0
+2024-08-13 11:05:00,10.51,10.52,10.47,10.47,1556.0,1631934.0
+2024-08-13 11:10:00,10.48,10.5,10.47,10.47,1225.0,1283798.0
+2024-08-13 11:15:00,10.47,10.48,10.45,10.45,1416.0,1480713.0
+2024-08-13 11:20:00,10.45,10.46,10.43,10.44,2271.0,2371811.0
+2024-08-13 11:25:00,10.44,10.44,10.42,10.43,1226.0,1278804.0
+2024-08-13 11:30:00,10.43,10.43,10.42,10.42,971.0,1012279.0
+2024-08-13 13:05:00,10.43,10.45,10.42,10.45,1348.0,1406353.0
+2024-08-13 13:10:00,10.44,10.44,10.43,10.44,419.0,437073.0
+2024-08-13 13:15:00,10.43,10.44,10.42,10.44,1605.0,1673299.0
+2024-08-13 13:20:00,10.44,10.46,10.44,10.45,789.0,824285.0
+2024-08-13 13:25:00,10.44,10.45,10.43,10.44,1949.0,2033836.0
+2024-08-13 13:30:00,10.44,10.44,10.43,10.44,410.0,427936.0
+2024-08-13 13:35:00,10.43,10.44,10.42,10.42,926.0,965313.0
+2024-08-13 13:40:00,10.41,10.42,10.41,10.41,332.0,345686.0
+2024-08-13 13:45:00,10.42,10.42,10.41,10.42,916.0,954470.0
+2024-08-13 13:50:00,10.42,10.42,10.41,10.42,696.0,724590.0
+2024-08-13 13:55:00,10.42,10.42,10.39,10.41,1718.0,1787640.0
+2024-08-13 14:00:00,10.4,10.41,10.4,10.41,376.0,391361.0
+2024-08-13 14:05:00,10.4,10.41,10.4,10.4,429.0,446169.0
+2024-08-13 14:10:00,10.4,10.42,10.4,10.4,628.0,653485.0
+2024-08-13 14:15:00,10.4,10.4,10.36,10.37,2171.0,2253145.0
+2024-08-13 14:20:00,10.37,10.38,10.37,10.38,696.0,722146.0
+2024-08-13 14:25:00,10.38,10.4,10.37,10.38,1204.0,1249986.0
+2024-08-13 14:30:00,10.38,10.4,10.37,10.39,731.0,758896.0
+2024-08-13 14:35:00,10.38,10.4,10.38,10.4,170.0,176657.0
+2024-08-13 14:40:00,10.4,10.4,10.38,10.4,1786.0,1855824.0
+2024-08-13 14:45:00,10.4,10.44,10.4,10.43,1141.0,1188229.0
+2024-08-13 14:50:00,10.44,10.44,10.42,10.44,583.0,608392.0
+2024-08-13 14:55:00,10.43,10.47,10.43,10.47,2292.0,2396543.0
+2024-08-13 15:00:00,10.47,10.47,10.45,10.45,1013.0,1059455.0
+2024-08-14 09:35:00,10.46,10.48,10.42,10.46,1977.0,2066756.0
+2024-08-14 09:40:00,10.46,10.46,10.42,10.45,1270.0,1325423.0
+2024-08-14 09:45:00,10.44,10.45,10.39,10.4,1754.0,1825616.0
+2024-08-14 09:50:00,10.4,10.44,10.39,10.42,953.0,992501.0
+2024-08-14 09:55:00,10.42,10.43,10.41,10.43,848.0,883431.0
+2024-08-14 10:00:00,10.41,10.42,10.4,10.4,487.0,506869.0
+2024-08-14 10:05:00,10.4,10.42,10.37,10.41,1481.0,1539263.0
+2024-08-14 10:10:00,10.42,10.44,10.41,10.44,641.0,668430.0
+2024-08-14 10:15:00,10.44,10.44,10.38,10.38,1669.0,1736378.0
+2024-08-14 10:20:00,10.38,10.41,10.38,10.4,223.0,231831.0
+2024-08-14 10:25:00,10.4,10.4,10.37,10.37,1643.0,1705727.0
+2024-08-14 10:30:00,10.37,10.41,10.37,10.4,764.0,793832.0
+2024-08-14 10:35:00,10.4,10.46,10.4,10.44,1452.0,1515740.0
+2024-08-14 10:40:00,10.43,10.46,10.42,10.46,835.0,872947.0
+2024-08-14 10:45:00,10.45,10.5,10.45,10.49,1527.0,1599208.0
+2024-08-14 10:50:00,10.49,10.52,10.49,10.51,2170.0,2278675.0
+2024-08-14 10:55:00,10.5,10.52,10.49,10.52,1471.0,1545817.0
+2024-08-14 11:00:00,10.52,10.53,10.49,10.5,919.0,966130.0
+2024-08-14 11:05:00,10.5,10.5,10.48,10.48,333.0,349358.0
+2024-08-14 11:10:00,10.48,10.49,10.48,10.49,135.0,141610.0
+2024-08-14 11:15:00,10.48,10.49,10.48,10.49,438.0,459341.0
+2024-08-14 11:20:00,10.49,10.5,10.49,10.5,437.0,458448.0
+2024-08-14 11:25:00,10.49,10.51,10.48,10.5,769.0,807069.0
+2024-08-14 11:30:00,10.5,10.5,10.49,10.5,222.0,233016.0
+2024-08-14 13:05:00,10.49,10.5,10.47,10.47,1534.0,1608817.0
+2024-08-14 13:10:00,10.47,10.49,10.46,10.48,761.0,797653.0
+2024-08-14 13:15:00,10.48,10.49,10.47,10.47,360.0,377131.0
+2024-08-14 13:20:00,10.47,10.5,10.47,10.49,694.0,728116.0
+2024-08-14 13:25:00,10.5,10.5,10.48,10.49,822.0,862283.0
+2024-08-14 13:30:00,10.48,10.48,10.46,10.46,859.0,899450.0
+2024-08-14 13:35:00,10.46,10.49,10.46,10.49,1425.0,1492360.0
+2024-08-14 13:40:00,10.49,10.5,10.48,10.49,882.0,925278.0
+2024-08-14 13:45:00,10.5,10.5,10.46,10.46,1656.0,1736698.0
+2024-08-14 13:50:00,10.46,10.46,10.44,10.45,1055.0,1102422.0
+2024-08-14 13:55:00,10.44,10.45,10.43,10.43,537.0,560662.0
+2024-08-14 14:00:00,10.44,10.45,10.43,10.44,923.0,963853.0
+2024-08-14 14:05:00,10.44,10.47,10.44,10.46,415.0,433888.0
+2024-08-14 14:10:00,10.45,10.45,10.44,10.44,249.0,260109.0
+2024-08-14 14:15:00,10.45,10.45,10.43,10.44,975.0,1018008.0
+2024-08-14 14:20:00,10.44,10.44,10.43,10.44,690.0,720189.0
+2024-08-14 14:25:00,10.44,10.46,10.44,10.44,1010.0,1054902.0
+2024-08-14 14:30:00,10.45,10.45,10.44,10.44,757.0,790964.0
+2024-08-14 14:35:00,10.44,10.46,10.44,10.45,872.0,911516.0
+2024-08-14 14:40:00,10.45,10.46,10.43,10.44,1012.0,1056283.0
+2024-08-14 14:45:00,10.43,10.44,10.41,10.42,1488.0,1550504.0
+2024-08-14 14:50:00,10.42,10.43,10.4,10.41,2479.0,2581636.0
+2024-08-14 14:55:00,10.41,10.43,10.4,10.41,1524.0,1585717.0
+2024-08-14 15:00:00,10.41,10.42,10.39,10.39,1283.0,1333819.0
+2024-08-15 09:35:00,10.4,10.44,10.34,10.38,4123.0,4285286.0
+2024-08-15 09:40:00,10.38,10.39,10.35,10.38,1410.0,1461662.0
+2024-08-15 09:45:00,10.37,10.4,10.35,10.35,3441.0,3566292.0
+2024-08-15 09:50:00,10.36,10.36,10.34,10.35,1188.0,1229420.0
+2024-08-15 09:55:00,10.35,10.36,10.32,10.34,1997.0,2064248.0
+2024-08-15 10:00:00,10.34,10.37,10.32,10.36,2912.0,3013733.0
+2024-08-15 10:05:00,10.37,10.38,10.36,10.38,1018.0,1055985.0
+2024-08-15 10:10:00,10.39,10.48,10.39,10.46,3612.0,3768187.0
+2024-08-15 10:15:00,10.47,10.53,10.47,10.53,5696.0,5978466.0
+2024-08-15 10:20:00,10.54,10.62,10.54,10.62,7032.0,7430496.0
+2024-08-15 10:25:00,10.61,10.66,10.61,10.65,7017.0,7462428.0
+2024-08-15 10:30:00,10.65,10.67,10.64,10.67,3637.0,3874718.0
+2024-08-15 10:35:00,10.66,10.7,10.66,10.68,5522.0,5898611.0
+2024-08-15 10:40:00,10.67,10.69,10.64,10.66,2376.0,2535747.0
+2024-08-15 10:45:00,10.65,10.66,10.63,10.65,2392.0,2546357.0
+2024-08-15 10:50:00,10.64,10.66,10.62,10.62,961.0,1021924.0
+2024-08-15 10:55:00,10.62,10.64,10.6,10.6,941.0,998605.0
+2024-08-15 11:00:00,10.61,10.63,10.61,10.61,1151.0,1221845.0
+2024-08-15 11:05:00,10.62,10.63,10.6,10.6,646.0,685941.0
+2024-08-15 11:10:00,10.6,10.61,10.6,10.61,609.0,645998.0
+2024-08-15 11:15:00,10.61,10.61,10.59,10.59,828.0,877734.0
+2024-08-15 11:20:00,10.59,10.62,10.59,10.62,1280.0,1358053.0
+2024-08-15 11:25:00,10.62,10.62,10.6,10.62,248.0,263216.0
+2024-08-15 11:30:00,10.62,10.63,10.61,10.62,224.0,237897.0
+2024-08-15 13:05:00,10.62,10.63,10.6,10.6,877.0,930531.0
+2024-08-15 13:10:00,10.59,10.6,10.56,10.59,3052.0,3226751.0
+2024-08-15 13:15:00,10.58,10.61,10.58,10.59,2585.0,2739663.0
+2024-08-15 13:20:00,10.59,10.59,10.56,10.57,636.0,672395.0
+2024-08-15 13:25:00,10.57,10.58,10.56,10.57,671.0,709316.0
+2024-08-15 13:30:00,10.57,10.57,10.56,10.57,513.0,541961.0
+2024-08-15 13:35:00,10.56,10.57,10.54,10.54,1227.0,1295073.0
+2024-08-15 13:40:00,10.55,10.56,10.54,10.55,778.0,820564.0
+2024-08-15 13:45:00,10.55,10.56,10.55,10.56,678.0,715745.0
+2024-08-15 13:50:00,10.56,10.57,10.54,10.54,786.0,829838.0
+2024-08-15 13:55:00,10.55,10.56,10.54,10.56,498.0,525559.0
+2024-08-15 14:00:00,10.56,10.56,10.55,10.56,332.0,350352.0
+2024-08-15 14:05:00,10.56,10.56,10.54,10.56,521.0,549605.0
+2024-08-15 14:10:00,10.55,10.56,10.54,10.55,463.0,488389.0
+2024-08-15 14:15:00,10.54,10.55,10.53,10.54,319.0,336180.0
+2024-08-15 14:20:00,10.54,10.55,10.54,10.55,396.0,417667.0
+2024-08-15 14:25:00,10.55,10.59,10.55,10.58,1589.0,1679873.0
+2024-08-15 14:30:00,10.59,10.6,10.57,10.59,502.0,531411.0
+2024-08-15 14:35:00,10.58,10.59,10.57,10.57,487.0,515221.0
+2024-08-15 14:40:00,10.57,10.57,10.56,10.56,524.0,553562.0
+2024-08-15 14:45:00,10.56,10.58,10.56,10.57,841.0,888483.0
+2024-08-15 14:50:00,10.57,10.6,10.57,10.6,1073.0,1135802.0
+2024-08-15 14:55:00,10.6,10.6,10.59,10.59,1579.0,1673409.0
+2024-08-15 15:00:00,10.6,10.62,10.59,10.59,2021.0,2141856.0
+2024-08-16 09:35:00,10.52,10.56,10.44,10.46,4743.0,4977813.0
+2024-08-16 09:40:00,10.47,10.48,10.45,10.46,2900.0,3033810.0
+2024-08-16 09:45:00,10.45,10.46,10.42,10.43,2472.0,2580525.0
+2024-08-16 09:50:00,10.45,10.46,10.43,10.44,808.0,843893.0
+2024-08-16 09:55:00,10.45,10.48,10.43,10.46,1611.0,1684760.0
+2024-08-16 10:00:00,10.47,10.49,10.46,10.49,2071.0,2169390.0
+2024-08-16 10:05:00,10.49,10.5,10.46,10.46,1388.0,1454609.0
+2024-08-16 10:10:00,10.46,10.46,10.44,10.46,926.0,967797.0
+2024-08-16 10:15:00,10.46,10.46,10.44,10.45,673.0,703217.0
+2024-08-16 10:20:00,10.46,10.47,10.44,10.45,835.0,873493.0
+2024-08-16 10:25:00,10.46,10.46,10.44,10.46,793.0,828950.0
+2024-08-16 10:30:00,10.45,10.46,10.44,10.44,491.0,513112.0
+2024-08-16 10:35:00,10.45,10.45,10.44,10.45,842.0,879270.0
+2024-08-16 10:40:00,10.45,10.46,10.44,10.45,203.0,212125.0
+2024-08-16 10:45:00,10.46,10.46,10.42,10.43,1672.0,1744868.0
+2024-08-16 10:50:00,10.43,10.43,10.42,10.42,352.0,366839.0
+2024-08-16 10:55:00,10.43,10.44,10.42,10.43,684.0,713373.0
+2024-08-16 11:00:00,10.42,10.43,10.4,10.4,2194.0,2284518.0
+2024-08-16 11:05:00,10.41,10.42,10.4,10.42,592.0,615925.0
+2024-08-16 11:10:00,10.42,10.44,10.42,10.44,260.0,271058.0
+2024-08-16 11:15:00,10.44,10.47,10.43,10.47,1382.0,1444627.0
+2024-08-16 11:20:00,10.46,10.48,10.46,10.47,421.0,440847.0
+2024-08-16 11:25:00,10.47,10.48,10.46,10.46,367.0,384357.0
+2024-08-16 11:30:00,10.46,10.47,10.45,10.47,504.0,526938.0
+2024-08-16 13:05:00,10.47,10.47,10.44,10.45,357.0,373276.0
+2024-08-16 13:10:00,10.45,10.48,10.45,10.46,1222.0,1279446.0
+2024-08-16 13:15:00,10.46,10.48,10.44,10.45,1499.0,1566120.0
+2024-08-16 13:20:00,10.45,10.46,10.43,10.43,630.0,658067.0
+2024-08-16 13:25:00,10.43,10.45,10.43,10.43,849.0,885725.0
+2024-08-16 13:30:00,10.43,10.44,10.42,10.42,816.0,850763.0
+2024-08-16 13:35:00,10.42,10.44,10.41,10.43,892.0,929560.0
+2024-08-16 13:40:00,10.41,10.43,10.4,10.4,1336.0,1390850.0
+2024-08-16 13:45:00,10.41,10.42,10.4,10.41,830.0,863495.0
+2024-08-16 13:50:00,10.42,10.42,10.4,10.42,370.0,385389.0
+2024-08-16 13:55:00,10.42,10.42,10.41,10.41,544.0,566724.0
+2024-08-16 14:00:00,10.41,10.43,10.41,10.43,560.0,583496.0
+2024-08-16 14:05:00,10.42,10.43,10.4,10.43,1555.0,1619412.0
+2024-08-16 14:10:00,10.43,10.44,10.41,10.42,587.0,611993.0
+2024-08-16 14:15:00,10.42,10.42,10.4,10.41,483.0,502834.0
+2024-08-16 14:20:00,10.41,10.42,10.4,10.42,526.0,547503.0
+2024-08-16 14:25:00,10.42,10.42,10.4,10.42,847.0,881940.0
+2024-08-16 14:30:00,10.41,10.43,10.41,10.42,765.0,796892.0
+2024-08-16 14:35:00,10.42,10.43,10.4,10.41,1087.0,1131773.0
+2024-08-16 14:40:00,10.4,10.42,10.4,10.41,707.0,736034.0
+2024-08-16 14:45:00,10.41,10.43,10.41,10.42,725.0,755665.0
+2024-08-16 14:50:00,10.43,10.43,10.41,10.43,1262.0,1315074.0
+2024-08-16 14:55:00,10.43,10.44,10.42,10.44,1886.0,1966774.0
+2024-08-16 15:00:00,10.42,10.45,10.42,10.42,3053.0,3184562.0
+2024-08-19 09:35:00,10.48,10.48,10.4,10.45,3487.0,3640377.0
+2024-08-19 09:40:00,10.45,10.57,10.44,10.55,5256.0,5534019.0
+2024-08-19 09:45:00,10.54,10.58,10.53,10.54,4624.0,4883221.0
+2024-08-19 09:50:00,10.54,10.55,10.5,10.52,1354.0,1425755.0
+2024-08-19 09:55:00,10.51,10.55,10.48,10.54,2280.0,2395324.0
+2024-08-19 10:00:00,10.55,10.55,10.53,10.54,992.0,1045692.0
+2024-08-19 10:05:00,10.54,10.55,10.49,10.5,1405.0,1478376.0
+2024-08-19 10:10:00,10.5,10.5,10.48,10.49,815.0,854767.0
+2024-08-19 10:15:00,10.49,10.49,10.47,10.48,640.0,670680.0
+2024-08-19 10:20:00,10.49,10.49,10.47,10.48,947.0,992661.0
+2024-08-19 10:25:00,10.48,10.49,10.47,10.47,791.0,829397.0
+2024-08-19 10:30:00,10.48,10.49,10.47,10.49,668.0,700056.0
+2024-08-19 10:35:00,10.49,10.49,10.47,10.47,899.0,941439.0
+2024-08-19 10:40:00,10.47,10.49,10.46,10.48,1204.0,1261535.0
+2024-08-19 10:45:00,10.48,10.48,10.46,10.46,559.0,585411.0
+2024-08-19 10:50:00,10.46,10.48,10.46,10.48,358.0,374762.0
+2024-08-19 10:55:00,10.47,10.47,10.46,10.47,249.0,260653.0
+2024-08-19 11:00:00,10.47,10.52,10.47,10.5,2181.0,2290255.0
+2024-08-19 11:05:00,10.5,10.51,10.47,10.49,414.0,434603.0
+2024-08-19 11:10:00,10.48,10.49,10.48,10.48,138.0,144652.0
+2024-08-19 11:15:00,10.49,10.49,10.48,10.48,183.0,191876.0
+2024-08-19 11:20:00,10.49,10.52,10.47,10.52,1218.0,1278715.0
+2024-08-19 11:25:00,10.51,10.52,10.5,10.51,777.0,816547.0
+2024-08-19 11:30:00,10.51,10.53,10.51,10.52,527.0,554316.0
+2024-08-19 13:05:00,10.52,10.52,10.49,10.49,925.0,972253.0
+2024-08-19 13:10:00,10.49,10.49,10.47,10.48,311.0,325934.0
+2024-08-19 13:15:00,10.47,10.48,10.46,10.47,362.0,379024.0
+2024-08-19 13:20:00,10.47,10.47,10.46,10.47,244.0,255404.0
+2024-08-19 13:25:00,10.46,10.47,10.45,10.46,529.0,553300.0
+2024-08-19 13:30:00,10.46,10.47,10.46,10.46,132.0,138076.0
+2024-08-19 13:35:00,10.46,10.47,10.44,10.45,1102.0,1152152.0
+2024-08-19 13:40:00,10.45,10.46,10.44,10.45,394.0,411641.0
+2024-08-19 13:45:00,10.46,10.46,10.44,10.44,755.0,788603.0
+2024-08-19 13:50:00,10.43,10.44,10.43,10.44,287.0,299566.0
+2024-08-19 13:55:00,10.44,10.44,10.43,10.43,124.0,129379.0
+2024-08-19 14:00:00,10.43,10.45,10.43,10.44,387.0,403986.0
+2024-08-19 14:05:00,10.45,10.45,10.43,10.44,656.0,684884.0
+2024-08-19 14:10:00,10.45,10.45,10.43,10.44,228.0,238026.0
+2024-08-19 14:15:00,10.44,10.44,10.42,10.43,680.0,709351.0
+2024-08-19 14:20:00,10.42,10.43,10.42,10.42,216.0,225106.0
+2024-08-19 14:25:00,10.42,10.44,10.42,10.44,477.0,497495.0
+2024-08-19 14:30:00,10.43,10.46,10.43,10.45,1025.0,1070594.0
+2024-08-19 14:35:00,10.46,10.46,10.44,10.46,958.0,1001186.0
+2024-08-19 14:40:00,10.46,10.46,10.45,10.45,594.0,621168.0
+2024-08-19 14:45:00,10.45,10.46,10.45,10.45,281.0,293753.0
+2024-08-19 14:50:00,10.45,10.46,10.44,10.45,1280.0,1337340.0
+2024-08-19 14:55:00,10.45,10.48,10.45,10.48,1042.0,1090735.0
+2024-08-19 15:00:00,10.47,10.48,10.45,10.45,962.0,1006885.0
+2024-08-20 09:35:00,10.47,10.48,10.35,10.37,4896.0,5085952.0
+2024-08-20 09:40:00,10.39,10.45,10.35,10.44,2218.0,2304656.0
+2024-08-20 09:45:00,10.44,10.51,10.44,10.5,2345.0,2458151.0
+2024-08-20 09:50:00,10.49,10.49,10.45,10.46,851.0,890914.0
+2024-08-20 09:55:00,10.46,10.46,10.42,10.42,778.0,812459.0
+2024-08-20 10:00:00,10.42,10.42,10.38,10.39,1214.0,1262367.0
+2024-08-20 10:05:00,10.39,10.39,10.36,10.36,1740.0,1803967.0
+2024-08-20 10:10:00,10.36,10.37,10.33,10.35,2483.0,2570029.0
+2024-08-20 10:15:00,10.35,10.36,10.34,10.36,501.0,518403.0
+2024-08-20 10:20:00,10.36,10.36,10.34,10.35,1440.0,1490103.0
+2024-08-20 10:25:00,10.34,10.36,10.32,10.32,1575.0,1628207.0
+2024-08-20 10:30:00,10.33,10.33,10.31,10.31,985.0,1016216.0
+2024-08-20 10:35:00,10.31,10.31,10.29,10.3,1739.0,1791741.0
+2024-08-20 10:40:00,10.3,10.31,10.29,10.31,793.0,817286.0
+2024-08-20 10:45:00,10.3,10.32,10.29,10.3,2159.0,2224792.0
+2024-08-20 10:50:00,10.3,10.3,10.29,10.29,736.0,757836.0
+2024-08-20 10:55:00,10.29,10.3,10.29,10.29,727.0,748439.0
+2024-08-20 11:00:00,10.29,10.3,10.28,10.29,962.0,990032.0
+2024-08-20 11:05:00,10.29,10.33,10.28,10.32,2639.0,2719803.0
+2024-08-20 11:10:00,10.31,10.35,10.31,10.33,1603.0,1655620.0
+2024-08-20 11:15:00,10.34,10.36,10.32,10.35,1634.0,1690239.0
+2024-08-20 11:20:00,10.35,10.35,10.32,10.33,579.0,598345.0
+2024-08-20 11:25:00,10.32,10.33,10.3,10.32,736.0,759504.0
+2024-08-20 11:30:00,10.32,10.33,10.3,10.31,528.0,544606.0
+2024-08-20 13:05:00,10.31,10.37,10.3,10.35,2028.0,2098114.0
+2024-08-20 13:10:00,10.35,10.36,10.33,10.35,599.0,619513.0
+2024-08-20 13:15:00,10.35,10.38,10.34,10.35,1047.0,1084930.0
+2024-08-20 13:20:00,10.34,10.36,10.34,10.34,289.0,299019.0
+2024-08-20 13:25:00,10.34,10.37,10.34,10.37,1791.0,1854786.0
+2024-08-20 13:30:00,10.37,10.37,10.35,10.35,478.0,495143.0
+2024-08-20 13:35:00,10.35,10.35,10.33,10.34,281.0,290647.0
+2024-08-20 13:40:00,10.35,10.36,10.34,10.34,513.0,530869.0
+2024-08-20 13:45:00,10.33,10.34,10.32,10.32,427.0,441138.0
+2024-08-20 13:50:00,10.33,10.34,10.31,10.34,581.0,599869.0
+2024-08-20 13:55:00,10.34,10.34,10.32,10.32,383.0,395651.0
+2024-08-20 14:00:00,10.33,10.36,10.32,10.33,929.0,960741.0
+2024-08-20 14:05:00,10.33,10.33,10.31,10.32,580.0,598531.0
+2024-08-20 14:10:00,10.32,10.33,10.31,10.31,287.0,296157.0
+2024-08-20 14:15:00,10.32,10.32,10.31,10.31,489.0,504329.0
+2024-08-20 14:20:00,10.31,10.33,10.3,10.32,867.0,894207.0
+2024-08-20 14:25:00,10.33,10.33,10.31,10.31,658.0,679007.0
+2024-08-20 14:30:00,10.32,10.34,10.31,10.34,870.0,898517.0
+2024-08-20 14:35:00,10.35,10.36,10.32,10.33,529.0,546893.0
+2024-08-20 14:40:00,10.33,10.36,10.33,10.35,598.0,618682.0
+2024-08-20 14:45:00,10.34,10.35,10.33,10.34,643.0,664936.0
+2024-08-20 14:50:00,10.34,10.35,10.33,10.34,966.0,998519.0
+2024-08-20 14:55:00,10.34,10.35,10.33,10.35,1380.0,1426480.0
+2024-08-20 15:00:00,10.34,10.36,10.34,10.34,1083.0,1120146.0
+2024-08-21 09:35:00,10.3,10.37,10.23,10.3,4412.0,4540566.0
+2024-08-21 09:40:00,10.3,10.35,10.3,10.34,1071.0,1105920.0
+2024-08-21 09:45:00,10.34,10.41,10.33,10.4,1828.0,1896882.0
+2024-08-21 09:50:00,10.4,10.41,10.37,10.39,1048.0,1089150.0
+2024-08-21 09:55:00,10.38,10.38,10.34,10.37,897.0,929287.0
+2024-08-21 10:00:00,10.36,10.37,10.33,10.34,608.0,629205.0
+2024-08-21 10:05:00,10.33,10.36,10.33,10.35,897.0,927618.0
+2024-08-21 10:10:00,10.35,10.36,10.34,10.35,311.0,321839.0
+2024-08-21 10:15:00,10.35,10.36,10.34,10.35,315.0,326036.0
+2024-08-21 10:20:00,10.34,10.37,10.34,10.37,562.0,582032.0
+2024-08-21 10:25:00,10.37,10.38,10.35,10.36,637.0,660163.0
+2024-08-21 10:30:00,10.34,10.35,10.32,10.32,616.0,636956.0
+2024-08-21 10:35:00,10.33,10.34,10.3,10.31,1360.0,1403491.0
+2024-08-21 10:40:00,10.32,10.34,10.29,10.29,743.0,766543.0
+2024-08-21 10:45:00,10.29,10.31,10.29,10.3,380.0,391304.0
+2024-08-21 10:50:00,10.3,10.31,10.29,10.29,534.0,549974.0
+2024-08-21 10:55:00,10.29,10.31,10.27,10.29,1478.0,1520742.0
+2024-08-21 11:00:00,10.29,10.34,10.28,10.33,1447.0,1492192.0
+2024-08-21 11:05:00,10.31,10.37,10.3,10.33,1059.0,1095330.0
+2024-08-21 11:10:00,10.32,10.33,10.32,10.32,240.0,247699.0
+2024-08-21 11:15:00,10.33,10.33,10.31,10.31,313.0,322842.0
+2024-08-21 11:20:00,10.33,10.33,10.29,10.31,303.0,312177.0
+2024-08-21 11:25:00,10.3,10.3,10.29,10.29,265.0,272740.0
+2024-08-21 11:30:00,10.3,10.3,10.29,10.3,168.0,172887.0
+2024-08-21 13:05:00,10.29,10.29,10.27,10.29,888.0,913207.0
+2024-08-21 13:10:00,10.28,10.29,10.25,10.27,1394.0,1431181.0
+2024-08-21 13:15:00,10.26,10.27,10.24,10.24,1229.0,1260133.0
+2024-08-21 13:20:00,10.24,10.26,10.24,10.24,1142.0,1170053.0
+2024-08-21 13:25:00,10.24,10.25,10.22,10.24,1476.0,1510011.0
+2024-08-21 13:30:00,10.23,10.24,10.23,10.24,2004.0,2051754.0
+2024-08-21 13:35:00,10.23,10.25,10.23,10.23,2243.0,2296830.0
+2024-08-21 13:40:00,10.23,10.24,10.22,10.22,1147.0,1173538.0
+2024-08-21 13:45:00,10.22,10.24,10.22,10.23,404.0,413329.0
+2024-08-21 13:50:00,10.23,10.24,10.22,10.23,692.0,707924.0
+2024-08-21 13:55:00,10.23,10.25,10.23,10.25,961.0,984258.0
+2024-08-21 14:00:00,10.24,10.25,10.24,10.24,279.0,286089.0
+2024-08-21 14:05:00,10.24,10.25,10.23,10.24,1036.0,1060365.0
+2024-08-21 14:10:00,10.25,10.25,10.24,10.24,459.0,470190.0
+2024-08-21 14:15:00,10.24,10.25,10.24,10.24,388.0,397448.0
+2024-08-21 14:20:00,10.24,10.25,10.23,10.24,931.0,953123.0
+2024-08-21 14:25:00,10.24,10.24,10.22,10.22,1216.0,1243922.0
+2024-08-21 14:30:00,10.22,10.23,10.22,10.22,970.0,991532.0
+2024-08-21 14:35:00,10.23,10.23,10.21,10.21,1529.0,1562363.0
+2024-08-21 14:40:00,10.21,10.22,10.2,10.2,2054.0,2096328.0
+2024-08-21 14:45:00,10.21,10.22,10.2,10.21,804.0,820753.0
+2024-08-21 14:50:00,10.21,10.22,10.2,10.21,1680.0,1714892.0
+2024-08-21 14:55:00,10.2,10.22,10.2,10.21,4058.0,4139661.0
+2024-08-21 15:00:00,10.2,10.21,10.2,10.21,1115.0,1137838.0
+2024-08-22 09:35:00,10.21,10.24,10.14,10.15,5045.0,5139720.0
+2024-08-22 09:40:00,10.15,10.16,10.1,10.12,3488.0,3531394.0
+2024-08-22 09:45:00,10.11,10.13,10.07,10.12,6049.0,6110364.0
+2024-08-22 09:50:00,10.12,10.12,10.08,10.09,4325.0,4365599.0
+2024-08-22 09:55:00,10.08,10.09,10.06,10.07,3752.0,3779795.0
+2024-08-22 10:00:00,10.06,10.07,10.03,10.03,3966.0,3984805.0
+2024-08-22 10:05:00,10.04,10.04,10.02,10.03,2473.0,2480066.0
+2024-08-22 10:10:00,10.03,10.04,10.03,10.04,767.0,769780.0
+2024-08-22 10:15:00,10.04,10.04,10.0,10.0,3760.0,3767976.0
+2024-08-22 10:20:00,10.0,10.01,9.98,10.0,4364.0,4361331.0
+2024-08-22 10:25:00,10.0,10.01,9.98,9.99,2134.0,2132824.0
+2024-08-22 10:30:00,9.99,9.99,9.97,9.99,2012.0,2008437.0
+2024-08-22 10:35:00,9.99,10.0,9.97,10.0,2220.0,2216576.0
+2024-08-22 10:40:00,9.99,9.99,9.97,9.97,1855.0,1851418.0
+2024-08-22 10:45:00,9.97,10.01,9.96,9.97,4110.0,4100874.0
+2024-08-22 10:50:00,9.98,9.98,9.91,9.93,3399.0,3379448.0
+2024-08-22 10:55:00,9.93,9.95,9.93,9.93,1934.0,1921170.0
+2024-08-22 11:00:00,9.93,9.95,9.93,9.93,1630.0,1619762.0
+2024-08-22 11:05:00,9.93,9.95,9.9,9.91,3521.0,3490676.0
+2024-08-22 11:10:00,9.9,9.91,9.88,9.9,3464.0,3427883.0
+2024-08-22 11:15:00,9.9,9.92,9.9,9.91,749.0,742143.0
+2024-08-22 11:20:00,9.91,9.92,9.9,9.92,784.0,777038.0
+2024-08-22 11:25:00,9.92,9.93,9.91,9.91,883.0,875824.0
+2024-08-22 11:30:00,9.92,9.92,9.9,9.92,986.0,977208.0
+2024-08-22 13:05:00,9.93,9.93,9.91,9.92,1353.0,1342535.0
+2024-08-22 13:10:00,9.92,9.92,9.9,9.91,754.0,747372.0
+2024-08-22 13:15:00,9.9,9.92,9.9,9.9,943.0,934438.0
+2024-08-22 13:20:00,9.9,9.91,9.89,9.9,1986.0,1966223.0
+2024-08-22 13:25:00,9.9,9.91,9.89,9.91,1590.0,1573958.0
+2024-08-22 13:30:00,9.91,9.92,9.9,9.92,1203.0,1192535.0
+2024-08-22 13:35:00,9.91,9.92,9.9,9.92,813.0,805967.0
+2024-08-22 13:40:00,9.91,9.92,9.89,9.89,1908.0,1889524.0
+2024-08-22 13:45:00,9.89,9.9,9.88,9.88,2846.0,2814637.0
+2024-08-22 13:50:00,9.89,9.89,9.87,9.88,2326.0,2297878.0
+2024-08-22 13:55:00,9.88,9.88,9.85,9.86,3234.0,3188702.0
+2024-08-22 14:00:00,9.85,9.86,9.83,9.83,2000.0,1969115.0
+2024-08-22 14:05:00,9.83,9.84,9.81,9.83,6481.0,6367009.0
+2024-08-22 14:10:00,9.84,9.84,9.8,9.81,5023.0,4930721.0
+2024-08-22 14:15:00,9.81,9.81,9.78,9.78,5599.0,5483942.0
+2024-08-22 14:20:00,9.78,9.81,9.78,9.81,2331.0,2285162.0
+2024-08-22 14:25:00,9.8,9.83,9.79,9.81,1805.0,1769936.0
+2024-08-22 14:30:00,9.81,9.83,9.8,9.81,2327.0,2284382.0
+2024-08-22 14:35:00,9.82,9.82,9.8,9.8,1799.0,1764103.0
+2024-08-22 14:40:00,9.8,9.81,9.79,9.8,1539.0,1507667.0
+2024-08-22 14:45:00,9.8,9.81,9.79,9.81,1389.0,1361187.0
+2024-08-22 14:50:00,9.81,9.82,9.79,9.81,2072.0,2031823.0
+2024-08-22 14:55:00,9.81,9.82,9.8,9.8,2027.0,1987621.0
+2024-08-22 15:00:00,9.8,9.82,9.8,9.82,2665.0,2615001.0
+2024-08-23 09:35:00,9.81,9.85,9.75,9.81,6235.0,6105743.0
+2024-08-23 09:40:00,9.81,9.83,9.78,9.8,2243.0,2200471.0
+2024-08-23 09:45:00,9.79,9.86,9.79,9.86,2667.0,2621868.0
+2024-08-23 09:50:00,9.86,9.89,9.83,9.86,2251.0,2218540.0
+2024-08-23 09:55:00,9.86,9.87,9.83,9.83,1575.0,1550820.0
+2024-08-23 10:00:00,9.83,9.83,9.8,9.81,596.0,584962.0
+2024-08-23 10:05:00,9.8,9.81,9.78,9.79,946.0,927116.0
+2024-08-23 10:10:00,9.79,9.83,9.79,9.82,1309.0,1285150.0
+2024-08-23 10:15:00,9.82,9.84,9.8,9.83,1577.0,1551249.0
+2024-08-23 10:20:00,9.84,9.85,9.83,9.83,734.0,722291.0
+2024-08-23 10:25:00,9.83,9.84,9.81,9.81,794.0,779853.0
+2024-08-23 10:30:00,9.81,9.81,9.8,9.8,419.0,410959.0
+2024-08-23 10:35:00,9.8,9.82,9.79,9.8,1118.0,1095862.0
+2024-08-23 10:40:00,9.81,9.84,9.81,9.82,476.0,467581.0
+2024-08-23 10:45:00,9.82,9.83,9.81,9.81,382.0,375004.0
+2024-08-23 10:50:00,9.81,9.82,9.81,9.82,274.0,269004.0
+2024-08-23 10:55:00,9.82,9.82,9.8,9.81,328.0,321782.0
+2024-08-23 11:00:00,9.82,9.82,9.8,9.8,920.0,902202.0
+2024-08-23 11:05:00,9.8,9.83,9.79,9.81,317.0,310991.0
+2024-08-23 11:10:00,9.82,9.85,9.81,9.83,543.0,534054.0
+2024-08-23 11:15:00,9.83,9.86,9.83,9.85,424.0,417600.0
+2024-08-23 11:20:00,9.84,9.88,9.82,9.88,1030.0,1015443.0
+2024-08-23 11:25:00,9.88,9.9,9.87,9.88,1631.0,1612142.0
+2024-08-23 11:30:00,9.88,9.88,9.85,9.86,708.0,698670.0
+2024-08-23 13:05:00,9.88,9.88,9.83,9.84,1018.0,1003023.0
+2024-08-23 13:10:00,9.83,9.83,9.81,9.81,806.0,791851.0
+2024-08-23 13:15:00,9.81,9.84,9.81,9.84,645.0,633856.0
+2024-08-23 13:20:00,9.84,9.84,9.81,9.84,443.0,435324.0
+2024-08-23 13:25:00,9.82,9.85,9.82,9.83,560.0,550859.0
+2024-08-23 13:30:00,9.83,9.85,9.83,9.84,454.0,446808.0
+2024-08-23 13:35:00,9.84,9.86,9.83,9.85,1063.0,1046462.0
+2024-08-23 13:40:00,9.84,9.86,9.84,9.85,688.0,677497.0
+2024-08-23 13:45:00,9.85,9.87,9.85,9.85,926.0,912863.0
+2024-08-23 13:50:00,9.85,9.86,9.83,9.85,440.0,433251.0
+2024-08-23 13:55:00,9.83,9.86,9.82,9.82,911.0,895498.0
+2024-08-23 14:00:00,9.84,9.84,9.8,9.8,2245.0,2202275.0
+2024-08-23 14:05:00,9.8,9.81,9.77,9.77,1748.0,1711494.0
+2024-08-23 14:10:00,9.79,9.79,9.76,9.76,1798.0,1756498.0
+2024-08-23 14:15:00,9.76,9.79,9.76,9.79,1236.0,1207886.0
+2024-08-23 14:20:00,9.77,9.81,9.77,9.8,588.0,575275.0
+2024-08-23 14:25:00,9.79,9.8,9.78,9.78,399.0,390550.0
+2024-08-23 14:30:00,9.8,9.8,9.78,9.8,721.0,705503.0
+2024-08-23 14:35:00,9.8,9.82,9.79,9.81,654.0,641272.0
+2024-08-23 14:40:00,9.81,9.83,9.8,9.81,497.0,487503.0
+2024-08-23 14:45:00,9.81,9.82,9.8,9.82,523.0,513254.0
+2024-08-23 14:50:00,9.8,9.83,9.8,9.83,799.0,784216.0
+2024-08-23 14:55:00,9.83,9.84,9.81,9.82,2150.0,2112695.0
+2024-08-23 15:00:00,9.84,9.84,9.82,9.82,922.0,905542.0
+2024-08-26 09:35:00,9.83,9.84,9.72,9.74,3488.0,3407579.0
+2024-08-26 09:40:00,9.73,9.75,9.71,9.74,3077.0,2993159.0
+2024-08-26 09:45:00,9.73,9.82,9.73,9.82,1445.0,1413972.0
+2024-08-26 09:50:00,9.81,9.85,9.78,9.85,1854.0,1821075.0
+2024-08-26 09:55:00,9.84,9.86,9.81,9.82,1371.0,1348275.0
+2024-08-26 10:00:00,9.82,9.85,9.8,9.83,1660.0,1631593.0
+2024-08-26 10:05:00,9.83,9.86,9.83,9.85,1449.0,1426677.0
+2024-08-26 10:10:00,9.86,9.89,9.85,9.88,2491.0,2456975.0
+2024-08-26 10:15:00,9.88,9.88,9.83,9.85,880.0,867455.0
+2024-08-26 10:20:00,9.85,9.86,9.83,9.85,878.0,863797.0
+2024-08-26 10:25:00,9.85,9.87,9.84,9.85,861.0,848744.0
+2024-08-26 10:30:00,9.86,9.87,9.85,9.86,1062.0,1047250.0
+2024-08-26 10:35:00,9.85,9.87,9.84,9.85,1128.0,1111544.0
+2024-08-26 10:40:00,9.84,9.85,9.81,9.82,1022.0,1004039.0
+2024-08-26 10:45:00,9.83,9.83,9.81,9.81,462.0,453564.0
+2024-08-26 10:50:00,9.81,9.81,9.79,9.79,660.0,646866.0
+2024-08-26 10:55:00,9.79,9.82,9.79,9.81,656.0,643344.0
+2024-08-26 11:00:00,9.81,9.81,9.78,9.79,589.0,576782.0
+2024-08-26 11:05:00,9.79,9.79,9.76,9.78,1052.0,1028891.0
+2024-08-26 11:10:00,9.79,9.79,9.78,9.78,439.0,429376.0
+2024-08-26 11:15:00,9.78,9.79,9.77,9.78,273.0,266992.0
+2024-08-26 11:20:00,9.79,9.8,9.77,9.78,697.0,682053.0
+2024-08-26 11:25:00,9.78,9.79,9.78,9.79,844.0,826132.0
+2024-08-26 11:30:00,9.78,9.8,9.77,9.78,929.0,908711.0
+2024-08-26 13:05:00,9.79,9.79,9.77,9.77,921.0,900205.0
+2024-08-26 13:10:00,9.78,9.78,9.77,9.78,186.0,181819.0
+2024-08-26 13:15:00,9.78,9.79,9.77,9.79,482.0,471638.0
+2024-08-26 13:20:00,9.79,9.81,9.79,9.79,439.0,430276.0
+2024-08-26 13:25:00,9.79,9.81,9.79,9.79,501.0,490671.0
+2024-08-26 13:30:00,9.8,9.8,9.79,9.8,95.0,93098.0
+2024-08-26 13:35:00,9.79,9.8,9.79,9.79,202.0,197776.0
+2024-08-26 13:40:00,9.79,9.79,9.77,9.78,447.0,437167.0
+2024-08-26 13:45:00,9.77,9.79,9.77,9.78,225.0,220068.0
+2024-08-26 13:50:00,9.79,9.79,9.77,9.78,620.0,606274.0
+2024-08-26 13:55:00,9.77,9.78,9.77,9.78,265.0,259106.0
+2024-08-26 14:00:00,9.78,9.79,9.78,9.78,390.0,381440.0
+2024-08-26 14:05:00,9.77,9.78,9.77,9.78,275.0,268888.0
+2024-08-26 14:10:00,9.78,9.79,9.77,9.78,888.0,868609.0
+2024-08-26 14:15:00,9.78,9.79,9.77,9.78,617.0,603625.0
+2024-08-26 14:20:00,9.77,9.78,9.76,9.76,1067.0,1042333.0
+2024-08-26 14:25:00,9.76,9.79,9.76,9.77,405.0,395876.0
+2024-08-26 14:30:00,9.79,9.79,9.77,9.78,699.0,683635.0
+2024-08-26 14:35:00,9.79,9.81,9.78,9.81,1016.0,994971.0
+2024-08-26 14:40:00,9.81,9.82,9.8,9.8,1507.0,1478486.0
+2024-08-26 14:45:00,9.8,9.8,9.79,9.8,866.0,848531.0
+2024-08-26 14:50:00,9.8,9.81,9.79,9.8,443.0,434167.0
+2024-08-26 14:55:00,9.81,9.82,9.8,9.81,867.0,850160.0
+2024-08-26 15:00:00,9.81,9.82,9.8,9.82,1020.0,1001599.0
+2024-08-27 09:35:00,9.75,9.79,9.74,9.78,3295.0,3216408.0
+2024-08-27 09:40:00,9.78,9.81,9.75,9.79,1741.0,1701995.0
+2024-08-27 09:45:00,9.79,9.81,9.76,9.76,1248.0,1220948.0
+2024-08-27 09:50:00,9.76,9.77,9.75,9.75,1114.0,1086882.0
+2024-08-27 09:55:00,9.75,9.76,9.72,9.73,2379.0,2316659.0
+2024-08-27 10:00:00,9.73,9.73,9.66,9.67,5890.0,5713088.0
+2024-08-27 10:05:00,9.67,9.67,9.64,9.65,2879.0,2778367.0
+2024-08-27 10:10:00,9.65,9.69,9.64,9.68,2059.0,1990830.0
+2024-08-27 10:15:00,9.67,9.69,9.66,9.66,696.0,673371.0
+2024-08-27 10:20:00,9.66,9.68,9.66,9.67,387.0,374292.0
+2024-08-27 10:25:00,9.68,9.68,9.67,9.68,500.0,483729.0
+2024-08-27 10:30:00,9.67,9.68,9.66,9.66,1016.0,982591.0
+2024-08-27 10:35:00,9.67,9.71,9.66,9.69,2360.0,2285796.0
+2024-08-27 10:40:00,9.69,9.71,9.69,9.71,610.0,591307.0
+2024-08-27 10:45:00,9.69,9.71,9.66,9.66,776.0,751204.0
+2024-08-27 10:50:00,9.66,9.68,9.66,9.67,1128.0,1090652.0
+2024-08-27 10:55:00,9.67,9.69,9.67,9.68,794.0,768548.0
+2024-08-27 11:00:00,9.68,9.68,9.66,9.67,1465.0,1416400.0
+2024-08-27 11:05:00,9.67,9.67,9.66,9.66,1020.0,986056.0
+2024-08-27 11:10:00,9.67,9.67,9.66,9.66,1084.0,1047774.0
+2024-08-27 11:15:00,9.66,9.67,9.66,9.66,202.0,195195.0
+2024-08-27 11:20:00,9.66,9.68,9.66,9.68,244.0,235829.0
+2024-08-27 11:25:00,9.68,9.7,9.67,9.68,481.0,465929.0
+2024-08-27 11:30:00,9.69,9.7,9.67,9.67,1430.0,1384393.0
+2024-08-27 13:05:00,9.67,9.69,9.65,9.65,2864.0,2767477.0
+2024-08-27 13:10:00,9.65,9.66,9.65,9.65,745.0,719014.0
+2024-08-27 13:15:00,9.66,9.66,9.65,9.65,379.0,365956.0
+2024-08-27 13:20:00,9.66,9.67,9.65,9.67,357.0,344911.0
+2024-08-27 13:25:00,9.66,9.68,9.66,9.68,203.0,196259.0
+2024-08-27 13:30:00,9.68,9.68,9.66,9.66,717.0,693121.0
+2024-08-27 13:35:00,9.66,9.67,9.66,9.67,155.0,149798.0
+2024-08-27 13:40:00,9.67,9.68,9.66,9.67,350.0,338444.0
+2024-08-27 13:45:00,9.68,9.68,9.66,9.67,284.0,274569.0
+2024-08-27 13:50:00,9.68,9.68,9.66,9.66,789.0,762883.0
+2024-08-27 13:55:00,9.66,9.67,9.66,9.66,210.0,202927.0
+2024-08-27 14:00:00,9.66,9.67,9.65,9.67,1308.0,1263960.0
+2024-08-27 14:05:00,9.66,9.67,9.66,9.67,399.0,385695.0
+2024-08-27 14:10:00,9.66,9.67,9.66,9.67,233.0,225118.0
+2024-08-27 14:15:00,9.67,9.67,9.65,9.66,1214.0,1172290.0
+2024-08-27 14:20:00,9.66,9.67,9.65,9.67,752.0,726377.0
+2024-08-27 14:25:00,9.67,9.67,9.65,9.66,1297.0,1253040.0
+2024-08-27 14:30:00,9.66,9.67,9.66,9.66,464.0,448360.0
+2024-08-27 14:35:00,9.66,9.67,9.64,9.65,2474.0,2388191.0
+2024-08-27 14:40:00,9.66,9.66,9.64,9.65,1516.0,1463224.0
+2024-08-27 14:45:00,9.65,9.67,9.65,9.65,635.0,613312.0
+2024-08-27 14:50:00,9.66,9.67,9.65,9.66,1042.0,1007307.0
+2024-08-27 14:55:00,9.66,9.67,9.66,9.66,674.0,651411.0
+2024-08-27 15:00:00,9.67,9.68,9.66,9.67,1140.0,1101826.0
+2024-08-28 09:35:00,9.66,9.71,9.64,9.66,4140.0,4003153.0
+2024-08-28 09:40:00,9.65,9.68,9.63,9.65,1370.0,1322353.0
+2024-08-28 09:45:00,9.65,9.65,9.61,9.62,2150.0,2070818.0
+2024-08-28 09:50:00,9.61,9.64,9.61,9.61,1176.0,1131950.0
+2024-08-28 09:55:00,9.61,9.64,9.6,9.63,2469.0,2373771.0
+2024-08-28 10:00:00,9.64,9.65,9.62,9.63,1141.0,1099787.0
+2024-08-28 10:05:00,9.64,9.66,9.63,9.66,861.0,830158.0
+2024-08-28 10:10:00,9.66,9.69,9.66,9.68,997.0,964710.0
+2024-08-28 10:15:00,9.69,9.69,9.65,9.65,559.0,540337.0
+2024-08-28 10:20:00,9.65,9.72,9.64,9.7,1771.0,1715031.0
+2024-08-28 10:25:00,9.71,9.72,9.7,9.72,940.0,913066.0
+2024-08-28 10:30:00,9.72,9.73,9.71,9.72,2214.0,2150644.0
+2024-08-28 10:35:00,9.71,9.73,9.71,9.72,528.0,513378.0
+2024-08-28 10:40:00,9.72,9.79,9.72,9.76,1897.0,1851397.0
+2024-08-28 10:45:00,9.76,9.78,9.75,9.78,589.0,575053.0
+2024-08-28 10:50:00,9.78,9.84,9.78,9.83,4936.0,4842772.0
+2024-08-28 10:55:00,9.83,9.87,9.83,9.85,2628.0,2588449.0
+2024-08-28 11:00:00,9.84,9.85,9.81,9.82,1203.0,1182313.0
+2024-08-28 11:05:00,9.83,9.86,9.83,9.83,1411.0,1388223.0
+2024-08-28 11:10:00,9.83,9.83,9.81,9.82,309.0,303303.0
+2024-08-28 11:15:00,9.81,9.82,9.8,9.81,692.0,678656.0
+2024-08-28 11:20:00,9.8,9.81,9.79,9.79,233.0,228339.0
+2024-08-28 11:25:00,9.79,9.8,9.78,9.78,348.0,340735.0
+2024-08-28 11:30:00,9.79,9.79,9.76,9.77,790.0,772487.0
+2024-08-28 13:05:00,9.77,9.79,9.74,9.79,1043.0,1018033.0
+2024-08-28 13:10:00,9.79,9.83,9.79,9.8,1207.0,1183148.0
+2024-08-28 13:15:00,9.81,9.81,9.79,9.79,352.0,344965.0
+2024-08-28 13:20:00,9.79,9.82,9.79,9.81,880.0,862637.0
+2024-08-28 13:25:00,9.8,9.81,9.8,9.8,373.0,365601.0
+2024-08-28 13:30:00,9.8,9.82,9.79,9.81,658.0,645143.0
+2024-08-28 13:35:00,9.8,9.81,9.78,9.79,549.0,537621.0
+2024-08-28 13:40:00,9.79,9.81,9.78,9.81,473.0,463421.0
+2024-08-28 13:45:00,9.8,9.81,9.8,9.8,420.0,411721.0
+2024-08-28 13:50:00,9.8,9.83,9.8,9.82,1138.0,1117510.0
+2024-08-28 13:55:00,9.86,9.89,9.86,9.86,7478.0,7376113.0
+2024-08-28 14:00:00,9.87,9.87,9.83,9.83,1174.0,1156760.0
+2024-08-28 14:05:00,9.83,9.85,9.83,9.83,449.0,441681.0
+2024-08-28 14:10:00,9.83,9.84,9.83,9.83,244.0,239881.0
+2024-08-28 14:15:00,9.83,9.83,9.81,9.83,658.0,646477.0
+2024-08-28 14:20:00,9.82,9.84,9.82,9.82,630.0,619117.0
+2024-08-28 14:25:00,9.82,9.84,9.81,9.83,581.0,570702.0
+2024-08-28 14:30:00,9.84,9.84,9.82,9.82,648.0,636531.0
+2024-08-28 14:35:00,9.82,9.84,9.82,9.84,317.0,311511.0
+2024-08-28 14:40:00,9.84,9.85,9.83,9.84,968.0,952761.0
+2024-08-28 14:45:00,9.84,9.85,9.83,9.83,385.0,378772.0
+2024-08-28 14:50:00,9.84,9.84,9.82,9.83,646.0,635242.0
+2024-08-28 14:55:00,9.83,9.85,9.82,9.82,2189.0,2152741.0
+2024-08-28 15:00:00,9.83,9.84,9.81,9.82,2308.0,2267449.0
+2024-08-29 09:35:00,9.82,9.84,9.75,9.8,4262.0,4167116.0
+2024-08-29 09:40:00,9.8,9.81,9.77,9.8,1804.0,1765329.0
+2024-08-29 09:45:00,9.8,9.83,9.79,9.82,1056.0,1035903.0
+2024-08-29 09:50:00,9.82,9.85,9.79,9.8,1359.0,1334422.0
+2024-08-29 09:55:00,9.81,9.84,9.81,9.83,886.0,870006.0
+2024-08-29 10:00:00,9.82,9.83,9.81,9.83,934.0,917431.0
+2024-08-29 10:05:00,9.83,9.86,9.83,9.85,1196.0,1177365.0
+2024-08-29 10:10:00,9.84,9.86,9.84,9.84,930.0,916152.0
+2024-08-29 10:15:00,9.84,9.87,9.84,9.87,1256.0,1238360.0
+2024-08-29 10:20:00,9.86,9.87,9.84,9.85,1574.0,1550876.0
+2024-08-29 10:25:00,9.85,9.87,9.83,9.83,1583.0,1559557.0
+2024-08-29 10:30:00,9.83,9.84,9.82,9.82,575.0,565201.0
+2024-08-29 10:35:00,9.82,9.84,9.81,9.82,767.0,753519.0
+2024-08-29 10:40:00,9.83,9.85,9.82,9.85,815.0,801758.0
+2024-08-29 10:45:00,9.85,9.88,9.85,9.87,1169.0,1153102.0
+2024-08-29 10:50:00,9.87,9.88,9.85,9.88,1029.0,1015797.0
+2024-08-29 10:55:00,9.88,9.91,9.88,9.91,2233.0,2208715.0
+2024-08-29 11:00:00,9.91,9.91,9.88,9.89,1150.0,1137781.0
+2024-08-29 11:05:00,9.89,9.9,9.87,9.87,595.0,588109.0
+2024-08-29 11:10:00,9.87,9.87,9.85,9.85,549.0,541430.0
+2024-08-29 11:15:00,9.86,9.87,9.85,9.87,751.0,740963.0
+2024-08-29 11:20:00,9.86,9.87,9.85,9.87,437.0,430959.0
+2024-08-29 11:25:00,9.86,9.89,9.86,9.86,625.0,617074.0
+2024-08-29 11:30:00,9.87,9.89,9.87,9.88,349.0,344735.0
diff --git a/examples/eth_usdt_realtime_prediction.py b/examples/eth_usdt_realtime_prediction.py
new file mode 100644
index 0000000000000000000000000000000000000000..07b2c1723041c8612287585e2aa36e01e4b63421
--- /dev/null
+++ b/examples/eth_usdt_realtime_prediction.py
@@ -0,0 +1,524 @@
+import os
+import sys
+import time
+import warnings
+from datetime import datetime, timedelta
+
+import matplotlib.dates as mdates
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+import requests
+
+warnings.filterwarnings('ignore')
+
+# 添加项目路径
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+from model import Kronos, KronosTokenizer, KronosPredictor
+
+
+# ==================== 配置参数 ====================
+class PredictionConfig:
+ """预测配置类"""
+
+ # 支持的时间间隔及其对应的分钟数
+ SUPPORTED_INTERVALS = {
+ '1m': 1, '3m': 3, '5m': 5, '15m': 15, '30m': 30,
+ '1h': 60, '2h': 120, '4h': 240, '6h': 360, '8h': 480, '12h': 720, '1d': 1440
+ }
+
+ def __init__(self, interval='15m', pred_len=24, lookback=400):
+ self.interval = interval
+ self.pred_len = pred_len
+ self.lookback = lookback
+ self.interval_minutes = self.SUPPORTED_INTERVALS.get(interval, 15)
+
+ # 验证参数
+ if interval not in self.SUPPORTED_INTERVALS:
+ raise ValueError(f"不支持的时间间隔: {interval}. 支持的间隔: {list(self.SUPPORTED_INTERVALS.keys())}")
+
+ def get_24h_periods(self):
+ """计算24小时对应的K线数量"""
+ return int(24 * 60 / self.interval_minutes)
+
+ def get_prediction_duration_hours(self):
+ """计算预测时长(小时)"""
+ return (self.pred_len * self.interval_minutes) / 60
+
+ def get_freq_string(self):
+ """获取pandas频率字符串"""
+ freq_map = {
+ '1m': '1T', '3m': '3T', '5m': '5T', '15m': '15T', '30m': '30T',
+ '1h': '1H', '2h': '2H', '4h': '4H', '6h': '6H', '8h': '8H', '12h': '12H', '1d': '1D'
+ }
+ return freq_map.get(self.interval, '15T')
+
+ def get_time_format(self):
+ """根据时间间隔获取最佳时间显示格式"""
+ if self.interval_minutes <= 60: # 小时内
+ return '%H:%M'
+ elif self.interval_minutes <= 1440: # 日内
+ return '%m-%d %H:%M'
+ else: # 日级别
+ return '%Y-%m-%d'
+
+ def get_prediction_time_points(self):
+ """Get prediction time point descriptions"""
+ duration_hours = self.get_prediction_duration_hours()
+
+ if duration_hours < 1:
+ return [
+ (int(self.pred_len * 0.25), f"{int(duration_hours * 0.25 * 60)}min later"),
+ (int(self.pred_len * 0.5), f"{int(duration_hours * 0.5 * 60)}min later"),
+ (self.pred_len - 1, f"{int(duration_hours * 60)}min later")
+ ]
+ elif duration_hours <= 24:
+ return [
+ (int(self.pred_len * 0.25), f"{duration_hours * 0.25:.1f}h later"),
+ (int(self.pred_len * 0.5), f"{duration_hours * 0.5:.1f}h later"),
+ (self.pred_len - 1, f"{duration_hours:.1f}h later")
+ ]
+ else:
+ days = duration_hours / 24
+ return [
+ (int(self.pred_len * 0.25), f"{days * 0.25:.1f}d later"),
+ (int(self.pred_len * 0.5), f"{days * 0.5:.1f}d later"),
+ (self.pred_len - 1, f"{days:.1f}d later")
+ ]
+
+
+def get_user_config():
+ """获取用户配置(可扩展为交互式输入)"""
+
+ # 配置示例:
+ # 短期交易 (1分钟K线,预测30分钟)
+ # config = PredictionConfig(interval='1m', pred_len=30, lookback=400)
+
+ # 中期交易 (15分钟K线,预测6小时)
+ config = PredictionConfig(interval='15m', pred_len=24, lookback=512)
+
+ # 长期分析 (1小时K线,预测24小时)
+ # config = PredictionConfig(interval='1h', pred_len=24, lookback=400)
+
+ # 日线分析 (1天K线,预测7天)
+ # config = PredictionConfig(interval='1d', pred_len=7, lookback=200)
+
+ print("📋 当前预测配置:")
+ print(f" 时间间隔: {config.interval}")
+ print(f" 预测长度: {config.pred_len} 步")
+ print(f" 预测时长: {config.get_prediction_duration_hours():.1f} 小时")
+ print(f" 历史数据: {config.lookback} 个数据点")
+ print(f" 支持的间隔: {list(config.SUPPORTED_INTERVALS.keys())}")
+ print()
+
+ return config
+
+
+class BinanceDataFetcher:
+ """币安数据获取器 - 中国可访问"""
+
+ def __init__(self):
+ self.base_url = "https://api.binance.com"
+ # 备用URL(如果主URL不可访问)
+ self.backup_urls = [
+ "https://api1.binance.com",
+ "https://api2.binance.com",
+ "https://api3.binance.com"
+ ]
+
+ def get_klines(self, symbol="ETHUSDT", interval="15m", limit=500):
+ """
+ 获取K线数据
+
+ Args:
+ symbol: 交易对符号 (如 ETHUSDT)
+ interval: 时间间隔 (1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M)
+ limit: 数据条数 (最大1000)
+ """
+ endpoint = "/api/v3/klines"
+ params = {
+ 'symbol': symbol,
+ 'interval': interval,
+ 'limit': limit
+ }
+
+ # 尝试多个URL
+ for url in [self.base_url] + self.backup_urls:
+ try:
+ response = requests.get(url + endpoint, params=params, timeout=10)
+ if response.status_code == 200:
+ data = response.json()
+ return self._parse_klines(data)
+ else:
+ print(f"API返回错误: {response.status_code}")
+ except Exception as e:
+ print(f"尝试URL {url} 失败: {e}")
+ continue
+
+ raise Exception("所有API URL都无法访问,请检查网络连接")
+
+ def _parse_klines(self, raw_data):
+ """解析K线数据"""
+ df = pd.DataFrame(raw_data, columns=[
+ 'timestamp', 'open', 'high', 'low', 'close', 'volume',
+ 'close_time', 'quote_asset_volume', 'number_of_trades',
+ 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
+ ])
+
+ # 转换数据类型
+ df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
+ for col in ['open', 'high', 'low', 'close', 'volume', 'quote_asset_volume']:
+ df[col] = df[col].astype(float)
+
+ # 重命名列以匹配Kronos格式
+ df = df.rename(columns={
+ 'timestamp': 'timestamps',
+ 'quote_asset_volume': 'amount'
+ })
+
+ # 选择需要的列
+ df = df[['timestamps', 'open', 'high', 'low', 'close', 'volume', 'amount']]
+
+ return df.sort_values('timestamps').reset_index(drop=True)
+
+
+def plot_prediction_with_realtime(historical_df, pred_df, config, symbol="ETH-USDT"):
+ """Plot professional financial chart style real-time prediction results"""
+
+ # Set font to avoid Chinese display issues
+ plt.rcParams['font.family'] = 'DejaVu Sans'
+ plt.rcParams['axes.unicode_minus'] = False
+
+ # 准备时间序列数据
+ hist_timestamps = pd.to_datetime(historical_df['timestamps'])
+ pred_timestamps = pd.to_datetime(pred_df.index) if hasattr(pred_df, 'index') else pd.date_range(
+ start=hist_timestamps.iloc[-1] + pd.Timedelta(minutes=config.interval_minutes),
+ periods=len(pred_df),
+ freq=config.get_freq_string()
+ )
+
+ # 准备数据
+ hist_close = historical_df['close'].values
+ pred_close = pred_df['close'].values
+ hist_volume = historical_df['volume'].values
+ pred_volume = pred_df['volume'].values
+
+ # 计算关键统计信息
+ current_price = hist_close[-1]
+ final_pred_price = pred_close[-1]
+ price_change = final_pred_price - current_price
+ price_change_pct = (price_change / current_price) * 100
+ max_pred_price = np.max(pred_close)
+ min_pred_price = np.min(pred_close)
+ volatility = ((max_pred_price - min_pred_price) / current_price) * 100
+
+ # 创建专业图表布局
+ fig = plt.figure(figsize=(16, 10))
+ gs = fig.add_gridspec(3, 4, height_ratios=[0.8, 2, 1], width_ratios=[1, 1, 1, 1],
+ hspace=0.3, wspace=0.2)
+
+ # 信息面板
+ ax_info = fig.add_subplot(gs[0, :])
+ ax_info.axis('off')
+
+ # 主价格图
+ ax_price = fig.add_subplot(gs[1, :])
+
+ # 成交量图
+ ax_volume = fig.add_subplot(gs[2, :], sharex=ax_price)
+
+ # === Information Panel ===
+ duration_text = f"{config.get_prediction_duration_hours():.1f}h" if config.get_prediction_duration_hours() >= 1 else f"{int(config.get_prediction_duration_hours() * 60)}min"
+ info_text = f"""
+ {symbol} {config.interval} Candlestick Prediction Analysis | {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
+ Config: {config.pred_len}-step prediction ({duration_text}) | Historical data: {config.lookback} points
+
+ Current Price: ${current_price:.2f} Predicted Price: ${final_pred_price:.2f} Change: {price_change:+.2f} ({price_change_pct:+.2f}%)
+ Predicted High: ${max_pred_price:.2f} Predicted Low: ${min_pred_price:.2f} Volatility: {volatility:.2f}%
+ """
+ ax_info.text(0.5, 0.5, info_text, transform=ax_info.transAxes,
+ fontsize=12, ha='center', va='center',
+ bbox=dict(boxstyle="round,pad=0.5", facecolor='lightblue', alpha=0.8))
+
+ # === 价格图绘制 ===
+ # 历史价格线
+ ax_price.plot(hist_timestamps, hist_close,
+ color='#1f77b4', linewidth=2, label='Historical Price', alpha=0.8)
+
+ # 预测价格线(虚线)
+ ax_price.plot(pred_timestamps, pred_close,
+ color='#ff7f0e', linewidth=2.5, linestyle='--',
+ label='Predicted Price', alpha=0.9)
+
+ # 预测区域背景高亮
+ y_min, y_max = ax_price.get_ylim()
+ pred_start = pred_timestamps[0]
+ pred_end = pred_timestamps[-1]
+ ax_price.axvspan(pred_start, pred_end, alpha=0.1, color='orange', label='Prediction Zone')
+
+ # 关键价格点标注
+ # 当前价格点
+ ax_price.scatter(hist_timestamps.iloc[-1], current_price,
+ color='blue', s=100, zorder=5, marker='o')
+ ax_price.annotate(f'Current: ${current_price:.2f}',
+ xy=(hist_timestamps.iloc[-1], current_price),
+ xytext=(10, 10), textcoords='offset points',
+ bbox=dict(boxstyle='round,pad=0.3', facecolor='lightblue'),
+ arrowprops=dict(arrowstyle='->', color='blue'))
+
+ # 最终预测价格点
+ ax_price.scatter(pred_timestamps[-1], final_pred_price,
+ color='red', s=100, zorder=5, marker='s')
+ ax_price.annotate(f'Predicted: ${final_pred_price:.2f}',
+ xy=(pred_timestamps[-1], final_pred_price),
+ xytext=(-80, 10), textcoords='offset points',
+ bbox=dict(boxstyle='round,pad=0.3', facecolor='lightyellow'),
+ arrowprops=dict(arrowstyle='->', color='red'))
+
+ # 最高最低价格标注
+ max_idx = np.argmax(pred_close)
+ min_idx = np.argmin(pred_close)
+
+ ax_price.scatter(pred_timestamps[max_idx], max_pred_price,
+ color='green', s=80, zorder=5, marker='^')
+ ax_price.annotate(f'High: ${max_pred_price:.2f}',
+ xy=(pred_timestamps[max_idx], max_pred_price),
+ xytext=(0, 15), textcoords='offset points',
+ ha='center', fontsize=9,
+ bbox=dict(boxstyle='round,pad=0.2', facecolor='lightgreen'))
+
+ ax_price.scatter(pred_timestamps[min_idx], min_pred_price,
+ color='red', s=80, zorder=5, marker='v')
+ ax_price.annotate(f'Low: ${min_pred_price:.2f}',
+ xy=(pred_timestamps[min_idx], min_pred_price),
+ xytext=(0, -20), textcoords='offset points',
+ ha='center', fontsize=9,
+ bbox=dict(boxstyle='round,pad=0.2', facecolor='lightcoral'))
+
+ # 趋势箭头
+ if price_change > 0:
+ ax_price.annotate('', xy=(pred_timestamps[-1], final_pred_price),
+ xytext=(pred_timestamps[0], pred_close[0]),
+ arrowprops=dict(arrowstyle='->', color='green', lw=2, alpha=0.6))
+ else:
+ ax_price.annotate('', xy=(pred_timestamps[-1], final_pred_price),
+ xytext=(pred_timestamps[0], pred_close[0]),
+ arrowprops=dict(arrowstyle='->', color='red', lw=2, alpha=0.6))
+
+ # === 成交量图绘制 ===
+ # 计算柱状图宽度(约为时间间隔的80%)
+ bar_width = pd.Timedelta(minutes=config.interval_minutes * 0.8)
+
+ # 历史成交量柱状图
+ ax_volume.bar(hist_timestamps, hist_volume,
+ width=bar_width, color='#1f77b4',
+ alpha=0.6, label='Historical Volume')
+
+ # 预测成交量柱状图
+ ax_volume.bar(pred_timestamps, pred_volume,
+ width=bar_width, color='#ff7f0e',
+ alpha=0.7, label='Predicted Volume')
+
+ # === 图表格式化 ===
+ # 价格图设置
+ ax_price.set_ylabel('Price (USDT)', fontsize=12, fontweight='bold')
+ ax_price.grid(True, alpha=0.3, linestyle='-', linewidth=0.5)
+ ax_price.legend(loc='upper left', frameon=True, fancybox=True, shadow=True)
+ ax_price.set_facecolor('#fafafa')
+
+ # 成交量图设置
+ ax_volume.set_ylabel('Volume (ETH)', fontsize=12, fontweight='bold')
+ ax_volume.set_xlabel('Time', fontsize=12, fontweight='bold')
+ ax_volume.grid(True, alpha=0.3, linestyle='-', linewidth=0.5)
+ ax_volume.legend(loc='upper left', frameon=True, fancybox=True, shadow=True)
+ ax_volume.set_facecolor('#fafafa')
+
+ # 时间轴格式化(基于配置参数)
+ time_format = config.get_time_format()
+ ax_volume.xaxis.set_major_formatter(mdates.DateFormatter(time_format))
+
+ # 根据时间间隔设置刻度间隔
+ if config.interval_minutes <= 5: # 1m, 3m, 5m
+ ax_volume.xaxis.set_major_locator(mdates.HourLocator(interval=1))
+ elif config.interval_minutes <= 30: # 15m, 30m
+ ax_volume.xaxis.set_major_locator(mdates.HourLocator(interval=2))
+ elif config.interval_minutes <= 240: # 1h, 2h, 4h
+ ax_volume.xaxis.set_major_locator(mdates.HourLocator(interval=6))
+ elif config.interval_minutes <= 720: # 6h, 8h, 12h
+ ax_volume.xaxis.set_major_locator(mdates.HourLocator(interval=12))
+ else: # 1d
+ ax_volume.xaxis.set_major_locator(mdates.DayLocator(interval=1))
+
+ # 旋转时间标签
+ plt.setp(ax_volume.xaxis.get_majorticklabels(), rotation=45, ha='right')
+
+ # 添加分割线(历史/预测边界)
+ boundary_time = pred_timestamps[0]
+ ax_price.axvline(x=boundary_time, color='gray', linestyle=':', linewidth=2, alpha=0.8)
+ ax_volume.axvline(x=boundary_time, color='gray', linestyle=':', linewidth=2, alpha=0.8)
+
+ # 添加分割线标签
+ ax_price.text(boundary_time, ax_price.get_ylim()[1] * 0.95, 'Prediction Start',
+ rotation=90, ha='right', va='top', fontsize=10,
+ bbox=dict(boxstyle='round,pad=0.2', facecolor='white', alpha=0.8))
+
+ # 整体布局优化
+ plt.tight_layout()
+
+ # Save chart
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+ filename = f"eth_usdt_prediction_{timestamp}.png"
+ plt.savefig(filename, dpi=300, bbox_inches='tight', facecolor='white')
+ print(f"Prediction chart saved as: {filename}")
+
+ # Also save SVG format (vector graphics)
+ svg_filename = f"eth_usdt_prediction_{timestamp}.svg"
+ plt.savefig(svg_filename, format='svg', bbox_inches='tight', facecolor='white')
+ print(f"Vector chart saved as: {svg_filename}")
+
+ # plt.show() # Commented out to avoid GUI issues
+ print("📊 Chart generation completed!")
+
+
+def main():
+ print("🚀 ETH-USDT 实时预测系统启动")
+ print("=" * 50)
+
+ # 0. 获取配置参数
+ config = get_user_config()
+
+ # 1. 初始化数据获取器
+ print("📡 初始化数据获取器...")
+ fetcher = BinanceDataFetcher()
+
+ # 2. 获取实时数据
+ print("📊 获取ETH-USDT实时数据...")
+ try:
+ df = fetcher.get_klines(symbol="ETHUSDT", interval=config.interval, limit=config.lookback)
+ print(f"✅ 成功获取 {len(df)} 条数据")
+ print(f"📅 数据时间范围: {df['timestamps'].min()} 到 {df['timestamps'].max()}")
+ print(f"💰 当前价格: ${df['close'].iloc[-1]:.2f}")
+
+ # 计算24小时涨跌(根据时间间隔调整)
+ periods_24h = config.get_24h_periods()
+ if len(df) >= periods_24h:
+ price_24h_ago = df['close'].iloc[-periods_24h]
+ change_24h = ((df['close'].iloc[-1] / price_24h_ago - 1) * 100)
+ print(f"📈 24h涨跌: {change_24h:.2f}%")
+ else:
+ print(f"📈 数据不足24小时,无法计算24h涨跌")
+ except Exception as e:
+ print(f"❌ 数据获取失败: {e}")
+ return
+
+ # 3. 加载模型
+ print("\n🤖 加载Kronos模型...")
+ try:
+ tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
+ model = Kronos.from_pretrained("NeoQuasar/Kronos-base")
+ predictor = KronosPredictor(model, tokenizer, device="cpu", max_context=512)
+ print("✅ 模型加载成功")
+ except Exception as e:
+ print(f"❌ 模型加载失败: {e}")
+ return
+
+ # 4. 准备预测数据
+ print("\n📋 准备预测数据...")
+
+ if len(df) < config.lookback:
+ print(f"❌ 数据不足,需要至少{config.lookback}条数据,当前只有{len(df)}条")
+ return
+
+ # 选择最近的数据
+ recent_df = df.tail(config.lookback + config.pred_len).copy()
+
+ # 历史数据
+ x_df = recent_df.iloc[:config.lookback][['open', 'high', 'low', 'close', 'volume', 'amount']]
+ x_timestamp = recent_df.iloc[:config.lookback]['timestamps']
+
+ # 生成未来时间戳(根据配置的时间间隔)
+ last_time = x_timestamp.iloc[-1]
+ future_timestamps = pd.date_range(
+ start=last_time + timedelta(minutes=config.interval_minutes),
+ periods=config.pred_len,
+ freq=config.get_freq_string()
+ )
+ # 转换为pandas Series以匹配模型期望的格式
+ future_timestamps = pd.Series(future_timestamps)
+
+ duration_hours = config.get_prediction_duration_hours()
+ duration_text = f"{duration_hours:.1f}小时" if duration_hours >= 1 else f"{int(duration_hours * 60)}分钟"
+
+ print(f"📊 使用 {len(x_df)} 条历史数据")
+ print(f"🔮 预测未来 {config.pred_len} 个时间点({duration_text})")
+ print(f"⏰ 预测时间范围: {future_timestamps.iloc[0]} 到 {future_timestamps.iloc[-1]}")
+
+ # 5. 执行预测
+ print("\n🔮 开始预测...")
+ start_time = time.time()
+
+ try:
+ pred_df = predictor.predict(
+ df=x_df,
+ x_timestamp=x_timestamp,
+ y_timestamp=future_timestamps,
+ pred_len=config.pred_len,
+ T=0.8, # 降低温度以获得更稳定的预测
+ top_p=0.9, # 核采样
+ sample_count=3, # 多次采样取平均
+ verbose=True
+ )
+
+ prediction_time = time.time() - start_time
+ print(f"✅ 预测完成,耗时: {prediction_time:.1f}秒")
+
+ except Exception as e:
+ print(f"❌ 预测失败: {e}")
+ return
+
+ # 6. 分析预测结果
+ print("\n📈 预测结果分析:")
+ print("=" * 30)
+
+ current_price = x_df['close'].iloc[-1]
+ pred_prices = pred_df['close']
+
+ print(f"当前价格: ${current_price:.2f}")
+
+ # 使用配置的时间点进行分析
+ time_points = config.get_prediction_time_points()
+ for idx, time_desc in time_points:
+ if idx < len(pred_prices):
+ price = pred_prices.iloc[idx]
+ change_pct = ((price / current_price - 1) * 100)
+ print(f"{time_desc}预测: ${price:.2f} ({change_pct:+.2f}%)")
+
+ # 价格趋势分析
+ price_trend = "上涨" if pred_prices.iloc[-1] > current_price else "下跌"
+ max_price = pred_prices.max()
+ min_price = pred_prices.min()
+
+ print(f"\n📊 趋势分析:")
+ print(f"整体趋势: {price_trend}")
+ print(f"预测最高价: ${max_price:.2f}")
+ print(f"预测最低价: ${min_price:.2f}")
+ print(f"价格波动范围: {((max_price - min_price) / current_price * 100):.2f}%")
+
+ # 7. 可视化结果
+ print("\n📊 生成预测图表...")
+ try:
+ plot_prediction_with_realtime(recent_df.iloc[:config.lookback], pred_df, config, "ETH-USDT")
+ except Exception as e:
+ print(f"⚠️ 图表生成失败: {e}")
+
+ # 8. 保存预测结果
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+ result_file = f"eth_usdt_prediction_{config.interval}_{timestamp}.csv"
+ pred_df.to_csv(result_file)
+ print(f"💾 预测结果已保存为: {result_file}")
+
+ print("\n🎉 预测完成!")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/prediction_batch_example.py b/examples/prediction_batch_example.py
new file mode 100644
index 0000000000000000000000000000000000000000..c74bfe3ffb56cee5069e48205c0b5d20668a8dc4
--- /dev/null
+++ b/examples/prediction_batch_example.py
@@ -0,0 +1,72 @@
+import pandas as pd
+import matplotlib.pyplot as plt
+import sys
+sys.path.append("../")
+from model import Kronos, KronosTokenizer, KronosPredictor
+
+
+def plot_prediction(kline_df, pred_df):
+ pred_df.index = kline_df.index[-pred_df.shape[0]:]
+ sr_close = kline_df['close']
+ sr_pred_close = pred_df['close']
+ sr_close.name = 'Ground Truth'
+ sr_pred_close.name = "Prediction"
+
+ sr_volume = kline_df['volume']
+ sr_pred_volume = pred_df['volume']
+ sr_volume.name = 'Ground Truth'
+ sr_pred_volume.name = "Prediction"
+
+ close_df = pd.concat([sr_close, sr_pred_close], axis=1)
+ volume_df = pd.concat([sr_volume, sr_pred_volume], axis=1)
+
+ fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
+
+ ax1.plot(close_df['Ground Truth'], label='Ground Truth', color='blue', linewidth=1.5)
+ ax1.plot(close_df['Prediction'], label='Prediction', color='red', linewidth=1.5)
+ ax1.set_ylabel('Close Price', fontsize=14)
+ ax1.legend(loc='lower left', fontsize=12)
+ ax1.grid(True)
+
+ ax2.plot(volume_df['Ground Truth'], label='Ground Truth', color='blue', linewidth=1.5)
+ ax2.plot(volume_df['Prediction'], label='Prediction', color='red', linewidth=1.5)
+ ax2.set_ylabel('Volume', fontsize=14)
+ ax2.legend(loc='upper left', fontsize=12)
+ ax2.grid(True)
+
+ plt.tight_layout()
+ plt.show()
+
+
+# 1. Load Model and Tokenizer
+tokenizer = KronosTokenizer.from_pretrained('/home/csc/huggingface/Kronos-Tokenizer-base/')
+model = Kronos.from_pretrained("/home/csc/huggingface/Kronos-base/")
+
+# 2. Instantiate Predictor
+predictor = KronosPredictor(model, tokenizer, device="cuda:0", max_context=512)
+
+# 3. Prepare Data
+df = pd.read_csv("./data/XSHG_5min_600977.csv")
+df['timestamps'] = pd.to_datetime(df['timestamps'])
+
+lookback = 400
+pred_len = 120
+
+dfs = []
+xtsp = []
+ytsp = []
+for i in range(5):
+ idf = df.loc[(i*400):(i*400+lookback-1), ['open', 'high', 'low', 'close', 'volume', 'amount']]
+ i_x_timestamp = df.loc[(i*400):(i*400+lookback-1), 'timestamps']
+ i_y_timestamp = df.loc[(i*400+lookback):(i*400+lookback+pred_len-1), 'timestamps']
+
+ dfs.append(idf)
+ xtsp.append(i_x_timestamp)
+ ytsp.append(i_y_timestamp)
+
+pred_df = predictor.predict_batch(
+ df_list=dfs,
+ x_timestamp_list=xtsp,
+ y_timestamp_list=ytsp,
+ pred_len=pred_len,
+)
diff --git a/examples/prediction_example.py b/examples/prediction_example.py
new file mode 100644
index 0000000000000000000000000000000000000000..d58b7d4a08f998b14ec95779d17c3534d960b923
--- /dev/null
+++ b/examples/prediction_example.py
@@ -0,0 +1,81 @@
+import pandas as pd
+import matplotlib.pyplot as plt
+import sys
+import os
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+from model import Kronos, KronosTokenizer, KronosPredictor
+
+
+def plot_prediction(kline_df, pred_df):
+ pred_df.index = kline_df.index[-pred_df.shape[0]:]
+ sr_close = kline_df['close']
+ sr_pred_close = pred_df['close']
+ sr_close.name = 'Ground Truth'
+ sr_pred_close.name = "Prediction"
+
+ sr_volume = kline_df['volume']
+ sr_pred_volume = pred_df['volume']
+ sr_volume.name = 'Ground Truth'
+ sr_pred_volume.name = "Prediction"
+
+ close_df = pd.concat([sr_close, sr_pred_close], axis=1)
+ volume_df = pd.concat([sr_volume, sr_pred_volume], axis=1)
+
+ fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
+
+ ax1.plot(close_df['Ground Truth'], label='Ground Truth', color='blue', linewidth=1.5)
+ ax1.plot(close_df['Prediction'], label='Prediction', color='red', linewidth=1.5)
+ ax1.set_ylabel('Close Price', fontsize=14)
+ ax1.legend(loc='lower left', fontsize=12)
+ ax1.grid(True)
+
+ ax2.plot(volume_df['Ground Truth'], label='Ground Truth', color='blue', linewidth=1.5)
+ ax2.plot(volume_df['Prediction'], label='Prediction', color='red', linewidth=1.5)
+ ax2.set_ylabel('Volume', fontsize=14)
+ ax2.legend(loc='upper left', fontsize=12)
+ ax2.grid(True)
+
+ plt.tight_layout()
+ plt.show()
+
+
+# 1. Load Model and Tokenizer
+tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
+model = Kronos.from_pretrained("NeoQuasar/Kronos-small")
+
+# 2. Instantiate Predictor
+predictor = KronosPredictor(model, tokenizer, device="cpu", max_context=512)
+
+# 3. Prepare Data
+df = pd.read_csv("./examples/data/XSHG_5min_600977.csv")
+df['timestamps'] = pd.to_datetime(df['timestamps'])
+
+lookback = 400
+pred_len = 120
+
+x_df = df.loc[:lookback-1, ['open', 'high', 'low', 'close', 'volume', 'amount']]
+x_timestamp = df.loc[:lookback-1, 'timestamps']
+y_timestamp = df.loc[lookback:lookback+pred_len-1, 'timestamps']
+
+# 4. Make Prediction
+pred_df = predictor.predict(
+ df=x_df,
+ x_timestamp=x_timestamp,
+ y_timestamp=y_timestamp,
+ pred_len=pred_len,
+ T=1.0,
+ top_p=0.9,
+ sample_count=1,
+ verbose=True
+)
+
+# 5. Visualize Results
+print("Forecasted Data Head:")
+print(pred_df.head())
+
+# Combine historical and forecasted data for plotting
+kline_df = df.loc[:lookback+pred_len-1]
+
+# visualize
+plot_prediction(kline_df, pred_df)
+
diff --git a/examples/prediction_wo_vol_example.py b/examples/prediction_wo_vol_example.py
new file mode 100644
index 0000000000000000000000000000000000000000..40f60da3d5ea4688b1716917b91b4554ab44c0f2
--- /dev/null
+++ b/examples/prediction_wo_vol_example.py
@@ -0,0 +1,69 @@
+import pandas as pd
+import matplotlib.pyplot as plt
+import sys
+import os
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+from model import Kronos, KronosTokenizer, KronosPredictor
+
+
+def plot_prediction(kline_df, pred_df):
+ pred_df.index = kline_df.index[-pred_df.shape[0]:]
+ sr_close = kline_df['close']
+ sr_pred_close = pred_df['close']
+ sr_close.name = 'Ground Truth'
+ sr_pred_close.name = "Prediction"
+
+ close_df = pd.concat([sr_close, sr_pred_close], axis=1)
+
+ fig, ax = plt.subplots(1, 1, figsize=(8, 4))
+
+ ax.plot(close_df['Ground Truth'], label='Ground Truth', color='blue', linewidth=1.5)
+ ax.plot(close_df['Prediction'], label='Prediction', color='red', linewidth=1.5)
+ ax.set_ylabel('Close Price', fontsize=14)
+ ax.legend(loc='lower left', fontsize=12)
+ ax.grid(True)
+
+ plt.tight_layout()
+ plt.show()
+
+
+# 1. Load Model and Tokenizer
+tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
+model = Kronos.from_pretrained("NeoQuasar/Kronos-base")
+
+# 2. Instantiate Predictor
+predictor = KronosPredictor(model, tokenizer, device="cpu", max_context=512)
+
+# 3. Prepare Data
+df = pd.read_csv("./examples/data/XSHG_5min_600977.csv")
+df['timestamps'] = pd.to_datetime(df['timestamps'])
+
+lookback = 400
+pred_len = 120
+
+x_df = df.loc[:lookback-1, ['open', 'high', 'low', 'close']]
+x_timestamp = df.loc[:lookback-1, 'timestamps']
+y_timestamp = df.loc[lookback:lookback+pred_len-1, 'timestamps']
+
+# 4. Make Prediction
+pred_df = predictor.predict(
+ df=x_df,
+ x_timestamp=x_timestamp,
+ y_timestamp=y_timestamp,
+ pred_len=pred_len,
+ T=1.0,
+ top_p=0.9,
+ sample_count=1,
+ verbose=True
+)
+
+# 5. Visualize Results
+print("Forecasted Data Head:")
+print(pred_df.head())
+
+# Combine historical and forecasted data for plotting
+kline_df = df.loc[:lookback+pred_len-1]
+
+# visualize
+plot_prediction(kline_df, pred_df)
+
diff --git a/figures/backtest_result_example.png b/figures/backtest_result_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..762f7d5ce34414dd552eea3dd184e6e516cdad67
--- /dev/null
+++ b/figures/backtest_result_example.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7b86fea2ac1a8d9a1c698039e64ae397d5453179557466a91da37431f331126c
+size 499292
diff --git a/figures/logo.png b/figures/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1ba864d47f597a98dba2c151e32255053f9aa0f
--- /dev/null
+++ b/figures/logo.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4a3bb66fed73a24f74b74f15f0798d5edf1b9729ee826a0cad8e5088dedda61
+size 871803
diff --git a/figures/overview.png b/figures/overview.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf96cc1af1dbf86c6106b3ac9ef8b9b4d8d19a27
--- /dev/null
+++ b/figures/overview.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f5b4556a39883fdd82b35515a686899a4c94495f70ab8f3fc7a7ac1e3104cc50
+size 1254487
diff --git a/figures/prediction_example.png b/figures/prediction_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..d50e14261b05c27122766766c1dfa9f307c48e6e
--- /dev/null
+++ b/figures/prediction_example.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:24ddc86256158658582687fc7cef4761f1dbb130ab8161e04957c8d178d323f9
+size 193945
diff --git a/finetune/__pycache__/config.cpython-313.pyc b/finetune/__pycache__/config.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ccdd9eefb6010049309dc71c3ba8c603e27c40a3
Binary files /dev/null and b/finetune/__pycache__/config.cpython-313.pyc differ
diff --git a/finetune/config.py b/finetune/config.py
new file mode 100644
index 0000000000000000000000000000000000000000..04cc3ee312ef4bc4f77d13e02cb8a8be6bf5a2e0
--- /dev/null
+++ b/finetune/config.py
@@ -0,0 +1,131 @@
+import os
+
+class Config:
+ """
+ Configuration class for the entire project.
+ """
+
+ def __init__(self):
+ # =================================================================
+ # Data & Feature Parameters
+ # =================================================================
+ # TODO: Update this path to your Qlib data directory.
+ self.qlib_data_path = "~/.qlib/qlib_data/cn_data"
+ self.instrument = 'csi300'
+
+ # Overall time range for data loading from Qlib.
+ self.dataset_begin_time = "2011-01-01"
+ self.dataset_end_time = '2025-06-05'
+
+ # Sliding window parameters for creating samples.
+ self.lookback_window = 90 # Number of past time steps for input.
+ self.predict_window = 10 # Number of future time steps for prediction.
+ self.max_context = 512 # Maximum context length for the model.
+
+ # Features to be used from the raw data.
+ self.feature_list = ['open', 'high', 'low', 'close', 'vol', 'amt']
+ # Time-based features to be generated.
+ self.time_feature_list = ['minute', 'hour', 'weekday', 'day', 'month']
+
+ # =================================================================
+ # Dataset Splitting & Paths
+ # =================================================================
+ # Note: The validation/test set starts earlier than the training/validation set ends
+ # to account for the `lookback_window`.
+ self.train_time_range = ["2011-01-01", "2022-12-31"]
+ self.val_time_range = ["2022-09-01", "2024-06-30"]
+ self.test_time_range = ["2024-04-01", "2025-06-05"]
+ self.backtest_time_range = ["2024-07-01", "2025-06-05"]
+
+ # TODO: Directory to save the processed, pickled datasets.
+ self.dataset_path = "./data/processed_datasets"
+
+ # =================================================================
+ # Training Hyperparameters
+ # =================================================================
+ self.clip = 5.0 # Clipping value for normalized data to prevent outliers.
+
+ self.epochs = 30
+ self.log_interval = 100 # Log training status every N batches.
+ self.batch_size = 50 # Batch size per GPU.
+
+ # Number of samples to draw for one "epoch" of training/validation.
+ # This is useful for large datasets where a true epoch is too long.
+ self.n_train_iter = 2000 * self.batch_size
+ self.n_val_iter = 400 * self.batch_size
+
+ # Learning rates for different model components.
+ self.tokenizer_learning_rate = 2e-4
+ self.predictor_learning_rate = 4e-5
+
+ # Gradient accumulation to simulate a larger batch size.
+ self.accumulation_steps = 1
+
+ # AdamW optimizer parameters.
+ self.adam_beta1 = 0.9
+ self.adam_beta2 = 0.95
+ self.adam_weight_decay = 0.1
+
+ # Miscellaneous
+ self.seed = 100 # Global random seed for reproducibility.
+
+ # =================================================================
+ # Experiment Logging & Saving
+ # =================================================================
+ self.use_comet = True # Set to False if you don't want to use Comet ML
+ self.comet_config = {
+ # It is highly recommended to load secrets from environment variables
+ # for security purposes. Example: os.getenv("COMET_API_KEY")
+ "api_key": "YOUR_COMET_API_KEY",
+ "project_name": "Kronos-Finetune-Demo",
+ "workspace": "your_comet_workspace" # TODO: Change to your Comet ML workspace name
+ }
+ self.comet_tag = 'finetune_demo'
+ self.comet_name = 'finetune_demo'
+
+ # Base directory for saving model checkpoints and results.
+ # Using a general 'outputs' directory is a common practice.
+ self.save_path = "./outputs/models"
+ self.tokenizer_save_folder_name = 'finetune_tokenizer_demo'
+ self.predictor_save_folder_name = 'finetune_predictor_demo'
+ self.backtest_save_folder_name = 'finetune_backtest_demo'
+
+ # Path for backtesting results.
+ self.backtest_result_path = "./outputs/backtest_results"
+
+ # =================================================================
+ # Model & Checkpoint Paths
+ # =================================================================
+ # TODO: Update these paths to your pretrained model locations.
+ # These can be local paths or Hugging Face Hub model identifiers.
+ self.pretrained_tokenizer_path = "path/to/your/Kronos-Tokenizer-base"
+ self.pretrained_predictor_path = "path/to/your/Kronos-small"
+
+ # Paths to the fine-tuned models, derived from the save_path.
+ # These will be generated automatically during training.
+ self.finetuned_tokenizer_path = f"{self.save_path}/{self.tokenizer_save_folder_name}/checkpoints/best_model"
+ self.finetuned_predictor_path = f"{self.save_path}/{self.predictor_save_folder_name}/checkpoints/best_model"
+
+ # =================================================================
+ # Backtesting Parameters
+ # =================================================================
+ self.backtest_n_symbol_hold = 50 # Number of symbols to hold in the portfolio.
+ self.backtest_n_symbol_drop = 5 # Number of symbols to drop from the pool.
+ self.backtest_hold_thresh = 5 # Minimum holding period for a stock.
+ self.inference_T = 0.6
+ self.inference_top_p = 0.9
+ self.inference_top_k = 0
+ self.inference_sample_count = 5
+ self.backtest_batch_size = 1000
+ self.backtest_benchmark = self._set_benchmark(self.instrument)
+
+ def _set_benchmark(self, instrument):
+ dt_benchmark = {
+ 'csi800': "SH000906",
+ 'csi1000': "SH000852",
+ 'csi300': "SH000300",
+ }
+ if instrument in dt_benchmark:
+ return dt_benchmark[instrument]
+ else:
+ raise ValueError(f"Benchmark not defined for instrument: {instrument}")
diff --git a/finetune/dataset.py b/finetune/dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..f955ec12d92c4129d5d88ab3562d27cb9c5a2a72
--- /dev/null
+++ b/finetune/dataset.py
@@ -0,0 +1,145 @@
+import pickle
+import random
+import numpy as np
+import torch
+from torch.utils.data import Dataset
+from config import Config
+
+
+class QlibDataset(Dataset):
+ """
+ A PyTorch Dataset for handling Qlib financial time series data.
+
+ This dataset pre-computes all possible start indices for sliding windows
+ and then randomly samples from them during training/validation.
+
+ Args:
+ data_type (str): The type of dataset to load, either 'train' or 'val'.
+
+ Raises:
+ ValueError: If `data_type` is not 'train' or 'val'.
+ """
+
+ def __init__(self, data_type: str = 'train'):
+ self.config = Config()
+ if data_type not in ['train', 'val']:
+ raise ValueError("data_type must be 'train' or 'val'")
+ self.data_type = data_type
+
+ # Use a dedicated random number generator for sampling to avoid
+ # interfering with other random processes (e.g., in model initialization).
+ self.py_rng = random.Random(self.config.seed)
+
+ # Set paths and number of samples based on the data type.
+ if data_type == 'train':
+ self.data_path = f"{self.config.dataset_path}/train_data.pkl"
+ self.n_samples = self.config.n_train_iter
+ else:
+ self.data_path = f"{self.config.dataset_path}/val_data.pkl"
+ self.n_samples = self.config.n_val_iter
+
+ with open(self.data_path, 'rb') as f:
+ self.data = pickle.load(f)
+
+ self.window = self.config.lookback_window + self.config.predict_window + 1
+
+ self.symbols = list(self.data.keys())
+ self.feature_list = self.config.feature_list
+ self.time_feature_list = self.config.time_feature_list
+
+ # Pre-compute all possible (symbol, start_index) pairs.
+ self.indices = []
+ print(f"[{data_type.upper()}] Pre-computing sample indices...")
+ for symbol in self.symbols:
+ df = self.data[symbol].reset_index()
+ series_len = len(df)
+ num_samples = series_len - self.window + 1
+
+ if num_samples > 0:
+ # Generate time features and store them directly in the dataframe.
+ df['minute'] = df['datetime'].dt.minute
+ df['hour'] = df['datetime'].dt.hour
+ df['weekday'] = df['datetime'].dt.weekday
+ df['day'] = df['datetime'].dt.day
+ df['month'] = df['datetime'].dt.month
+ # Keep only necessary columns to save memory.
+ self.data[symbol] = df[self.feature_list + self.time_feature_list]
+
+ # Add all valid starting indices for this symbol to the global list.
+ for i in range(num_samples):
+ self.indices.append((symbol, i))
+
+ # The effective dataset size is the minimum of the configured iterations
+ # and the total number of available samples.
+ self.n_samples = min(self.n_samples, len(self.indices))
+ print(f"[{data_type.upper()}] Found {len(self.indices)} possible samples. Using {self.n_samples} per epoch.")
+
+ def set_epoch_seed(self, epoch: int):
+ """
+ Sets a new seed for the random sampler for each epoch. This is crucial
+ for reproducibility in distributed training.
+
+ Args:
+ epoch (int): The current epoch number.
+ """
+ epoch_seed = self.config.seed + epoch
+ self.py_rng.seed(epoch_seed)
+
+ def __len__(self) -> int:
+ """Returns the number of samples per epoch."""
+ return self.n_samples
+
+ def __getitem__(self, idx: int) -> tuple[torch.Tensor, torch.Tensor]:
+ """
+ Retrieves a random sample from the dataset.
+
+ Note: The `idx` argument is ignored. Instead, a random index is drawn
+ from the pre-computed `self.indices` list using `self.py_rng`. This
+ ensures random sampling over the entire dataset for each call.
+
+ Args:
+ idx (int): Ignored.
+
+ Returns:
+ tuple[torch.Tensor, torch.Tensor]: A tuple containing:
+ - x_tensor (torch.Tensor): The normalized feature tensor.
+ - x_stamp_tensor (torch.Tensor): The time feature tensor.
+ """
+ # Select a random sample from the entire pool of indices.
+ random_idx = self.py_rng.randint(0, len(self.indices) - 1)
+ symbol, start_idx = self.indices[random_idx]
+
+ # Extract the sliding window from the dataframe.
+ df = self.data[symbol]
+ end_idx = start_idx + self.window
+ win_df = df.iloc[start_idx:end_idx]
+
+ # Separate main features and time features.
+ x = win_df[self.feature_list].values.astype(np.float32)
+ x_stamp = win_df[self.time_feature_list].values.astype(np.float32)
+
+ # Perform instance-level normalization.
+ x_mean, x_std = np.mean(x, axis=0), np.std(x, axis=0)
+ x = (x - x_mean) / (x_std + 1e-5)
+ x = np.clip(x, -self.config.clip, self.config.clip)
+
+ # Convert to PyTorch tensors.
+ x_tensor = torch.from_numpy(x)
+ x_stamp_tensor = torch.from_numpy(x_stamp)
+
+ return x_tensor, x_stamp_tensor
+
+
+if __name__ == '__main__':
+ # Example usage and verification.
+ print("Creating training dataset instance...")
+ train_dataset = QlibDataset(data_type='train')
+
+ print(f"Dataset length: {len(train_dataset)}")
+
+ if len(train_dataset) > 0:
+ try_x, try_x_stamp = train_dataset[100] # Index 100 is ignored.
+ print(f"Sample feature shape: {try_x.shape}")
+ print(f"Sample time feature shape: {try_x_stamp.shape}")
+ else:
+ print("Dataset is empty.")
diff --git a/finetune/qlib_data_preprocess.py b/finetune/qlib_data_preprocess.py
new file mode 100644
index 0000000000000000000000000000000000000000..7fe6147be522302dd3e85aa80a71f0047df72402
--- /dev/null
+++ b/finetune/qlib_data_preprocess.py
@@ -0,0 +1,130 @@
+import os
+import pickle
+import numpy as np
+import pandas as pd
+import qlib
+from qlib.config import REG_CN
+from qlib.data import D
+from qlib.data.dataset.loader import QlibDataLoader
+from tqdm import trange
+
+from config import Config
+
+
+class QlibDataPreprocessor:
+ """
+ A class to handle the loading, processing, and splitting of Qlib financial data.
+ """
+
+ def __init__(self):
+ """Initializes the preprocessor with configuration and data fields."""
+ self.config = Config()
+ self.data_fields = ['open', 'close', 'high', 'low', 'volume', 'vwap']
+ self.data = {} # A dictionary to store processed data for each symbol.
+
+ def initialize_qlib(self):
+ """Initializes the Qlib environment."""
+ print("Initializing Qlib...")
+ qlib.init(provider_uri=self.config.qlib_data_path, region=REG_CN)
+
+ def load_qlib_data(self):
+ """
+ Loads raw data from Qlib, processes it symbol by symbol, and stores
+ it in the `self.data` attribute.
+ """
+ print("Loading and processing data from Qlib...")
+ data_fields_qlib = ['$' + f for f in self.data_fields]
+ cal: np.ndarray = D.calendar()
+
+ # Determine the actual start and end times to load, including buffer for lookback and predict windows.
+ start_index = cal.searchsorted(pd.Timestamp(self.config.dataset_begin_time))
+ end_index = cal.searchsorted(pd.Timestamp(self.config.dataset_end_time))
+
+ # Check if start_index lookbackw_window will cause negative index
+ adjusted_start_index = max(start_index - self.config.lookback_window, 0)
+ real_start_time = cal[adjusted_start_index]
+
+ # Check if end_index exceeds the range of the array
+ if end_index >= len(cal):
+ end_index = len(cal) - 1
+ elif cal[end_index] != pd.Timestamp(self.config.dataset_end_time):
+ end_index -= 1
+
+ # Check if end_index+predictw_window will exceed the range of the array
+ adjusted_end_index = min(end_index + self.config.predict_window, len(cal) - 1)
+ real_end_time = cal[adjusted_end_index]
+
+ # Load data using Qlib's data loader.
+ data_df = QlibDataLoader(config=data_fields_qlib).load(
+ self.config.instrument, real_start_time, real_end_time
+ )
+ data_df = data_df.stack().unstack(level=1) # Reshape for easier access.
+
+ symbol_list = list(data_df.columns)
+ for i in trange(len(symbol_list), desc="Processing Symbols"):
+ symbol = symbol_list[i]
+ symbol_df = data_df[symbol]
+
+ # Pivot the table to have features as columns and datetime as index.
+ symbol_df = symbol_df.reset_index().rename(columns={'level_1': 'field'})
+ symbol_df = pd.pivot(symbol_df, index='datetime', columns='field', values=symbol)
+ symbol_df = symbol_df.rename(columns={f'${field}': field for field in self.data_fields})
+
+ # Calculate amount and select final features.
+ symbol_df['vol'] = symbol_df['volume']
+ symbol_df['amt'] = (symbol_df['open'] + symbol_df['high'] + symbol_df['low'] + symbol_df['close']) / 4 * symbol_df['vol']
+ symbol_df = symbol_df[self.config.feature_list]
+
+ # Filter out symbols with insufficient data.
+ symbol_df = symbol_df.dropna()
+ if len(symbol_df) < self.config.lookback_window + self.config.predict_window + 1:
+ continue
+
+ self.data[symbol] = symbol_df
+
+ def prepare_dataset(self):
+ """
+ Splits the loaded data into train, validation, and test sets and saves them to disk.
+ """
+ print("Splitting data into train, validation, and test sets...")
+ train_data, val_data, test_data = {}, {}, {}
+
+ symbol_list = list(self.data.keys())
+ for i in trange(len(symbol_list), desc="Preparing Datasets"):
+ symbol = symbol_list[i]
+ symbol_df = self.data[symbol]
+
+ # Define time ranges from config.
+ train_start, train_end = self.config.train_time_range
+ val_start, val_end = self.config.val_time_range
+ test_start, test_end = self.config.test_time_range
+
+ # Create boolean masks for each dataset split.
+ train_mask = (symbol_df.index >= train_start) & (symbol_df.index <= train_end)
+ val_mask = (symbol_df.index >= val_start) & (symbol_df.index <= val_end)
+ test_mask = (symbol_df.index >= test_start) & (symbol_df.index <= test_end)
+
+ # Apply masks to create the final datasets.
+ train_data[symbol] = symbol_df[train_mask]
+ val_data[symbol] = symbol_df[val_mask]
+ test_data[symbol] = symbol_df[test_mask]
+
+ # Save the datasets using pickle.
+ os.makedirs(self.config.dataset_path, exist_ok=True)
+ with open(f"{self.config.dataset_path}/train_data.pkl", 'wb') as f:
+ pickle.dump(train_data, f)
+ with open(f"{self.config.dataset_path}/val_data.pkl", 'wb') as f:
+ pickle.dump(val_data, f)
+ with open(f"{self.config.dataset_path}/test_data.pkl", 'wb') as f:
+ pickle.dump(test_data, f)
+
+ print("Datasets prepared and saved successfully.")
+
+
+if __name__ == '__main__':
+ # This block allows the script to be run directly to perform data preprocessing.
+ preprocessor = QlibDataPreprocessor()
+ preprocessor.initialize_qlib()
+ preprocessor.load_qlib_data()
+ preprocessor.prepare_dataset()
+
diff --git a/finetune/qlib_test.py b/finetune/qlib_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..29dddb3d59375cef70ca022e171eedeb270400f1
--- /dev/null
+++ b/finetune/qlib_test.py
@@ -0,0 +1,358 @@
+import os
+import sys
+import argparse
+import pickle
+from collections import defaultdict
+
+import numpy as np
+import pandas as pd
+import torch
+from torch.utils.data import Dataset, DataLoader
+from tqdm import trange, tqdm
+from matplotlib import pyplot as plt
+
+import qlib
+from qlib.config import REG_CN
+from qlib.backtest import backtest, executor, CommonInfrastructure
+from qlib.contrib.evaluate import risk_analysis
+from qlib.contrib.strategy import TopkDropoutStrategy
+from qlib.utils import flatten_dict
+from qlib.utils.time import Freq
+
+# Ensure project root is in the Python path
+sys.path.append("../")
+from config import Config
+from model.kronos import Kronos, KronosTokenizer, auto_regressive_inference
+
+
+# =================================================================================
+# 1. Data Loading and Processing for Inference
+# =================================================================================
+
+class QlibTestDataset(Dataset):
+ """
+ PyTorch Dataset for handling Qlib test data, specifically for inference.
+
+ This dataset iterates through all possible sliding windows sequentially. It also
+ yields metadata like symbol and timestamp, which are crucial for mapping
+ predictions back to the original time series.
+ """
+
+ def __init__(self, data: dict, config: Config):
+ self.data = data
+ self.config = config
+ self.window_size = config.lookback_window + config.predict_window
+ self.symbols = list(self.data.keys())
+ self.feature_list = config.feature_list
+ self.time_feature_list = config.time_feature_list
+ self.indices = []
+
+ print("Preprocessing and building indices for test dataset...")
+ for symbol in self.symbols:
+ df = self.data[symbol].reset_index()
+ # Generate time features on-the-fly
+ df['minute'] = df['datetime'].dt.minute
+ df['hour'] = df['datetime'].dt.hour
+ df['weekday'] = df['datetime'].dt.weekday
+ df['day'] = df['datetime'].dt.day
+ df['month'] = df['datetime'].dt.month
+ self.data[symbol] = df # Store preprocessed dataframe
+
+ num_samples = len(df) - self.window_size + 1
+ if num_samples > 0:
+ for i in range(num_samples):
+ timestamp = df.iloc[i + self.config.lookback_window - 1]['datetime']
+ self.indices.append((symbol, i, timestamp))
+
+ def __len__(self) -> int:
+ return len(self.indices)
+
+ def __getitem__(self, idx: int):
+ symbol, start_idx, timestamp = self.indices[idx]
+ df = self.data[symbol]
+
+ context_end = start_idx + self.config.lookback_window
+ predict_end = context_end + self.config.predict_window
+
+ context_df = df.iloc[start_idx:context_end]
+ predict_df = df.iloc[context_end:predict_end]
+
+ x = context_df[self.feature_list].values.astype(np.float32)
+ x_stamp = context_df[self.time_feature_list].values.astype(np.float32)
+ y_stamp = predict_df[self.time_feature_list].values.astype(np.float32)
+
+ # Instance-level normalization, consistent with training
+ x_mean, x_std = np.mean(x, axis=0), np.std(x, axis=0)
+ x = (x - x_mean) / (x_std + 1e-5)
+ x = np.clip(x, -self.config.clip, self.config.clip)
+
+ return torch.from_numpy(x), torch.from_numpy(x_stamp), torch.from_numpy(y_stamp), symbol, timestamp
+
+
+# =================================================================================
+# 2. Backtesting Logic
+# =================================================================================
+
+class QlibBacktest:
+ """
+ A wrapper class for conducting backtesting experiments using Qlib.
+ """
+
+ def __init__(self, config: Config):
+ self.config = config
+ self.initialize_qlib()
+
+ def initialize_qlib(self):
+ """Initializes the Qlib environment."""
+ print("Initializing Qlib for backtesting...")
+ qlib.init(provider_uri=self.config.qlib_data_path, region=REG_CN)
+
+ def run_single_backtest(self, signal_series: pd.Series) -> pd.DataFrame:
+ """
+ Runs a single backtest for a given prediction signal.
+
+ Args:
+ signal_series (pd.Series): A pandas Series with a MultiIndex
+ (instrument, datetime) and prediction scores.
+ Returns:
+ pd.DataFrame: A DataFrame containing the performance report.
+ """
+ strategy = TopkDropoutStrategy(
+ topk=self.config.backtest_n_symbol_hold,
+ n_drop=self.config.backtest_n_symbol_drop,
+ hold_thresh=self.config.backtest_hold_thresh,
+ signal=signal_series,
+ )
+ executor_config = {
+ "time_per_step": "day",
+ "generate_portfolio_metrics": True,
+ "delay_execution": True,
+ }
+ backtest_config = {
+ "start_time": self.config.backtest_time_range[0],
+ "end_time": self.config.backtest_time_range[1],
+ "account": 100_000_000,
+ "benchmark": self.config.backtest_benchmark,
+ "exchange_kwargs": {
+ "freq": "day", "limit_threshold": 0.095, "deal_price": "open",
+ "open_cost": 0.001, "close_cost": 0.0015, "min_cost": 5,
+ },
+ "executor": executor.SimulatorExecutor(**executor_config),
+ }
+
+ portfolio_metric_dict, _ = backtest(strategy=strategy, **backtest_config)
+ analysis_freq = "{0}{1}".format(*Freq.parse("day"))
+ report, _ = portfolio_metric_dict.get(analysis_freq)
+
+ # --- Analysis and Reporting ---
+ analysis = {
+ "excess_return_without_cost": risk_analysis(report["return"] - report["bench"], freq=analysis_freq),
+ "excess_return_with_cost": risk_analysis(report["return"] - report["bench"] - report["cost"], freq=analysis_freq),
+ }
+ print("\n--- Backtest Analysis ---")
+ print("Benchmark Return:", risk_analysis(report["bench"], freq=analysis_freq), sep='\n')
+ print("\nExcess Return (w/o cost):", analysis["excess_return_without_cost"], sep='\n')
+ print("\nExcess Return (w/ cost):", analysis["excess_return_with_cost"], sep='\n')
+
+ report_df = pd.DataFrame({
+ "cum_bench": report["bench"].cumsum(),
+ "cum_return_w_cost": (report["return"] - report["cost"]).cumsum(),
+ "cum_ex_return_w_cost": (report["return"] - report["bench"] - report["cost"]).cumsum(),
+ })
+ return report_df
+
+ def run_and_plot_results(self, signals: dict[str, pd.DataFrame]):
+ """
+ Runs backtests for multiple signals and plots the cumulative return curves.
+
+ Args:
+ signals (dict[str, pd.DataFrame]): A dictionary where keys are signal names
+ and values are prediction DataFrames.
+ """
+ return_df, ex_return_df, bench_df = pd.DataFrame(), pd.DataFrame(), pd.DataFrame()
+
+ for signal_name, pred_df in signals.items():
+ print(f"\nBacktesting signal: {signal_name}...")
+ pred_series = pred_df.stack()
+ pred_series.index.names = ['datetime', 'instrument']
+ pred_series = pred_series.swaplevel().sort_index()
+ report_df = self.run_single_backtest(pred_series)
+
+ return_df[signal_name] = report_df['cum_return_w_cost']
+ ex_return_df[signal_name] = report_df['cum_ex_return_w_cost']
+ if 'return' not in bench_df:
+ bench_df['return'] = report_df['cum_bench']
+
+ # Plotting results
+ fig, axes = plt.subplots(2, 1, figsize=(12, 8), sharex=True)
+ return_df.plot(ax=axes[0], title='Cumulative Return with Cost', grid=True)
+ axes[0].plot(bench_df['return'], label=self.config.instrument.upper(), color='black', linestyle='--')
+ axes[0].legend()
+ axes[0].set_ylabel("Cumulative Return")
+
+ ex_return_df.plot(ax=axes[1], title='Cumulative Excess Return with Cost', grid=True)
+ axes[1].legend()
+ axes[1].set_xlabel("Date")
+ axes[1].set_ylabel("Cumulative Excess Return")
+
+ plt.tight_layout()
+ plt.savefig("../figures/backtest_result_example.png", dpi=200)
+ plt.show()
+
+
+# =================================================================================
+# 3. Inference Logic
+# =================================================================================
+
+def load_models(config: dict) -> tuple[KronosTokenizer, Kronos]:
+ """Loads the fine-tuned tokenizer and predictor model."""
+ device = torch.device(config['device'])
+ print(f"Loading models onto device: {device}...")
+ tokenizer = KronosTokenizer.from_pretrained(config['tokenizer_path']).to(device).eval()
+ model = Kronos.from_pretrained(config['model_path']).to(device).eval()
+ return tokenizer, model
+
+
+def collate_fn_for_inference(batch):
+ """
+ Custom collate function to handle batches containing Tensors, strings, and Timestamps.
+
+ Args:
+ batch (list): A list of samples, where each sample is the tuple returned by
+ QlibTestDataset.__getitem__.
+
+ Returns:
+ A single tuple containing the batched data.
+ """
+ # Unzip the list of samples into separate lists for each data type
+ x, x_stamp, y_stamp, symbols, timestamps = zip(*batch)
+
+ # Stack the tensors to create a batch
+ x_batch = torch.stack(x, dim=0)
+ x_stamp_batch = torch.stack(x_stamp, dim=0)
+ y_stamp_batch = torch.stack(y_stamp, dim=0)
+
+ # Return the strings and timestamps as lists
+ return x_batch, x_stamp_batch, y_stamp_batch, list(symbols), list(timestamps)
+
+
+def generate_predictions(config: dict, test_data: dict) -> dict[str, pd.DataFrame]:
+ """
+ Runs inference on the test dataset to generate prediction signals.
+
+ Args:
+ config (dict): A dictionary containing inference parameters.
+ test_data (dict): The raw test data loaded from a pickle file.
+
+ Returns:
+ A dictionary where keys are signal types (e.g., 'mean', 'last') and
+ values are DataFrames of predictions (datetime index, symbol columns).
+ """
+ tokenizer, model = load_models(config)
+ device = torch.device(config['device'])
+
+ # Use the Dataset and DataLoader for efficient batching and processing
+ dataset = QlibTestDataset(data=test_data, config=Config())
+ loader = DataLoader(
+ dataset,
+ batch_size=config['batch_size'] // config['sample_count'],
+ shuffle=False,
+ num_workers=os.cpu_count() // 2,
+ collate_fn=collate_fn_for_inference
+ )
+
+ results = defaultdict(list)
+ with torch.no_grad():
+ for x, x_stamp, y_stamp, symbols, timestamps in tqdm(loader, desc="Inference"):
+ preds = auto_regressive_inference(
+ tokenizer, model, x.to(device), x_stamp.to(device), y_stamp.to(device),
+ max_context=config['max_context'], pred_len=config['pred_len'], clip=config['clip'],
+ T=config['T'], top_k=config['top_k'], top_p=config['top_p'], sample_count=config['sample_count']
+ )
+
+ # The 'close' price is at index 3 in `feature_list`
+ last_day_close = x[:, -1, 3].numpy()
+ signals = {
+ 'last': preds[:, -1, 3] - last_day_close,
+ 'mean': np.mean(preds[:, :, 3], axis=1) - last_day_close,
+ 'max': np.max(preds[:, :, 3], axis=1) - last_day_close,
+ 'min': np.min(preds[:, :, 3], axis=1) - last_day_close,
+ }
+
+ for i in range(len(symbols)):
+ for sig_type, sig_values in signals.items():
+ results[sig_type].append((timestamps[i], symbols[i], sig_values[i]))
+
+ print("Post-processing predictions into DataFrames...")
+ prediction_dfs = {}
+ for sig_type, records in results.items():
+ df = pd.DataFrame(records, columns=['datetime', 'instrument', 'score'])
+ pivot_df = df.pivot_table(index='datetime', columns='instrument', values='score')
+ prediction_dfs[sig_type] = pivot_df.sort_index()
+
+ return prediction_dfs
+
+
+# =================================================================================
+# 4. Main Execution
+# =================================================================================
+
+def main():
+ """Main function to set up config, run inference, and execute backtesting."""
+ parser = argparse.ArgumentParser(description="Run Kronos Inference and Backtesting")
+ parser.add_argument("--device", type=str, default="cuda:1", help="Device for inference (e.g., 'cuda:0', 'cpu')")
+ args = parser.parse_args()
+
+ # --- 1. Configuration Setup ---
+ base_config = Config()
+
+ # Create a dedicated dictionary for this run's configuration
+ run_config = {
+ 'device': args.device,
+ 'data_path': base_config.dataset_path,
+ 'result_save_path': base_config.backtest_result_path,
+ 'result_name': base_config.backtest_save_folder_name,
+ 'tokenizer_path': base_config.finetuned_tokenizer_path,
+ 'model_path': base_config.finetuned_predictor_path,
+ 'max_context': base_config.max_context,
+ 'pred_len': base_config.predict_window,
+ 'clip': base_config.clip,
+ 'T': base_config.inference_T,
+ 'top_k': base_config.inference_top_k,
+ 'top_p': base_config.inference_top_p,
+ 'sample_count': base_config.inference_sample_count,
+ 'batch_size': base_config.backtest_batch_size,
+ }
+
+ print("--- Running with Configuration ---")
+ for key, val in run_config.items():
+ print(f"{key:>20}: {val}")
+ print("-" * 35)
+
+ # --- 2. Load Data ---
+ test_data_path = os.path.join(run_config['data_path'], "test_data.pkl")
+ print(f"Loading test data from {test_data_path}...")
+ with open(test_data_path, 'rb') as f:
+ test_data = pickle.load(f)
+ print(test_data)
+ # --- 3. Generate Predictions ---
+ model_preds = generate_predictions(run_config, test_data)
+
+ # --- 4. Save Predictions ---
+ save_dir = os.path.join(run_config['result_save_path'], run_config['result_name'])
+ os.makedirs(save_dir, exist_ok=True)
+ predictions_file = os.path.join(save_dir, "predictions.pkl")
+ print(f"Saving prediction signals to {predictions_file}...")
+ with open(predictions_file, 'wb') as f:
+ pickle.dump(model_preds, f)
+
+ # --- 5. Run Backtesting ---
+ with open(predictions_file, 'rb') as f:
+ model_preds = pickle.load(f)
+
+ backtester = QlibBacktest(base_config)
+ backtester.run_and_plot_results(model_preds)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/finetune/train_predictor.py b/finetune/train_predictor.py
new file mode 100644
index 0000000000000000000000000000000000000000..1e425872764d7ee49b30a41567ff45c5dafb1b8e
--- /dev/null
+++ b/finetune/train_predictor.py
@@ -0,0 +1,244 @@
+import os
+import sys
+import json
+import time
+from time import gmtime, strftime
+import torch.distributed as dist
+import torch
+from torch.utils.data import DataLoader
+from torch.utils.data.distributed import DistributedSampler
+from torch.nn.parallel import DistributedDataParallel as DDP
+
+import comet_ml
+
+# Ensure project root is in path
+sys.path.append('../')
+from config import Config
+from dataset import QlibDataset
+from model.kronos import KronosTokenizer, Kronos
+# Import shared utilities
+from utils.training_utils import (
+ setup_ddp,
+ cleanup_ddp,
+ set_seed,
+ get_model_size,
+ format_time
+)
+
+
+def create_dataloaders(config: dict, rank: int, world_size: int):
+ """
+ Creates and returns distributed dataloaders for training and validation.
+
+ Args:
+ config (dict): A dictionary of configuration parameters.
+ rank (int): The global rank of the current process.
+ world_size (int): The total number of processes.
+
+ Returns:
+ tuple: (train_loader, val_loader, train_dataset, valid_dataset).
+ """
+ print(f"[Rank {rank}] Creating distributed dataloaders...")
+ train_dataset = QlibDataset('train')
+ valid_dataset = QlibDataset('val')
+ print(f"[Rank {rank}] Train dataset size: {len(train_dataset)}, Validation dataset size: {len(valid_dataset)}")
+
+ train_sampler = DistributedSampler(train_dataset, num_replicas=world_size, rank=rank, shuffle=True)
+ val_sampler = DistributedSampler(valid_dataset, num_replicas=world_size, rank=rank, shuffle=False)
+
+ train_loader = DataLoader(
+ train_dataset, batch_size=config['batch_size'], sampler=train_sampler,
+ num_workers=config.get('num_workers', 2), pin_memory=True, drop_last=True
+ )
+ val_loader = DataLoader(
+ valid_dataset, batch_size=config['batch_size'], sampler=val_sampler,
+ num_workers=config.get('num_workers', 2), pin_memory=True, drop_last=False
+ )
+ return train_loader, val_loader, train_dataset, valid_dataset
+
+
+def train_model(model, tokenizer, device, config, save_dir, logger, rank, world_size):
+ """
+ The main training and validation loop for the predictor.
+ """
+ start_time = time.time()
+ if rank == 0:
+ effective_bs = config['batch_size'] * world_size
+ print(f"Effective BATCHSIZE per GPU: {config['batch_size']}, Total: {effective_bs}")
+
+ train_loader, val_loader, train_dataset, valid_dataset = create_dataloaders(config, rank, world_size)
+
+ optimizer = torch.optim.AdamW(
+ model.parameters(),
+ lr=config['predictor_learning_rate'],
+ betas=(config['adam_beta1'], config['adam_beta2']),
+ weight_decay=config['adam_weight_decay']
+ )
+ scheduler = torch.optim.lr_scheduler.OneCycleLR(
+ optimizer, max_lr=config['predictor_learning_rate'],
+ steps_per_epoch=len(train_loader), epochs=config['epochs'],
+ pct_start=0.03, div_factor=10
+ )
+
+ best_val_loss = float('inf')
+ dt_result = {}
+ batch_idx_global = 0
+
+ for epoch_idx in range(config['epochs']):
+ epoch_start_time = time.time()
+ model.train()
+ train_loader.sampler.set_epoch(epoch_idx)
+
+ train_dataset.set_epoch_seed(epoch_idx * 10000 + rank)
+ valid_dataset.set_epoch_seed(0)
+
+ for i, (batch_x, batch_x_stamp) in enumerate(train_loader):
+ batch_x = batch_x.squeeze(0).to(device, non_blocking=True)
+ batch_x_stamp = batch_x_stamp.squeeze(0).to(device, non_blocking=True)
+
+ # Tokenize input data on-the-fly
+ with torch.no_grad():
+ token_seq_0, token_seq_1 = tokenizer.encode(batch_x, half=True)
+
+ # Prepare inputs and targets for the language model
+ token_in = [token_seq_0[:, :-1], token_seq_1[:, :-1]]
+ token_out = [token_seq_0[:, 1:], token_seq_1[:, 1:]]
+
+ # Forward pass and loss calculation
+ logits = model(token_in[0], token_in[1], batch_x_stamp[:, :-1, :])
+ loss, s1_loss, s2_loss = model.module.head.compute_loss(logits[0], logits[1], token_out[0], token_out[1])
+
+ # Backward pass and optimization
+ optimizer.zero_grad()
+ loss.backward()
+ torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=3.0)
+ optimizer.step()
+ scheduler.step()
+
+ # Logging (Master Process Only)
+ if rank == 0 and (batch_idx_global + 1) % config['log_interval'] == 0:
+ lr = optimizer.param_groups[0]['lr']
+ print(
+ f"[Rank {rank}, Epoch {epoch_idx + 1}/{config['epochs']}, Step {i + 1}/{len(train_loader)}] "
+ f"LR {lr:.6f}, Loss: {loss.item():.4f}"
+ )
+ if rank == 0 and logger:
+ lr = optimizer.param_groups[0]['lr']
+ logger.log_metric('train_predictor_loss_batch', loss.item(), step=batch_idx_global)
+ logger.log_metric('train_S1_loss_each_batch', s1_loss.item(), step=batch_idx_global)
+ logger.log_metric('train_S2_loss_each_batch', s2_loss.item(), step=batch_idx_global)
+ logger.log_metric('predictor_learning_rate', lr, step=batch_idx_global)
+
+ batch_idx_global += 1
+
+ # --- Validation Loop ---
+ model.eval()
+ tot_val_loss_sum_rank = 0.0
+ val_batches_processed_rank = 0
+ with torch.no_grad():
+ for batch_x, batch_x_stamp in val_loader:
+ batch_x = batch_x.squeeze(0).to(device, non_blocking=True)
+ batch_x_stamp = batch_x_stamp.squeeze(0).to(device, non_blocking=True)
+
+ token_seq_0, token_seq_1 = tokenizer.encode(batch_x, half=True)
+ token_in = [token_seq_0[:, :-1], token_seq_1[:, :-1]]
+ token_out = [token_seq_0[:, 1:], token_seq_1[:, 1:]]
+
+ logits = model(token_in[0], token_in[1], batch_x_stamp[:, :-1, :])
+ val_loss, _, _ = model.module.head.compute_loss(logits[0], logits[1], token_out[0], token_out[1])
+
+ tot_val_loss_sum_rank += val_loss.item()
+ val_batches_processed_rank += 1
+
+ # Reduce validation metrics
+ val_loss_sum_tensor = torch.tensor(tot_val_loss_sum_rank, device=device)
+ val_batches_tensor = torch.tensor(val_batches_processed_rank, device=device)
+ dist.all_reduce(val_loss_sum_tensor, op=dist.ReduceOp.SUM)
+ dist.all_reduce(val_batches_tensor, op=dist.ReduceOp.SUM)
+
+ avg_val_loss = val_loss_sum_tensor.item() / val_batches_tensor.item() if val_batches_tensor.item() > 0 else 0
+
+ # --- End of Epoch Summary & Checkpointing (Master Process Only) ---
+ if rank == 0:
+ print(f"\n--- Epoch {epoch_idx + 1}/{config['epochs']} Summary ---")
+ print(f"Validation Loss: {avg_val_loss:.4f}")
+ print(f"Time This Epoch: {format_time(time.time() - epoch_start_time)}")
+ print(f"Total Time Elapsed: {format_time(time.time() - start_time)}\n")
+ if logger:
+ logger.log_metric('val_predictor_loss_epoch', avg_val_loss, epoch=epoch_idx)
+
+ if avg_val_loss < best_val_loss:
+ best_val_loss = avg_val_loss
+ save_path = f"{save_dir}/checkpoints/best_model"
+ model.module.save_pretrained(save_path)
+ print(f"Best model saved to {save_path} (Val Loss: {best_val_loss:.4f})")
+
+ dist.barrier()
+
+ dt_result['best_val_loss'] = best_val_loss
+ return dt_result
+
+
+def main(config: dict):
+ """Main function to orchestrate the DDP training process."""
+ rank, world_size, local_rank = setup_ddp()
+ device = torch.device(f"cuda:{local_rank}")
+ set_seed(config['seed'], rank)
+
+ save_dir = os.path.join(config['save_path'], config['predictor_save_folder_name'])
+
+ # Logger and summary setup (master process only)
+ comet_logger, master_summary = None, {}
+ if rank == 0:
+ os.makedirs(os.path.join(save_dir, 'checkpoints'), exist_ok=True)
+ master_summary = {
+ 'start_time': strftime("%Y-%m-%dT%H-%M-%S", gmtime()),
+ 'save_directory': save_dir,
+ 'world_size': world_size,
+ }
+ if config['use_comet']:
+ comet_logger = comet_ml.Experiment(
+ api_key=config['comet_config']['api_key'],
+ project_name=config['comet_config']['project_name'],
+ workspace=config['comet_config']['workspace'],
+ )
+ comet_logger.add_tag(config['comet_tag'])
+ comet_logger.set_name(config['comet_name'])
+ comet_logger.log_parameters(config)
+ print("Comet Logger Initialized.")
+
+ dist.barrier()
+
+ # Model Initialization
+ tokenizer = KronosTokenizer.from_pretrained(config['finetuned_tokenizer_path'])
+ tokenizer.eval().to(device)
+
+ model = Kronos.from_pretrained(config['pretrained_predictor_path'])
+ model.to(device)
+ model = DDP(model, device_ids=[local_rank], find_unused_parameters=False)
+
+ if rank == 0:
+ print(f"Predictor Model Size: {get_model_size(model.module)}")
+
+ # Start Training
+ dt_result = train_model(
+ model, tokenizer, device, config, save_dir, comet_logger, rank, world_size
+ )
+
+ if rank == 0:
+ master_summary['final_result'] = dt_result
+ with open(os.path.join(save_dir, 'summary.json'), 'w') as f:
+ json.dump(master_summary, f, indent=4)
+ print('Training finished. Summary file saved.')
+ if comet_logger: comet_logger.end()
+
+ cleanup_ddp()
+
+
+if __name__ == '__main__':
+ # Usage: torchrun --standalone --nproc_per_node=NUM_GPUS train_predictor.py
+ if "WORLD_SIZE" not in os.environ:
+ raise RuntimeError("This script must be launched with `torchrun`.")
+
+ config_instance = Config()
+ main(config_instance.__dict__)
diff --git a/finetune/train_tokenizer.py b/finetune/train_tokenizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..2fe28cf1df1a174c9a2aed79c945be1f7e12fb97
--- /dev/null
+++ b/finetune/train_tokenizer.py
@@ -0,0 +1,281 @@
+import os
+import sys
+import json
+import time
+from time import gmtime, strftime
+import argparse
+import datetime
+import torch.distributed as dist
+import torch
+import torch.nn.functional as F
+from torch.utils.data import DataLoader
+from torch.utils.data.distributed import DistributedSampler
+from torch.nn.parallel import DistributedDataParallel as DDP
+
+import comet_ml
+
+# Ensure project root is in path
+sys.path.append("../")
+from config import Config
+from dataset import QlibDataset
+from model.kronos import KronosTokenizer
+# Import shared utilities
+from utils.training_utils import (
+ setup_ddp,
+ cleanup_ddp,
+ set_seed,
+ get_model_size,
+ format_time,
+)
+
+
+def create_dataloaders(config: dict, rank: int, world_size: int):
+ """
+ Creates and returns distributed dataloaders for training and validation.
+
+ Args:
+ config (dict): A dictionary of configuration parameters.
+ rank (int): The global rank of the current process.
+ world_size (int): The total number of processes.
+
+ Returns:
+ tuple: A tuple containing (train_loader, val_loader, train_dataset, valid_dataset).
+ """
+ print(f"[Rank {rank}] Creating distributed dataloaders...")
+ train_dataset = QlibDataset('train')
+ valid_dataset = QlibDataset('val')
+ print(f"[Rank {rank}] Train dataset size: {len(train_dataset)}, Validation dataset size: {len(valid_dataset)}")
+
+ train_sampler = DistributedSampler(train_dataset, num_replicas=world_size, rank=rank, shuffle=True)
+ val_sampler = DistributedSampler(valid_dataset, num_replicas=world_size, rank=rank, shuffle=False)
+
+ train_loader = DataLoader(
+ train_dataset,
+ batch_size=config['batch_size'],
+ sampler=train_sampler,
+ shuffle=False, # Shuffle is handled by the sampler
+ num_workers=config.get('num_workers', 2),
+ pin_memory=True,
+ drop_last=True
+ )
+ val_loader = DataLoader(
+ valid_dataset,
+ batch_size=config['batch_size'],
+ sampler=val_sampler,
+ shuffle=False,
+ num_workers=config.get('num_workers', 2),
+ pin_memory=True,
+ drop_last=False
+ )
+ print(f"[Rank {rank}] Dataloaders created. Train steps/epoch: {len(train_loader)}, Val steps: {len(val_loader)}")
+ return train_loader, val_loader, train_dataset, valid_dataset
+
+
+def train_model(model, device, config, save_dir, logger, rank, world_size):
+ """
+ The main training and validation loop for the tokenizer.
+
+ Args:
+ model (DDP): The DDP-wrapped model to train.
+ device (torch.device): The device for the current process.
+ config (dict): Configuration dictionary.
+ save_dir (str): Directory to save checkpoints.
+ logger (comet_ml.Experiment): Comet logger instance.
+ rank (int): Global rank of the process.
+ world_size (int): Total number of processes.
+
+ Returns:
+ tuple: A tuple containing the trained model and a dictionary of results.
+ """
+ start_time = time.time()
+ if rank == 0:
+ effective_bs = config['batch_size'] * world_size * config['accumulation_steps']
+ print(f"[Rank {rank}] BATCHSIZE (per GPU): {config['batch_size']}")
+ print(f"[Rank {rank}] Effective total batch size: {effective_bs}")
+
+ train_loader, val_loader, train_dataset, valid_dataset = create_dataloaders(config, rank, world_size)
+
+ optimizer = torch.optim.AdamW(
+ model.parameters(),
+ lr=config['tokenizer_learning_rate'],
+ weight_decay=config['adam_weight_decay']
+ )
+
+ scheduler = torch.optim.lr_scheduler.OneCycleLR(
+ optimizer=optimizer,
+ max_lr=config['tokenizer_learning_rate'],
+ steps_per_epoch=len(train_loader),
+ epochs=config['epochs'],
+ pct_start=0.03,
+ div_factor=10
+ )
+
+ best_val_loss = float('inf')
+ dt_result = {}
+ batch_idx_global_train = 0
+
+ for epoch_idx in range(config['epochs']):
+ epoch_start_time = time.time()
+ model.train()
+ train_loader.sampler.set_epoch(epoch_idx)
+
+ # Set dataset seeds for reproducible sampling
+ train_dataset.set_epoch_seed(epoch_idx * 10000 + rank)
+ valid_dataset.set_epoch_seed(0) # Keep validation sampling consistent
+
+ for i, (ori_batch_x, _) in enumerate(train_loader):
+ ori_batch_x = ori_batch_x.squeeze(0).to(device, non_blocking=True)
+
+ # --- Gradient Accumulation Loop ---
+ current_batch_total_loss = 0.0
+ for j in range(config['accumulation_steps']):
+ start_idx = j * (ori_batch_x.shape[0] // config['accumulation_steps'])
+ end_idx = (j + 1) * (ori_batch_x.shape[0] // config['accumulation_steps'])
+ batch_x = ori_batch_x[start_idx:end_idx]
+
+ # Forward pass
+ zs, bsq_loss, _, _ = model(batch_x)
+ z_pre, z = zs
+
+ # Loss calculation
+ recon_loss_pre = F.mse_loss(z_pre, batch_x)
+ recon_loss_all = F.mse_loss(z, batch_x)
+ recon_loss = recon_loss_pre + recon_loss_all
+ loss = (recon_loss + bsq_loss) / 2 # Assuming w_1=w_2=1
+
+ loss_scaled = loss / config['accumulation_steps']
+ current_batch_total_loss += loss.item()
+ loss_scaled.backward()
+
+ # --- Optimizer Step after Accumulation ---
+ torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=2.0)
+ optimizer.step()
+ scheduler.step()
+ optimizer.zero_grad()
+
+ # --- Logging (Master Process Only) ---
+ if rank == 0 and (batch_idx_global_train + 1) % config['log_interval'] == 0:
+ avg_loss = current_batch_total_loss / config['accumulation_steps']
+ print(
+ f"[Rank {rank}, Epoch {epoch_idx + 1}/{config['epochs']}, Step {i + 1}/{len(train_loader)}] "
+ f"LR {optimizer.param_groups[0]['lr']:.6f}, Loss: {avg_loss:.4f}"
+ )
+ if rank == 0 and logger:
+ avg_loss = current_batch_total_loss / config['accumulation_steps']
+ logger.log_metric('train_tokenizer_loss_batch', avg_loss, step=batch_idx_global_train)
+ logger.log_metric(f'train_vqvae_vq_loss_each_batch', bsq_loss.item(), step=batch_idx_global_train)
+ logger.log_metric(f'train_recon_loss_pre_each_batch', recon_loss_pre.item(), step=batch_idx_global_train)
+ logger.log_metric(f'train_recon_loss_each_batch', recon_loss_all.item(), step=batch_idx_global_train)
+ logger.log_metric('tokenizer_learning_rate', optimizer.param_groups[0]["lr"], step=batch_idx_global_train)
+
+ batch_idx_global_train += 1
+
+ # --- Validation Loop ---
+ model.eval()
+ tot_val_loss_sum_rank = 0.0
+ val_sample_count_rank = 0
+ with torch.no_grad():
+ for ori_batch_x, _ in val_loader:
+ ori_batch_x = ori_batch_x.squeeze(0).to(device, non_blocking=True)
+ zs, _, _, _ = model(ori_batch_x)
+ _, z = zs
+ val_loss_item = F.mse_loss(z, ori_batch_x)
+
+ tot_val_loss_sum_rank += val_loss_item.item() * ori_batch_x.size(0)
+ val_sample_count_rank += ori_batch_x.size(0)
+
+ # Reduce validation losses from all processes
+ val_loss_sum_tensor = torch.tensor(tot_val_loss_sum_rank, device=device)
+ val_count_tensor = torch.tensor(val_sample_count_rank, device=device)
+ dist.all_reduce(val_loss_sum_tensor, op=dist.ReduceOp.SUM)
+ dist.all_reduce(val_count_tensor, op=dist.ReduceOp.SUM)
+
+ avg_val_loss = val_loss_sum_tensor.item() / val_count_tensor.item() if val_count_tensor.item() > 0 else 0
+
+ # --- End of Epoch Summary & Checkpointing (Master Process Only) ---
+ if rank == 0:
+ print(f"\n--- Epoch {epoch_idx + 1}/{config['epochs']} Summary ---")
+ print(f"Validation Loss: {avg_val_loss:.4f}")
+ print(f"Time This Epoch: {format_time(time.time() - epoch_start_time)}")
+ print(f"Total Time Elapsed: {format_time(time.time() - start_time)}\n")
+ if logger:
+ logger.log_metric('val_tokenizer_loss_epoch', avg_val_loss, epoch=epoch_idx)
+
+ if avg_val_loss < best_val_loss:
+ best_val_loss = avg_val_loss
+ save_path = f"{save_dir}/checkpoints/best_model"
+ model.module.save_pretrained(save_path)
+ print(f"Best model saved to {save_path} (Val Loss: {best_val_loss:.4f})")
+ if logger:
+ logger.log_model("best_model", save_path)
+
+ dist.barrier() # Ensure all processes finish the epoch before starting the next one.
+
+ dt_result['best_val_loss'] = best_val_loss
+ return model, dt_result
+
+
+def main(config: dict):
+ """
+ Main function to orchestrate the DDP training process.
+ """
+ rank, world_size, local_rank = setup_ddp()
+ device = torch.device(f"cuda:{local_rank}")
+ set_seed(config['seed'], rank)
+
+ save_dir = os.path.join(config['save_path'], config['tokenizer_save_folder_name'])
+
+ # Logger and summary setup (master process only)
+ comet_logger, master_summary = None, {}
+ if rank == 0:
+ os.makedirs(os.path.join(save_dir, 'checkpoints'), exist_ok=True)
+ master_summary = {
+ 'start_time': strftime("%Y-%m-%dT%H-%M-%S", gmtime()),
+ 'save_directory': save_dir,
+ 'world_size': world_size,
+ }
+ if config['use_comet']:
+ comet_logger = comet_ml.Experiment(
+ api_key=config['comet_config']['api_key'],
+ project_name=config['comet_config']['project_name'],
+ workspace=config['comet_config']['workspace'],
+ )
+ comet_logger.add_tag(config['comet_tag'])
+ comet_logger.set_name(config['comet_name'])
+ comet_logger.log_parameters(config)
+ print("Comet Logger Initialized.")
+
+ dist.barrier() # Ensure save directory is created before proceeding
+
+ # Model Initialization
+ model = KronosTokenizer.from_pretrained(config['pretrained_tokenizer_path'])
+ model.to(device)
+ model = DDP(model, device_ids=[local_rank], find_unused_parameters=False)
+
+ if rank == 0:
+ print(f"Model Size: {get_model_size(model.module)}")
+
+ # Start Training
+ _, dt_result = train_model(
+ model, device, config, save_dir, comet_logger, rank, world_size
+ )
+
+ # Finalize and save summary (master process only)
+ if rank == 0:
+ master_summary['final_result'] = dt_result
+ with open(os.path.join(save_dir, 'summary.json'), 'w') as f:
+ json.dump(master_summary, f, indent=4)
+ print('Training finished. Summary file saved.')
+ if comet_logger:
+ comet_logger.end()
+
+ cleanup_ddp()
+
+
+if __name__ == '__main__':
+ # Usage: torchrun --standalone --nproc_per_node=NUM_GPUS train_tokenizer.py
+ if "WORLD_SIZE" not in os.environ:
+ raise RuntimeError("This script must be launched with `torchrun`.")
+
+ config_instance = Config()
+ main(config_instance.__dict__)
diff --git a/finetune/utils/__init__.py b/finetune/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/finetune/utils/training_utils.py b/finetune/utils/training_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..8756322adc2784445aedb4063be56e16e92bed18
--- /dev/null
+++ b/finetune/utils/training_utils.py
@@ -0,0 +1,118 @@
+import os
+import random
+import datetime
+import numpy as np
+import torch
+import torch.distributed as dist
+
+
+def setup_ddp():
+ """
+ Initializes the distributed data parallel environment.
+
+ This function relies on environment variables set by `torchrun` or a similar
+ launcher. It initializes the process group and sets the CUDA device for the
+ current process.
+
+ Returns:
+ tuple: A tuple containing (rank, world_size, local_rank).
+ """
+ if not dist.is_available():
+ raise RuntimeError("torch.distributed is not available.")
+
+ dist.init_process_group(backend="nccl")
+ rank = int(os.environ["RANK"])
+ world_size = int(os.environ["WORLD_SIZE"])
+ local_rank = int(os.environ["LOCAL_RANK"])
+ torch.cuda.set_device(local_rank)
+ print(
+ f"[DDP Setup] Global Rank: {rank}/{world_size}, "
+ f"Local Rank (GPU): {local_rank} on device {torch.cuda.current_device()}"
+ )
+ return rank, world_size, local_rank
+
+
+def cleanup_ddp():
+ """Cleans up the distributed process group."""
+ if dist.is_initialized():
+ dist.destroy_process_group()
+
+
+def set_seed(seed: int, rank: int = 0):
+ """
+ Sets the random seed for reproducibility across all relevant libraries.
+
+ Args:
+ seed (int): The base seed value.
+ rank (int): The process rank, used to ensure different processes have
+ different seeds, which can be important for data loading.
+ """
+ actual_seed = seed + rank
+ random.seed(actual_seed)
+ np.random.seed(actual_seed)
+ torch.manual_seed(actual_seed)
+ if torch.cuda.is_available():
+ torch.cuda.manual_seed_all(actual_seed)
+ # The two lines below can impact performance, so they are often
+ # reserved for final experiments where reproducibility is critical.
+ torch.backends.cudnn.deterministic = True
+ torch.backends.cudnn.benchmark = False
+
+
+def get_model_size(model: torch.nn.Module) -> str:
+ """
+ Calculates the number of trainable parameters in a PyTorch model and returns
+ it as a human-readable string.
+
+ Args:
+ model (torch.nn.Module): The PyTorch model.
+
+ Returns:
+ str: A string representing the model size (e.g., "175.0B", "7.1M", "50.5K").
+ """
+ total_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
+
+ if total_params >= 1e9:
+ return f"{total_params / 1e9:.1f}B" # Billions
+ elif total_params >= 1e6:
+ return f"{total_params / 1e6:.1f}M" # Millions
+ else:
+ return f"{total_params / 1e3:.1f}K" # Thousands
+
+
+def reduce_tensor(tensor: torch.Tensor, world_size: int, op=dist.ReduceOp.SUM) -> torch.Tensor:
+ """
+ Reduces a tensor's value across all processes in a distributed setup.
+
+ Args:
+ tensor (torch.Tensor): The tensor to be reduced.
+ world_size (int): The total number of processes.
+ op (dist.ReduceOp, optional): The reduction operation (SUM, AVG, etc.).
+ Defaults to dist.ReduceOp.SUM.
+
+ Returns:
+ torch.Tensor: The reduced tensor, which will be identical on all processes.
+ """
+ rt = tensor.clone()
+ dist.all_reduce(rt, op=op)
+ # Note: `dist.ReduceOp.AVG` is available in newer torch versions.
+ # For compatibility, manual division is sometimes used after a SUM.
+ if op == dist.ReduceOp.AVG:
+ rt /= world_size
+ return rt
+
+
+def format_time(seconds: float) -> str:
+ """
+ Formats a duration in seconds into a human-readable H:M:S string.
+
+ Args:
+ seconds (float): The total seconds.
+
+ Returns:
+ str: The formatted time string (e.g., "0:15:32").
+ """
+ return str(datetime.timedelta(seconds=int(seconds)))
+
+
+
diff --git a/model/__init__.py b/model/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..718d07a21b53b7eff4a6564e6dfcae8ee7e8c6b1
--- /dev/null
+++ b/model/__init__.py
@@ -0,0 +1,17 @@
+from .kronos import KronosTokenizer, Kronos, KronosPredictor
+
+model_dict = {
+ 'kronos_tokenizer': KronosTokenizer,
+ 'kronos': Kronos,
+ 'kronos_predictor': KronosPredictor
+}
+
+
+def get_model_class(model_name):
+ if model_name in model_dict:
+ return model_dict[model_name]
+ else:
+ print(f"Model {model_name} not found in model_dict")
+ raise NotImplementedError
+
+
diff --git a/model/__pycache__/__init__.cpython-313.pyc b/model/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..35d832f3cfe25c9812a0fca5f81922bfabca5c30
Binary files /dev/null and b/model/__pycache__/__init__.cpython-313.pyc differ
diff --git a/model/__pycache__/kronos.cpython-313.pyc b/model/__pycache__/kronos.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d661ff53605221a35e9c4c2f25e9fb88702e5e48
Binary files /dev/null and b/model/__pycache__/kronos.cpython-313.pyc differ
diff --git a/model/__pycache__/module.cpython-313.pyc b/model/__pycache__/module.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6a3ce92c585395a5e29719278687186aad2e4ada
Binary files /dev/null and b/model/__pycache__/module.cpython-313.pyc differ
diff --git a/model/kronos.py b/model/kronos.py
new file mode 100644
index 0000000000000000000000000000000000000000..e3fb417047d43cd9e078950c5303b3c2a5fd32c9
--- /dev/null
+++ b/model/kronos.py
@@ -0,0 +1,626 @@
+import numpy as np
+import pandas as pd
+import torch
+from huggingface_hub import PyTorchModelHubMixin
+import sys
+
+from tqdm import trange
+
+sys.path.append("../")
+from model.module import *
+
+
+class KronosTokenizer(nn.Module, PyTorchModelHubMixin):
+ """
+ KronosTokenizer module for tokenizing input data using a hybrid quantization approach.
+
+ This tokenizer utilizes a combination of encoder and decoder Transformer blocks
+ along with the Binary Spherical Quantization (BSQuantizer) to compress and decompress input data.
+
+ Args:
+ d_in (int): Input dimension.
+ d_model (int): Model dimension.
+ n_heads (int): Number of attention heads.
+ ff_dim (int): Feed-forward dimension.
+ n_enc_layers (int): Number of encoder layers.
+ n_dec_layers (int): Number of decoder layers.
+ ffn_dropout_p (float): Dropout probability for feed-forward networks.
+ attn_dropout_p (float): Dropout probability for attention mechanisms.
+ resid_dropout_p (float): Dropout probability for residual connections.
+ s1_bits (int): Number of bits for the pre token in BSQuantizer.
+ s2_bits (int): Number of bits for the post token in BSQuantizer.
+ beta (float): Beta parameter for BSQuantizer.
+ gamma0 (float): Gamma0 parameter for BSQuantizer.
+ gamma (float): Gamma parameter for BSQuantizer.
+ zeta (float): Zeta parameter for BSQuantizer.
+ group_size (int): Group size parameter for BSQuantizer.
+
+ """
+
+ def __init__(self, d_in, d_model, n_heads, ff_dim, n_enc_layers, n_dec_layers, ffn_dropout_p, attn_dropout_p, resid_dropout_p, s1_bits, s2_bits, beta, gamma0, gamma, zeta, group_size):
+
+ super().__init__()
+ self.d_in = d_in
+ self.d_model = d_model
+ self.n_heads = n_heads
+ self.ff_dim = ff_dim
+ self.enc_layers = n_enc_layers
+ self.dec_layers = n_dec_layers
+ self.ffn_dropout_p = ffn_dropout_p
+ self.attn_dropout_p = attn_dropout_p
+ self.resid_dropout_p = resid_dropout_p
+
+ self.s1_bits = s1_bits
+ self.s2_bits = s2_bits
+ self.codebook_dim = s1_bits + s2_bits # Total dimension of the codebook after quantization
+ self.embed = nn.Linear(self.d_in, self.d_model)
+ self.head = nn.Linear(self.d_model, self.d_in)
+
+ # Encoder Transformer Blocks
+ self.encoder = nn.ModuleList([
+ TransformerBlock(self.d_model, self.n_heads, self.ff_dim, self.ffn_dropout_p, self.attn_dropout_p, self.resid_dropout_p)
+ for _ in range(self.enc_layers - 1)
+ ])
+ # Decoder Transformer Blocks
+ self.decoder = nn.ModuleList([
+ TransformerBlock(self.d_model, self.n_heads, self.ff_dim, self.ffn_dropout_p, self.attn_dropout_p, self.resid_dropout_p)
+ for _ in range(self.dec_layers - 1)
+ ])
+ self.quant_embed = nn.Linear(in_features=self.d_model, out_features=self.codebook_dim) # Linear layer before quantization
+ self.post_quant_embed_pre = nn.Linear(in_features=self.s1_bits, out_features=self.d_model) # Linear layer after quantization (pre part - s1 bits)
+ self.post_quant_embed = nn.Linear(in_features=self.codebook_dim, out_features=self.d_model) # Linear layer after quantization (full codebook)
+ self.tokenizer = BSQuantizer(self.s1_bits, self.s2_bits, beta, gamma0, gamma, zeta, group_size) # BSQuantizer module
+
+ def forward(self, x):
+ """
+ Forward pass of the KronosTokenizer.
+
+ Args:
+ x (torch.Tensor): Input tensor of shape (batch_size, seq_len, d_in).
+
+ Returns:
+ tuple: A tuple containing:
+ - tuple: (z_pre, z) - Reconstructed outputs from decoder with s1_bits and full codebook respectively,
+ both of shape (batch_size, seq_len, d_in).
+ - torch.Tensor: bsq_loss - Loss from the BSQuantizer.
+ - torch.Tensor: quantized - Quantized representation from BSQuantizer.
+ - torch.Tensor: z_indices - Indices from the BSQuantizer.
+ """
+ z = self.embed(x)
+
+ for layer in self.encoder:
+ z = layer(z)
+
+ z = self.quant_embed(z) # (B, T, codebook)
+
+ bsq_loss, quantized, z_indices = self.tokenizer(z)
+
+ quantized_pre = quantized[:, :, :self.s1_bits] # Extract the first part of quantized representation (s1_bits)
+ z_pre = self.post_quant_embed_pre(quantized_pre)
+
+ z = self.post_quant_embed(quantized)
+
+ # Decoder layers (for pre part - s1 bits)
+ for layer in self.decoder:
+ z_pre = layer(z_pre)
+ z_pre = self.head(z_pre)
+
+ # Decoder layers (for full codebook)
+ for layer in self.decoder:
+ z = layer(z)
+ z = self.head(z)
+
+ return (z_pre, z), bsq_loss, quantized, z_indices
+
+ def indices_to_bits(self, x, half=False):
+ """
+ Converts indices to bit representations and scales them.
+
+ Args:
+ x (torch.Tensor): Indices tensor.
+ half (bool, optional): Whether to process only half of the codebook dimension. Defaults to False.
+
+ Returns:
+ torch.Tensor: Bit representation tensor.
+ """
+ if half:
+ x1 = x[0] # Assuming x is a tuple of indices if half is True
+ x2 = x[1]
+ mask = 2 ** torch.arange(self.codebook_dim//2, device=x1.device, dtype=torch.long) # Create a mask for bit extraction
+ x1 = (x1.unsqueeze(-1) & mask) != 0 # Extract bits for the first half
+ x2 = (x2.unsqueeze(-1) & mask) != 0 # Extract bits for the second half
+ x = torch.cat([x1, x2], dim=-1) # Concatenate the bit representations
+ else:
+ mask = 2 ** torch.arange(self.codebook_dim, device=x.device, dtype=torch.long) # Create a mask for bit extraction
+ x = (x.unsqueeze(-1) & mask) != 0 # Extract bits
+
+ x = x.float() * 2 - 1 # Convert boolean to bipolar (-1, 1)
+ q_scale = 1. / (self.codebook_dim ** 0.5) # Scaling factor
+ x = x * q_scale
+ return x
+
+ def encode(self, x, half=False):
+ """
+ Encodes the input data into quantized indices.
+
+ Args:
+ x (torch.Tensor): Input tensor of shape (batch_size, seq_len, d_in).
+ half (bool, optional): Whether to use half quantization in BSQuantizer. Defaults to False.
+
+ Returns:
+ torch.Tensor: Quantized indices from BSQuantizer.
+ """
+ z = self.embed(x)
+ for layer in self.encoder:
+ z = layer(z)
+ z = self.quant_embed(z)
+
+ bsq_loss, quantized, z_indices = self.tokenizer(z, half)
+ return z_indices
+
+ def decode(self, x, half=False):
+ """
+ Decodes quantized indices back to the input data space.
+
+ Args:
+ x (torch.Tensor): Quantized indices tensor.
+ half (bool, optional): Whether the indices were generated with half quantization. Defaults to False.
+
+ Returns:
+ torch.Tensor: Reconstructed output tensor of shape (batch_size, seq_len, d_in).
+ """
+ quantized = self.indices_to_bits(x, half)
+ z = self.post_quant_embed(quantized)
+ for layer in self.decoder:
+ z = layer(z)
+ z = self.head(z)
+ return z
+
+
+class Kronos(nn.Module, PyTorchModelHubMixin):
+ """
+ Kronos Model.
+
+ Args:
+ s1_bits (int): Number of bits for pre tokens.
+ s2_bits (int): Number of bits for post tokens.
+ n_layers (int): Number of Transformer blocks.
+ d_model (int): Dimension of the model's embeddings and hidden states.
+ n_heads (int): Number of attention heads in the MultiheadAttention layers.
+ ff_dim (int): Dimension of the feedforward network in the Transformer blocks.
+ ffn_dropout_p (float): Dropout probability for the feedforward network.
+ attn_dropout_p (float): Dropout probability for the attention layers.
+ resid_dropout_p (float): Dropout probability for residual connections.
+ token_dropout_p (float): Dropout probability for token embeddings.
+ learn_te (bool): Whether to use learnable temporal embeddings.
+ """
+
+ def __init__(self, s1_bits, s2_bits, n_layers, d_model, n_heads, ff_dim, ffn_dropout_p, attn_dropout_p, resid_dropout_p, token_dropout_p, learn_te):
+ super().__init__()
+ self.s1_bits = s1_bits
+ self.s2_bits = s2_bits
+ self.n_layers = n_layers
+ self.d_model = d_model
+ self.n_heads = n_heads
+ self.learn_te = learn_te
+ self.ff_dim = ff_dim
+ self.ffn_dropout_p = ffn_dropout_p
+ self.attn_dropout_p = attn_dropout_p
+ self.resid_dropout_p = resid_dropout_p
+ self.token_dropout_p = token_dropout_p
+
+ self.s1_vocab_size = 2 ** self.s1_bits
+ self.token_drop = nn.Dropout(self.token_dropout_p)
+ self.embedding = HierarchicalEmbedding(self.s1_bits, self.s2_bits, self.d_model)
+ self.time_emb = TemporalEmbedding(self.d_model, self.learn_te)
+ self.transformer = nn.ModuleList([
+ TransformerBlock(self.d_model, self.n_heads, self.ff_dim, self.ffn_dropout_p, self.attn_dropout_p, self.resid_dropout_p)
+ for _ in range(self.n_layers)
+ ])
+ self.norm = RMSNorm(self.d_model)
+ self.dep_layer = DependencyAwareLayer(self.d_model)
+ self.head = DualHead(self.s1_bits, self.s2_bits, self.d_model)
+ self.apply(self._init_weights)
+
+ def _init_weights(self, module):
+
+ if isinstance(module, nn.Linear):
+ nn.init.xavier_normal_(module.weight)
+ if module.bias is not None:
+ nn.init.zeros_(module.bias)
+ elif isinstance(module, nn.Embedding):
+ nn.init.normal_(module.weight, mean=0, std=self.embedding.d_model ** -0.5)
+ elif isinstance(module, nn.LayerNorm):
+ nn.init.ones_(module.weight)
+ nn.init.zeros_(module.bias)
+ elif isinstance(module, RMSNorm):
+ nn.init.ones_(module.weight)
+
+ def forward(self, s1_ids, s2_ids, stamp=None, padding_mask=None, use_teacher_forcing=False, s1_targets=None):
+ """
+ Args:
+ s1_ids (torch.Tensor): Input tensor of s1 token IDs. Shape: [batch_size, seq_len]
+ s2_ids (torch.Tensor): Input tensor of s2 token IDs. Shape: [batch_size, seq_len]
+ stamp (torch.Tensor, optional): Temporal stamp tensor. Shape: [batch_size, seq_len]. Defaults to None.
+ padding_mask (torch.Tensor, optional): Mask for padding tokens. Shape: [batch_size, seq_len]. Defaults to None.
+ use_teacher_forcing (bool, optional): Whether to use teacher forcing for s1 decoding. Defaults to False.
+ s1_targets (torch.Tensor, optional): Target s1 token IDs for teacher forcing. Shape: [batch_size, seq_len]. Defaults to None.
+
+ Returns:
+ Tuple[torch.Tensor, torch.Tensor]:
+ - s1 logits: Logits for s1 token predictions. Shape: [batch_size, seq_len, s1_vocab_size]
+ - s2_logits: Logits for s2 token predictions, conditioned on s1. Shape: [batch_size, seq_len, s2_vocab_size]
+ """
+ x = self.embedding([s1_ids, s2_ids])
+ if stamp is not None:
+ time_embedding = self.time_emb(stamp)
+ x = x + time_embedding
+ x = self.token_drop(x)
+
+ for layer in self.transformer:
+ x = layer(x, key_padding_mask=padding_mask)
+
+ x = self.norm(x)
+
+ s1_logits = self.head(x)
+
+ if use_teacher_forcing:
+ sibling_embed = self.embedding.emb_s1(s1_targets)
+ else:
+ s1_probs = F.softmax(s1_logits.detach(), dim=-1)
+ sample_s1_ids = torch.multinomial(s1_probs.view(-1, self.s1_vocab_size), 1).view(s1_ids.shape)
+ sibling_embed = self.embedding.emb_s1(sample_s1_ids)
+
+ x2 = self.dep_layer(x, sibling_embed, key_padding_mask=padding_mask) # Dependency Aware Layer: Condition on s1 embeddings
+ s2_logits = self.head.cond_forward(x2)
+ return s1_logits, s2_logits
+
+ def decode_s1(self, s1_ids, s2_ids, stamp=None, padding_mask=None):
+ """
+ Decodes only the s1 tokens.
+
+ This method performs a forward pass to predict only s1 tokens. It returns the s1 logits
+ and the context representation from the Transformer, which can be used for subsequent s2 decoding.
+
+ Args:
+ s1_ids (torch.Tensor): Input tensor of s1 token IDs. Shape: [batch_size, seq_len]
+ s2_ids (torch.Tensor): Input tensor of s2 token IDs. Shape: [batch_size, seq_len]
+ stamp (torch.Tensor, optional): Temporal stamp tensor. Shape: [batch_size, seq_len]. Defaults to None.
+ padding_mask (torch.Tensor, optional): Mask for padding tokens. Shape: [batch_size, seq_len]. Defaults to None.
+
+ Returns:
+ Tuple[torch.Tensor, torch.Tensor]:
+ - s1 logits: Logits for s1 token predictions. Shape: [batch_size, seq_len, s1_vocab_size]
+ - context: Context representation from the Transformer. Shape: [batch_size, seq_len, d_model]
+ """
+ x = self.embedding([s1_ids, s2_ids])
+ if stamp is not None:
+ time_embedding = self.time_emb(stamp)
+ x = x + time_embedding
+ x = self.token_drop(x)
+
+ for layer in self.transformer:
+ x = layer(x, key_padding_mask=padding_mask)
+
+ x = self.norm(x)
+
+ s1_logits = self.head(x)
+ return s1_logits, x
+
+ def decode_s2(self, context, s1_ids, padding_mask=None):
+ """
+ Decodes the s2 tokens, conditioned on the context and s1 tokens.
+
+ This method decodes s2 tokens based on a pre-computed context representation (typically from `decode_s1`)
+ and the s1 token IDs. It uses the dependency-aware layer and the conditional s2 head to predict s2 tokens.
+
+ Args:
+ context (torch.Tensor): Context representation from the transformer (output of decode_s1).
+ Shape: [batch_size, seq_len, d_model]
+ s1_ids (torch.torch.Tensor): Input tensor of s1 token IDs. Shape: [batch_size, seq_len]
+ padding_mask (torch.Tensor, optional): Mask for padding tokens. Shape: [batch_size, seq_len]. Defaults to None.
+
+ Returns:
+ torch.Tensor: s2 logits. Shape: [batch_size, seq_len, s2_vocab_size]
+ """
+ sibling_embed = self.embedding.emb_s1(s1_ids)
+ x2 = self.dep_layer(context, sibling_embed, key_padding_mask=padding_mask)
+ return self.head.cond_forward(x2)
+
+
+def top_k_top_p_filtering(
+ logits,
+ top_k: int = 0,
+ top_p: float = 1.0,
+ filter_value: float = -float("Inf"),
+ min_tokens_to_keep: int = 1,
+):
+ """Filter a distribution of logits using top-k and/or nucleus (top-p) filtering
+ Args:
+ logits: logits distribution shape (batch size, vocabulary size)
+ if top_k > 0: keep only top k tokens with highest probability (top-k filtering).
+ if top_p < 1.0: keep the top tokens with cumulative probability >= top_p (nucleus filtering).
+ Nucleus filtering is described in Holtzman et al. (http://arxiv.org/abs/1904.09751)
+ Make sure we keep at least min_tokens_to_keep per batch example in the output
+ From: https://gist.github.com/thomwolf/1a5a29f6962089e871b94cbd09daf317
+ """
+ if top_k > 0:
+ top_k = min(max(top_k, min_tokens_to_keep), logits.size(-1)) # Safety check
+ # Remove all tokens with a probability less than the last token of the top-k
+ indices_to_remove = logits < torch.topk(logits, top_k)[0][..., -1, None]
+ logits[indices_to_remove] = filter_value
+ return logits
+
+ if top_p < 1.0:
+ sorted_logits, sorted_indices = torch.sort(logits, descending=True)
+ cumulative_probs = torch.cumsum(F.softmax(sorted_logits, dim=-1), dim=-1)
+
+ # Remove tokens with cumulative probability above the threshold (token with 0 are kept)
+ sorted_indices_to_remove = cumulative_probs > top_p
+ if min_tokens_to_keep > 1:
+ # Keep at least min_tokens_to_keep (set to min_tokens_to_keep-1 because we add the first one below)
+ sorted_indices_to_remove[..., :min_tokens_to_keep] = 0
+ # Shift the indices to the right to keep also the first token above the threshold
+ sorted_indices_to_remove[..., 1:] = sorted_indices_to_remove[..., :-1].clone()
+ sorted_indices_to_remove[..., 0] = 0
+
+ # scatter sorted tensors to original indexing
+ indices_to_remove = sorted_indices_to_remove.scatter(1, sorted_indices, sorted_indices_to_remove)
+ logits[indices_to_remove] = filter_value
+ return logits
+
+
+def sample_from_logits(logits, temperature=1.0, top_k=None, top_p=None, sample_logits=True):
+ logits = logits / temperature
+ if top_k is not None or top_p is not None:
+ if top_k > 0 or top_p < 1.0:
+ logits = top_k_top_p_filtering(logits, top_k=top_k, top_p=top_p)
+
+ probs = F.softmax(logits, dim=-1)
+
+ if not sample_logits:
+ _, x = top_k(probs, k=1, dim=-1)
+ else:
+ x = torch.multinomial(probs, num_samples=1)
+
+ return x
+
+
+def auto_regressive_inference(tokenizer, model, x, x_stamp, y_stamp, max_context, pred_len, clip=5, T=1.0, top_k=0, top_p=0.99, sample_count=5, verbose=False):
+ with torch.no_grad():
+ batch_size = x.size(0)
+ initial_seq_len = x.size(1)
+ x = torch.clip(x, -clip, clip)
+
+ device = x.device
+ x = x.unsqueeze(1).repeat(1, sample_count, 1, 1).reshape(-1, x.size(1), x.size(2)).to(device)
+ x_stamp = x_stamp.unsqueeze(1).repeat(1, sample_count, 1, 1).reshape(-1, x_stamp.size(1), x_stamp.size(2)).to(device)
+ y_stamp = y_stamp.unsqueeze(1).repeat(1, sample_count, 1, 1).reshape(-1, y_stamp.size(1), y_stamp.size(2)).to(device)
+
+ x_token = tokenizer.encode(x, half=True)
+
+ def get_dynamic_stamp(x_stamp, y_stamp, current_seq_len, pred_step):
+
+ if current_seq_len <= max_context - pred_step:
+ return torch.cat([x_stamp, y_stamp[:, :pred_step, :]], dim=1)
+ else:
+ start_idx = max_context - pred_step
+ return torch.cat([x_stamp[:, -start_idx:, :], y_stamp[:, :pred_step, :]], dim=1)
+
+ if verbose:
+ ran = trange
+ else:
+ ran = range
+ for i in ran(pred_len):
+ current_seq_len = initial_seq_len + i
+
+ if current_seq_len <= max_context:
+ input_tokens = x_token
+ else:
+ input_tokens = [t[:, -max_context:].contiguous() for t in x_token]
+
+ current_stamp = get_dynamic_stamp(x_stamp, y_stamp, current_seq_len, i)
+
+ s1_logits, context = model.decode_s1(input_tokens[0], input_tokens[1], current_stamp)
+ s1_logits = s1_logits[:, -1, :]
+ sample_pre = sample_from_logits(s1_logits, temperature=T, top_k=top_k, top_p=top_p, sample_logits=True)
+
+ s2_logits = model.decode_s2(context, sample_pre)
+ s2_logits = s2_logits[:, -1, :]
+ sample_post = sample_from_logits(s2_logits, temperature=T, top_k=top_k, top_p=top_p, sample_logits=True)
+
+ x_token[0] = torch.cat([x_token[0], sample_pre], dim=1)
+ x_token[1] = torch.cat([x_token[1], sample_post], dim=1)
+
+ torch.cuda.empty_cache()
+
+ input_tokens = [t[:, -max_context:].contiguous() for t in x_token]
+ z = tokenizer.decode(input_tokens, half=True)
+ z = z.reshape(batch_size, sample_count, z.size(1), z.size(2))
+ preds = z.cpu().numpy()
+ preds = np.mean(preds, axis=1)
+
+ return preds
+
+
+def calc_time_stamps(x_timestamp):
+ time_df = pd.DataFrame()
+ time_df['minute'] = x_timestamp.dt.minute
+ time_df['hour'] = x_timestamp.dt.hour
+ time_df['weekday'] = x_timestamp.dt.weekday
+ time_df['day'] = x_timestamp.dt.day
+ time_df['month'] = x_timestamp.dt.month
+ return time_df
+
+
+class KronosPredictor:
+
+ def __init__(self, model, tokenizer, device="cuda:0", max_context=512, clip=5):
+ self.tokenizer = tokenizer
+ self.model = model
+ self.max_context = max_context
+ self.clip = clip
+ self.price_cols = ['open', 'high', 'low', 'close']
+ self.vol_col = 'volume'
+ self.amt_vol = 'amount'
+ self.time_cols = ['minute', 'hour', 'weekday', 'day', 'month']
+ self.device = device
+
+ self.tokenizer = self.tokenizer.to(self.device)
+ self.model = self.model.to(self.device)
+
+ def generate(self, x, x_stamp, y_stamp, pred_len, T, top_k, top_p, sample_count, verbose):
+
+ x_tensor = torch.from_numpy(np.array(x).astype(np.float32)).to(self.device)
+ x_stamp_tensor = torch.from_numpy(np.array(x_stamp).astype(np.float32)).to(self.device)
+ y_stamp_tensor = torch.from_numpy(np.array(y_stamp).astype(np.float32)).to(self.device)
+
+ preds = auto_regressive_inference(self.tokenizer, self.model, x_tensor, x_stamp_tensor, y_stamp_tensor, self.max_context, pred_len,
+ self.clip, T, top_k, top_p, sample_count, verbose)
+ preds = preds[:, -pred_len:, :]
+ return preds
+
+ def predict(self, df, x_timestamp, y_timestamp, pred_len, T=1.0, top_k=0, top_p=0.9, sample_count=1, verbose=True):
+
+ if not isinstance(df, pd.DataFrame):
+ raise ValueError("Input must be a pandas DataFrame.")
+
+ if not all(col in df.columns for col in self.price_cols):
+ raise ValueError(f"Price columns {self.price_cols} not found in DataFrame.")
+
+ df = df.copy()
+ if self.vol_col not in df.columns:
+ df[self.vol_col] = 0.0 # Fill missing volume with zeros
+ df[self.amt_vol] = 0.0 # Fill missing amount with zeros
+ if self.amt_vol not in df.columns and self.vol_col in df.columns:
+ df[self.amt_vol] = df[self.vol_col] * df[self.price_cols].mean(axis=1)
+
+ if df[self.price_cols + [self.vol_col, self.amt_vol]].isnull().values.any():
+ raise ValueError("Input DataFrame contains NaN values in price or volume columns.")
+
+ x_time_df = calc_time_stamps(x_timestamp)
+ y_time_df = calc_time_stamps(y_timestamp)
+
+ x = df[self.price_cols + [self.vol_col, self.amt_vol]].values.astype(np.float32)
+ x_stamp = x_time_df.values.astype(np.float32)
+ y_stamp = y_time_df.values.astype(np.float32)
+
+ x_mean, x_std = np.mean(x, axis=0), np.std(x, axis=0)
+
+ x = (x - x_mean) / (x_std + 1e-5)
+ x = np.clip(x, -self.clip, self.clip)
+
+ x = x[np.newaxis, :]
+ x_stamp = x_stamp[np.newaxis, :]
+ y_stamp = y_stamp[np.newaxis, :]
+
+ preds = self.generate(x, x_stamp, y_stamp, pred_len, T, top_k, top_p, sample_count, verbose)
+
+ preds = preds.squeeze(0)
+ preds = preds * (x_std + 1e-5) + x_mean
+
+ pred_df = pd.DataFrame(preds, columns=self.price_cols + [self.vol_col, self.amt_vol], index=y_timestamp)
+ return pred_df
+
+
+ def predict_batch(self, df_list, x_timestamp_list, y_timestamp_list, pred_len, T=1.0, top_k=0, top_p=0.9, sample_count=1, verbose=True):
+ """
+ Perform parallel (batch) prediction on multiple time series. All series must have the same historical length and prediction length (pred_len).
+
+ Args:
+ df_list (List[pd.DataFrame]): List of input DataFrames, each containing price columns and optional volume/amount columns.
+ x_timestamp_list (List[pd.DatetimeIndex or Series]): List of timestamps corresponding to historical data, length should match the number of rows in each DataFrame.
+ y_timestamp_list (List[pd.DatetimeIndex or Series]): List of future prediction timestamps, length should equal pred_len.
+ pred_len (int): Number of prediction steps.
+ T (float): Sampling temperature.
+ top_k (int): Top-k filtering threshold.
+ top_p (float): Top-p (nucleus sampling) threshold.
+ sample_count (int): Number of parallel samples per series, automatically averaged internally.
+ verbose (bool): Whether to display autoregressive progress.
+
+ Returns:
+ List[pd.DataFrame]: List of prediction results in the same order as input, each DataFrame contains
+ `open, high, low, close, volume, amount` columns, indexed by corresponding `y_timestamp`.
+ """
+ # Basic validation
+ if not isinstance(df_list, (list, tuple)) or not isinstance(x_timestamp_list, (list, tuple)) or not isinstance(y_timestamp_list, (list, tuple)):
+ raise ValueError("df_list, x_timestamp_list, y_timestamp_list must be list or tuple types.")
+ if not (len(df_list) == len(x_timestamp_list) == len(y_timestamp_list)):
+ raise ValueError("df_list, x_timestamp_list, y_timestamp_list must have consistent lengths.")
+
+ num_series = len(df_list)
+
+ x_list = []
+ x_stamp_list = []
+ y_stamp_list = []
+ means = []
+ stds = []
+ seq_lens = []
+ y_lens = []
+
+ for i in range(num_series):
+ df = df_list[i]
+ if not isinstance(df, pd.DataFrame):
+ raise ValueError(f"Input at index {i} is not a pandas DataFrame.")
+ if not all(col in df.columns for col in self.price_cols):
+ raise ValueError(f"DataFrame at index {i} is missing price columns {self.price_cols}.")
+
+ df = df.copy()
+ if self.vol_col not in df.columns:
+ df[self.vol_col] = 0.0
+ df[self.amt_vol] = 0.0
+ if self.amt_vol not in df.columns and self.vol_col in df.columns:
+ df[self.amt_vol] = df[self.vol_col] * df[self.price_cols].mean(axis=1)
+
+ if df[self.price_cols + [self.vol_col, self.amt_vol]].isnull().values.any():
+ raise ValueError(f"DataFrame at index {i} contains NaN values in price or volume columns.")
+
+ x_timestamp = x_timestamp_list[i]
+ y_timestamp = y_timestamp_list[i]
+
+ x_time_df = calc_time_stamps(x_timestamp)
+ y_time_df = calc_time_stamps(y_timestamp)
+
+ x = df[self.price_cols + [self.vol_col, self.amt_vol]].values.astype(np.float32)
+ x_stamp = x_time_df.values.astype(np.float32)
+ y_stamp = y_time_df.values.astype(np.float32)
+
+ if x.shape[0] != x_stamp.shape[0]:
+ raise ValueError(f"Inconsistent lengths at index {i}: x has {x.shape[0]} vs x_stamp has {x_stamp.shape[0]}.")
+ if y_stamp.shape[0] != pred_len:
+ raise ValueError(f"y_timestamp length at index {i} should equal pred_len={pred_len}, got {y_stamp.shape[0]}.")
+
+ x_mean, x_std = np.mean(x, axis=0), np.std(x, axis=0)
+ x_norm = (x - x_mean) / (x_std + 1e-5)
+ x_norm = np.clip(x_norm, -self.clip, self.clip)
+
+ x_list.append(x_norm)
+ x_stamp_list.append(x_stamp)
+ y_stamp_list.append(y_stamp)
+ means.append(x_mean)
+ stds.append(x_std)
+
+ seq_lens.append(x_norm.shape[0])
+ y_lens.append(y_stamp.shape[0])
+
+ # Require all series to have consistent historical and prediction lengths for batch processing
+ if len(set(seq_lens)) != 1:
+ raise ValueError(f"Parallel prediction requires all series to have consistent historical lengths, got: {seq_lens}")
+ if len(set(y_lens)) != 1:
+ raise ValueError(f"Parallel prediction requires all series to have consistent prediction lengths, got: {y_lens}")
+
+ x_batch = np.stack(x_list, axis=0).astype(np.float32) # (B, seq_len, feat)
+ x_stamp_batch = np.stack(x_stamp_list, axis=0).astype(np.float32) # (B, seq_len, time_feat)
+ y_stamp_batch = np.stack(y_stamp_list, axis=0).astype(np.float32) # (B, pred_len, time_feat)
+
+ preds = self.generate(x_batch, x_stamp_batch, y_stamp_batch, pred_len, T, top_k, top_p, sample_count, verbose)
+ # preds: (B, pred_len, feat)
+
+ pred_dfs = []
+ for i in range(num_series):
+ preds_i = preds[i] * (stds[i] + 1e-5) + means[i]
+ pred_df = pd.DataFrame(preds_i, columns=self.price_cols + [self.vol_col, self.amt_vol], index=y_timestamp_list[i])
+ pred_dfs.append(pred_df)
+
+ return pred_dfs
+
diff --git a/model/module.py b/model/module.py
new file mode 100644
index 0000000000000000000000000000000000000000..9a7f1e9921580b5eb5e007a02013c48f62a7ddd8
--- /dev/null
+++ b/model/module.py
@@ -0,0 +1,577 @@
+import math
+
+from einops import rearrange, reduce
+import torch
+import torch.nn as nn
+from torch.autograd import Function
+import torch.nn.functional as F
+
+
+class DifferentiableEntropyFunction(Function):
+ @staticmethod
+ def forward(ctx, zq, basis, K, eps):
+ zb = (zq + 1) / 2
+ zi = ((zb * basis).sum(-1)).to(torch.int64)
+ cnt = torch.scatter_reduce(torch.zeros(2 ** K, device=zq.device, dtype=zq.dtype),
+ 0,
+ zi.flatten(),
+ torch.ones_like(zi.flatten()).to(zq.dtype),
+ 'sum')
+ prob = (cnt + eps) / (cnt + eps).sum()
+ H = -(prob * torch.log(prob)).sum()
+ ctx.save_for_backward(zq, zi, prob)
+ ctx.K = K
+ return H
+
+ @staticmethod
+ def backward(ctx, grad_output):
+ zq, zi, prob = ctx.saved_tensors
+ grad_array = -grad_output * (torch.log(prob) + 1) / zi.numel() / ctx.K
+ reord_grad = grad_array[zi.flatten()].reshape(zi.shape)
+ grad_input = reord_grad.unsqueeze(-1) * zq
+ return grad_input, None, None, None, None
+
+
+def codebook_entropy(zq, basis, K, eps=1e-4):
+ return DifferentiableEntropyFunction.apply(zq, basis, K, eps)
+
+
+class BinarySphericalQuantizer(nn.Module):
+ def __init__(self, embed_dim, beta, gamma0, gamma, zeta,
+ input_format='bchw',
+ soft_entropy=True, group_size=9,
+ persample_entropy_compute='analytical',
+ cb_entropy_compute='group',
+ l2_norm=True,
+ inv_temperature=1):
+ """
+ Paper link: https://arxiv.org/pdf/2406.07548.pdf
+ Here we use the official implementation of the BinarySphericalQuantizer.
+ """
+ super().__init__()
+ self.embed_dim = embed_dim
+ self.beta = beta # loss weight for commit loss
+ self.gamma0 = gamma0 # loss weight for entropy penalty
+ self.gamma = gamma # loss weight for entropy penalty
+ self.zeta = zeta # loss weight for entire entropy penalty
+ self.input_format = input_format
+ assert self.embed_dim % group_size == 0, "embed_dim must be divisible by group_size"
+ self.num_groups = self.embed_dim // group_size
+ self.group_size = group_size
+ assert persample_entropy_compute in ['group', 'analytical'], "persample_entropy_compute must be either 'group' or 'analytical'"
+ assert cb_entropy_compute in ['group', 'nce'], "cb_entropy_compute must be either 'group' or 'nce'"
+ self.persample_entropy_compute = persample_entropy_compute
+ self.cb_entropy_compute = cb_entropy_compute
+ self.l2_norm = l2_norm
+ self.inv_temperature = inv_temperature
+
+ self.register_buffer('basis', 2 ** torch.arange(embed_dim - 1, -1, -1))
+ self.register_buffer('group_basis', 2 ** torch.arange(group_size - 1, -1, -1))
+
+ self.num_dimensions = 2 ** embed_dim
+ self.bits_per_index = embed_dim
+
+ # we only need to keep the codebook portion up to the group size
+ # because we approximate the H loss with this subcode
+ group_codes = torch.arange(2 ** self.group_size)
+ group_codebook = self.indexes_to_codes(group_codes).float()[:, -group_size:]
+ self.register_buffer('group_codebook', group_codebook, persistent=False)
+
+ self.soft_entropy = soft_entropy # soft_entropy: Sec 3.2 of https://arxiv.org/pdf/1911.05894.pdf
+
+ def quantize(self, z):
+ assert z.shape[-1] == self.embed_dim, f"Expected {self.embed_dim} dimensions, got {z.shape[-1]}"
+
+ zhat = torch.where(z > 0,
+ torch.tensor(1, dtype=z.dtype, device=z.device),
+ torch.tensor(-1, dtype=z.dtype, device=z.device))
+ return z + (zhat - z).detach()
+
+ def forward(self, z):
+ # if self.input_format == 'bchw':
+ # z = rearrange(z, 'b c h w -> b h w c')
+ zq = self.quantize(z)
+
+ indices = self.codes_to_indexes(zq.detach())
+ group_indices = self.codes_to_group_indexes(zq.detach())
+ if not self.training:
+ used_codes = torch.unique(indices, return_counts=False)
+ else:
+ used_codes = None
+
+ q_scale = 1. / (self.embed_dim ** 0.5) if self.l2_norm else 1.
+
+ if self.soft_entropy:
+ persample_entropy, cb_entropy, avg_prob = self.soft_entropy_loss(z)
+ entropy_penalty = self.gamma0 * persample_entropy - self.gamma * cb_entropy
+ else:
+ zb_by_sample = ((zq + 1) / 2).reshape(z.shape[0], -1, z.shape[-1]).to(torch.float32)
+ persample_entropy = self.get_hard_per_sample_entropy(zb_by_sample)
+ cb_entropy = codebook_entropy(zq, self.basis, self.embed_dim)
+ entropy_penalty = self.gamma0 * persample_entropy - self.gamma * cb_entropy
+
+ zq = zq * q_scale
+
+ # commit loss
+ commit_loss = self.beta * torch.mean(((zq.detach() - z) ** 2).sum(dim=-1))
+
+ # if self.input_format == 'bchw':
+ # zq = rearrange(zq, 'b h w c -> b c h w')
+
+ return (
+ zq,
+ commit_loss + self.zeta * entropy_penalty / self.inv_temperature,
+ {"H": cb_entropy, "used_codes": used_codes, "indices": indices, "group_indices": group_indices,
+ "avg_prob": avg_prob}
+ )
+
+ def soft_entropy_loss(self, z):
+ # if we divide the code in subgroups of size group_size, the codebook will be of size 2 ** group_size
+ # the sub-code is the last group_size bits of the full code
+ group_code_book = self.group_codebook / (self.embed_dim ** 0.5 if self.l2_norm else 1)
+ divided_z = rearrange(z, '... (g c) -> ... g c', c=self.group_size)
+
+ # we calculate the distance between the divided_z and the codebook for each subgroup
+ distance = - 2 * torch.einsum('... g c, d c ->... g d', divided_z, group_code_book)
+ prob = (-distance * self.inv_temperature).softmax(dim=-1)
+ if self.persample_entropy_compute == 'analytical':
+ if self.l2_norm:
+ p = torch.sigmoid(-4 * z / (self.embed_dim ** 0.5) * self.inv_temperature)
+ else:
+ p = torch.sigmoid(-4 * z * self.inv_temperature)
+ prob = torch.stack([p, 1 - p], dim=-1)
+ per_sample_entropy = self.get_entropy(prob, dim=-1, normalize=False).sum(dim=-1).mean()
+ else:
+ per_sample_entropy = self.get_entropy(prob, dim=-1, normalize=False).sum(dim=-1).mean()
+
+ # macro average of the probability of each subgroup
+ avg_prob = reduce(prob, '... g d ->g d', 'mean')
+ codebook_entropy = self.get_entropy(avg_prob, dim=-1, normalize=False)
+
+ # the approximation of the entropy is the sum of the entropy of each subgroup
+ return per_sample_entropy, codebook_entropy.sum(), avg_prob
+
+ def get_hard_per_sample_entropy(self, zb_by_sample):
+ probs_per_dim = zb_by_sample.sum(1) / zb_by_sample.shape[1]
+ persample_entropy = - probs_per_dim * torch.log(probs_per_dim + 1e-8) - (1 - probs_per_dim) * torch.log(1 - probs_per_dim + 1e-8)
+ persample_entropy = persample_entropy.sum(-1)
+ return persample_entropy.mean()
+
+ def codes_to_indexes(self, zhat):
+ """Converts a `code` to an index in the codebook.
+ Args:
+ zhat: A tensor of shape (B, ..., C) containing the codes. must be in {-1, 1}
+ """
+ assert zhat.shape[-1] == self.embed_dim, f"Expected {self.embed_dim} dimensions, got {zhat.shape[-1]}"
+ return ((zhat + 1) / 2 * self.basis).sum(axis=-1).to(torch.int64)
+
+ def codes_to_group_indexes(self, zhat):
+ """Converts a `code` to a list of indexes (in groups) in the codebook.
+ Args:
+ zhat: A tensor of shape (B, ..., C) containing the codes. must be in {-1, 1}
+ """
+ zhat_in_group = rearrange(zhat, 'b ... (g c) -> b ... g c', c=self.group_size)
+ return ((zhat_in_group + 1) / 2 * self.group_basis).sum(axis=-1).to(torch.int64)
+
+ def indexes_to_codes(self, indices):
+ """Inverse of `indexes_to_codes`."""
+ indices = indices.unsqueeze(-1)
+ codes_non_centered = torch.remainder(
+ torch.floor_divide(indices, self.basis), 2
+ )
+ return codes_non_centered * 2 - 1
+
+ def group_indexes_to_codes(self, group_indices):
+ """Inverse of `group_indexes_to_codes`."""
+ group_indices = group_indices.unsqueeze(-1)
+ codes_non_centered = torch.remainder(
+ torch.floor_divide(group_indices, self.group_basis), 2
+ )
+ codes_non_centered = rearrange(codes_non_centered, 'b ... g c -> b ... (g c)')
+ return codes_non_centered * 2 - 1
+
+ def get_entropy(self, count, dim=-1, eps=1e-4, normalize=True):
+ if normalize:
+ probs = (count + eps) / (count + eps).sum(dim=dim, keepdim=True)
+ else:
+ probs = count
+ H = -(probs * torch.log(probs + 1e-8)).sum(dim=dim)
+ return H
+
+ def get_group_codebook_entry(self, group_indices):
+ z_q = self.group_indexes_to_codes(group_indices)
+ q_scale = 1. / (self.embed_dim ** 0.5) if self.l2_norm else 1.
+ z_q = z_q * q_scale
+ if self.input_format == 'bchw':
+ h, w = int(z_q.shape[1] ** 0.5)
+ assert h * w == z_q.shape[1], 'Invalid sequence length'
+ z_q = rearrange(z_q, 'b (h w) c -> b c h w', h=h)
+ return z_q
+
+ def get_codebook_entry(self, indices):
+ z_q = self.indexes_to_codes(indices)
+ q_scale = 1. / (self.embed_dim ** 0.5) if self.l2_norm else 1.
+ z_q = z_q * q_scale
+ if self.input_format == 'bchw':
+ h, w = int(z_q.shape[1] ** 0.5)
+ assert h * w == z_q.shape[1], 'Invalid sequence length'
+ z_q = rearrange(z_q, 'b (h w) c -> b c h w', h=h)
+ return z_q
+
+
+class BSQuantizer(nn.Module):
+
+ def __init__(self, s1_bits, s2_bits, beta, gamma0, gamma, zeta, group_size):
+ super().__init__()
+ self.codebook_dim = s1_bits + s2_bits
+ self.s1_bits = s1_bits
+ self.s2_bits = s2_bits
+ self.bsq = BinarySphericalQuantizer(self.codebook_dim, beta, gamma0, gamma, zeta, group_size=group_size)
+
+ def bits_to_indices(self, bits):
+ bits = (bits >= 0).to(torch.long)
+ indices = 2 ** torch.arange(
+ 0,
+ bits.shape[-1],
+ 1,
+ dtype=torch.long,
+ device=bits.device,
+ )
+ return (bits * indices).sum(-1)
+
+ def forward(self, z, half=False):
+ z = F.normalize(z, dim=-1)
+ quantized, bsq_loss, metrics = self.bsq(z)
+ if half:
+ q_pre = quantized[:, :, :self.s1_bits]
+ q_post = quantized[:, :, self.s1_bits:]
+ z_indices = [self.bits_to_indices(q_pre), self.bits_to_indices(q_post)]
+ else:
+ z_indices = self.bits_to_indices(quantized)
+ return bsq_loss, quantized, z_indices
+
+
+class RMSNorm(torch.nn.Module):
+ def __init__(self, dim: int, eps: float = 1e-5):
+ super().__init__()
+ self.eps = eps
+ self.weight = nn.Parameter(torch.ones(dim))
+
+ def _norm(self, x):
+ return x * torch.rsqrt(torch.mean(x * x, dim=-1, keepdim=True) + self.eps)
+
+ def forward(self, x):
+ output = self._norm(x.float()).type_as(x)
+ return output * self.weight
+
+
+class FeedForward(nn.Module):
+ def __init__(self, d_model, ff_dim, ffn_dropout_p=0.0):
+ super().__init__()
+
+ self.w1 = nn.Linear(d_model, ff_dim, bias=False)
+ self.w3 = nn.Linear(d_model, ff_dim, bias=False)
+ self.w2 = nn.Linear(ff_dim, d_model, bias=False)
+ self.ffn_dropout = nn.Dropout(ffn_dropout_p)
+
+ def forward(self, x):
+ return self.ffn_dropout(self.w2(F.silu(self.w1(x)) * self.w3(x)))
+
+
+class RotaryPositionalEmbedding(nn.Module):
+ def __init__(self, dim):
+ super().__init__()
+ inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2).float() / dim))
+ self.register_buffer("inv_freq", inv_freq)
+ self.seq_len_cached = None
+ self.cos_cached = None
+ self.sin_cached = None
+
+ def _update_cos_sin_cache(self, x, seq_len):
+ if seq_len != self.seq_len_cached:
+ self.seq_len_cached = seq_len
+ t = torch.arange(seq_len, device=x.device).type_as(self.inv_freq)
+ freqs = torch.einsum('i,j->ij', t, self.inv_freq)
+ emb = torch.cat((freqs, freqs), dim=-1).to(x.device)
+ self.cos_cached = emb.cos()[None, None, :, :]
+ self.sin_cached = emb.sin()[None, None, :, :]
+ return self.cos_cached, self.sin_cached
+
+ def forward(self, q, k):
+ cos, sin = self._update_cos_sin_cache(q, q.shape[-2])
+ return (
+ (q * cos) + (self._rotate_half(q) * sin),
+ (k * cos) + (self._rotate_half(k) * sin),
+ )
+
+ def _rotate_half(self, x):
+ x1, x2 = x.chunk(2, dim=-1)
+ return torch.cat((-x2, x1), dim=-1)
+
+
+def scaled_dot_product_attention(query, key, value, attn_mask=None, dropout_p=0.0, is_causal=False, scale=None) -> torch.Tensor:
+ L, S = query.size(-2), key.size(-2)
+ scale_factor = 1 / math.sqrt(query.size(-1)) if scale is None else scale
+ attn_bias = torch.zeros(L, S, dtype=query.dtype).to(query.device)
+
+ if is_causal:
+ assert attn_mask is None
+ temp_mask = torch.ones(L, S, dtype=torch.bool).tril(diagonal=0).to(query.device)
+ attn_bias.masked_fill_(temp_mask.logical_not(), float("-inf"))
+ attn_bias.to(query.dtype)
+
+ attn_weight = query @ key.transpose(-2, -1) * scale_factor
+ attn_weight += attn_bias
+
+ if attn_mask is not None:
+ attn_mask_bias = torch.zeros_like(attn_weight)
+ if attn_mask.dtype == torch.bool:
+ attn_mask_bias.masked_fill_(attn_mask, float("-inf"))
+ else:
+ attn_mask_bias += attn_mask
+ attn_weight += attn_mask_bias
+
+ attn_weight = torch.softmax(attn_weight, dim=-1)
+ attn_weight = torch.dropout(attn_weight, dropout_p, train=True)
+ return attn_weight @ value
+
+
+class MultiHeadAttentionWithRoPE(nn.Module):
+ def __init__(self, d_model, n_heads, attn_dropout_p=0.0, resid_dropout_p=0.0):
+ super().__init__()
+ self.d_model = d_model
+ self.n_heads = n_heads
+ self.head_dim = d_model // n_heads
+
+ self.q_proj = nn.Linear(d_model, d_model)
+ self.k_proj = nn.Linear(d_model, d_model)
+ self.v_proj = nn.Linear(d_model, d_model)
+ self.out_proj = nn.Linear(d_model, d_model)
+ self.rotary = RotaryPositionalEmbedding(self.head_dim)
+ self.attn_dropout_p = attn_dropout_p
+ self.resid_dropout = nn.Dropout(resid_dropout_p)
+
+ def forward(self, x, key_padding_mask=None):
+ batch_size, seq_len, _ = x.shape
+
+ q = self.q_proj(x).view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)
+ k = self.k_proj(x).view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)
+ v = self.v_proj(x).view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)
+
+ q, k = self.rotary(q, k)
+
+ if key_padding_mask is not None:
+ attn_mask = key_padding_mask.unsqueeze(1).unsqueeze(2) # [batch, 1, 1, seq_len]
+ attn_mask = attn_mask.expand(-1, self.n_heads, seq_len, -1) # [batch, n_heads, q_len, k_len]
+ else:
+ attn_mask = None
+
+ attn_output = scaled_dot_product_attention(
+ q, k, v,
+ attn_mask=attn_mask,
+ dropout_p=self.attn_dropout_p,
+ is_causal=True
+ )
+
+ attn_output = attn_output.transpose(1, 2).contiguous().view(batch_size, seq_len, self.d_model)
+ return self.resid_dropout(self.out_proj(attn_output))
+
+
+class MultiHeadCrossAttentionWithRoPE(nn.Module):
+ def __init__(self, d_model, n_heads, attn_dropout_p=0.0, resid_dropout=0.0):
+ super().__init__()
+ self.d_model = d_model
+ self.n_heads = n_heads
+ self.head_dim = d_model // n_heads
+
+ self.q_proj = nn.Linear(d_model, d_model)
+ self.k_proj = nn.Linear(d_model, d_model)
+ self.v_proj = nn.Linear(d_model, d_model)
+ self.out_proj = nn.Linear(d_model, d_model)
+ self.rotary = RotaryPositionalEmbedding(self.head_dim)
+ self.attn_dropout_p = attn_dropout_p
+ self.resid_dropout = nn.Dropout(resid_dropout)
+
+ def forward(self, query, key, value, key_padding_mask=None):
+ batch_size, q_len, _ = query.shape
+ _, seq_len, _ = key.shape
+
+ q = self.q_proj(query).view(batch_size, q_len, self.n_heads, self.head_dim).transpose(1, 2)
+ k = self.k_proj(key).view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)
+ v = self.v_proj(value).view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)
+
+ q, k = self.rotary(q, k)
+
+ if key_padding_mask is not None:
+ attn_mask = key_padding_mask.unsqueeze(1).unsqueeze(2)
+ attn_mask = attn_mask.expand(-1, self.n_heads, q_len, -1)
+ else:
+ attn_mask = None
+
+ is_causal_flag = self.training
+
+ attn_output = scaled_dot_product_attention(
+ q, k, v,
+ attn_mask=attn_mask,
+ dropout_p=self.attn_dropout_p,
+ is_causal=is_causal_flag
+ )
+
+ attn_output = attn_output.transpose(1, 2).contiguous().view(batch_size, q_len, self.d_model)
+ return self.resid_dropout(self.out_proj(attn_output))
+
+
+class HierarchicalEmbedding(nn.Module):
+ def __init__(self, s1_bits, s2_bits, d_model=256):
+ super().__init__()
+ self.s1_bits = s1_bits
+ self.s2_bits = s2_bits
+
+ vocab_s1 = 2 ** s1_bits
+ vocab_s2 = 2 ** s2_bits
+
+ self.emb_s1 = nn.Embedding(vocab_s1, d_model)
+ self.emb_s2 = nn.Embedding(vocab_s2, d_model)
+ self.d_model = d_model
+ self.fusion_proj = nn.Linear(d_model * 2, d_model)
+
+ nn.init.normal_(self.emb_s1.weight, mean=0, std=d_model ** -0.5)
+ nn.init.normal_(self.emb_s2.weight, mean=0, std=d_model ** -0.5)
+
+ def forward(self, token_ids):
+ """Inputs:
+ token_ids: [batch_size, seq_len] token ID
+ Output: [batch_size, seq_len, d_model]
+ """
+ if isinstance(token_ids, tuple) or isinstance(token_ids, list):
+ s1_ids, s2_ids = token_ids
+ else:
+ s1_ids, s2_ids = self.split_token(token_ids, self.s2_bits)
+ s1_emb = self.emb_s1(s1_ids) * math.sqrt(self.d_model)
+ s2_emb = self.emb_s2(s2_ids) * math.sqrt(self.d_model)
+ return self.fusion_proj(torch.cat([s1_emb, s2_emb], dim=-1))
+
+
+class DependencyAwareLayer(nn.Module):
+ def __init__(self, d_model, n_heads=4, attn_dropout_p=0.0, resid_dropout=0.0):
+ super().__init__()
+ self.cross_attn = MultiHeadCrossAttentionWithRoPE(d_model, n_heads, attn_dropout_p, resid_dropout)
+ self.norm = RMSNorm(d_model)
+
+ def forward(self, hidden_states, sibling_embed, key_padding_mask=None):
+ """hidden_states: [batch, seq_len, d_model]
+ sibling_embed: Embedding from another subtoken
+ """
+ attn_out = self.cross_attn(
+ query=sibling_embed,
+ key=hidden_states,
+ value=hidden_states,
+ key_padding_mask=key_padding_mask
+ )
+ return self.norm(hidden_states + attn_out)
+
+
+class TransformerBlock(nn.Module):
+ def __init__(self, d_model, n_heads, ff_dim=1024, ffn_dropout_p=0.0, attn_dropout_p=0.0, resid_dropout_p=0.0):
+ super().__init__()
+ self.norm1 = RMSNorm(d_model)
+ self.self_attn = MultiHeadAttentionWithRoPE(d_model, n_heads, attn_dropout_p, resid_dropout_p)
+ self.norm2 = RMSNorm(d_model)
+ self.ffn = FeedForward(d_model, ff_dim, ffn_dropout_p)
+
+ def forward(self, x, key_padding_mask=None):
+ residual = x
+ x = self.norm1(x)
+ attn_out = self.self_attn(x, key_padding_mask=key_padding_mask)
+ x = residual + attn_out
+
+ residual = x
+ x = self.norm2(x)
+ ffn_out = self.ffn(x)
+ x = residual + ffn_out
+ return x
+
+
+class DualHead(nn.Module):
+ def __init__(self, s1_bits, s2_bits, d_model):
+ super().__init__()
+ self.vocab_s1 = 2 ** s1_bits
+ self.vocab_s2 = 2 ** s2_bits
+ self.proj_s1 = nn.Linear(d_model, self.vocab_s1)
+ self.proj_s2 = nn.Linear(d_model, self.vocab_s2)
+
+ def compute_loss(self, s1_logits, s2_logits, s1_targets, s2_targets, padding_mask=None):
+ if padding_mask is not None:
+ valid_mask = (padding_mask == 0)
+ s1_logits = s1_logits[valid_mask]
+ s2_logits = s2_logits[valid_mask]
+ s1_targets = s1_targets[valid_mask]
+ s2_targets = s2_targets[valid_mask]
+ ce_s1 = F.cross_entropy(s1_logits, s1_targets)
+ ce_s2 = F.cross_entropy(s2_logits, s2_targets)
+ else:
+ ce_s1 = F.cross_entropy(s1_logits.reshape(-1, self.vocab_s1), s1_targets.reshape(-1))
+ ce_s2 = F.cross_entropy(s2_logits.reshape(-1, self.vocab_s2), s2_targets.reshape(-1))
+ ce_loss = (ce_s1 + ce_s2) / 2
+ return ce_loss, ce_s1, ce_s2
+
+ def forward(self, x):
+ return self.proj_s1(x)
+
+ def cond_forward(self, x2):
+ return self.proj_s2(x2)
+
+
+class FixedEmbedding(nn.Module):
+ def __init__(self, c_in, d_model):
+ super(FixedEmbedding, self).__init__()
+
+ w = torch.zeros(c_in, d_model).float()
+ w.require_grad = False
+
+ position = torch.arange(0, c_in).float().unsqueeze(1)
+ div_term = (torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model)).exp()
+
+ w[:, 0::2] = torch.sin(position * div_term)
+ w[:, 1::2] = torch.cos(position * div_term)
+
+ self.emb = nn.Embedding(c_in, d_model)
+ self.emb.weight = nn.Parameter(w, requires_grad=False)
+
+ def forward(self, x):
+ return self.emb(x).detach()
+
+
+class TemporalEmbedding(nn.Module):
+ def __init__(self, d_model, learn_pe):
+ super(TemporalEmbedding, self).__init__()
+
+ minute_size = 60
+ hour_size = 24
+ weekday_size = 7
+ day_size = 32
+ month_size = 13
+
+ Embed = FixedEmbedding if not learn_pe else nn.Embedding
+ self.minute_embed = Embed(minute_size, d_model)
+ self.hour_embed = Embed(hour_size, d_model)
+ self.weekday_embed = Embed(weekday_size, d_model)
+ self.day_embed = Embed(day_size, d_model)
+ self.month_embed = Embed(month_size, d_model)
+
+ def forward(self, x):
+ x = x.long()
+
+ minute_x = self.minute_embed(x[:, :, 0])
+ hour_x = self.hour_embed(x[:, :, 1])
+ weekday_x = self.weekday_embed(x[:, :, 2])
+ day_x = self.day_embed(x[:, :, 3])
+ month_x = self.month_embed(x[:, :, 4])
+
+ return hour_x + weekday_x + day_x + month_x + minute_x
+
+
+
+
+
+
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c8f798cf2acfe43258d516e81ea52334d424c534
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,12 @@
+binance
+requests
+numpy
+pandas
+torch
+
+einops==0.8.1
+huggingface_hub==0.33.1
+matplotlib==3.9.3
+pandas==2.2.2
+tqdm==4.67.1
+safetensors==0.6.2
diff --git a/webui/README.md b/webui/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..5fa12186f18b9d5a010f293ab9b9b719f57f6021
--- /dev/null
+++ b/webui/README.md
@@ -0,0 +1,135 @@
+# Kronos Web UI
+
+Web user interface for Kronos financial prediction model, providing intuitive graphical operation interface.
+
+## ✨ Features
+
+- **Multi-format data support**: Supports CSV, Feather and other financial data formats
+- **Smart time window**: Fixed 400+120 data point time window slider selection
+- **Real model prediction**: Integrated real Kronos model, supports multiple model sizes
+- **Prediction quality control**: Adjustable temperature, nucleus sampling, sample count and other parameters
+- **Multi-device support**: Supports CPU, CUDA, MPS and other computing devices
+- **Comparison analysis**: Detailed comparison between prediction results and actual data
+- **K-line chart display**: Professional financial K-line chart display
+
+## 🚀 Quick Start
+
+### Method 1: Start with Python script
+```bash
+cd webui
+python run.py
+```
+
+### Method 2: Start with Shell script
+```bash
+cd webui
+chmod +x start.sh
+./start.sh
+```
+
+### Method 3: Start Flask application directly
+```bash
+cd webui
+python app.py
+```
+
+After successful startup, visit http://localhost:7070
+
+## 📋 Usage Steps
+
+1. **Load data**: Select financial data file from data directory
+2. **Load model**: Select Kronos model and computing device
+3. **Set parameters**: Adjust prediction quality parameters
+4. **Select time window**: Use slider to select 400+120 data point time range
+5. **Start prediction**: Click prediction button to generate results
+6. **View results**: View prediction results in charts and tables
+
+## 🔧 Prediction Quality Parameters
+
+### Temperature (T)
+- **Range**: 0.1 - 2.0
+- **Effect**: Controls prediction randomness
+- **Recommendation**: 1.2-1.5 for better prediction quality
+
+### Nucleus Sampling (top_p)
+- **Range**: 0.1 - 1.0
+- **Effect**: Controls prediction diversity
+- **Recommendation**: 0.95-1.0 to consider more possibilities
+
+### Sample Count
+- **Range**: 1 - 5
+- **Effect**: Generate multiple prediction samples
+- **Recommendation**: 2-3 samples to improve quality
+
+## 📊 Supported Data Formats
+
+### Required Columns
+- `open`: Opening price
+- `high`: Highest price
+- `low`: Lowest price
+- `close`: Closing price
+
+### Optional Columns
+- `volume`: Trading volume
+- `amount`: Trading amount (not used for prediction)
+- `timestamps`/`timestamp`/`date`: Timestamp
+
+## 🤖 Model Support
+
+- **Kronos-mini**: 4.1M parameters, lightweight fast prediction
+- **Kronos-small**: 24.7M parameters, balanced performance and speed
+- **Kronos-base**: 102.3M parameters, high quality prediction
+
+## 🖥️ GPU Acceleration Support
+
+- **CPU**: General computing, best compatibility
+- **CUDA**: NVIDIA GPU acceleration, best performance
+- **MPS**: Apple Silicon GPU acceleration, recommended for Mac users
+
+## ⚠️ Notes
+
+- `amount` column is not used for prediction, only for display
+- Time window is fixed at 400+120=520 data points
+- Ensure data file contains sufficient historical data
+- First model loading may require download, please be patient
+
+## 🔍 Comparison Analysis
+
+The system automatically provides comparison analysis between prediction results and actual data, including:
+- Price difference statistics
+- Error analysis
+- Prediction quality assessment
+
+## 🛠️ Technical Architecture
+
+- **Backend**: Flask + Python
+- **Frontend**: HTML + CSS + JavaScript
+- **Charts**: Plotly.js
+- **Data processing**: Pandas + NumPy
+- **Model**: Hugging Face Transformers
+
+## 📝 Troubleshooting
+
+### Common Issues
+1. **Port occupied**: Modify port number in app.py
+2. **Missing dependencies**: Run `pip install -r requirements.txt`
+3. **Model loading failed**: Check network connection and model ID
+4. **Data format error**: Ensure data column names and format are correct
+
+### Log Viewing
+Detailed runtime information will be displayed in the console at startup, including model status and error messages.
+
+## 📄 License
+
+This project follows the license terms of the original Kronos project.
+
+## 🤝 Contributing
+
+Welcome to submit Issues and Pull Requests to improve this Web UI!
+
+## 📞 Support
+
+If you have questions, please check:
+1. Project documentation
+2. GitHub Issues
+3. Console error messages
diff --git a/webui/__pycache__/app.cpython-313.pyc b/webui/__pycache__/app.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c28d39b6dcc418b62de0d3b1576da60c9cfadf55
Binary files /dev/null and b/webui/__pycache__/app.cpython-313.pyc differ
diff --git a/webui/__pycache__/technical_indicators.cpython-313.pyc b/webui/__pycache__/technical_indicators.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..45abdaeeacabfb090bce06c53c9adad6326f2f63
Binary files /dev/null and b/webui/__pycache__/technical_indicators.cpython-313.pyc differ
diff --git a/webui/app.py b/webui/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..0c34047d2fabb7ab9689a083f0c0b9a69af67b73
--- /dev/null
+++ b/webui/app.py
@@ -0,0 +1,863 @@
+import datetime
+import json
+import os
+import sys
+import warnings
+
+import pandas as pd
+import plotly.graph_objects as go
+import plotly.utils
+import pytz
+from binance.client import Client
+from flask import Flask, render_template, request, jsonify
+from flask_cors import CORS
+from sympy import false
+
+try:
+ from technical_indicators import add_technical_indicators, get_available_indicators
+
+ TECHNICAL_INDICATORS_AVAILABLE = False
+except ImportError as e:
+ print(f"⚠️ 技术指标模块导入失败: {e}")
+ TECHNICAL_INDICATORS_AVAILABLE = False
+
+
+ # 定义空的替代函数
+ def add_technical_indicators(df, indicators_config=None):
+ return df
+
+
+ def get_available_indicators():
+ return {'trend': [], 'momentum': [], 'volatility': [], 'volume': []}
+
+warnings.filterwarnings('ignore')
+
+# 设置东八区时区
+BEIJING_TZ = pytz.timezone('Asia/Shanghai')
+
+# Add project root directory to path
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+try:
+ from model import Kronos, KronosTokenizer, KronosPredictor
+
+ MODEL_AVAILABLE = True
+except ImportError:
+ MODEL_AVAILABLE = False
+ print("Warning: Kronos model cannot be imported, will use simulated data for demonstration")
+
+app = Flask(__name__)
+CORS(app)
+
+# Global variables to store models
+tokenizer = None
+model = None
+predictor = None
+
+# Available model configurations
+AVAILABLE_MODELS = {
+ 'kronos-mini': {
+ 'name': 'Kronos-mini',
+ 'model_id': 'NeoQuasar/Kronos-mini',
+ 'tokenizer_id': 'NeoQuasar/Kronos-Tokenizer-2k',
+ 'context_length': 2048,
+ 'params': '4.1M',
+ 'description': 'Lightweight model, suitable for fast prediction'
+ },
+ 'kronos-small': {
+ 'name': 'Kronos-small',
+ 'model_id': 'NeoQuasar/Kronos-small',
+ 'tokenizer_id': 'NeoQuasar/Kronos-Tokenizer-base',
+ 'context_length': 512,
+ 'params': '24.7M',
+ 'description': 'Small model, balanced performance and speed'
+ },
+ 'kronos-base': {
+ 'name': 'Kronos-base',
+ 'model_id': 'NeoQuasar/Kronos-base',
+ 'tokenizer_id': 'NeoQuasar/Kronos-Tokenizer-base',
+ 'context_length': 512,
+ 'params': '102.3M',
+ 'description': 'Base model, provides better prediction quality'
+ }
+}
+
+# 币安客户端初始化(使用公开API,无需API密钥)
+binance_client = Client("", "")
+
+
+def get_available_symbols():
+ """获取固定的交易对列表"""
+ # 返回固定的主要交易对,不再从币安API获取
+ return [
+ {'symbol': 'BTCUSDT', 'baseAsset': 'BTC', 'quoteAsset': 'USDT', 'name': 'BTC/USDT'},
+ {'symbol': 'ETHUSDT', 'baseAsset': 'ETH', 'quoteAsset': 'USDT', 'name': 'ETH/USDT'},
+ {'symbol': 'SOLUSDT', 'baseAsset': 'SOL', 'quoteAsset': 'USDT', 'name': 'SOL/USDT'},
+ {'symbol': 'BNBUSDT', 'baseAsset': 'BNB', 'quoteAsset': 'USDT', 'name': 'BNB/USDT'}
+ ]
+
+
+
+def get_binance_klines(symbol, interval='1h', limit=1000):
+ """从币安获取K线数据,如果失败则生成模拟数据"""
+ try:
+ # 尝试获取真实的币安数据
+ klines = binance_client.get_klines(
+ symbol=symbol,
+ interval=interval,
+ limit=limit
+ )
+
+ # 转换为DataFrame
+ df = pd.DataFrame(klines, columns=[
+ 'timestamp', 'open', 'high', 'low', 'close', 'volume',
+ 'close_time', 'quote_asset_volume', 'number_of_trades',
+ 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
+ ])
+
+ # 数据类型转换,转换为东八区时间
+ df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms', utc=True)
+ df['timestamp'] = df['timestamp'].dt.tz_convert(BEIJING_TZ)
+ df['timestamps'] = df['timestamp'] # 保持兼容性
+
+ # 转换数值列
+ numeric_cols = ['open', 'high', 'low', 'close', 'volume', 'quote_asset_volume']
+ for col in numeric_cols:
+ df[col] = pd.to_numeric(df[col], errors='coerce')
+
+ # 添加amount列(成交额)
+ df['amount'] = df['quote_asset_volume']
+
+ # 只保留需要的列
+ df = df[['timestamp','timestamps', 'open', 'high', 'low', 'close', 'volume', 'amount']]
+
+ # 按时间排序
+ df = df.sort_values('timestamp').reset_index(drop=True)
+
+ # 添加技术指标(如果可用)
+ if TECHNICAL_INDICATORS_AVAILABLE:
+ try:
+ df = add_technical_indicators(df)
+ print(f"✅ 成功获取币安真实数据并计算技术指标: {symbol} {interval} {len(df)}条,{len(df.columns)}个特征")
+ except Exception as e:
+ print(f"⚠️ 技术指标计算失败,使用原始数据: {e}")
+ else:
+ print(f"✅ 成功获取币安真实数据: {symbol} {interval} {len(df)}条")
+
+ return df, None
+
+ except Exception as e:
+ print(f"⚠️ 币安API连接失败,使用模拟数据: {str(e)}")
+
+
+def get_timeframe_options():
+ """获取可用的时间周期选项"""
+ return [
+ {'value': '1m', 'label': '1分钟', 'description': '1分钟K线'},
+ {'value': '5m', 'label': '5分钟', 'description': '5分钟K线'},
+ {'value': '15m', 'label': '15分钟', 'description': '15分钟K线'},
+ {'value': '30m', 'label': '30分钟', 'description': '30分钟K线'},
+ {'value': '1h', 'label': '1小时', 'description': '1小时K线'},
+ {'value': '4h', 'label': '4小时', 'description': '4小时K线'},
+ {'value': '1d', 'label': '1天', 'description': '日K线'},
+ {'value': '1w', 'label': '1周', 'description': '周K线'},
+ ]
+
+
+def save_prediction_results(file_path, prediction_type, prediction_results, actual_data, input_data, prediction_params):
+ """Save prediction results to file"""
+ try:
+ # Create prediction results directory
+ results_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'prediction_results')
+ os.makedirs(results_dir, exist_ok=True)
+
+ # Generate filename
+ timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
+ filename = f'prediction_{timestamp}.json'
+ filepath = os.path.join(results_dir, filename)
+
+ # Prepare data for saving
+ save_data = {
+ 'timestamp': datetime.datetime.now().isoformat(),
+ 'file_path': file_path,
+ 'prediction_type': prediction_type,
+ 'prediction_params': prediction_params,
+ 'input_data_summary': {
+ 'rows': len(input_data),
+ 'columns': list(input_data.columns),
+ 'price_range': {
+ 'open': {'min': float(input_data['open'].min()), 'max': float(input_data['open'].max())},
+ 'high': {'min': float(input_data['high'].min()), 'max': float(input_data['high'].max())},
+ 'low': {'min': float(input_data['low'].min()), 'max': float(input_data['low'].max())},
+ 'close': {'min': float(input_data['close'].min()), 'max': float(input_data['close'].max())}
+ },
+ 'last_values': {
+ 'open': float(input_data['open'].iloc[-1]),
+ 'high': float(input_data['high'].iloc[-1]),
+ 'low': float(input_data['low'].iloc[-1]),
+ 'close': float(input_data['close'].iloc[-1])
+ }
+ },
+ 'prediction_results': prediction_results,
+ 'actual_data': actual_data,
+ 'analysis': {}
+ }
+
+ # If actual data exists, perform comparison analysis
+ if actual_data and len(actual_data) > 0:
+ # Calculate continuity analysis
+ if len(prediction_results) > 0 and len(actual_data) > 0:
+ last_pred = prediction_results[0] # First prediction point
+ first_actual = actual_data[0] # First actual point
+
+ save_data['analysis']['continuity'] = {
+ 'last_prediction': {
+ 'open': last_pred['open'],
+ 'high': last_pred['high'],
+ 'low': last_pred['low'],
+ 'close': last_pred['close']
+ },
+ 'first_actual': {
+ 'open': first_actual['open'],
+ 'high': first_actual['high'],
+ 'low': first_actual['low'],
+ 'close': first_actual['close']
+ },
+ 'gaps': {
+ 'open_gap': abs(last_pred['open'] - first_actual['open']),
+ 'high_gap': abs(last_pred['high'] - first_actual['high']),
+ 'low_gap': abs(last_pred['low'] - first_actual['low']),
+ 'close_gap': abs(last_pred['close'] - first_actual['close'])
+ },
+ 'gap_percentages': {
+ 'open_gap_pct': (abs(last_pred['open'] - first_actual['open']) / first_actual['open']) * 100,
+ 'high_gap_pct': (abs(last_pred['high'] - first_actual['high']) / first_actual['high']) * 100,
+ 'low_gap_pct': (abs(last_pred['low'] - first_actual['low']) / first_actual['low']) * 100,
+ 'close_gap_pct': (abs(last_pred['close'] - first_actual['close']) / first_actual['close']) * 100
+ }
+ }
+
+ # Save to file
+ with open(filepath, 'w', encoding='utf-8') as f:
+ json.dump(save_data, f, indent=2, ensure_ascii=False)
+
+ print(f"Prediction results saved to: {filepath}")
+ return filepath
+
+ except Exception as e:
+ print(f"Failed to save prediction results: {e}")
+ return None
+
+
+def create_prediction_chart(df, pred_df, lookback, pred_len, actual_df=None, historical_start_idx=0):
+ """Create prediction chart"""
+ # Use specified historical data start position, not always from the beginning of df
+ if historical_start_idx + lookback + pred_len <= len(df):
+ # Display lookback historical points + pred_len prediction points starting from specified position
+ historical_df = df.iloc[historical_start_idx:historical_start_idx + lookback]
+ prediction_range = range(historical_start_idx + lookback, historical_start_idx + lookback + pred_len)
+ else:
+ # If data is insufficient, adjust to maximum available range
+ available_lookback = min(lookback, len(df) - historical_start_idx)
+ available_pred_len = min(pred_len, max(0, len(df) - historical_start_idx - available_lookback))
+ historical_df = df.iloc[historical_start_idx:historical_start_idx + available_lookback]
+ prediction_range = range(historical_start_idx + available_lookback,
+ historical_start_idx + available_lookback + available_pred_len)
+
+ # Create chart
+ fig = go.Figure()
+
+ # Add historical data (candlestick chart)
+ fig.add_trace(go.Candlestick(
+ x=historical_df['timestamps'] if 'timestamps' in historical_df.columns else historical_df.index,
+ open=historical_df['open'],
+ high=historical_df['high'],
+ low=historical_df['low'],
+ close=historical_df['close'],
+ name='Historical Data (400 data points)',
+ increasing_line_color='#26A69A',
+ decreasing_line_color='#EF5350'
+ ))
+
+ # Add prediction data (candlestick chart)
+ if pred_df is not None and len(pred_df) > 0:
+ # Calculate prediction data timestamps - ensure continuity with historical data
+ if 'timestamps' in df.columns and len(historical_df) > 0:
+ # Start from the last timestamp of historical data, create prediction timestamps with the same time interval
+ last_timestamp = historical_df['timestamps'].iloc[-1]
+ time_diff = df['timestamps'].iloc[1] - df['timestamps'].iloc[0] if len(df) > 1 else pd.Timedelta(hours=1)
+
+ pred_timestamps = pd.date_range(
+ start=last_timestamp + time_diff,
+ periods=len(pred_df),
+ freq=time_diff
+ )
+ else:
+ # If no timestamps, use index
+ pred_timestamps = range(len(historical_df), len(historical_df) + len(pred_df))
+
+ fig.add_trace(go.Candlestick(
+ x=pred_timestamps,
+ open=pred_df['open'],
+ high=pred_df['high'],
+ low=pred_df['low'],
+ close=pred_df['close'],
+ name='Prediction Data (120 data points)',
+ increasing_line_color='#66BB6A',
+ decreasing_line_color='#FF7043'
+ ))
+
+ # Add actual data for comparison (if exists)
+ if actual_df is not None and len(actual_df) > 0:
+ # Actual data should be in the same time period as prediction data
+ if 'timestamps' in df.columns:
+ # Actual data should use the same timestamps as prediction data to ensure time alignment
+ if 'pred_timestamps' in locals():
+ actual_timestamps = pred_timestamps
+ else:
+ # If no prediction timestamps, calculate from the last timestamp of historical data
+ if len(historical_df) > 0:
+ last_timestamp = historical_df['timestamps'].iloc[-1]
+ time_diff = df['timestamps'].iloc[1] - df['timestamps'].iloc[0] if len(df) > 1 else pd.Timedelta(
+ hours=1)
+ actual_timestamps = pd.date_range(
+ start=last_timestamp + time_diff,
+ periods=len(actual_df),
+ freq=time_diff
+ )
+ else:
+ actual_timestamps = range(len(historical_df), len(historical_df) + len(actual_df))
+ else:
+ actual_timestamps = range(len(historical_df), len(historical_df) + len(actual_df))
+
+ fig.add_trace(go.Candlestick(
+ x=actual_timestamps,
+ open=actual_df['open'],
+ high=actual_df['high'],
+ low=actual_df['low'],
+ close=actual_df['close'],
+ name='Actual Data (120 data points)',
+ increasing_line_color='#FF9800',
+ decreasing_line_color='#F44336'
+ ))
+
+ # Update layout
+ fig.update_layout(
+ title='Kronos Financial Prediction Results - 400 Historical Points + 120 Prediction Points vs 120 Actual Points',
+ xaxis_title='Time',
+ yaxis_title='Price',
+ template='plotly_white',
+ height=600,
+ showlegend=True
+ )
+
+ # Ensure x-axis time continuity
+ if 'timestamps' in historical_df.columns:
+ # Get all timestamps and sort them
+ all_timestamps = []
+ if len(historical_df) > 0:
+ all_timestamps.extend(historical_df['timestamps'])
+ if 'pred_timestamps' in locals():
+ all_timestamps.extend(pred_timestamps)
+ if 'actual_timestamps' in locals():
+ all_timestamps.extend(actual_timestamps)
+
+ if all_timestamps:
+ all_timestamps = sorted(all_timestamps)
+ fig.update_xaxes(
+ range=[all_timestamps[0], all_timestamps[-1]],
+ rangeslider_visible=False,
+ type='date'
+ )
+
+ return json.dumps(fig, cls=plotly.utils.PlotlyJSONEncoder)
+
+
+@app.route('/')
+def index():
+ """Home page"""
+ return render_template('index.html')
+
+
+@app.route('/api/symbols')
+def get_symbols():
+ """获取可用的交易对列表"""
+ symbols = get_available_symbols()
+ return jsonify(symbols)
+
+
+@app.route('/api/timeframes')
+def get_timeframes():
+ """获取可用的时间周期列表"""
+ timeframes = get_timeframe_options()
+ return jsonify(timeframes)
+
+
+@app.route('/api/technical-indicators')
+def get_technical_indicators():
+ """获取可用的技术指标列表"""
+ indicators = get_available_indicators()
+ return jsonify(indicators)
+
+
+@app.route('/api/load-data', methods=['POST'])
+def load_data():
+ """加载币安数据"""
+ try:
+ data = request.get_json()
+ symbol = data.get('symbol')
+ interval = data.get('interval', '1h')
+ limit = int(data.get('limit', 1000))
+
+ if not symbol:
+ return jsonify({'error': '交易对不能为空'}), 400
+
+ df, error = get_binance_klines(symbol, interval, limit)
+ if error:
+ return jsonify({'error': error}), 400
+
+ # Detect data time frequency
+ def detect_timeframe(df):
+ if len(df) < 2:
+ return "Unknown"
+
+ time_diffs = []
+ for i in range(1, min(10, len(df))): # Check first 10 time differences
+ diff = df['timestamps'].iloc[i] - df['timestamps'].iloc[i - 1]
+ time_diffs.append(diff)
+
+ if not time_diffs:
+ return "Unknown"
+
+ # Calculate average time difference
+ avg_diff = sum(time_diffs, pd.Timedelta(0)) / len(time_diffs)
+
+ # Convert to readable format
+ if avg_diff < pd.Timedelta(minutes=1):
+ return f"{avg_diff.total_seconds():.0f} seconds"
+ elif avg_diff < pd.Timedelta(hours=1):
+ return f"{avg_diff.total_seconds() / 60:.0f} minutes"
+ elif avg_diff < pd.Timedelta(days=1):
+ return f"{avg_diff.total_seconds() / 3600:.0f} hours"
+ else:
+ return f"{avg_diff.days} days"
+
+ # Return data information with formatted time
+ def format_beijing_time(timestamp):
+ """格式化东八区时间为 yyyy-MM-dd HH:mm:ss"""
+ if pd.isna(timestamp):
+ return 'N/A'
+ # 确保时间戳有时区信息
+ if timestamp.tz is None:
+ timestamp = timestamp.tz_localize(BEIJING_TZ)
+ elif timestamp.tz != BEIJING_TZ:
+ timestamp = timestamp.tz_convert(BEIJING_TZ)
+ return timestamp.strftime('%Y-%m-%d %H:%M:%S')
+
+ data_info = {
+ 'rows': len(df),
+ 'columns': list(df.columns),
+ 'start_date': format_beijing_time(df['timestamps'].min()) if 'timestamps' in df.columns else 'N/A',
+ 'end_date': format_beijing_time(df['timestamps'].max()) if 'timestamps' in df.columns else 'N/A',
+ 'price_range': {
+ 'min': float(df[['open', 'high', 'low', 'close']].min().min()),
+ 'max': float(df[['open', 'high', 'low', 'close']].max().max())
+ },
+ 'prediction_columns': ['open', 'high', 'low', 'close'] + (['volume'] if 'volume' in df.columns else []),
+ 'timeframe': detect_timeframe(df)
+ }
+
+ return jsonify({
+ 'success': True,
+ 'data_info': data_info,
+ 'message': f'Successfully loaded data, total {len(df)} rows'
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'Failed to load data: {str(e)}'}), 500
+
+
+@app.route('/api/predict', methods=['POST'])
+def predict():
+ """Perform prediction"""
+ try:
+ data = request.get_json()
+ symbol = data.get('symbol')
+ interval = data.get('interval', '1h')
+ limit = int(data.get('limit', 1000))
+ lookback = int(data.get('lookback', 400))
+ pred_len = int(data.get('pred_len', 120))
+
+ # Get prediction quality parameters
+ temperature = float(data.get('temperature', 1.0))
+ top_p = float(data.get('top_p', 0.9))
+ sample_count = int(data.get('sample_count', 1))
+
+ if not symbol:
+ return jsonify({'error': '交易对不能为空'}), 400
+
+ # Load data from Binance
+ df, error = get_binance_klines(symbol, interval, limit)
+ if error:
+ return jsonify({'error': error}), 400
+
+ if len(df) < lookback:
+ return jsonify({'error': f'Insufficient data length, need at least {lookback} rows'}), 400
+
+ # Perform prediction
+ if MODEL_AVAILABLE:
+ try:
+ # Use real Kronos model
+ # Only use necessary columns: OHLCVA (6 features required by Kronos model)
+ required_cols = ['open', 'high', 'low', 'close']
+ if 'volume' in df.columns:
+ required_cols.append('volume')
+ if 'amount' in df.columns:
+ required_cols.append('amount')
+
+ print(f"🔍 Using features for prediction: {required_cols}")
+ print(f" Available columns in data: {list(df.columns)}")
+ print(f" Data shape: {df.shape}")
+
+ # Check if required columns exist
+ missing_cols = [col for col in required_cols if col not in df.columns]
+ if missing_cols:
+ return jsonify({'error': f'Missing required columns: {missing_cols}'}), 400
+
+ # Process time period selection
+ start_date = data.get('start_date')
+
+ if start_date:
+ # Custom time period - fix logic: use data within selected window
+ start_dt = pd.to_datetime(start_date)
+
+ # Find data after start time
+ mask = df['timestamps'] >= start_dt
+ time_range_df = df[mask]
+
+ # Ensure sufficient data: lookback + pred_len
+ if len(time_range_df) < lookback + pred_len:
+ return jsonify({
+ 'error': f'Insufficient data from start time {start_dt.strftime("%Y-%m-%d %H:%M")}, need at least {lookback + pred_len} data points, currently only {len(time_range_df)} available'}), 400
+
+ # Use first lookback data points within selected window for prediction
+ x_df = time_range_df.iloc[:lookback][required_cols]
+ x_timestamp = time_range_df.iloc[:lookback]['timestamps']
+
+ print(f"🔍 Custom time period - x_df shape: {x_df.shape}")
+ print(f" x_timestamp length: {len(x_timestamp)}")
+ print(f" x_df columns: {list(x_df.columns)}")
+ print(f" x_df sample:\n{x_df.head()}")
+
+ # Generate future timestamps for prediction instead of using existing data
+ # Calculate time difference from the data
+ if len(time_range_df) >= 2:
+ time_diff = time_range_df['timestamps'].iloc[1] - time_range_df['timestamps'].iloc[0]
+ else:
+ time_diff = pd.Timedelta(hours=1) # Default to 1 hour
+
+ # Generate future timestamps starting from the last timestamp of input data
+ last_timestamp = time_range_df['timestamps'].iloc[lookback - 1]
+ y_timestamp = pd.date_range(
+ start=last_timestamp + time_diff,
+ periods=pred_len,
+ freq=time_diff
+ )
+
+ # Calculate actual time period length
+ start_timestamp = time_range_df['timestamps'].iloc[0]
+ end_timestamp = y_timestamp[-1] # Use the last generated timestamp
+ time_span = end_timestamp - start_timestamp
+
+ prediction_type = f"Kronos model prediction (within selected window: first {lookback} data points for prediction, {pred_len} future predictions, time span: {time_span})"
+ else:
+ # Use latest data
+ x_df = df.iloc[:lookback][required_cols]
+ x_timestamp = df.iloc[:lookback]['timestamps']
+
+ # Generate future timestamps for prediction instead of using existing data
+ # Calculate time difference from the data
+ if len(df) >= 2:
+ time_diff = df['timestamps'].iloc[1] - df['timestamps'].iloc[0]
+ else:
+ time_diff = pd.Timedelta(hours=1) # Default to 1 hour
+
+ # Generate future timestamps starting from the last timestamp of input data
+ last_timestamp = df['timestamps'].iloc[lookback - 1]
+ y_timestamp = pd.date_range(
+ start=last_timestamp + time_diff,
+ periods=pred_len,
+ freq=time_diff
+ )
+ prediction_type = "Kronos model prediction (latest data)"
+
+ print(f"🔍 Latest data - x_df shape: {x_df.shape}")
+ print(f" x_timestamp length: {len(x_timestamp)}")
+ print(f" y_timestamp length: {len(y_timestamp)}")
+ print(f" x_df columns: {list(x_df.columns)}")
+ print(f" x_df sample:\n{x_df.head()}")
+
+ # Check if data is empty
+ if x_df.empty or len(x_df) == 0:
+ return jsonify({'error': 'Input data is empty after processing'}), 400
+
+ if len(x_timestamp) == 0:
+ return jsonify({'error': 'Input timestamps are empty'}), 400
+
+ if len(y_timestamp) == 0:
+ return jsonify({'error': 'Target timestamps are empty'}), 400
+
+ # Ensure timestamps are Series format, not DatetimeIndex, to avoid .dt attribute error in Kronos model
+ if isinstance(x_timestamp, pd.DatetimeIndex):
+ x_timestamp = pd.Series(x_timestamp, name='timestamps')
+ if isinstance(y_timestamp, pd.DatetimeIndex):
+ y_timestamp = pd.Series(y_timestamp, name='timestamps')
+
+ pred_df = predictor.predict(
+ df=x_df,
+ x_timestamp=x_timestamp,
+ y_timestamp=y_timestamp,
+ pred_len=pred_len,
+ T=temperature,
+ top_p=top_p,
+ sample_count=sample_count
+ )
+
+ except Exception as e:
+ return jsonify({'error': f'Kronos model prediction failed: {str(e)}'}), 500
+ else:
+ return jsonify({'error': 'Kronos model not loaded, please load model first'}), 400
+
+ # Prepare actual data for comparison (if exists)
+ actual_data = []
+ actual_df = None
+
+ if start_date: # Custom time period
+ # Fix logic: use data within selected window
+ # Prediction uses first 400 data points within selected window
+ # Actual data should be last 120 data points within selected window
+ start_dt = pd.to_datetime(start_date)
+ # 确保时区一致性
+ if start_dt.tz is None:
+ start_dt = start_dt.tz_localize(BEIJING_TZ)
+
+ # Find data starting from start_date
+ mask = df['timestamps'] >= start_dt
+ time_range_df = df[mask]
+
+ if len(time_range_df) >= lookback + pred_len:
+ # Get last 120 data points within selected window as actual values
+ actual_df = time_range_df.iloc[lookback:lookback + pred_len]
+
+ for i, (_, row) in enumerate(actual_df.iterrows()):
+ actual_data.append({
+ 'timestamp': row['timestamps'].isoformat(),
+ 'open': float(row['open']),
+ 'high': float(row['high']),
+ 'low': float(row['low']),
+ 'close': float(row['close']),
+ 'volume': float(row['volume']) if 'volume' in row else 0,
+ 'amount': float(row['amount']) if 'amount' in row else 0
+ })
+ else: # Latest data
+ # Prediction uses first 400 data points
+ # Actual data should be 120 data points after first 400 data points
+ if len(df) >= lookback + pred_len:
+ actual_df = df.iloc[lookback:lookback + pred_len]
+ for i, (_, row) in enumerate(actual_df.iterrows()):
+ actual_data.append({
+ 'timestamp': row['timestamps'].isoformat(),
+ 'open': float(row['open']),
+ 'high': float(row['high']),
+ 'low': float(row['low']),
+ 'close': float(row['close']),
+ 'volume': float(row['volume']) if 'volume' in row else 0,
+ 'amount': float(row['amount']) if 'amount' in row else 0
+ })
+
+ # Create chart - pass historical data start position
+ if start_date:
+ # Custom time period: find starting position of historical data in original df
+ start_dt = pd.to_datetime(start_date)
+ # 确保时区一致性
+ if start_dt.tz is None:
+ start_dt = start_dt.tz_localize(BEIJING_TZ)
+ mask = df['timestamps'] >= start_dt
+ historical_start_idx = df[mask].index[0] if len(df[mask]) > 0 else 0
+ else:
+ # Latest data: start from beginning
+ historical_start_idx = 0
+
+ chart_json = create_prediction_chart(df, pred_df, lookback, pred_len, actual_df, historical_start_idx)
+
+ # Prepare prediction result data - fix timestamp calculation logic
+ if 'timestamps' in df.columns:
+ if start_date:
+ # Custom time period: use selected window data to calculate timestamps
+ start_dt = pd.to_datetime(start_date)
+ # 确保时区一致性
+ if start_dt.tz is None:
+ start_dt = start_dt.tz_localize(BEIJING_TZ)
+ mask = df['timestamps'] >= start_dt
+ time_range_df = df[mask]
+
+ if len(time_range_df) >= lookback:
+ # Calculate prediction timestamps starting from last time point of selected window
+ last_timestamp = time_range_df['timestamps'].iloc[lookback - 1]
+ time_diff = df['timestamps'].iloc[1] - df['timestamps'].iloc[0]
+ future_timestamps = pd.date_range(
+ start=last_timestamp + time_diff,
+ periods=pred_len,
+ freq=time_diff
+ )
+ else:
+ future_timestamps = []
+ else:
+ # Latest data: calculate from last time point of entire data file
+ last_timestamp = df['timestamps'].iloc[-1]
+ time_diff = df['timestamps'].iloc[1] - df['timestamps'].iloc[0]
+ future_timestamps = pd.date_range(
+ start=last_timestamp + time_diff,
+ periods=pred_len,
+ freq=time_diff
+ )
+ else:
+ future_timestamps = range(len(df), len(df) + pred_len)
+
+ prediction_results = []
+ for i, (_, row) in enumerate(pred_df.iterrows()):
+ prediction_results.append({
+ 'timestamp': future_timestamps[i].isoformat() if i < len(future_timestamps) else f"T{i}",
+ 'open': float(row['open']),
+ 'high': float(row['high']),
+ 'low': float(row['low']),
+ 'close': float(row['close']),
+ 'volume': float(row['volume']) if 'volume' in row else 0,
+ 'amount': float(row['amount']) if 'amount' in row else 0
+ })
+
+ # Save prediction results to file
+ try:
+ data_source = f"{symbol}_{interval}"
+ save_prediction_results(
+ file_path=data_source,
+ prediction_type=prediction_type,
+ prediction_results=prediction_results,
+ actual_data=actual_data,
+ input_data=x_df,
+ prediction_params={
+ 'symbol': symbol,
+ 'interval': interval,
+ 'limit': limit,
+ 'lookback': lookback,
+ 'pred_len': pred_len,
+ 'temperature': temperature,
+ 'top_p': top_p,
+ 'sample_count': sample_count,
+ 'start_date': start_date if start_date else 'latest'
+ }
+ )
+ except Exception as e:
+ print(f"Failed to save prediction results: {e}")
+
+ return jsonify({
+ 'success': True,
+ 'prediction_type': prediction_type,
+ 'chart': chart_json,
+ 'prediction_results': prediction_results,
+ 'actual_data': actual_data,
+ 'has_comparison': len(actual_data) > 0,
+ 'message': f'Prediction completed, generated {pred_len} prediction points' + (
+ f', including {len(actual_data)} actual data points for comparison' if len(actual_data) > 0 else '')
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'Prediction failed: {str(e)}'}), 500
+
+
+@app.route('/api/load-model', methods=['POST'])
+def load_model():
+ """Load Kronos model"""
+ global tokenizer, model, predictor
+
+ try:
+ if not MODEL_AVAILABLE:
+ return jsonify({'error': 'Kronos model library not available'}), 400
+
+ data = request.get_json()
+ model_key = data.get('model_key', 'kronos-small')
+ device = data.get('device', 'cpu')
+
+ if model_key not in AVAILABLE_MODELS:
+ return jsonify({'error': f'Unsupported model: {model_key}'}), 400
+
+ model_config = AVAILABLE_MODELS[model_key]
+
+ # Load tokenizer and model
+ tokenizer = KronosTokenizer.from_pretrained(model_config['tokenizer_id'])
+ model = Kronos.from_pretrained(model_config['model_id'])
+
+ # Create predictor
+ predictor = KronosPredictor(model, tokenizer, device=device, max_context=model_config['context_length'])
+
+ return jsonify({
+ 'success': True,
+ 'message': f'Model loaded successfully: {model_config["name"]} ({model_config["params"]}) on {device}',
+ 'model_info': {
+ 'name': model_config['name'],
+ 'params': model_config['params'],
+ 'context_length': model_config['context_length'],
+ 'description': model_config['description']
+ }
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'Model loading failed: {str(e)}'}), 500
+
+
+@app.route('/api/available-models')
+def get_available_models():
+ """Get available model list"""
+ return jsonify({
+ 'models': AVAILABLE_MODELS,
+ 'model_available': MODEL_AVAILABLE
+ })
+
+
+@app.route('/api/model-status')
+def get_model_status():
+ """Get model status"""
+ if MODEL_AVAILABLE:
+ if predictor is not None:
+ return jsonify({
+ 'available': True,
+ 'loaded': True,
+ 'message': 'Kronos model loaded and available',
+ 'current_model': {
+ 'name': predictor.model.__class__.__name__,
+ 'device': str(next(predictor.model.parameters()).device)
+ }
+ })
+ else:
+ return jsonify({
+ 'available': True,
+ 'loaded': False,
+ 'message': 'Kronos model available but not loaded'
+ })
+ else:
+ return jsonify({
+ 'available': False,
+ 'loaded': False,
+ 'message': 'Kronos model library not available, please install related dependencies'
+ })
+
+
+if __name__ == '__main__':
+ print("Starting Kronos Web UI...")
+ print(f"Model availability: {MODEL_AVAILABLE}")
+ if MODEL_AVAILABLE:
+ print("Tip: You can load Kronos model through /api/load-model endpoint")
+ else:
+ print("Tip: Will use simulated data for demonstration")
+
+ app.run(debug=True, host='0.0.0.0', port=7070)
diff --git a/webui/docker_start.sh b/webui/docker_start.sh
new file mode 100644
index 0000000000000000000000000000000000000000..49fd978daf2dead4cbb01b1c6c59d852a571c4e1
--- /dev/null
+++ b/webui/docker_start.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+# Kronos Web UI Docker startup script
+
+echo "🚀 Starting Kronos Web UI in Docker..."
+echo "======================================"
+
+# Check if we're in the correct directory
+if [ ! -f "app.py" ]; then
+ echo "❌ app.py not found, please check the working directory"
+ exit 1
+fi
+
+# Set environment variables
+export PYTHONPATH=/app
+export FLASK_APP=webui/app.py
+export FLASK_ENV=production
+
+# Create necessary directories
+mkdir -p prediction_results
+mkdir -p model/data
+
+# Check if model is available
+python3 -c "
+try:
+ from model import Kronos, KronosTokenizer, KronosPredictor
+ print('✅ Kronos model library available')
+except ImportError as e:
+ print(f'⚠️ Kronos model library not available: {e}')
+ print(' Will use simulated data for demonstration')
+"
+
+# Start the Flask application
+echo "🌐 Starting Flask server on port 7860..."
+echo "Access URL: http://localhost:7860"
+echo "Press Ctrl+C to stop server"
+echo ""
+
+# Use gunicorn for production if available, otherwise use Flask dev server
+if command -v gunicorn &> /dev/null; then
+ echo "Using Gunicorn for production..."
+ exec gunicorn --bind 0.0.0.0:7860 --workers 2 --timeout 120 --access-logfile - --error-logfile - app:app
+else
+ echo "Using Flask development server..."
+ exec python3 app.py
+fi
diff --git a/webui/prediction_results/prediction_20250828_184347.json b/webui/prediction_results/prediction_20250828_184347.json
new file mode 100644
index 0000000000000000000000000000000000000000..1fa26936ada8c6c9ccc45e8431bc71215af3bf79
--- /dev/null
+++ b/webui/prediction_results/prediction_20250828_184347.json
@@ -0,0 +1,2243 @@
+{
+ "timestamp": "2025-08-28T18:43:47.791765",
+ "file_path": "ETHUSDT_1h",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "ETHUSDT",
+ "interval": "1h",
+ "limit": 1000,
+ "lookback": 400,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 1,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 400,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 3383.2,
+ "max": 3929.79
+ },
+ "high": {
+ "min": 3412.59,
+ "max": 3941.0
+ },
+ "low": {
+ "min": 3354.28,
+ "max": 3909.72
+ },
+ "close": {
+ "min": 3383.2,
+ "max": 3929.8
+ }
+ },
+ "last_values": {
+ "open": 3466.26,
+ "high": 3488.0,
+ "low": 3465.21,
+ "close": 3484.94
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-28T19:00:00+08:00",
+ "open": 3468.14892578125,
+ "high": 3476.130126953125,
+ "low": 3447.22314453125,
+ "close": 3457.6015625,
+ "volume": 11822.2060546875,
+ "amount": 41490972.0
+ },
+ {
+ "timestamp": "2025-08-28T20:00:00+08:00",
+ "open": 3461.814208984375,
+ "high": 3499.876953125,
+ "low": 3450.8935546875,
+ "close": 3488.62548828125,
+ "volume": 14990.9091796875,
+ "amount": 51411228.0
+ },
+ {
+ "timestamp": "2025-08-28T21:00:00+08:00",
+ "open": 3483.72119140625,
+ "high": 3499.249267578125,
+ "low": 3466.6474609375,
+ "close": 3483.294677734375,
+ "volume": 13611.0146484375,
+ "amount": 47573660.0
+ },
+ {
+ "timestamp": "2025-08-28T22:00:00+08:00",
+ "open": 3503.0693359375,
+ "high": 3514.906005859375,
+ "low": 3452.087890625,
+ "close": 3461.633544921875,
+ "volume": 23598.255859375,
+ "amount": 80013608.0
+ },
+ {
+ "timestamp": "2025-08-28T23:00:00+08:00",
+ "open": 3472.73681640625,
+ "high": 3483.671875,
+ "low": 3452.955322265625,
+ "close": 3466.7421875,
+ "volume": 13364.9931640625,
+ "amount": 45953844.0
+ },
+ {
+ "timestamp": "2025-08-29T00:00:00+08:00",
+ "open": 3471.701171875,
+ "high": 3507.112548828125,
+ "low": 3455.1953125,
+ "close": 3490.139404296875,
+ "volume": 29673.27734375,
+ "amount": 98473200.0
+ },
+ {
+ "timestamp": "2025-08-29T01:00:00+08:00",
+ "open": 3510.8427734375,
+ "high": 3544.874267578125,
+ "low": 3489.832763671875,
+ "close": 3517.6767578125,
+ "volume": 29258.44140625,
+ "amount": 99728368.0
+ },
+ {
+ "timestamp": "2025-08-29T02:00:00+08:00",
+ "open": 3514.7841796875,
+ "high": 3528.6025390625,
+ "low": 3489.89697265625,
+ "close": 3508.23583984375,
+ "volume": 22397.392578125,
+ "amount": 76663296.0
+ },
+ {
+ "timestamp": "2025-08-29T03:00:00+08:00",
+ "open": 3513.5546875,
+ "high": 3519.365234375,
+ "low": 3463.162841796875,
+ "close": 3474.033203125,
+ "volume": 28335.953125,
+ "amount": 95009912.0
+ },
+ {
+ "timestamp": "2025-08-29T04:00:00+08:00",
+ "open": 3475.752197265625,
+ "high": 3498.843017578125,
+ "low": 3455.8115234375,
+ "close": 3478.194091796875,
+ "volume": 23878.3984375,
+ "amount": 79594720.0
+ },
+ {
+ "timestamp": "2025-08-29T05:00:00+08:00",
+ "open": 3467.24853515625,
+ "high": 3482.260498046875,
+ "low": 3427.906982421875,
+ "close": 3448.40478515625,
+ "volume": 29498.138671875,
+ "amount": 96328576.0
+ },
+ {
+ "timestamp": "2025-08-29T06:00:00+08:00",
+ "open": 3439.564208984375,
+ "high": 3473.7197265625,
+ "low": 3407.775146484375,
+ "close": 3447.84375,
+ "volume": 38097.359375,
+ "amount": 123009160.0
+ },
+ {
+ "timestamp": "2025-08-29T07:00:00+08:00",
+ "open": 3433.309326171875,
+ "high": 3447.677001953125,
+ "low": 3393.175048828125,
+ "close": 3410.229248046875,
+ "volume": 26765.513671875,
+ "amount": 85481504.0
+ },
+ {
+ "timestamp": "2025-08-29T08:00:00+08:00",
+ "open": 3416.614990234375,
+ "high": 3460.13720703125,
+ "low": 3399.771484375,
+ "close": 3439.709228515625,
+ "volume": 26403.80859375,
+ "amount": 84065496.0
+ },
+ {
+ "timestamp": "2025-08-29T09:00:00+08:00",
+ "open": 3451.199951171875,
+ "high": 3469.704833984375,
+ "low": 3417.040771484375,
+ "close": 3436.0166015625,
+ "volume": 31116.67578125,
+ "amount": 101487776.0
+ },
+ {
+ "timestamp": "2025-08-29T10:00:00+08:00",
+ "open": 3432.70458984375,
+ "high": 3472.6015625,
+ "low": 3415.297607421875,
+ "close": 3454.004638671875,
+ "volume": 25828.935546875,
+ "amount": 84078160.0
+ },
+ {
+ "timestamp": "2025-08-29T11:00:00+08:00",
+ "open": 3440.9443359375,
+ "high": 3465.64013671875,
+ "low": 3416.551025390625,
+ "close": 3442.333984375,
+ "volume": 33883.79296875,
+ "amount": 108258472.0
+ },
+ {
+ "timestamp": "2025-08-29T12:00:00+08:00",
+ "open": 3439.764404296875,
+ "high": 3449.08349609375,
+ "low": 3417.070556640625,
+ "close": 3428.1455078125,
+ "volume": 13853.611328125,
+ "amount": 46947156.0
+ },
+ {
+ "timestamp": "2025-08-29T13:00:00+08:00",
+ "open": 3449.460693359375,
+ "high": 3472.006591796875,
+ "low": 3415.291015625,
+ "close": 3436.240966796875,
+ "volume": 31302.556640625,
+ "amount": 98996696.0
+ },
+ {
+ "timestamp": "2025-08-29T14:00:00+08:00",
+ "open": 3431.794677734375,
+ "high": 3449.3583984375,
+ "low": 3410.71484375,
+ "close": 3425.410888671875,
+ "volume": 21295.623046875,
+ "amount": 69638944.0
+ },
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 3405.3408203125,
+ "high": 3429.2470703125,
+ "low": 3361.233642578125,
+ "close": 3385.927734375,
+ "volume": 34861.234375,
+ "amount": 109210472.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 3381.72900390625,
+ "high": 3446.140625,
+ "low": 3362.82666015625,
+ "close": 3425.9697265625,
+ "volume": 33529.0546875,
+ "amount": 106655240.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 3425.0419921875,
+ "high": 3453.053466796875,
+ "low": 3406.19677734375,
+ "close": 3431.833251953125,
+ "volume": 27149.974609375,
+ "amount": 87418696.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 3442.406982421875,
+ "high": 3482.64990234375,
+ "low": 3425.232666015625,
+ "close": 3463.140625,
+ "volume": 33164.15234375,
+ "amount": 110002776.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 3465.9921875,
+ "high": 3506.56591796875,
+ "low": 3448.1884765625,
+ "close": 3489.350341796875,
+ "volume": 31491.951171875,
+ "amount": 105813880.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 3483.676025390625,
+ "high": 3503.85205078125,
+ "low": 3467.48291015625,
+ "close": 3488.96875,
+ "volume": 16379.38671875,
+ "amount": 56624872.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 3488.94091796875,
+ "high": 3510.781005859375,
+ "low": 3463.559814453125,
+ "close": 3489.7548828125,
+ "volume": 26487.48828125,
+ "amount": 89625680.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 3481.56591796875,
+ "high": 3492.911376953125,
+ "low": 3458.482177734375,
+ "close": 3470.540283203125,
+ "volume": 17526.03125,
+ "amount": 60344644.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 3469.722900390625,
+ "high": 3486.805419921875,
+ "low": 3455.75244140625,
+ "close": 3471.106689453125,
+ "volume": 14491.2421875,
+ "amount": 50355272.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 3468.894775390625,
+ "high": 3487.218017578125,
+ "low": 3446.548583984375,
+ "close": 3466.410888671875,
+ "volume": 21765.0390625,
+ "amount": 73304280.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 3466.30908203125,
+ "high": 3485.128173828125,
+ "low": 3444.802734375,
+ "close": 3464.304443359375,
+ "volume": 23290.185546875,
+ "amount": 77930928.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 3475.242431640625,
+ "high": 3492.35400390625,
+ "low": 3437.67626953125,
+ "close": 3455.584228515625,
+ "volume": 32366.541015625,
+ "amount": 104928336.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 3439.1904296875,
+ "high": 3458.9365234375,
+ "low": 3411.313232421875,
+ "close": 3432.90478515625,
+ "volume": 23476.369140625,
+ "amount": 78507928.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 3430.857177734375,
+ "high": 3473.16015625,
+ "low": 3412.4482421875,
+ "close": 3455.3232421875,
+ "volume": 24322.662109375,
+ "amount": 79716152.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 3460.14306640625,
+ "high": 3505.022705078125,
+ "low": 3445.50048828125,
+ "close": 3487.989501953125,
+ "volume": 25433.70703125,
+ "amount": 85826544.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 3481.59619140625,
+ "high": 3498.063720703125,
+ "low": 3460.976806640625,
+ "close": 3478.622314453125,
+ "volume": 19458.09765625,
+ "amount": 66888076.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 3472.95947265625,
+ "high": 3497.14892578125,
+ "low": 3441.0693359375,
+ "close": 3475.32275390625,
+ "volume": 22292.001953125,
+ "amount": 71040912.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 3482.1015625,
+ "high": 3509.3486328125,
+ "low": 3465.51025390625,
+ "close": 3494.0234375,
+ "volume": 21343.0625,
+ "amount": 71492904.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 3493.76025390625,
+ "high": 3509.20556640625,
+ "low": 3470.673828125,
+ "close": 3493.825927734375,
+ "volume": 18176.375,
+ "amount": 61656444.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 3497.45166015625,
+ "high": 3511.575927734375,
+ "low": 3476.6875,
+ "close": 3493.53662109375,
+ "volume": 15902.19140625,
+ "amount": 55375516.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 3495.31982421875,
+ "high": 3522.240478515625,
+ "low": 3477.999755859375,
+ "close": 3513.140380859375,
+ "volume": 15443.646484375,
+ "amount": 54717752.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 3513.2119140625,
+ "high": 3533.237060546875,
+ "low": 3485.8349609375,
+ "close": 3515.5625,
+ "volume": 16526.314453125,
+ "amount": 57483684.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 3513.151123046875,
+ "high": 3533.728515625,
+ "low": 3488.749755859375,
+ "close": 3511.3828125,
+ "volume": 29275.87890625,
+ "amount": 99888296.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 3506.642578125,
+ "high": 3531.968505859375,
+ "low": 3486.180908203125,
+ "close": 3517.985595703125,
+ "volume": 23027.29296875,
+ "amount": 78585664.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 3531.1796875,
+ "high": 3539.64892578125,
+ "low": 3492.451416015625,
+ "close": 3501.460205078125,
+ "volume": 20179.0859375,
+ "amount": 70712592.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 3505.10400390625,
+ "high": 3523.694580078125,
+ "low": 3487.6943359375,
+ "close": 3506.3369140625,
+ "volume": 18263.3359375,
+ "amount": 63227472.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 3507.10693359375,
+ "high": 3524.10888671875,
+ "low": 3481.83154296875,
+ "close": 3502.443115234375,
+ "volume": 28682.345703125,
+ "amount": 99056448.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 3500.263671875,
+ "high": 3512.617431640625,
+ "low": 3480.970458984375,
+ "close": 3494.75537109375,
+ "volume": 13585.0888671875,
+ "amount": 47761664.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 3494.47412109375,
+ "high": 3523.316650390625,
+ "low": 3482.838623046875,
+ "close": 3511.900634765625,
+ "volume": 16062.4951171875,
+ "amount": 56453180.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 3508.79150390625,
+ "high": 3521.7294921875,
+ "low": 3489.431396484375,
+ "close": 3505.088623046875,
+ "volume": 15340.181640625,
+ "amount": 54304496.0
+ },
+ {
+ "timestamp": "2025-08-30T21:00:00+08:00",
+ "open": 3514.0986328125,
+ "high": 3548.181884765625,
+ "low": 3497.149169921875,
+ "close": 3537.88623046875,
+ "volume": 19336.25,
+ "amount": 68097016.0
+ },
+ {
+ "timestamp": "2025-08-30T22:00:00+08:00",
+ "open": 3536.456298828125,
+ "high": 3581.998291015625,
+ "low": 3505.706787109375,
+ "close": 3551.600830078125,
+ "volume": 37870.69921875,
+ "amount": 130169344.0
+ },
+ {
+ "timestamp": "2025-08-30T23:00:00+08:00",
+ "open": 3554.302001953125,
+ "high": 3572.1083984375,
+ "low": 3537.70068359375,
+ "close": 3556.613525390625,
+ "volume": 16178.5693359375,
+ "amount": 57691016.0
+ },
+ {
+ "timestamp": "2025-08-31T00:00:00+08:00",
+ "open": 3544.907470703125,
+ "high": 3555.91650390625,
+ "low": 3509.399658203125,
+ "close": 3527.784912109375,
+ "volume": 25012.73046875,
+ "amount": 86259992.0
+ },
+ {
+ "timestamp": "2025-08-31T01:00:00+08:00",
+ "open": 3530.232177734375,
+ "high": 3566.323486328125,
+ "low": 3511.997314453125,
+ "close": 3550.9853515625,
+ "volume": 34384.98828125,
+ "amount": 118960032.0
+ },
+ {
+ "timestamp": "2025-08-31T02:00:00+08:00",
+ "open": 3546.08544921875,
+ "high": 3567.689697265625,
+ "low": 3520.6572265625,
+ "close": 3553.1845703125,
+ "volume": 17046.0703125,
+ "amount": 61672976.0
+ },
+ {
+ "timestamp": "2025-08-31T03:00:00+08:00",
+ "open": 3555.565673828125,
+ "high": 3553.3115234375,
+ "low": 3496.5009765625,
+ "close": 3504.778076171875,
+ "volume": 25209.626953125,
+ "amount": 90606552.0
+ },
+ {
+ "timestamp": "2025-08-31T04:00:00+08:00",
+ "open": 3514.896728515625,
+ "high": 3538.239990234375,
+ "low": 3497.66064453125,
+ "close": 3519.965576171875,
+ "volume": 19448.58984375,
+ "amount": 67944240.0
+ },
+ {
+ "timestamp": "2025-08-31T05:00:00+08:00",
+ "open": 3516.385986328125,
+ "high": 3549.198974609375,
+ "low": 3496.19873046875,
+ "close": 3531.891357421875,
+ "volume": 39729.296875,
+ "amount": 137073632.0
+ },
+ {
+ "timestamp": "2025-08-31T06:00:00+08:00",
+ "open": 3524.895263671875,
+ "high": 3558.8916015625,
+ "low": 3500.920654296875,
+ "close": 3542.42578125,
+ "volume": 21010.33984375,
+ "amount": 73549496.0
+ },
+ {
+ "timestamp": "2025-08-31T07:00:00+08:00",
+ "open": 3540.580078125,
+ "high": 3562.463623046875,
+ "low": 3520.479736328125,
+ "close": 3544.3935546875,
+ "volume": 25887.041015625,
+ "amount": 89431272.0
+ },
+ {
+ "timestamp": "2025-08-31T08:00:00+08:00",
+ "open": 3543.780517578125,
+ "high": 3578.470947265625,
+ "low": 3531.41943359375,
+ "close": 3566.87548828125,
+ "volume": 39538.43359375,
+ "amount": 137115232.0
+ },
+ {
+ "timestamp": "2025-08-31T09:00:00+08:00",
+ "open": 3574.94482421875,
+ "high": 3591.615234375,
+ "low": 3552.0703125,
+ "close": 3571.47021484375,
+ "volume": 23257.1328125,
+ "amount": 82802704.0
+ },
+ {
+ "timestamp": "2025-08-31T10:00:00+08:00",
+ "open": 3570.832763671875,
+ "high": 3582.4814453125,
+ "low": 3544.106201171875,
+ "close": 3561.2314453125,
+ "volume": 27277.099609375,
+ "amount": 95787896.0
+ },
+ {
+ "timestamp": "2025-08-31T11:00:00+08:00",
+ "open": 3561.4560546875,
+ "high": 3581.984130859375,
+ "low": 3543.4755859375,
+ "close": 3568.34716796875,
+ "volume": 28733.494140625,
+ "amount": 101161608.0
+ },
+ {
+ "timestamp": "2025-08-31T12:00:00+08:00",
+ "open": 3573.066650390625,
+ "high": 3595.313232421875,
+ "low": 3560.29345703125,
+ "close": 3581.3408203125,
+ "volume": 19071.9765625,
+ "amount": 67863536.0
+ },
+ {
+ "timestamp": "2025-08-31T13:00:00+08:00",
+ "open": 3583.27001953125,
+ "high": 3605.70068359375,
+ "low": 3566.567626953125,
+ "close": 3588.767578125,
+ "volume": 29999.08984375,
+ "amount": 106010232.0
+ },
+ {
+ "timestamp": "2025-08-31T14:00:00+08:00",
+ "open": 3609.24462890625,
+ "high": 3642.2978515625,
+ "low": 3576.64013671875,
+ "close": 3603.13916015625,
+ "volume": 26337.767578125,
+ "amount": 94407848.0
+ },
+ {
+ "timestamp": "2025-08-31T15:00:00+08:00",
+ "open": 3610.994873046875,
+ "high": 3631.838623046875,
+ "low": 3588.931640625,
+ "close": 3611.744384765625,
+ "volume": 28535.8984375,
+ "amount": 101900192.0
+ },
+ {
+ "timestamp": "2025-08-31T16:00:00+08:00",
+ "open": 3601.09033203125,
+ "high": 3619.553955078125,
+ "low": 3572.877685546875,
+ "close": 3597.489990234375,
+ "volume": 35363.2109375,
+ "amount": 125741016.0
+ },
+ {
+ "timestamp": "2025-08-31T17:00:00+08:00",
+ "open": 3603.489013671875,
+ "high": 3626.448486328125,
+ "low": 3571.823486328125,
+ "close": 3592.206298828125,
+ "volume": 34616.64453125,
+ "amount": 123871432.0
+ },
+ {
+ "timestamp": "2025-08-31T18:00:00+08:00",
+ "open": 3591.42822265625,
+ "high": 3614.21142578125,
+ "low": 3574.286376953125,
+ "close": 3598.65673828125,
+ "volume": 43010.1015625,
+ "amount": 152287072.0
+ },
+ {
+ "timestamp": "2025-08-31T19:00:00+08:00",
+ "open": 3609.3896484375,
+ "high": 3631.5693359375,
+ "low": 3567.523681640625,
+ "close": 3586.775634765625,
+ "volume": 46034.44921875,
+ "amount": 164477792.0
+ },
+ {
+ "timestamp": "2025-08-31T20:00:00+08:00",
+ "open": 3601.6044921875,
+ "high": 3631.02685546875,
+ "low": 3585.49755859375,
+ "close": 3618.29931640625,
+ "volume": 34731.8828125,
+ "amount": 124306624.0
+ },
+ {
+ "timestamp": "2025-08-31T21:00:00+08:00",
+ "open": 3627.4541015625,
+ "high": 3645.651123046875,
+ "low": 3588.77197265625,
+ "close": 3604.88427734375,
+ "volume": 33821.76953125,
+ "amount": 121511600.0
+ },
+ {
+ "timestamp": "2025-08-31T22:00:00+08:00",
+ "open": 3609.21630859375,
+ "high": 3624.7626953125,
+ "low": 3589.6396484375,
+ "close": 3608.43701171875,
+ "volume": 19986.55078125,
+ "amount": 71930064.0
+ },
+ {
+ "timestamp": "2025-08-31T23:00:00+08:00",
+ "open": 3605.911376953125,
+ "high": 3622.1708984375,
+ "low": 3583.413818359375,
+ "close": 3605.765380859375,
+ "volume": 36891.55078125,
+ "amount": 131533088.0
+ },
+ {
+ "timestamp": "2025-09-01T00:00:00+08:00",
+ "open": 3603.644775390625,
+ "high": 3618.170166015625,
+ "low": 3588.930908203125,
+ "close": 3606.161376953125,
+ "volume": 13745.3837890625,
+ "amount": 50117124.0
+ },
+ {
+ "timestamp": "2025-09-01T01:00:00+08:00",
+ "open": 3618.791015625,
+ "high": 3615.46728515625,
+ "low": 3586.7783203125,
+ "close": 3594.759521484375,
+ "volume": 22564.8671875,
+ "amount": 81858480.0
+ },
+ {
+ "timestamp": "2025-09-01T02:00:00+08:00",
+ "open": 3609.00244140625,
+ "high": 3645.954345703125,
+ "low": 3594.9208984375,
+ "close": 3632.624755859375,
+ "volume": 40672.64453125,
+ "amount": 145219552.0
+ },
+ {
+ "timestamp": "2025-09-01T03:00:00+08:00",
+ "open": 3634.521240234375,
+ "high": 3658.514892578125,
+ "low": 3616.27490234375,
+ "close": 3639.481689453125,
+ "volume": 30849.6875,
+ "amount": 112328224.0
+ },
+ {
+ "timestamp": "2025-09-01T04:00:00+08:00",
+ "open": 3637.838134765625,
+ "high": 3653.825439453125,
+ "low": 3615.41064453125,
+ "close": 3632.104248046875,
+ "volume": 27218.19921875,
+ "amount": 98525912.0
+ },
+ {
+ "timestamp": "2025-09-01T05:00:00+08:00",
+ "open": 3633.328369140625,
+ "high": 3647.701416015625,
+ "low": 3618.96826171875,
+ "close": 3636.32568359375,
+ "volume": 12220.6640625,
+ "amount": 44403348.0
+ },
+ {
+ "timestamp": "2025-09-01T06:00:00+08:00",
+ "open": 3655.7119140625,
+ "high": 3677.554443359375,
+ "low": 3599.05517578125,
+ "close": 3620.9833984375,
+ "volume": 29162.8828125,
+ "amount": 110434336.0
+ },
+ {
+ "timestamp": "2025-09-01T07:00:00+08:00",
+ "open": 3635.944580078125,
+ "high": 3657.149169921875,
+ "low": 3617.201904296875,
+ "close": 3638.95751953125,
+ "volume": 27112.767578125,
+ "amount": 98672976.0
+ },
+ {
+ "timestamp": "2025-09-01T08:00:00+08:00",
+ "open": 3706.15478515625,
+ "high": 3768.969482421875,
+ "low": 3599.4306640625,
+ "close": 3641.33056640625,
+ "volume": 26431.27734375,
+ "amount": 98242376.0
+ },
+ {
+ "timestamp": "2025-09-01T09:00:00+08:00",
+ "open": 3650.827880859375,
+ "high": 3666.99609375,
+ "low": 3626.406494140625,
+ "close": 3645.767333984375,
+ "volume": 21349.005859375,
+ "amount": 77676432.0
+ },
+ {
+ "timestamp": "2025-09-01T10:00:00+08:00",
+ "open": 3647.571044921875,
+ "high": 3666.177001953125,
+ "low": 3625.84130859375,
+ "close": 3646.537841796875,
+ "volume": 31924.48046875,
+ "amount": 115758112.0
+ },
+ {
+ "timestamp": "2025-09-01T11:00:00+08:00",
+ "open": 3647.4833984375,
+ "high": 3668.267822265625,
+ "low": 3628.75537109375,
+ "close": 3652.542236328125,
+ "volume": 35726.5546875,
+ "amount": 129920816.0
+ },
+ {
+ "timestamp": "2025-09-01T12:00:00+08:00",
+ "open": 3700.94970703125,
+ "high": 3712.095947265625,
+ "low": 3630.115478515625,
+ "close": 3645.3837890625,
+ "volume": 33909.453125,
+ "amount": 129076672.0
+ },
+ {
+ "timestamp": "2025-09-01T13:00:00+08:00",
+ "open": 3659.6240234375,
+ "high": 3683.8955078125,
+ "low": 3642.53369140625,
+ "close": 3673.70263671875,
+ "volume": 22655.662109375,
+ "amount": 84269184.0
+ },
+ {
+ "timestamp": "2025-09-01T14:00:00+08:00",
+ "open": 3671.739013671875,
+ "high": 3689.649169921875,
+ "low": 3654.13671875,
+ "close": 3676.41064453125,
+ "volume": 19736.21875,
+ "amount": 73153760.0
+ },
+ {
+ "timestamp": "2025-09-01T15:00:00+08:00",
+ "open": 3668.830322265625,
+ "high": 3677.822021484375,
+ "low": 3632.979248046875,
+ "close": 3645.85400390625,
+ "volume": 32829.375,
+ "amount": 120742400.0
+ },
+ {
+ "timestamp": "2025-09-01T16:00:00+08:00",
+ "open": 3644.898193359375,
+ "high": 3661.139404296875,
+ "low": 3623.921630859375,
+ "close": 3642.707763671875,
+ "volume": 22472.23046875,
+ "amount": 82116160.0
+ },
+ {
+ "timestamp": "2025-09-01T17:00:00+08:00",
+ "open": 3642.300048828125,
+ "high": 3663.891357421875,
+ "low": 3627.124755859375,
+ "close": 3651.3369140625,
+ "volume": 25698.533203125,
+ "amount": 93891680.0
+ },
+ {
+ "timestamp": "2025-09-01T18:00:00+08:00",
+ "open": 3647.7666015625,
+ "high": 3659.95458984375,
+ "low": 3623.6650390625,
+ "close": 3645.59423828125,
+ "volume": 29862.859375,
+ "amount": 109192208.0
+ },
+ {
+ "timestamp": "2025-09-01T19:00:00+08:00",
+ "open": 3639.471435546875,
+ "high": 3652.29248046875,
+ "low": 3620.84765625,
+ "close": 3643.015380859375,
+ "volume": 38507.26171875,
+ "amount": 139202304.0
+ },
+ {
+ "timestamp": "2025-09-01T20:00:00+08:00",
+ "open": 3650.572021484375,
+ "high": 3645.328857421875,
+ "low": 3617.303466796875,
+ "close": 3620.720947265625,
+ "volume": 24788.48046875,
+ "amount": 91357856.0
+ },
+ {
+ "timestamp": "2025-09-01T21:00:00+08:00",
+ "open": 3623.6982421875,
+ "high": 3630.431396484375,
+ "low": 3596.617431640625,
+ "close": 3608.395751953125,
+ "volume": 19434.51953125,
+ "amount": 70918184.0
+ },
+ {
+ "timestamp": "2025-09-01T22:00:00+08:00",
+ "open": 3612.80810546875,
+ "high": 3631.20166015625,
+ "low": 3597.616943359375,
+ "close": 3618.6123046875,
+ "volume": 18826.673828125,
+ "amount": 67608392.0
+ },
+ {
+ "timestamp": "2025-09-01T23:00:00+08:00",
+ "open": 3621.827392578125,
+ "high": 3639.676025390625,
+ "low": 3606.2109375,
+ "close": 3626.62890625,
+ "volume": 20204.71484375,
+ "amount": 72770960.0
+ },
+ {
+ "timestamp": "2025-09-02T00:00:00+08:00",
+ "open": 3628.596435546875,
+ "high": 3641.76708984375,
+ "low": 3600.493896484375,
+ "close": 3614.9853515625,
+ "volume": 33523.3984375,
+ "amount": 121069280.0
+ },
+ {
+ "timestamp": "2025-09-02T01:00:00+08:00",
+ "open": 3625.431884765625,
+ "high": 3668.158447265625,
+ "low": 3613.774169921875,
+ "close": 3663.7353515625,
+ "volume": 26953.91015625,
+ "amount": 97312840.0
+ },
+ {
+ "timestamp": "2025-09-02T02:00:00+08:00",
+ "open": 3659.55322265625,
+ "high": 3670.4306640625,
+ "low": 3627.720703125,
+ "close": 3647.45947265625,
+ "volume": 26681.921875,
+ "amount": 96963112.0
+ },
+ {
+ "timestamp": "2025-09-02T03:00:00+08:00",
+ "open": 3643.05078125,
+ "high": 3651.91552734375,
+ "low": 3611.958251953125,
+ "close": 3625.541259765625,
+ "volume": 18680.94140625,
+ "amount": 68299552.0
+ },
+ {
+ "timestamp": "2025-09-02T04:00:00+08:00",
+ "open": 3627.533203125,
+ "high": 3650.206787109375,
+ "low": 3608.2587890625,
+ "close": 3632.515869140625,
+ "volume": 20985.216796875,
+ "amount": 76285968.0
+ },
+ {
+ "timestamp": "2025-09-02T05:00:00+08:00",
+ "open": 3642.9619140625,
+ "high": 3673.5244140625,
+ "low": 3614.7392578125,
+ "close": 3638.457763671875,
+ "volume": 29110.40625,
+ "amount": 106286984.0
+ },
+ {
+ "timestamp": "2025-09-02T06:00:00+08:00",
+ "open": 3649.281982421875,
+ "high": 3673.47119140625,
+ "low": 3625.91162109375,
+ "close": 3647.77001953125,
+ "volume": 32140.509765625,
+ "amount": 117109824.0
+ },
+ {
+ "timestamp": "2025-09-02T07:00:00+08:00",
+ "open": 3648.700439453125,
+ "high": 3664.75537109375,
+ "low": 3629.885498046875,
+ "close": 3647.60693359375,
+ "volume": 20344.96875,
+ "amount": 74699992.0
+ },
+ {
+ "timestamp": "2025-09-02T08:00:00+08:00",
+ "open": 3647.435302734375,
+ "high": 3659.057373046875,
+ "low": 3626.186279296875,
+ "close": 3641.026611328125,
+ "volume": 16247.140625,
+ "amount": 59863400.0
+ },
+ {
+ "timestamp": "2025-09-02T09:00:00+08:00",
+ "open": 3642.234130859375,
+ "high": 3661.250244140625,
+ "low": 3628.173583984375,
+ "close": 3651.25,
+ "volume": 20856.9453125,
+ "amount": 75970800.0
+ },
+ {
+ "timestamp": "2025-09-02T10:00:00+08:00",
+ "open": 3664.116455078125,
+ "high": 3740.093017578125,
+ "low": 3563.56982421875,
+ "close": 3627.733154296875,
+ "volume": 28155.84765625,
+ "amount": 103703080.0
+ },
+ {
+ "timestamp": "2025-09-02T11:00:00+08:00",
+ "open": 3653.74658203125,
+ "high": 3681.43896484375,
+ "low": 3622.62451171875,
+ "close": 3642.622314453125,
+ "volume": 26403.95703125,
+ "amount": 95644768.0
+ },
+ {
+ "timestamp": "2025-09-02T12:00:00+08:00",
+ "open": 3651.860107421875,
+ "high": 3674.969970703125,
+ "low": 3634.89599609375,
+ "close": 3660.502197265625,
+ "volume": 20447.05078125,
+ "amount": 75581792.0
+ },
+ {
+ "timestamp": "2025-09-02T13:00:00+08:00",
+ "open": 3657.2568359375,
+ "high": 3671.539306640625,
+ "low": 3642.1376953125,
+ "close": 3658.734619140625,
+ "volume": 14799.5439453125,
+ "amount": 54890104.0
+ },
+ {
+ "timestamp": "2025-09-02T14:00:00+08:00",
+ "open": 3659.761474609375,
+ "high": 3672.185791015625,
+ "low": 3643.5595703125,
+ "close": 3659.8720703125,
+ "volume": 13889.8310546875,
+ "amount": 51610440.0
+ },
+ {
+ "timestamp": "2025-09-02T15:00:00+08:00",
+ "open": 3647.686279296875,
+ "high": 3666.09814453125,
+ "low": 3629.409423828125,
+ "close": 3654.3515625,
+ "volume": 21850.337890625,
+ "amount": 80185176.0
+ },
+ {
+ "timestamp": "2025-09-02T16:00:00+08:00",
+ "open": 3657.072021484375,
+ "high": 3669.529541015625,
+ "low": 3631.63720703125,
+ "close": 3647.35546875,
+ "volume": 18260.533203125,
+ "amount": 67864896.0
+ },
+ {
+ "timestamp": "2025-09-02T17:00:00+08:00",
+ "open": 3660.329345703125,
+ "high": 3683.8974609375,
+ "low": 3625.788818359375,
+ "close": 3642.968017578125,
+ "volume": 25198.13671875,
+ "amount": 91833328.0
+ },
+ {
+ "timestamp": "2025-09-02T18:00:00+08:00",
+ "open": 3648.4814453125,
+ "high": 3673.598876953125,
+ "low": 3632.00390625,
+ "close": 3657.188232421875,
+ "volume": 24749.943359375,
+ "amount": 90996184.0
+ }
+ ],
+ "actual_data": [
+ {
+ "timestamp": "2025-08-03T19:00:00+08:00",
+ "open": 3484.94,
+ "high": 3516.31,
+ "low": 3484.5,
+ "close": 3485.46,
+ "volume": 24185.4187,
+ "amount": 84639993.916648
+ },
+ {
+ "timestamp": "2025-08-03T20:00:00+08:00",
+ "open": 3485.45,
+ "high": 3504.27,
+ "low": 3475.63,
+ "close": 3489.66,
+ "volume": 13322.4888,
+ "amount": 46468415.705146
+ },
+ {
+ "timestamp": "2025-08-03T21:00:00+08:00",
+ "open": 3489.67,
+ "high": 3499.16,
+ "low": 3483.98,
+ "close": 3492.15,
+ "volume": 8257.0432,
+ "amount": 28827905.47964
+ },
+ {
+ "timestamp": "2025-08-03T22:00:00+08:00",
+ "open": 3492.15,
+ "high": 3494.44,
+ "low": 3463.91,
+ "close": 3472.08,
+ "volume": 15904.9333,
+ "amount": 55285842.543492
+ },
+ {
+ "timestamp": "2025-08-03T23:00:00+08:00",
+ "open": 3472.08,
+ "high": 3479.02,
+ "low": 3454.34,
+ "close": 3476.49,
+ "volume": 13775.3339,
+ "amount": 47740813.852397
+ },
+ {
+ "timestamp": "2025-08-04T00:00:00+08:00",
+ "open": 3476.49,
+ "high": 3496.68,
+ "low": 3467.85,
+ "close": 3495.03,
+ "volume": 13016.2107,
+ "amount": 45314415.974091
+ },
+ {
+ "timestamp": "2025-08-04T01:00:00+08:00",
+ "open": 3495.03,
+ "high": 3499.66,
+ "low": 3480.1,
+ "close": 3489.81,
+ "volume": 8693.7508,
+ "amount": 30341439.229837
+ },
+ {
+ "timestamp": "2025-08-04T02:00:00+08:00",
+ "open": 3489.82,
+ "high": 3498.0,
+ "low": 3481.54,
+ "close": 3496.47,
+ "volume": 7343.8967,
+ "amount": 25636455.496089
+ },
+ {
+ "timestamp": "2025-08-04T03:00:00+08:00",
+ "open": 3496.48,
+ "high": 3515.0,
+ "low": 3488.73,
+ "close": 3496.74,
+ "volume": 17761.4273,
+ "amount": 62246145.787179
+ },
+ {
+ "timestamp": "2025-08-04T04:00:00+08:00",
+ "open": 3496.75,
+ "high": 3497.93,
+ "low": 3484.0,
+ "close": 3492.63,
+ "volume": 7579.8708,
+ "amount": 26455230.032259
+ },
+ {
+ "timestamp": "2025-08-04T05:00:00+08:00",
+ "open": 3492.64,
+ "high": 3508.71,
+ "low": 3489.14,
+ "close": 3502.44,
+ "volume": 8030.1638,
+ "amount": 28102767.867
+ },
+ {
+ "timestamp": "2025-08-04T06:00:00+08:00",
+ "open": 3502.44,
+ "high": 3515.49,
+ "low": 3483.5,
+ "close": 3503.41,
+ "volume": 8560.7602,
+ "amount": 29928851.451857
+ },
+ {
+ "timestamp": "2025-08-04T07:00:00+08:00",
+ "open": 3503.41,
+ "high": 3521.79,
+ "low": 3495.19,
+ "close": 3496.74,
+ "volume": 12735.8513,
+ "amount": 44681690.785297
+ },
+ {
+ "timestamp": "2025-08-04T08:00:00+08:00",
+ "open": 3496.75,
+ "high": 3551.98,
+ "low": 3490.73,
+ "close": 3546.17,
+ "volume": 20294.4593,
+ "amount": 71590998.494384
+ },
+ {
+ "timestamp": "2025-08-04T09:00:00+08:00",
+ "open": 3546.16,
+ "high": 3568.32,
+ "low": 3533.84,
+ "close": 3537.84,
+ "volume": 21871.3514,
+ "amount": 77564293.248077
+ },
+ {
+ "timestamp": "2025-08-04T10:00:00+08:00",
+ "open": 3537.85,
+ "high": 3571.88,
+ "low": 3523.66,
+ "close": 3571.66,
+ "volume": 23300.425,
+ "amount": 82627745.273626
+ },
+ {
+ "timestamp": "2025-08-04T11:00:00+08:00",
+ "open": 3571.66,
+ "high": 3576.07,
+ "low": 3555.16,
+ "close": 3556.8,
+ "volume": 10075.0921,
+ "amount": 35901236.309885
+ },
+ {
+ "timestamp": "2025-08-04T12:00:00+08:00",
+ "open": 3556.79,
+ "high": 3565.67,
+ "low": 3536.08,
+ "close": 3539.56,
+ "volume": 14816.6168,
+ "amount": 52589350.405797
+ },
+ {
+ "timestamp": "2025-08-04T13:00:00+08:00",
+ "open": 3539.56,
+ "high": 3541.3,
+ "low": 3524.14,
+ "close": 3533.46,
+ "volume": 10448.7895,
+ "amount": 36896475.237576
+ },
+ {
+ "timestamp": "2025-08-04T14:00:00+08:00",
+ "open": 3533.46,
+ "high": 3541.49,
+ "low": 3520.69,
+ "close": 3538.95,
+ "volume": 11440.8843,
+ "amount": 40408805.963704
+ },
+ {
+ "timestamp": "2025-08-04T15:00:00+08:00",
+ "open": 3538.94,
+ "high": 3554.21,
+ "low": 3536.58,
+ "close": 3551.99,
+ "volume": 10991.9173,
+ "amount": 38974289.242651
+ },
+ {
+ "timestamp": "2025-08-04T16:00:00+08:00",
+ "open": 3552.0,
+ "high": 3564.7,
+ "low": 3542.25,
+ "close": 3550.5,
+ "volume": 16866.3252,
+ "amount": 59951468.933939
+ },
+ {
+ "timestamp": "2025-08-04T17:00:00+08:00",
+ "open": 3550.5,
+ "high": 3563.6,
+ "low": 3545.24,
+ "close": 3547.19,
+ "volume": 9126.3226,
+ "amount": 32443511.665887
+ },
+ {
+ "timestamp": "2025-08-04T18:00:00+08:00",
+ "open": 3547.2,
+ "high": 3574.47,
+ "low": 3545.0,
+ "close": 3554.9,
+ "volume": 11163.6158,
+ "amount": 39746261.004546
+ },
+ {
+ "timestamp": "2025-08-04T19:00:00+08:00",
+ "open": 3554.9,
+ "high": 3566.12,
+ "low": 3549.6,
+ "close": 3555.7,
+ "volume": 8543.0119,
+ "amount": 30386240.888326
+ },
+ {
+ "timestamp": "2025-08-04T20:00:00+08:00",
+ "open": 3555.71,
+ "high": 3573.0,
+ "low": 3551.1,
+ "close": 3570.17,
+ "volume": 8758.9984,
+ "amount": 31196643.68114
+ },
+ {
+ "timestamp": "2025-08-04T21:00:00+08:00",
+ "open": 3570.18,
+ "high": 3621.2,
+ "low": 3560.48,
+ "close": 3621.18,
+ "volume": 39973.0102,
+ "amount": 143630982.008284
+ },
+ {
+ "timestamp": "2025-08-04T22:00:00+08:00",
+ "open": 3621.19,
+ "high": 3665.6,
+ "low": 3618.51,
+ "close": 3639.04,
+ "volume": 62527.0339,
+ "amount": 227846837.110381
+ },
+ {
+ "timestamp": "2025-08-04T23:00:00+08:00",
+ "open": 3639.05,
+ "high": 3657.46,
+ "low": 3634.56,
+ "close": 3648.89,
+ "volume": 24071.5376,
+ "amount": 87751241.502379
+ },
+ {
+ "timestamp": "2025-08-05T00:00:00+08:00",
+ "open": 3648.89,
+ "high": 3698.86,
+ "low": 3648.85,
+ "close": 3685.61,
+ "volume": 31790.7909,
+ "amount": 116832883.158396
+ },
+ {
+ "timestamp": "2025-08-05T01:00:00+08:00",
+ "open": 3685.62,
+ "high": 3718.54,
+ "low": 3678.44,
+ "close": 3681.5,
+ "volume": 29492.6576,
+ "amount": 109099443.74252
+ },
+ {
+ "timestamp": "2025-08-05T02:00:00+08:00",
+ "open": 3681.5,
+ "high": 3693.4,
+ "low": 3671.26,
+ "close": 3676.28,
+ "volume": 11484.4418,
+ "amount": 42275283.151899
+ },
+ {
+ "timestamp": "2025-08-05T03:00:00+08:00",
+ "open": 3676.28,
+ "high": 3688.46,
+ "low": 3666.22,
+ "close": 3669.73,
+ "volume": 12455.6091,
+ "amount": 45797047.636022
+ },
+ {
+ "timestamp": "2025-08-05T04:00:00+08:00",
+ "open": 3669.73,
+ "high": 3713.04,
+ "low": 3661.21,
+ "close": 3700.47,
+ "volume": 17101.3931,
+ "amount": 63093481.917354
+ },
+ {
+ "timestamp": "2025-08-05T05:00:00+08:00",
+ "open": 3700.46,
+ "high": 3732.0,
+ "low": 3699.1,
+ "close": 3710.02,
+ "volume": 18804.2053,
+ "amount": 69861928.66363
+ },
+ {
+ "timestamp": "2025-08-05T06:00:00+08:00",
+ "open": 3710.02,
+ "high": 3736.73,
+ "low": 3710.02,
+ "close": 3732.52,
+ "volume": 23577.2217,
+ "amount": 87873069.64921
+ },
+ {
+ "timestamp": "2025-08-05T07:00:00+08:00",
+ "open": 3732.51,
+ "high": 3733.74,
+ "low": 3709.31,
+ "close": 3720.99,
+ "volume": 14374.2753,
+ "amount": 53479794.443385
+ },
+ {
+ "timestamp": "2025-08-05T08:00:00+08:00",
+ "open": 3720.99,
+ "high": 3722.24,
+ "low": 3693.66,
+ "close": 3697.52,
+ "volume": 18166.7583,
+ "amount": 67297897.954748
+ },
+ {
+ "timestamp": "2025-08-05T09:00:00+08:00",
+ "open": 3697.53,
+ "high": 3707.43,
+ "low": 3678.56,
+ "close": 3680.38,
+ "volume": 13461.5777,
+ "amount": 49706801.158639
+ },
+ {
+ "timestamp": "2025-08-05T10:00:00+08:00",
+ "open": 3680.38,
+ "high": 3688.07,
+ "low": 3672.5,
+ "close": 3680.09,
+ "volume": 20551.5013,
+ "amount": 75582923.838953
+ },
+ {
+ "timestamp": "2025-08-05T11:00:00+08:00",
+ "open": 3680.1,
+ "high": 3681.16,
+ "low": 3648.24,
+ "close": 3651.94,
+ "volume": 22939.5826,
+ "amount": 83967337.074924
+ },
+ {
+ "timestamp": "2025-08-05T12:00:00+08:00",
+ "open": 3651.94,
+ "high": 3667.84,
+ "low": 3635.0,
+ "close": 3649.02,
+ "volume": 14185.1342,
+ "amount": 51808130.057304
+ },
+ {
+ "timestamp": "2025-08-05T13:00:00+08:00",
+ "open": 3649.03,
+ "high": 3668.37,
+ "low": 3646.91,
+ "close": 3664.4,
+ "volume": 11672.3515,
+ "amount": 42721624.244208
+ },
+ {
+ "timestamp": "2025-08-05T14:00:00+08:00",
+ "open": 3664.4,
+ "high": 3679.69,
+ "low": 3635.04,
+ "close": 3650.85,
+ "volume": 17109.5981,
+ "amount": 62641621.966935
+ },
+ {
+ "timestamp": "2025-08-05T15:00:00+08:00",
+ "open": 3650.85,
+ "high": 3656.5,
+ "low": 3601.53,
+ "close": 3613.49,
+ "volume": 27886.6748,
+ "amount": 101066192.319664
+ },
+ {
+ "timestamp": "2025-08-05T16:00:00+08:00",
+ "open": 3613.49,
+ "high": 3637.5,
+ "low": 3608.1,
+ "close": 3634.81,
+ "volume": 18459.413,
+ "amount": 66897128.8631
+ },
+ {
+ "timestamp": "2025-08-05T17:00:00+08:00",
+ "open": 3634.81,
+ "high": 3666.55,
+ "low": 3633.58,
+ "close": 3660.56,
+ "volume": 14570.1279,
+ "amount": 53166877.929179
+ },
+ {
+ "timestamp": "2025-08-05T18:00:00+08:00",
+ "open": 3660.56,
+ "high": 3694.06,
+ "low": 3654.0,
+ "close": 3682.55,
+ "volume": 17429.1474,
+ "amount": 64100752.55806
+ },
+ {
+ "timestamp": "2025-08-05T19:00:00+08:00",
+ "open": 3682.56,
+ "high": 3686.3,
+ "low": 3662.03,
+ "close": 3673.79,
+ "volume": 16969.2144,
+ "amount": 62348030.824123
+ },
+ {
+ "timestamp": "2025-08-05T20:00:00+08:00",
+ "open": 3673.8,
+ "high": 3680.58,
+ "low": 3609.73,
+ "close": 3628.43,
+ "volume": 29620.7096,
+ "amount": 107886418.725765
+ },
+ {
+ "timestamp": "2025-08-05T21:00:00+08:00",
+ "open": 3628.43,
+ "high": 3659.4,
+ "low": 3618.63,
+ "close": 3646.86,
+ "volume": 22651.8476,
+ "amount": 82382659.00909
+ },
+ {
+ "timestamp": "2025-08-05T22:00:00+08:00",
+ "open": 3646.85,
+ "high": 3647.63,
+ "low": 3559.82,
+ "close": 3577.85,
+ "volume": 76416.0033,
+ "amount": 274185452.294548
+ },
+ {
+ "timestamp": "2025-08-05T23:00:00+08:00",
+ "open": 3577.85,
+ "high": 3598.21,
+ "low": 3555.0,
+ "close": 3570.43,
+ "volume": 36957.393,
+ "amount": 132100040.780566
+ },
+ {
+ "timestamp": "2025-08-06T00:00:00+08:00",
+ "open": 3570.43,
+ "high": 3594.4,
+ "low": 3563.07,
+ "close": 3577.67,
+ "volume": 22068.0117,
+ "amount": 78984997.570765
+ },
+ {
+ "timestamp": "2025-08-06T01:00:00+08:00",
+ "open": 3577.67,
+ "high": 3609.08,
+ "low": 3576.53,
+ "close": 3605.53,
+ "volume": 15739.6251,
+ "amount": 56576963.229153
+ },
+ {
+ "timestamp": "2025-08-06T02:00:00+08:00",
+ "open": 3605.53,
+ "high": 3612.26,
+ "low": 3567.81,
+ "close": 3587.69,
+ "volume": 15577.0193,
+ "amount": 55882352.293388
+ },
+ {
+ "timestamp": "2025-08-06T03:00:00+08:00",
+ "open": 3587.7,
+ "high": 3594.9,
+ "low": 3559.71,
+ "close": 3571.66,
+ "volume": 11272.0649,
+ "amount": 40327392.257818
+ },
+ {
+ "timestamp": "2025-08-06T04:00:00+08:00",
+ "open": 3571.65,
+ "high": 3597.7,
+ "low": 3571.65,
+ "close": 3576.5,
+ "volume": 8946.206,
+ "amount": 32064012.977547
+ },
+ {
+ "timestamp": "2025-08-06T05:00:00+08:00",
+ "open": 3576.49,
+ "high": 3590.91,
+ "low": 3570.0,
+ "close": 3575.62,
+ "volume": 8287.7314,
+ "amount": 29684124.219502
+ },
+ {
+ "timestamp": "2025-08-06T06:00:00+08:00",
+ "open": 3575.61,
+ "high": 3598.96,
+ "low": 3546.0,
+ "close": 3597.01,
+ "volume": 15588.6108,
+ "amount": 55611816.749148
+ },
+ {
+ "timestamp": "2025-08-06T07:00:00+08:00",
+ "open": 3597.02,
+ "high": 3624.56,
+ "low": 3593.82,
+ "close": 3612.0,
+ "volume": 12544.655,
+ "amount": 45318178.743317
+ },
+ {
+ "timestamp": "2025-08-06T08:00:00+08:00",
+ "open": 3612.01,
+ "high": 3614.0,
+ "low": 3570.97,
+ "close": 3576.17,
+ "volume": 14701.3921,
+ "amount": 52804179.285012
+ },
+ {
+ "timestamp": "2025-08-06T09:00:00+08:00",
+ "open": 3576.29,
+ "high": 3593.93,
+ "low": 3564.19,
+ "close": 3592.31,
+ "volume": 13311.2163,
+ "amount": 47656767.779134
+ },
+ {
+ "timestamp": "2025-08-06T10:00:00+08:00",
+ "open": 3592.3,
+ "high": 3596.05,
+ "low": 3573.91,
+ "close": 3592.34,
+ "volume": 6947.3673,
+ "amount": 24917823.086425
+ },
+ {
+ "timestamp": "2025-08-06T11:00:00+08:00",
+ "open": 3592.35,
+ "high": 3594.46,
+ "low": 3572.05,
+ "close": 3583.66,
+ "volume": 6443.6362,
+ "amount": 23084846.550522
+ },
+ {
+ "timestamp": "2025-08-06T12:00:00+08:00",
+ "open": 3583.67,
+ "high": 3584.89,
+ "low": 3570.2,
+ "close": 3573.51,
+ "volume": 6999.9054,
+ "amount": 25031420.258159
+ },
+ {
+ "timestamp": "2025-08-06T13:00:00+08:00",
+ "open": 3573.5,
+ "high": 3662.0,
+ "low": 3569.28,
+ "close": 3638.51,
+ "volume": 36791.5623,
+ "amount": 133683042.516564
+ },
+ {
+ "timestamp": "2025-08-06T14:00:00+08:00",
+ "open": 3638.52,
+ "high": 3643.94,
+ "low": 3616.95,
+ "close": 3632.23,
+ "volume": 14135.6883,
+ "amount": 51302216.069645
+ },
+ {
+ "timestamp": "2025-08-06T15:00:00+08:00",
+ "open": 3632.23,
+ "high": 3649.17,
+ "low": 3625.0,
+ "close": 3639.82,
+ "volume": 13062.1164,
+ "amount": 47533535.32585
+ },
+ {
+ "timestamp": "2025-08-06T16:00:00+08:00",
+ "open": 3639.81,
+ "high": 3643.04,
+ "low": 3607.54,
+ "close": 3622.15,
+ "volume": 17163.5719,
+ "amount": 62187556.059639
+ },
+ {
+ "timestamp": "2025-08-06T17:00:00+08:00",
+ "open": 3622.14,
+ "high": 3644.6,
+ "low": 3616.54,
+ "close": 3627.05,
+ "volume": 11538.5576,
+ "amount": 41865931.907236
+ },
+ {
+ "timestamp": "2025-08-06T18:00:00+08:00",
+ "open": 3627.06,
+ "high": 3634.91,
+ "low": 3611.54,
+ "close": 3616.3,
+ "volume": 12126.8385,
+ "amount": 43909457.401443
+ },
+ {
+ "timestamp": "2025-08-06T19:00:00+08:00",
+ "open": 3616.3,
+ "high": 3630.55,
+ "low": 3609.93,
+ "close": 3619.64,
+ "volume": 7406.9453,
+ "amount": 26814863.031456
+ },
+ {
+ "timestamp": "2025-08-06T20:00:00+08:00",
+ "open": 3619.63,
+ "high": 3623.31,
+ "low": 3579.38,
+ "close": 3584.01,
+ "volume": 21252.4327,
+ "amount": 76407389.282446
+ },
+ {
+ "timestamp": "2025-08-06T21:00:00+08:00",
+ "open": 3584.02,
+ "high": 3604.7,
+ "low": 3574.05,
+ "close": 3602.75,
+ "volume": 23925.4513,
+ "amount": 85928233.551377
+ },
+ {
+ "timestamp": "2025-08-06T22:00:00+08:00",
+ "open": 3602.76,
+ "high": 3637.17,
+ "low": 3587.97,
+ "close": 3637.17,
+ "volume": 27369.5503,
+ "amount": 98891239.718361
+ },
+ {
+ "timestamp": "2025-08-06T23:00:00+08:00",
+ "open": 3637.16,
+ "high": 3669.38,
+ "low": 3620.31,
+ "close": 3664.69,
+ "volume": 29992.1527,
+ "amount": 109196193.698316
+ },
+ {
+ "timestamp": "2025-08-07T00:00:00+08:00",
+ "open": 3664.7,
+ "high": 3674.78,
+ "low": 3640.16,
+ "close": 3645.42,
+ "volume": 21273.1646,
+ "amount": 77768093.564447
+ },
+ {
+ "timestamp": "2025-08-07T01:00:00+08:00",
+ "open": 3645.42,
+ "high": 3684.26,
+ "low": 3638.56,
+ "close": 3682.32,
+ "volume": 14136.3406,
+ "amount": 51788514.602329
+ },
+ {
+ "timestamp": "2025-08-07T02:00:00+08:00",
+ "open": 3682.31,
+ "high": 3698.6,
+ "low": 3672.44,
+ "close": 3677.09,
+ "volume": 17679.717,
+ "amount": 65178320.683334
+ },
+ {
+ "timestamp": "2025-08-07T03:00:00+08:00",
+ "open": 3677.08,
+ "high": 3686.15,
+ "low": 3669.11,
+ "close": 3683.65,
+ "volume": 10806.3655,
+ "amount": 39735017.421117
+ },
+ {
+ "timestamp": "2025-08-07T04:00:00+08:00",
+ "open": 3683.66,
+ "high": 3683.66,
+ "low": 3666.89,
+ "close": 3674.54,
+ "volume": 9692.9289,
+ "amount": 35615297.522507
+ },
+ {
+ "timestamp": "2025-08-07T05:00:00+08:00",
+ "open": 3674.53,
+ "high": 3684.97,
+ "low": 3652.38,
+ "close": 3669.9,
+ "volume": 12537.5208,
+ "amount": 45979271.294903
+ },
+ {
+ "timestamp": "2025-08-07T06:00:00+08:00",
+ "open": 3669.91,
+ "high": 3682.82,
+ "low": 3666.03,
+ "close": 3682.15,
+ "volume": 7461.3455,
+ "amount": 27431497.758384
+ },
+ {
+ "timestamp": "2025-08-07T07:00:00+08:00",
+ "open": 3682.15,
+ "high": 3686.17,
+ "low": 3674.0,
+ "close": 3683.31,
+ "volume": 8554.153,
+ "amount": 31492787.933534
+ },
+ {
+ "timestamp": "2025-08-07T08:00:00+08:00",
+ "open": 3683.31,
+ "high": 3683.31,
+ "low": 3663.76,
+ "close": 3673.93,
+ "volume": 8821.4226,
+ "amount": 32404533.256647
+ },
+ {
+ "timestamp": "2025-08-07T09:00:00+08:00",
+ "open": 3673.93,
+ "high": 3716.61,
+ "low": 3666.68,
+ "close": 3667.55,
+ "volume": 29195.1749,
+ "amount": 107834273.699961
+ },
+ {
+ "timestamp": "2025-08-07T10:00:00+08:00",
+ "open": 3667.55,
+ "high": 3677.84,
+ "low": 3650.4,
+ "close": 3659.03,
+ "volume": 10793.6538,
+ "amount": 39552520.069412
+ },
+ {
+ "timestamp": "2025-08-07T11:00:00+08:00",
+ "open": 3659.02,
+ "high": 3664.7,
+ "low": 3647.63,
+ "close": 3656.78,
+ "volume": 7312.4733,
+ "amount": 26741858.457292
+ },
+ {
+ "timestamp": "2025-08-07T12:00:00+08:00",
+ "open": 3656.78,
+ "high": 3670.91,
+ "low": 3655.09,
+ "close": 3662.27,
+ "volume": 7952.4262,
+ "amount": 29135827.987942
+ },
+ {
+ "timestamp": "2025-08-07T13:00:00+08:00",
+ "open": 3662.27,
+ "high": 3688.66,
+ "low": 3659.33,
+ "close": 3688.0,
+ "volume": 7630.6906,
+ "amount": 28041966.204968
+ },
+ {
+ "timestamp": "2025-08-07T14:00:00+08:00",
+ "open": 3688.0,
+ "high": 3711.0,
+ "low": 3686.58,
+ "close": 3695.14,
+ "volume": 19795.4181,
+ "amount": 73185873.377086
+ },
+ {
+ "timestamp": "2025-08-07T15:00:00+08:00",
+ "open": 3695.15,
+ "high": 3710.0,
+ "low": 3694.22,
+ "close": 3702.4,
+ "volume": 10977.7521,
+ "amount": 40641263.624024
+ },
+ {
+ "timestamp": "2025-08-07T16:00:00+08:00",
+ "open": 3702.41,
+ "high": 3727.88,
+ "low": 3702.41,
+ "close": 3721.25,
+ "volume": 21846.6884,
+ "amount": 81267478.788996
+ },
+ {
+ "timestamp": "2025-08-07T17:00:00+08:00",
+ "open": 3721.26,
+ "high": 3737.0,
+ "low": 3715.03,
+ "close": 3732.41,
+ "volume": 19907.7895,
+ "amount": 74188765.645104
+ },
+ {
+ "timestamp": "2025-08-07T18:00:00+08:00",
+ "open": 3732.4,
+ "high": 3826.5,
+ "low": 3730.63,
+ "close": 3821.48,
+ "volume": 98363.4913,
+ "amount": 372895872.014478
+ },
+ {
+ "timestamp": "2025-08-07T19:00:00+08:00",
+ "open": 3821.47,
+ "high": 3843.66,
+ "low": 3806.82,
+ "close": 3827.0,
+ "volume": 43599.3277,
+ "amount": 166673838.734013
+ },
+ {
+ "timestamp": "2025-08-07T20:00:00+08:00",
+ "open": 3827.01,
+ "high": 3851.0,
+ "low": 3823.64,
+ "close": 3849.68,
+ "volume": 43328.6642,
+ "amount": 166353380.895278
+ },
+ {
+ "timestamp": "2025-08-07T21:00:00+08:00",
+ "open": 3849.68,
+ "high": 3865.64,
+ "low": 3826.3,
+ "close": 3857.69,
+ "volume": 40189.986,
+ "amount": 154591439.45392
+ },
+ {
+ "timestamp": "2025-08-07T22:00:00+08:00",
+ "open": 3857.69,
+ "high": 3858.24,
+ "low": 3804.27,
+ "close": 3820.33,
+ "volume": 42348.8701,
+ "amount": 161944829.376416
+ },
+ {
+ "timestamp": "2025-08-07T23:00:00+08:00",
+ "open": 3820.33,
+ "high": 3841.0,
+ "low": 3815.13,
+ "close": 3837.01,
+ "volume": 25338.4874,
+ "amount": 96995371.730342
+ },
+ {
+ "timestamp": "2025-08-08T00:00:00+08:00",
+ "open": 3837.01,
+ "high": 3843.79,
+ "low": 3780.54,
+ "close": 3815.29,
+ "volume": 36988.8399,
+ "amount": 141175705.196292
+ },
+ {
+ "timestamp": "2025-08-08T01:00:00+08:00",
+ "open": 3815.29,
+ "high": 3834.33,
+ "low": 3805.04,
+ "close": 3830.2,
+ "volume": 15044.9344,
+ "amount": 57466303.469954
+ },
+ {
+ "timestamp": "2025-08-08T02:00:00+08:00",
+ "open": 3830.19,
+ "high": 3831.39,
+ "low": 3808.34,
+ "close": 3827.7,
+ "volume": 12739.6187,
+ "amount": 48652770.698461
+ },
+ {
+ "timestamp": "2025-08-08T03:00:00+08:00",
+ "open": 3827.7,
+ "high": 3876.44,
+ "low": 3822.08,
+ "close": 3867.6,
+ "volume": 29003.2856,
+ "amount": 111764391.130891
+ },
+ {
+ "timestamp": "2025-08-08T04:00:00+08:00",
+ "open": 3867.6,
+ "high": 3880.0,
+ "low": 3851.22,
+ "close": 3874.14,
+ "volume": 20732.7113,
+ "amount": 80143395.809151
+ },
+ {
+ "timestamp": "2025-08-08T05:00:00+08:00",
+ "open": 3874.15,
+ "high": 3885.95,
+ "low": 3858.72,
+ "close": 3871.53,
+ "volume": 16520.2261,
+ "amount": 63942410.903693
+ },
+ {
+ "timestamp": "2025-08-08T06:00:00+08:00",
+ "open": 3871.53,
+ "high": 3927.77,
+ "low": 3868.64,
+ "close": 3916.8,
+ "volume": 43175.8358,
+ "amount": 168327605.61928
+ },
+ {
+ "timestamp": "2025-08-08T07:00:00+08:00",
+ "open": 3916.8,
+ "high": 3917.5,
+ "low": 3889.51,
+ "close": 3910.31,
+ "volume": 20071.2192,
+ "amount": 78331295.28814
+ },
+ {
+ "timestamp": "2025-08-08T08:00:00+08:00",
+ "open": 3910.3,
+ "high": 3937.0,
+ "low": 3882.29,
+ "close": 3900.16,
+ "volume": 40356.648,
+ "amount": 157758571.63297
+ },
+ {
+ "timestamp": "2025-08-08T09:00:00+08:00",
+ "open": 3900.15,
+ "high": 3918.0,
+ "low": 3880.0,
+ "close": 3887.36,
+ "volume": 24134.8488,
+ "amount": 94035327.531122
+ },
+ {
+ "timestamp": "2025-08-08T10:00:00+08:00",
+ "open": 3887.35,
+ "high": 3906.58,
+ "low": 3880.0,
+ "close": 3893.68,
+ "volume": 13375.9968,
+ "amount": 52067053.074899
+ },
+ {
+ "timestamp": "2025-08-08T11:00:00+08:00",
+ "open": 3893.67,
+ "high": 3969.06,
+ "low": 3892.6,
+ "close": 3939.18,
+ "volume": 52679.7141,
+ "amount": 207679512.656005
+ },
+ {
+ "timestamp": "2025-08-08T12:00:00+08:00",
+ "open": 3939.19,
+ "high": 3939.34,
+ "low": 3916.0,
+ "close": 3920.5,
+ "volume": 13674.9861,
+ "amount": 53684917.681459
+ },
+ {
+ "timestamp": "2025-08-08T13:00:00+08:00",
+ "open": 3920.51,
+ "high": 3920.87,
+ "low": 3894.56,
+ "close": 3901.5,
+ "volume": 15809.6234,
+ "amount": 61737223.473883
+ },
+ {
+ "timestamp": "2025-08-08T14:00:00+08:00",
+ "open": 3901.5,
+ "high": 3920.32,
+ "low": 3892.47,
+ "close": 3915.01,
+ "volume": 14818.3957,
+ "amount": 57921469.932196
+ },
+ {
+ "timestamp": "2025-08-08T15:00:00+08:00",
+ "open": 3915.01,
+ "high": 3928.29,
+ "low": 3900.4,
+ "close": 3915.97,
+ "volume": 22590.2051,
+ "amount": 88472627.9492
+ },
+ {
+ "timestamp": "2025-08-08T16:00:00+08:00",
+ "open": 3915.98,
+ "high": 3927.54,
+ "low": 3885.29,
+ "close": 3898.46,
+ "volume": 23335.7904,
+ "amount": 91096066.228158
+ },
+ {
+ "timestamp": "2025-08-08T17:00:00+08:00",
+ "open": 3898.46,
+ "high": 3902.0,
+ "low": 3884.44,
+ "close": 3900.03,
+ "volume": 11907.3276,
+ "amount": 46364175.009127
+ },
+ {
+ "timestamp": "2025-08-08T18:00:00+08:00",
+ "open": 3900.03,
+ "high": 3908.37,
+ "low": 3886.59,
+ "close": 3897.41,
+ "volume": 9849.5187,
+ "amount": 38395026.767345
+ }
+ ],
+ "analysis": {
+ "continuity": {
+ "last_prediction": {
+ "open": 3468.14892578125,
+ "high": 3476.130126953125,
+ "low": 3447.22314453125,
+ "close": 3457.6015625
+ },
+ "first_actual": {
+ "open": 3484.94,
+ "high": 3516.31,
+ "low": 3484.5,
+ "close": 3485.46
+ },
+ "gaps": {
+ "open_gap": 16.791074218750055,
+ "high_gap": 40.179873046874945,
+ "low_gap": 37.27685546875,
+ "close_gap": 27.858437500000036
+ },
+ "gap_percentages": {
+ "open_gap_pct": 0.4818181724434296,
+ "high_gap_pct": 1.1426715234684925,
+ "low_gap_pct": 1.0697906577342517,
+ "close_gap_pct": 0.7992757770853784
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_105733.json b/webui/prediction_results/prediction_20250829_105733.json
new file mode 100644
index 0000000000000000000000000000000000000000..c757d77504e762419049c9fc2b05949567fddb67
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_105733.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T10:57:33.720609",
+ "file_path": "ETHUSDT_1h",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "ETHUSDT",
+ "interval": "1h",
+ "limit": 400,
+ "lookback": 400,
+ "pred_len": 120,
+ "temperature": 1.2,
+ "top_p": 0.9,
+ "sample_count": 28,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 400,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 4075.58,
+ "max": 4935.01
+ },
+ "high": {
+ "min": 4115.51,
+ "max": 4956.78
+ },
+ "low": {
+ "min": 4060.0,
+ "max": 4897.31
+ },
+ "close": {
+ "min": 4075.59,
+ "max": 4935.0
+ }
+ },
+ "last_values": {
+ "open": 4481.62,
+ "high": 4490.7,
+ "low": 4434.79,
+ "close": 4460.62
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T10:00:00+08:00",
+ "open": 4450.8359375,
+ "high": 4494.50830078125,
+ "low": 4427.478515625,
+ "close": 4463.5849609375,
+ "volume": 19731.15625,
+ "amount": 89868512.0
+ },
+ {
+ "timestamp": "2025-08-29T11:00:00+08:00",
+ "open": 4459.93994140625,
+ "high": 4493.154296875,
+ "low": 4427.376953125,
+ "close": 4459.12255859375,
+ "volume": 20277.904296875,
+ "amount": 92300304.0
+ },
+ {
+ "timestamp": "2025-08-29T12:00:00+08:00",
+ "open": 4453.43896484375,
+ "high": 4488.71728515625,
+ "low": 4416.20458984375,
+ "close": 4460.4091796875,
+ "volume": 22137.80859375,
+ "amount": 100495416.0
+ },
+ {
+ "timestamp": "2025-08-29T13:00:00+08:00",
+ "open": 4452.81640625,
+ "high": 4488.9931640625,
+ "low": 4419.21875,
+ "close": 4457.8291015625,
+ "volume": 21303.05859375,
+ "amount": 96756680.0
+ },
+ {
+ "timestamp": "2025-08-29T14:00:00+08:00",
+ "open": 4453.10888671875,
+ "high": 4498.98046875,
+ "low": 4425.1357421875,
+ "close": 4460.93798828125,
+ "volume": 25089.302734375,
+ "amount": 114732928.0
+ },
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 4462.42822265625,
+ "high": 4498.001953125,
+ "low": 4418.0537109375,
+ "close": 4464.234375,
+ "volume": 30212.841796875,
+ "amount": 136533104.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 4457.75048828125,
+ "high": 4501.37646484375,
+ "low": 4426.861328125,
+ "close": 4468.7001953125,
+ "volume": 29965.708984375,
+ "amount": 134467024.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 4464.234375,
+ "high": 4502.5986328125,
+ "low": 4430.35400390625,
+ "close": 4470.16650390625,
+ "volume": 29753.06640625,
+ "amount": 135085440.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 4470.16259765625,
+ "high": 4505.154296875,
+ "low": 4440.8515625,
+ "close": 4479.41943359375,
+ "volume": 30642.41796875,
+ "amount": 138297552.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 4481.640625,
+ "high": 4520.38916015625,
+ "low": 4450.97216796875,
+ "close": 4490.08935546875,
+ "volume": 29416.107421875,
+ "amount": 133158272.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 4479.46728515625,
+ "high": 4532.5166015625,
+ "low": 4447.89794921875,
+ "close": 4497.046875,
+ "volume": 33504.37890625,
+ "amount": 152929152.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 4493.11279296875,
+ "high": 4540.783203125,
+ "low": 4460.349609375,
+ "close": 4506.4287109375,
+ "volume": 37279.5546875,
+ "amount": 169164432.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 4511.74853515625,
+ "high": 4550.04736328125,
+ "low": 4478.97314453125,
+ "close": 4509.96435546875,
+ "volume": 32651.22265625,
+ "amount": 147927248.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 4511.28857421875,
+ "high": 4548.7861328125,
+ "low": 4483.978515625,
+ "close": 4514.49267578125,
+ "volume": 37645.71875,
+ "amount": 170708288.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 4512.9609375,
+ "high": 4548.849609375,
+ "low": 4471.10595703125,
+ "close": 4511.14306640625,
+ "volume": 30429.859375,
+ "amount": 137106608.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 4505.650390625,
+ "high": 4547.44140625,
+ "low": 4478.6416015625,
+ "close": 4516.3759765625,
+ "volume": 29940.6796875,
+ "amount": 134529568.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 4509.92919921875,
+ "high": 4550.62255859375,
+ "low": 4481.5302734375,
+ "close": 4520.822265625,
+ "volume": 29082.5234375,
+ "amount": 131279064.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 4516.47802734375,
+ "high": 4555.31005859375,
+ "low": 4487.1640625,
+ "close": 4523.4306640625,
+ "volume": 32992.02734375,
+ "amount": 146586528.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 4518.392578125,
+ "high": 4564.9658203125,
+ "low": 4497.18310546875,
+ "close": 4540.0302734375,
+ "volume": 28643.2109375,
+ "amount": 128580496.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 4530.82177734375,
+ "high": 4559.23583984375,
+ "low": 4501.7939453125,
+ "close": 4532.138671875,
+ "volume": 26202.1953125,
+ "amount": 118504600.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 4526.82373046875,
+ "high": 4562.5791015625,
+ "low": 4500.203125,
+ "close": 4532.30712890625,
+ "volume": 28922.1015625,
+ "amount": 130380640.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 4534.630859375,
+ "high": 4568.8115234375,
+ "low": 4512.154296875,
+ "close": 4539.01611328125,
+ "volume": 25019.025390625,
+ "amount": 113397968.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 4535.39306640625,
+ "high": 4566.35888671875,
+ "low": 4508.9755859375,
+ "close": 4531.33642578125,
+ "volume": 25840.5546875,
+ "amount": 116813872.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 4521.49169921875,
+ "high": 4552.07666015625,
+ "low": 4489.42578125,
+ "close": 4519.38818359375,
+ "volume": 31191.93359375,
+ "amount": 139978240.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 4508.76953125,
+ "high": 4539.025390625,
+ "low": 4473.35302734375,
+ "close": 4509.77294921875,
+ "volume": 29320.80859375,
+ "amount": 132001056.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 4508.013671875,
+ "high": 4537.02880859375,
+ "low": 4461.837890625,
+ "close": 4505.21875,
+ "volume": 27340.513671875,
+ "amount": 123927256.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 4497.7177734375,
+ "high": 4540.33154296875,
+ "low": 4471.88232421875,
+ "close": 4511.08984375,
+ "volume": 29142.4609375,
+ "amount": 132103040.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 4500.7177734375,
+ "high": 4546.02490234375,
+ "low": 4459.09228515625,
+ "close": 4502.54638671875,
+ "volume": 35493.7109375,
+ "amount": 159789952.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 4493.02734375,
+ "high": 4533.30517578125,
+ "low": 4453.9111328125,
+ "close": 4500.021484375,
+ "volume": 32821.66796875,
+ "amount": 146583088.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 4477.076171875,
+ "high": 4537.36865234375,
+ "low": 4428.81884765625,
+ "close": 4497.0966796875,
+ "volume": 41439.2265625,
+ "amount": 185322080.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 4486.07666015625,
+ "high": 4526.85400390625,
+ "low": 4444.513671875,
+ "close": 4496.07470703125,
+ "volume": 32475.9140625,
+ "amount": 145825488.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 4481.4931640625,
+ "high": 4536.28369140625,
+ "low": 4447.109375,
+ "close": 4500.2939453125,
+ "volume": 40199.81640625,
+ "amount": 180964448.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 4488.0673828125,
+ "high": 4537.7578125,
+ "low": 4449.1435546875,
+ "close": 4501.94677734375,
+ "volume": 40515.2734375,
+ "amount": 182693888.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 4487.50341796875,
+ "high": 4536.515625,
+ "low": 4427.98193359375,
+ "close": 4493.09912109375,
+ "volume": 48395.421875,
+ "amount": 216889600.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 4482.77734375,
+ "high": 4523.8505859375,
+ "low": 4433.978515625,
+ "close": 4480.380859375,
+ "volume": 39964.015625,
+ "amount": 180851792.0
+ },
+ {
+ "timestamp": "2025-08-30T21:00:00+08:00",
+ "open": 4474.68359375,
+ "high": 4513.74755859375,
+ "low": 4434.42236328125,
+ "close": 4480.46923828125,
+ "volume": 35719.953125,
+ "amount": 161377408.0
+ },
+ {
+ "timestamp": "2025-08-30T22:00:00+08:00",
+ "open": 4472.40380859375,
+ "high": 4516.482421875,
+ "low": 4429.94091796875,
+ "close": 4482.6728515625,
+ "volume": 34478.453125,
+ "amount": 155292304.0
+ },
+ {
+ "timestamp": "2025-08-30T23:00:00+08:00",
+ "open": 4474.7255859375,
+ "high": 4511.2392578125,
+ "low": 4434.8154296875,
+ "close": 4478.13671875,
+ "volume": 38205.8828125,
+ "amount": 171659504.0
+ },
+ {
+ "timestamp": "2025-08-31T00:00:00+08:00",
+ "open": 4483.43798828125,
+ "high": 4514.7763671875,
+ "low": 4447.97021484375,
+ "close": 4480.90673828125,
+ "volume": 30044.4296875,
+ "amount": 135494272.0
+ },
+ {
+ "timestamp": "2025-08-31T01:00:00+08:00",
+ "open": 4478.654296875,
+ "high": 4514.06396484375,
+ "low": 4449.1953125,
+ "close": 4480.10986328125,
+ "volume": 28165.23046875,
+ "amount": 127759216.0
+ },
+ {
+ "timestamp": "2025-08-31T02:00:00+08:00",
+ "open": 4473.78125,
+ "high": 4514.228515625,
+ "low": 4445.8505859375,
+ "close": 4482.70556640625,
+ "volume": 27063.619140625,
+ "amount": 122650752.0
+ },
+ {
+ "timestamp": "2025-08-31T03:00:00+08:00",
+ "open": 4480.15087890625,
+ "high": 4504.80126953125,
+ "low": 4439.88525390625,
+ "close": 4469.64404296875,
+ "volume": 25218.947265625,
+ "amount": 114438584.0
+ },
+ {
+ "timestamp": "2025-08-31T04:00:00+08:00",
+ "open": 4460.44921875,
+ "high": 4496.0146484375,
+ "low": 4421.23388671875,
+ "close": 4467.8115234375,
+ "volume": 27878.4921875,
+ "amount": 125946912.0
+ },
+ {
+ "timestamp": "2025-08-31T05:00:00+08:00",
+ "open": 4457.68359375,
+ "high": 4508.80615234375,
+ "low": 4423.09814453125,
+ "close": 4473.8330078125,
+ "volume": 31408.904296875,
+ "amount": 141321280.0
+ },
+ {
+ "timestamp": "2025-08-31T06:00:00+08:00",
+ "open": 4462.6728515625,
+ "high": 4502.55322265625,
+ "low": 4427.08984375,
+ "close": 4464.8515625,
+ "volume": 30178.615234375,
+ "amount": 137053360.0
+ },
+ {
+ "timestamp": "2025-08-31T07:00:00+08:00",
+ "open": 4457.85986328125,
+ "high": 4495.55908203125,
+ "low": 4415.52685546875,
+ "close": 4465.9853515625,
+ "volume": 31197.201171875,
+ "amount": 140450048.0
+ },
+ {
+ "timestamp": "2025-08-31T08:00:00+08:00",
+ "open": 4459.98828125,
+ "high": 4496.1435546875,
+ "low": 4429.2705078125,
+ "close": 4460.576171875,
+ "volume": 30786.2421875,
+ "amount": 139296304.0
+ },
+ {
+ "timestamp": "2025-08-31T09:00:00+08:00",
+ "open": 4462.32421875,
+ "high": 4501.80908203125,
+ "low": 4426.9814453125,
+ "close": 4474.70751953125,
+ "volume": 29207.87890625,
+ "amount": 132301560.0
+ },
+ {
+ "timestamp": "2025-08-31T10:00:00+08:00",
+ "open": 4470.01416015625,
+ "high": 4515.68310546875,
+ "low": 4431.60302734375,
+ "close": 4479.33154296875,
+ "volume": 34050.01171875,
+ "amount": 152495920.0
+ },
+ {
+ "timestamp": "2025-08-31T11:00:00+08:00",
+ "open": 4472.5400390625,
+ "high": 4520.5712890625,
+ "low": 4438.35693359375,
+ "close": 4483.72119140625,
+ "volume": 38330.17578125,
+ "amount": 172849568.0
+ },
+ {
+ "timestamp": "2025-08-31T12:00:00+08:00",
+ "open": 4481.42236328125,
+ "high": 4513.62060546875,
+ "low": 4443.89111328125,
+ "close": 4481.28759765625,
+ "volume": 35882.328125,
+ "amount": 161331104.0
+ },
+ {
+ "timestamp": "2025-08-31T13:00:00+08:00",
+ "open": 4477.16015625,
+ "high": 4519.8837890625,
+ "low": 4438.07177734375,
+ "close": 4483.29443359375,
+ "volume": 34176.1796875,
+ "amount": 153926832.0
+ },
+ {
+ "timestamp": "2025-08-31T14:00:00+08:00",
+ "open": 4479.00439453125,
+ "high": 4513.7646484375,
+ "low": 4436.97509765625,
+ "close": 4486.51220703125,
+ "volume": 32291.1328125,
+ "amount": 144562304.0
+ },
+ {
+ "timestamp": "2025-08-31T15:00:00+08:00",
+ "open": 4479.67919921875,
+ "high": 4515.6171875,
+ "low": 4448.310546875,
+ "close": 4486.01123046875,
+ "volume": 33435.0078125,
+ "amount": 151168656.0
+ },
+ {
+ "timestamp": "2025-08-31T16:00:00+08:00",
+ "open": 4487.38623046875,
+ "high": 4525.0166015625,
+ "low": 4456.3505859375,
+ "close": 4496.7744140625,
+ "volume": 31492.712890625,
+ "amount": 141909072.0
+ },
+ {
+ "timestamp": "2025-08-31T17:00:00+08:00",
+ "open": 4490.2138671875,
+ "high": 4547.57421875,
+ "low": 4454.83642578125,
+ "close": 4506.9951171875,
+ "volume": 38174.625,
+ "amount": 170458400.0
+ },
+ {
+ "timestamp": "2025-08-31T18:00:00+08:00",
+ "open": 4501.44921875,
+ "high": 4539.72412109375,
+ "low": 4456.2265625,
+ "close": 4515.705078125,
+ "volume": 35388.4140625,
+ "amount": 159776400.0
+ },
+ {
+ "timestamp": "2025-08-31T19:00:00+08:00",
+ "open": 4509.02783203125,
+ "high": 4557.29345703125,
+ "low": 4478.16796875,
+ "close": 4511.64599609375,
+ "volume": 31070.486328125,
+ "amount": 142651296.0
+ },
+ {
+ "timestamp": "2025-08-31T20:00:00+08:00",
+ "open": 4511.42236328125,
+ "high": 4543.98681640625,
+ "low": 4474.60791015625,
+ "close": 4513.00927734375,
+ "volume": 33355.8671875,
+ "amount": 150990352.0
+ },
+ {
+ "timestamp": "2025-08-31T21:00:00+08:00",
+ "open": 4510.88037109375,
+ "high": 4555.1796875,
+ "low": 4475.1455078125,
+ "close": 4513.15380859375,
+ "volume": 33064.078125,
+ "amount": 148064768.0
+ },
+ {
+ "timestamp": "2025-08-31T22:00:00+08:00",
+ "open": 4507.35986328125,
+ "high": 4546.740234375,
+ "low": 4456.5390625,
+ "close": 4511.0244140625,
+ "volume": 41013.0390625,
+ "amount": 185423952.0
+ },
+ {
+ "timestamp": "2025-08-31T23:00:00+08:00",
+ "open": 4506.08984375,
+ "high": 4553.21484375,
+ "low": 4479.30224609375,
+ "close": 4519.13330078125,
+ "volume": 35694.73046875,
+ "amount": 161016528.0
+ },
+ {
+ "timestamp": "2025-09-01T00:00:00+08:00",
+ "open": 4515.09423828125,
+ "high": 4571.60986328125,
+ "low": 4475.12646484375,
+ "close": 4531.5927734375,
+ "volume": 50190.98046875,
+ "amount": 224669856.0
+ },
+ {
+ "timestamp": "2025-09-01T01:00:00+08:00",
+ "open": 4520.98193359375,
+ "high": 4571.2705078125,
+ "low": 4492.3857421875,
+ "close": 4536.96142578125,
+ "volume": 43183.2734375,
+ "amount": 194699456.0
+ },
+ {
+ "timestamp": "2025-09-01T02:00:00+08:00",
+ "open": 4527.15234375,
+ "high": 4584.31103515625,
+ "low": 4499.2080078125,
+ "close": 4543.89599609375,
+ "volume": 42264.5390625,
+ "amount": 192231104.0
+ },
+ {
+ "timestamp": "2025-09-01T03:00:00+08:00",
+ "open": 4543.2080078125,
+ "high": 4581.86279296875,
+ "low": 4515.0869140625,
+ "close": 4550.6015625,
+ "volume": 35673.5,
+ "amount": 162637792.0
+ },
+ {
+ "timestamp": "2025-09-01T04:00:00+08:00",
+ "open": 4550.373046875,
+ "high": 4585.73681640625,
+ "low": 4519.7255859375,
+ "close": 4546.40576171875,
+ "volume": 30567.98046875,
+ "amount": 139016640.0
+ },
+ {
+ "timestamp": "2025-09-01T05:00:00+08:00",
+ "open": 4534.3642578125,
+ "high": 4581.50537109375,
+ "low": 4489.97216796875,
+ "close": 4546.67041015625,
+ "volume": 33954.3828125,
+ "amount": 153468688.0
+ },
+ {
+ "timestamp": "2025-09-01T06:00:00+08:00",
+ "open": 4529.3857421875,
+ "high": 4570.0,
+ "low": 4492.39306640625,
+ "close": 4543.60791015625,
+ "volume": 38178.34765625,
+ "amount": 172492160.0
+ },
+ {
+ "timestamp": "2025-09-01T07:00:00+08:00",
+ "open": 4536.6728515625,
+ "high": 4578.05908203125,
+ "low": 4505.8515625,
+ "close": 4547.5517578125,
+ "volume": 37513.44140625,
+ "amount": 169059376.0
+ },
+ {
+ "timestamp": "2025-09-01T08:00:00+08:00",
+ "open": 4537.17333984375,
+ "high": 4579.54638671875,
+ "low": 4505.5595703125,
+ "close": 4542.337890625,
+ "volume": 37342.78125,
+ "amount": 168504400.0
+ },
+ {
+ "timestamp": "2025-09-01T09:00:00+08:00",
+ "open": 4542.44775390625,
+ "high": 4588.03955078125,
+ "low": 4512.2275390625,
+ "close": 4555.419921875,
+ "volume": 33891.13671875,
+ "amount": 153160720.0
+ },
+ {
+ "timestamp": "2025-09-01T10:00:00+08:00",
+ "open": 4555.69091796875,
+ "high": 4593.60205078125,
+ "low": 4519.77734375,
+ "close": 4554.9326171875,
+ "volume": 32961.81640625,
+ "amount": 149232912.0
+ },
+ {
+ "timestamp": "2025-09-01T11:00:00+08:00",
+ "open": 4551.8701171875,
+ "high": 4595.939453125,
+ "low": 4526.4951171875,
+ "close": 4567.53857421875,
+ "volume": 34340.46484375,
+ "amount": 154740672.0
+ },
+ {
+ "timestamp": "2025-09-01T12:00:00+08:00",
+ "open": 4551.22021484375,
+ "high": 4590.642578125,
+ "low": 4512.958984375,
+ "close": 4558.58251953125,
+ "volume": 31490.224609375,
+ "amount": 142267904.0
+ },
+ {
+ "timestamp": "2025-09-01T13:00:00+08:00",
+ "open": 4556.5498046875,
+ "high": 4597.73779296875,
+ "low": 4521.79736328125,
+ "close": 4563.30029296875,
+ "volume": 37523.03515625,
+ "amount": 168086096.0
+ },
+ {
+ "timestamp": "2025-09-01T14:00:00+08:00",
+ "open": 4547.9365234375,
+ "high": 4605.7509765625,
+ "low": 4512.25732421875,
+ "close": 4560.18017578125,
+ "volume": 40796.53125,
+ "amount": 184486400.0
+ },
+ {
+ "timestamp": "2025-09-01T15:00:00+08:00",
+ "open": 4551.7548828125,
+ "high": 4595.08203125,
+ "low": 4517.673828125,
+ "close": 4559.6455078125,
+ "volume": 40180.01171875,
+ "amount": 181325856.0
+ },
+ {
+ "timestamp": "2025-09-01T16:00:00+08:00",
+ "open": 4541.392578125,
+ "high": 4598.98291015625,
+ "low": 4504.27001953125,
+ "close": 4558.1953125,
+ "volume": 46832.625,
+ "amount": 209827136.0
+ },
+ {
+ "timestamp": "2025-09-01T17:00:00+08:00",
+ "open": 4537.3212890625,
+ "high": 4594.482421875,
+ "low": 4511.13330078125,
+ "close": 4558.16552734375,
+ "volume": 40158.1875,
+ "amount": 181835472.0
+ },
+ {
+ "timestamp": "2025-09-01T18:00:00+08:00",
+ "open": 4546.46044921875,
+ "high": 4598.70654296875,
+ "low": 4512.66943359375,
+ "close": 4566.07470703125,
+ "volume": 48231.7890625,
+ "amount": 216870304.0
+ },
+ {
+ "timestamp": "2025-09-01T19:00:00+08:00",
+ "open": 4564.17138671875,
+ "high": 4605.62255859375,
+ "low": 4527.1689453125,
+ "close": 4567.36376953125,
+ "volume": 44911.62109375,
+ "amount": 202784528.0
+ },
+ {
+ "timestamp": "2025-09-01T20:00:00+08:00",
+ "open": 4568.35400390625,
+ "high": 4608.775390625,
+ "low": 4530.666015625,
+ "close": 4572.20556640625,
+ "volume": 49538.671875,
+ "amount": 223670128.0
+ },
+ {
+ "timestamp": "2025-09-01T21:00:00+08:00",
+ "open": 4563.20166015625,
+ "high": 4604.4912109375,
+ "low": 4534.18212890625,
+ "close": 4578.16552734375,
+ "volume": 49131.1015625,
+ "amount": 219783520.0
+ },
+ {
+ "timestamp": "2025-09-01T22:00:00+08:00",
+ "open": 4562.595703125,
+ "high": 4601.8984375,
+ "low": 4534.12939453125,
+ "close": 4576.1748046875,
+ "volume": 40698.40234375,
+ "amount": 182535312.0
+ },
+ {
+ "timestamp": "2025-09-01T23:00:00+08:00",
+ "open": 4569.4189453125,
+ "high": 4614.7001953125,
+ "low": 4538.5859375,
+ "close": 4590.91455078125,
+ "volume": 45643.28125,
+ "amount": 204557808.0
+ },
+ {
+ "timestamp": "2025-09-02T00:00:00+08:00",
+ "open": 4578.15234375,
+ "high": 4619.27685546875,
+ "low": 4544.9169921875,
+ "close": 4587.79150390625,
+ "volume": 51975.890625,
+ "amount": 234901408.0
+ },
+ {
+ "timestamp": "2025-09-02T01:00:00+08:00",
+ "open": 4577.390625,
+ "high": 4631.59423828125,
+ "low": 4545.03125,
+ "close": 4585.9189453125,
+ "volume": 51274.875,
+ "amount": 230496544.0
+ },
+ {
+ "timestamp": "2025-09-02T02:00:00+08:00",
+ "open": 4573.42236328125,
+ "high": 4613.76318359375,
+ "low": 4528.8759765625,
+ "close": 4591.5029296875,
+ "volume": 43442.48828125,
+ "amount": 194660128.0
+ },
+ {
+ "timestamp": "2025-09-02T03:00:00+08:00",
+ "open": 4586.62841796875,
+ "high": 4624.18310546875,
+ "low": 4549.8232421875,
+ "close": 4587.60205078125,
+ "volume": 38606.8984375,
+ "amount": 173501440.0
+ },
+ {
+ "timestamp": "2025-09-02T04:00:00+08:00",
+ "open": 4585.529296875,
+ "high": 4624.11474609375,
+ "low": 4553.10400390625,
+ "close": 4596.857421875,
+ "volume": 38522.11328125,
+ "amount": 173502480.0
+ },
+ {
+ "timestamp": "2025-09-02T05:00:00+08:00",
+ "open": 4580.89501953125,
+ "high": 4630.5234375,
+ "low": 4539.7060546875,
+ "close": 4586.83935546875,
+ "volume": 42720.11328125,
+ "amount": 193021648.0
+ },
+ {
+ "timestamp": "2025-09-02T06:00:00+08:00",
+ "open": 4571.10107421875,
+ "high": 4617.46533203125,
+ "low": 4533.0322265625,
+ "close": 4578.92919921875,
+ "volume": 43508.734375,
+ "amount": 196595456.0
+ },
+ {
+ "timestamp": "2025-09-02T07:00:00+08:00",
+ "open": 4573.62548828125,
+ "high": 4611.6513671875,
+ "low": 4531.03515625,
+ "close": 4574.15771484375,
+ "volume": 42145.03125,
+ "amount": 189896544.0
+ },
+ {
+ "timestamp": "2025-09-02T08:00:00+08:00",
+ "open": 4573.3837890625,
+ "high": 4598.72802734375,
+ "low": 4536.0673828125,
+ "close": 4564.84228515625,
+ "volume": 34268.640625,
+ "amount": 154832912.0
+ },
+ {
+ "timestamp": "2025-09-02T09:00:00+08:00",
+ "open": 4557.5595703125,
+ "high": 4593.67431640625,
+ "low": 4520.9833984375,
+ "close": 4561.54150390625,
+ "volume": 39207.77734375,
+ "amount": 176473856.0
+ },
+ {
+ "timestamp": "2025-09-02T10:00:00+08:00",
+ "open": 4545.6884765625,
+ "high": 4589.771484375,
+ "low": 4508.16455078125,
+ "close": 4556.0419921875,
+ "volume": 40883.828125,
+ "amount": 183683680.0
+ },
+ {
+ "timestamp": "2025-09-02T11:00:00+08:00",
+ "open": 4544.94384765625,
+ "high": 4583.875,
+ "low": 4492.998046875,
+ "close": 4550.53857421875,
+ "volume": 40838.2109375,
+ "amount": 184617152.0
+ },
+ {
+ "timestamp": "2025-09-02T12:00:00+08:00",
+ "open": 4529.3046875,
+ "high": 4578.46484375,
+ "low": 4482.02197265625,
+ "close": 4535.69482421875,
+ "volume": 44927.51953125,
+ "amount": 202664016.0
+ },
+ {
+ "timestamp": "2025-09-02T13:00:00+08:00",
+ "open": 4532.599609375,
+ "high": 4572.65087890625,
+ "low": 4501.83447265625,
+ "close": 4543.251953125,
+ "volume": 39039.8125,
+ "amount": 175099296.0
+ },
+ {
+ "timestamp": "2025-09-02T14:00:00+08:00",
+ "open": 4534.67236328125,
+ "high": 4574.8134765625,
+ "low": 4495.57958984375,
+ "close": 4544.16552734375,
+ "volume": 40128.22265625,
+ "amount": 179932976.0
+ },
+ {
+ "timestamp": "2025-09-02T15:00:00+08:00",
+ "open": 4526.42822265625,
+ "high": 4581.20556640625,
+ "low": 4495.72021484375,
+ "close": 4545.689453125,
+ "volume": 45521.45703125,
+ "amount": 205629088.0
+ },
+ {
+ "timestamp": "2025-09-02T16:00:00+08:00",
+ "open": 4538.80908203125,
+ "high": 4583.529296875,
+ "low": 4509.79541015625,
+ "close": 4556.81591796875,
+ "volume": 38849.3828125,
+ "amount": 175604992.0
+ },
+ {
+ "timestamp": "2025-09-02T17:00:00+08:00",
+ "open": 4547.2919921875,
+ "high": 4591.7880859375,
+ "low": 4507.6572265625,
+ "close": 4550.9033203125,
+ "volume": 42733.4609375,
+ "amount": 193856672.0
+ },
+ {
+ "timestamp": "2025-09-02T18:00:00+08:00",
+ "open": 4537.7236328125,
+ "high": 4593.67041015625,
+ "low": 4491.9482421875,
+ "close": 4554.923828125,
+ "volume": 55684.0859375,
+ "amount": 249526496.0
+ },
+ {
+ "timestamp": "2025-09-02T19:00:00+08:00",
+ "open": 4550.138671875,
+ "high": 4607.232421875,
+ "low": 4510.49462890625,
+ "close": 4559.1455078125,
+ "volume": 53416.7578125,
+ "amount": 239459168.0
+ },
+ {
+ "timestamp": "2025-09-02T20:00:00+08:00",
+ "open": 4546.7890625,
+ "high": 4605.263671875,
+ "low": 4510.28369140625,
+ "close": 4563.14111328125,
+ "volume": 45000.546875,
+ "amount": 203496160.0
+ },
+ {
+ "timestamp": "2025-09-02T21:00:00+08:00",
+ "open": 4545.60302734375,
+ "high": 4589.77001953125,
+ "low": 4495.37060546875,
+ "close": 4555.21484375,
+ "volume": 45539.390625,
+ "amount": 205006336.0
+ },
+ {
+ "timestamp": "2025-09-02T22:00:00+08:00",
+ "open": 4546.20458984375,
+ "high": 4593.9287109375,
+ "low": 4513.806640625,
+ "close": 4561.802734375,
+ "volume": 39585.1484375,
+ "amount": 178231856.0
+ },
+ {
+ "timestamp": "2025-09-02T23:00:00+08:00",
+ "open": 4559.8203125,
+ "high": 4596.2900390625,
+ "low": 4524.34814453125,
+ "close": 4560.80419921875,
+ "volume": 40244.0390625,
+ "amount": 180489472.0
+ },
+ {
+ "timestamp": "2025-09-03T00:00:00+08:00",
+ "open": 4549.5927734375,
+ "high": 4597.9208984375,
+ "low": 4520.5087890625,
+ "close": 4563.94384765625,
+ "volume": 38034.07421875,
+ "amount": 171380160.0
+ },
+ {
+ "timestamp": "2025-09-03T01:00:00+08:00",
+ "open": 4558.900390625,
+ "high": 4607.0771484375,
+ "low": 4525.36865234375,
+ "close": 4572.4052734375,
+ "volume": 42806.9765625,
+ "amount": 191927728.0
+ },
+ {
+ "timestamp": "2025-09-03T02:00:00+08:00",
+ "open": 4569.9013671875,
+ "high": 4612.73583984375,
+ "low": 4535.84228515625,
+ "close": 4576.216796875,
+ "volume": 42280.65625,
+ "amount": 192226768.0
+ },
+ {
+ "timestamp": "2025-09-03T03:00:00+08:00",
+ "open": 4570.88134765625,
+ "high": 4606.115234375,
+ "low": 4536.02734375,
+ "close": 4574.78564453125,
+ "volume": 38558.3046875,
+ "amount": 174409024.0
+ },
+ {
+ "timestamp": "2025-09-03T04:00:00+08:00",
+ "open": 4562.32177734375,
+ "high": 4593.474609375,
+ "low": 4526.6728515625,
+ "close": 4564.43310546875,
+ "volume": 37037.171875,
+ "amount": 166321456.0
+ },
+ {
+ "timestamp": "2025-09-03T05:00:00+08:00",
+ "open": 4559.52734375,
+ "high": 4591.86083984375,
+ "low": 4521.20263671875,
+ "close": 4560.76611328125,
+ "volume": 38661.72265625,
+ "amount": 174025728.0
+ },
+ {
+ "timestamp": "2025-09-03T06:00:00+08:00",
+ "open": 4550.4130859375,
+ "high": 4602.3818359375,
+ "low": 4507.49951171875,
+ "close": 4562.0517578125,
+ "volume": 39403.13671875,
+ "amount": 176418672.0
+ },
+ {
+ "timestamp": "2025-09-03T07:00:00+08:00",
+ "open": 4555.890625,
+ "high": 4612.65576171875,
+ "low": 4530.1845703125,
+ "close": 4575.11669921875,
+ "volume": 38585.37109375,
+ "amount": 175562176.0
+ },
+ {
+ "timestamp": "2025-09-03T08:00:00+08:00",
+ "open": 4567.9541015625,
+ "high": 4604.32373046875,
+ "low": 4522.24072265625,
+ "close": 4564.3603515625,
+ "volume": 41344.58984375,
+ "amount": 186778160.0
+ },
+ {
+ "timestamp": "2025-09-03T09:00:00+08:00",
+ "open": 4560.51171875,
+ "high": 4601.98291015625,
+ "low": 4505.90380859375,
+ "close": 4555.81787109375,
+ "volume": 52268.02734375,
+ "amount": 233733104.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_121801.json b/webui/prediction_results/prediction_20250829_121801.json
new file mode 100644
index 0000000000000000000000000000000000000000..9eb08319610b04da1a66d2591d33771d826ed7c7
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_121801.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T12:18:01.979611",
+ "file_path": "BTCUSDT_1h",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "BTCUSDT",
+ "interval": "1h",
+ "limit": 400,
+ "lookback": 400,
+ "pred_len": 120,
+ "temperature": 1.2,
+ "top_p": 0.9,
+ "sample_count": 28,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 400,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 109100.24,
+ "max": 123847.82
+ },
+ "high": {
+ "min": 109910.68,
+ "max": 124474.0
+ },
+ "low": {
+ "min": 108666.66,
+ "max": 123337.66
+ },
+ "close": {
+ "min": 109100.23,
+ "max": 123847.83
+ }
+ },
+ "last_values": {
+ "open": 111419.98,
+ "high": 111606.6,
+ "low": 111302.27,
+ "close": 111571.88
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T12:00:00+08:00",
+ "open": 111678.046875,
+ "high": 112058.6484375,
+ "low": 111368.4765625,
+ "close": 111744.7734375,
+ "volume": 405.9655456542969,
+ "amount": 47038224.0
+ },
+ {
+ "timestamp": "2025-08-29T13:00:00+08:00",
+ "open": 111796.3828125,
+ "high": 112146.296875,
+ "low": 111461.4765625,
+ "close": 111780.171875,
+ "volume": 432.43914794921875,
+ "amount": 49848024.0
+ },
+ {
+ "timestamp": "2025-08-29T14:00:00+08:00",
+ "open": 111791.625,
+ "high": 112208.390625,
+ "low": 111419.890625,
+ "close": 111882.1484375,
+ "volume": 540.7537841796875,
+ "amount": 61842488.0
+ },
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 111769.8671875,
+ "high": 112259.59375,
+ "low": 111382.8125,
+ "close": 111854.5,
+ "volume": 554.3189086914062,
+ "amount": 62870188.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 111927.046875,
+ "high": 112388.6796875,
+ "low": 111471.046875,
+ "close": 111938.5078125,
+ "volume": 557.777099609375,
+ "amount": 63840504.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 111790.3203125,
+ "high": 112544.296875,
+ "low": 111308.9765625,
+ "close": 112095.5703125,
+ "volume": 734.0645141601562,
+ "amount": 83315408.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 112104.0703125,
+ "high": 112711.390625,
+ "low": 111511.2734375,
+ "close": 112256.734375,
+ "volume": 813.0852661132812,
+ "amount": 91869640.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 112036.8203125,
+ "high": 112828.796875,
+ "low": 111500.0390625,
+ "close": 112430.0625,
+ "volume": 814.6621704101562,
+ "amount": 93057072.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 112277.0390625,
+ "high": 113020.4453125,
+ "low": 111647.8203125,
+ "close": 112538.7109375,
+ "volume": 808.9354248046875,
+ "amount": 91927912.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 112360.5703125,
+ "high": 113118.484375,
+ "low": 111740.078125,
+ "close": 112733.21875,
+ "volume": 848.8428955078125,
+ "amount": 95803144.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 112677.671875,
+ "high": 113365.2421875,
+ "low": 112083.640625,
+ "close": 112972.515625,
+ "volume": 918.8619995117188,
+ "amount": 103425584.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 112883.890625,
+ "high": 113497.1484375,
+ "low": 112433.7421875,
+ "close": 113059.265625,
+ "volume": 894.2817993164062,
+ "amount": 101721584.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 112990.3203125,
+ "high": 113604.203125,
+ "low": 112319.265625,
+ "close": 113162.2578125,
+ "volume": 795.2791748046875,
+ "amount": 90507440.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 113053.015625,
+ "high": 113701.5703125,
+ "low": 112730.328125,
+ "close": 113401.4296875,
+ "volume": 835.3759155273438,
+ "amount": 95571496.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 113313.8515625,
+ "high": 113946.765625,
+ "low": 112822.28125,
+ "close": 113557.015625,
+ "volume": 908.225830078125,
+ "amount": 104284352.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 113491.3671875,
+ "high": 114152.734375,
+ "low": 112822.0625,
+ "close": 113787.734375,
+ "volume": 805.0210571289062,
+ "amount": 93016096.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 113709.828125,
+ "high": 114362.234375,
+ "low": 113255.1640625,
+ "close": 113878.640625,
+ "volume": 843.4304809570312,
+ "amount": 97360744.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 113846.5625,
+ "high": 114394.2578125,
+ "low": 113421.1484375,
+ "close": 114012.2734375,
+ "volume": 730.8413696289062,
+ "amount": 84390816.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 113922.25,
+ "high": 114599.1875,
+ "low": 113537.1875,
+ "close": 114216.015625,
+ "volume": 800.009521484375,
+ "amount": 91974744.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 114085.484375,
+ "high": 114788.0078125,
+ "low": 113634.375,
+ "close": 114381.109375,
+ "volume": 798.4268188476562,
+ "amount": 92166744.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 114266.0390625,
+ "high": 114902.3671875,
+ "low": 113825.8125,
+ "close": 114427.5078125,
+ "volume": 781.154541015625,
+ "amount": 90198160.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 114198.859375,
+ "high": 114718.0859375,
+ "low": 113719.09375,
+ "close": 114445.15625,
+ "volume": 727.2125854492188,
+ "amount": 84094280.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 114254.078125,
+ "high": 115053.984375,
+ "low": 113719.296875,
+ "close": 114578.6640625,
+ "volume": 787.0217895507812,
+ "amount": 90583872.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 114370.4765625,
+ "high": 114978.4375,
+ "low": 113954.0,
+ "close": 114610.1640625,
+ "volume": 698.4326171875,
+ "amount": 80562704.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 114524.578125,
+ "high": 114983.5234375,
+ "low": 114071.0390625,
+ "close": 114640.3984375,
+ "volume": 711.9177856445312,
+ "amount": 82456848.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 114473.9375,
+ "high": 115008.3671875,
+ "low": 113770.96875,
+ "close": 114655.96875,
+ "volume": 641.5777587890625,
+ "amount": 74140864.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 114599.3359375,
+ "high": 114959.15625,
+ "low": 114203.4140625,
+ "close": 114578.296875,
+ "volume": 603.5386352539062,
+ "amount": 69634744.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 114565.4453125,
+ "high": 115189.7265625,
+ "low": 114228.171875,
+ "close": 114749.9921875,
+ "volume": 824.3392944335938,
+ "amount": 94645616.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 114666.6953125,
+ "high": 115140.3828125,
+ "low": 114342.3359375,
+ "close": 114742.46875,
+ "volume": 706.1392211914062,
+ "amount": 81438368.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 114636.4453125,
+ "high": 115071.3515625,
+ "low": 114165.953125,
+ "close": 114799.7109375,
+ "volume": 603.8955078125,
+ "amount": 69889120.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 114637.8203125,
+ "high": 115285.8671875,
+ "low": 114242.046875,
+ "close": 114799.8125,
+ "volume": 709.6212158203125,
+ "amount": 82033984.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 114650.3359375,
+ "high": 115288.828125,
+ "low": 114052.4296875,
+ "close": 114782.5625,
+ "volume": 702.4822998046875,
+ "amount": 81290800.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 114726.6640625,
+ "high": 115218.671875,
+ "low": 114385.2265625,
+ "close": 114810.65625,
+ "volume": 642.02294921875,
+ "amount": 74575360.0
+ },
+ {
+ "timestamp": "2025-08-30T21:00:00+08:00",
+ "open": 114892.1875,
+ "high": 115429.2265625,
+ "low": 114520.5859375,
+ "close": 114968.1875,
+ "volume": 581.2764892578125,
+ "amount": 67660224.0
+ },
+ {
+ "timestamp": "2025-08-30T22:00:00+08:00",
+ "open": 114778.40625,
+ "high": 115230.03125,
+ "low": 114373.734375,
+ "close": 114951.84375,
+ "volume": 664.252197265625,
+ "amount": 76671360.0
+ },
+ {
+ "timestamp": "2025-08-30T23:00:00+08:00",
+ "open": 114792.9375,
+ "high": 115302.5703125,
+ "low": 114358.7734375,
+ "close": 114915.8828125,
+ "volume": 614.5665283203125,
+ "amount": 71216488.0
+ },
+ {
+ "timestamp": "2025-08-31T00:00:00+08:00",
+ "open": 114701.2421875,
+ "high": 115293.90625,
+ "low": 114356.75,
+ "close": 114886.0,
+ "volume": 758.6578979492188,
+ "amount": 87556176.0
+ },
+ {
+ "timestamp": "2025-08-31T01:00:00+08:00",
+ "open": 114800.234375,
+ "high": 115376.8203125,
+ "low": 114549.1953125,
+ "close": 114942.9453125,
+ "volume": 660.4749755859375,
+ "amount": 76325336.0
+ },
+ {
+ "timestamp": "2025-08-31T02:00:00+08:00",
+ "open": 114899.90625,
+ "high": 115435.015625,
+ "low": 114550.4140625,
+ "close": 115096.53125,
+ "volume": 677.5713500976562,
+ "amount": 78511792.0
+ },
+ {
+ "timestamp": "2025-08-31T03:00:00+08:00",
+ "open": 115009.75,
+ "high": 115614.5625,
+ "low": 114704.109375,
+ "close": 115275.328125,
+ "volume": 627.1311645507812,
+ "amount": 72788048.0
+ },
+ {
+ "timestamp": "2025-08-31T04:00:00+08:00",
+ "open": 115312.7265625,
+ "high": 115785.8828125,
+ "low": 114951.515625,
+ "close": 115352.828125,
+ "volume": 684.791259765625,
+ "amount": 79607792.0
+ },
+ {
+ "timestamp": "2025-08-31T05:00:00+08:00",
+ "open": 115360.7890625,
+ "high": 115944.265625,
+ "low": 114984.9296875,
+ "close": 115551.5390625,
+ "volume": 759.218017578125,
+ "amount": 88073592.0
+ },
+ {
+ "timestamp": "2025-08-31T06:00:00+08:00",
+ "open": 115514.921875,
+ "high": 115978.9609375,
+ "low": 115180.875,
+ "close": 115584.578125,
+ "volume": 731.6386108398438,
+ "amount": 84956176.0
+ },
+ {
+ "timestamp": "2025-08-31T07:00:00+08:00",
+ "open": 115572.9765625,
+ "high": 116045.5859375,
+ "low": 115320.328125,
+ "close": 115734.9375,
+ "volume": 672.762451171875,
+ "amount": 78672560.0
+ },
+ {
+ "timestamp": "2025-08-31T08:00:00+08:00",
+ "open": 115623.4453125,
+ "high": 116154.1875,
+ "low": 115299.625,
+ "close": 115679.859375,
+ "volume": 678.5626831054688,
+ "amount": 79602008.0
+ },
+ {
+ "timestamp": "2025-08-31T09:00:00+08:00",
+ "open": 115533.9140625,
+ "high": 116118.5234375,
+ "low": 115244.1015625,
+ "close": 115750.1484375,
+ "volume": 656.5803833007812,
+ "amount": 76637552.0
+ },
+ {
+ "timestamp": "2025-08-31T10:00:00+08:00",
+ "open": 115534.28125,
+ "high": 116049.2265625,
+ "low": 115140.5234375,
+ "close": 115718.9765625,
+ "volume": 673.4630737304688,
+ "amount": 78149592.0
+ },
+ {
+ "timestamp": "2025-08-31T11:00:00+08:00",
+ "open": 115686.109375,
+ "high": 116227.015625,
+ "low": 115103.0078125,
+ "close": 115691.7265625,
+ "volume": 730.6686401367188,
+ "amount": 85101936.0
+ },
+ {
+ "timestamp": "2025-08-31T12:00:00+08:00",
+ "open": 115557.546875,
+ "high": 116038.984375,
+ "low": 115196.140625,
+ "close": 115637.84375,
+ "volume": 616.0569458007812,
+ "amount": 71511352.0
+ },
+ {
+ "timestamp": "2025-08-31T13:00:00+08:00",
+ "open": 115577.7578125,
+ "high": 116125.296875,
+ "low": 115175.7734375,
+ "close": 115594.984375,
+ "volume": 715.7029418945312,
+ "amount": 83584912.0
+ },
+ {
+ "timestamp": "2025-08-31T14:00:00+08:00",
+ "open": 115540.7734375,
+ "high": 115974.453125,
+ "low": 115086.125,
+ "close": 115500.296875,
+ "volume": 668.9669799804688,
+ "amount": 77617560.0
+ },
+ {
+ "timestamp": "2025-08-31T15:00:00+08:00",
+ "open": 115392.5703125,
+ "high": 115996.546875,
+ "low": 115064.015625,
+ "close": 115569.5546875,
+ "volume": 799.4886474609375,
+ "amount": 92742384.0
+ },
+ {
+ "timestamp": "2025-08-31T16:00:00+08:00",
+ "open": 115492.515625,
+ "high": 116025.59375,
+ "low": 115198.1640625,
+ "close": 115712.5703125,
+ "volume": 608.7568359375,
+ "amount": 70650136.0
+ },
+ {
+ "timestamp": "2025-08-31T17:00:00+08:00",
+ "open": 115824.375,
+ "high": 116295.296875,
+ "low": 115440.90625,
+ "close": 115886.5546875,
+ "volume": 655.3104248046875,
+ "amount": 75839392.0
+ },
+ {
+ "timestamp": "2025-08-31T18:00:00+08:00",
+ "open": 115781.7421875,
+ "high": 116216.75,
+ "low": 115292.1875,
+ "close": 115914.1015625,
+ "volume": 737.2243041992188,
+ "amount": 85503688.0
+ },
+ {
+ "timestamp": "2025-08-31T19:00:00+08:00",
+ "open": 115817.6796875,
+ "high": 116349.8828125,
+ "low": 115472.5234375,
+ "close": 115940.0078125,
+ "volume": 702.83349609375,
+ "amount": 81555112.0
+ },
+ {
+ "timestamp": "2025-08-31T20:00:00+08:00",
+ "open": 115901.71875,
+ "high": 116512.8125,
+ "low": 115638.859375,
+ "close": 116140.46875,
+ "volume": 659.1805419921875,
+ "amount": 76850248.0
+ },
+ {
+ "timestamp": "2025-08-31T21:00:00+08:00",
+ "open": 116034.828125,
+ "high": 116533.2265625,
+ "low": 115556.8984375,
+ "close": 115999.234375,
+ "volume": 703.81787109375,
+ "amount": 80180824.0
+ },
+ {
+ "timestamp": "2025-08-31T22:00:00+08:00",
+ "open": 116069.2890625,
+ "high": 116596.6953125,
+ "low": 115546.0390625,
+ "close": 116206.28125,
+ "volume": 803.7196044921875,
+ "amount": 92996728.0
+ },
+ {
+ "timestamp": "2025-08-31T23:00:00+08:00",
+ "open": 116168.6015625,
+ "high": 116798.75,
+ "low": 115866.921875,
+ "close": 116420.046875,
+ "volume": 798.1824340820312,
+ "amount": 92726352.0
+ },
+ {
+ "timestamp": "2025-09-01T00:00:00+08:00",
+ "open": 116389.359375,
+ "high": 116927.6171875,
+ "low": 116036.3203125,
+ "close": 116534.2890625,
+ "volume": 874.3668823242188,
+ "amount": 102158488.0
+ },
+ {
+ "timestamp": "2025-09-01T01:00:00+08:00",
+ "open": 116445.0546875,
+ "high": 117008.7265625,
+ "low": 115990.6328125,
+ "close": 116543.7890625,
+ "volume": 883.1549682617188,
+ "amount": 102974064.0
+ },
+ {
+ "timestamp": "2025-09-01T02:00:00+08:00",
+ "open": 116323.375,
+ "high": 116852.796875,
+ "low": 115945.9921875,
+ "close": 116528.578125,
+ "volume": 842.6671142578125,
+ "amount": 97626464.0
+ },
+ {
+ "timestamp": "2025-09-01T03:00:00+08:00",
+ "open": 116487.3203125,
+ "high": 116942.203125,
+ "low": 116169.2890625,
+ "close": 116584.1484375,
+ "volume": 651.710693359375,
+ "amount": 76004512.0
+ },
+ {
+ "timestamp": "2025-09-01T04:00:00+08:00",
+ "open": 116594.375,
+ "high": 116920.8359375,
+ "low": 116259.4765625,
+ "close": 116554.0625,
+ "volume": 561.9791870117188,
+ "amount": 65773012.0
+ },
+ {
+ "timestamp": "2025-09-01T05:00:00+08:00",
+ "open": 116431.3125,
+ "high": 116817.296875,
+ "low": 116082.171875,
+ "close": 116428.109375,
+ "volume": 576.2901000976562,
+ "amount": 67000744.0
+ },
+ {
+ "timestamp": "2025-09-01T06:00:00+08:00",
+ "open": 116441.5859375,
+ "high": 116920.515625,
+ "low": 116157.0234375,
+ "close": 116459.3203125,
+ "volume": 598.8751831054688,
+ "amount": 69953344.0
+ },
+ {
+ "timestamp": "2025-09-01T07:00:00+08:00",
+ "open": 116404.265625,
+ "high": 116829.828125,
+ "low": 116023.109375,
+ "close": 116423.4453125,
+ "volume": 596.3116455078125,
+ "amount": 69609616.0
+ },
+ {
+ "timestamp": "2025-09-01T08:00:00+08:00",
+ "open": 116430.609375,
+ "high": 116915.65625,
+ "low": 116025.4453125,
+ "close": 116406.953125,
+ "volume": 673.6424560546875,
+ "amount": 78286288.0
+ },
+ {
+ "timestamp": "2025-09-01T09:00:00+08:00",
+ "open": 116380.3984375,
+ "high": 116850.671875,
+ "low": 116046.046875,
+ "close": 116446.421875,
+ "volume": 589.7572631835938,
+ "amount": 68686032.0
+ },
+ {
+ "timestamp": "2025-09-01T10:00:00+08:00",
+ "open": 116416.1640625,
+ "high": 116779.859375,
+ "low": 116009.5078125,
+ "close": 116385.1953125,
+ "volume": 618.2947387695312,
+ "amount": 72080168.0
+ },
+ {
+ "timestamp": "2025-09-01T11:00:00+08:00",
+ "open": 116316.421875,
+ "high": 116879.671875,
+ "low": 115941.8125,
+ "close": 116481.2265625,
+ "volume": 678.6925659179688,
+ "amount": 79048768.0
+ },
+ {
+ "timestamp": "2025-09-01T12:00:00+08:00",
+ "open": 116406.1875,
+ "high": 116958.2734375,
+ "low": 116042.8515625,
+ "close": 116494.7890625,
+ "volume": 633.0341796875,
+ "amount": 73585200.0
+ },
+ {
+ "timestamp": "2025-09-01T13:00:00+08:00",
+ "open": 116524.4375,
+ "high": 116815.578125,
+ "low": 116129.515625,
+ "close": 116458.8125,
+ "volume": 773.78173828125,
+ "amount": 89548216.0
+ },
+ {
+ "timestamp": "2025-09-01T14:00:00+08:00",
+ "open": 116257.9765625,
+ "high": 117002.4609375,
+ "low": 115768.4609375,
+ "close": 116466.953125,
+ "volume": 730.5646362304688,
+ "amount": 85442800.0
+ },
+ {
+ "timestamp": "2025-09-01T15:00:00+08:00",
+ "open": 116394.4375,
+ "high": 117111.53125,
+ "low": 115888.4609375,
+ "close": 116620.1328125,
+ "volume": 750.8353881835938,
+ "amount": 87240464.0
+ },
+ {
+ "timestamp": "2025-09-01T16:00:00+08:00",
+ "open": 116480.3046875,
+ "high": 117249.8828125,
+ "low": 116091.0859375,
+ "close": 116582.828125,
+ "volume": 719.80810546875,
+ "amount": 83425224.0
+ },
+ {
+ "timestamp": "2025-09-01T17:00:00+08:00",
+ "open": 116625.28125,
+ "high": 117148.9140625,
+ "low": 116169.171875,
+ "close": 116616.453125,
+ "volume": 748.014892578125,
+ "amount": 86873928.0
+ },
+ {
+ "timestamp": "2025-09-01T18:00:00+08:00",
+ "open": 116465.78125,
+ "high": 117228.6875,
+ "low": 116200.203125,
+ "close": 116746.9609375,
+ "volume": 723.50634765625,
+ "amount": 84327800.0
+ },
+ {
+ "timestamp": "2025-09-01T19:00:00+08:00",
+ "open": 116727.921875,
+ "high": 117215.734375,
+ "low": 116388.9765625,
+ "close": 116691.78125,
+ "volume": 711.3038330078125,
+ "amount": 83376272.0
+ },
+ {
+ "timestamp": "2025-09-01T20:00:00+08:00",
+ "open": 116661.4296875,
+ "high": 117299.2734375,
+ "low": 116213.953125,
+ "close": 116756.6953125,
+ "volume": 849.3621826171875,
+ "amount": 99181008.0
+ },
+ {
+ "timestamp": "2025-09-01T21:00:00+08:00",
+ "open": 116673.796875,
+ "high": 117209.4609375,
+ "low": 116284.578125,
+ "close": 116691.109375,
+ "volume": 773.4111938476562,
+ "amount": 89430880.0
+ },
+ {
+ "timestamp": "2025-09-01T22:00:00+08:00",
+ "open": 116553.0546875,
+ "high": 117246.6796875,
+ "low": 116192.1484375,
+ "close": 116739.421875,
+ "volume": 808.733642578125,
+ "amount": 93944392.0
+ },
+ {
+ "timestamp": "2025-09-01T23:00:00+08:00",
+ "open": 116491.140625,
+ "high": 117103.796875,
+ "low": 116092.3515625,
+ "close": 116613.71875,
+ "volume": 920.4912109375,
+ "amount": 106971280.0
+ },
+ {
+ "timestamp": "2025-09-02T00:00:00+08:00",
+ "open": 116399.4453125,
+ "high": 117119.078125,
+ "low": 115873.90625,
+ "close": 116414.9140625,
+ "volume": 793.8433227539062,
+ "amount": 92618888.0
+ },
+ {
+ "timestamp": "2025-09-02T01:00:00+08:00",
+ "open": 116417.2265625,
+ "high": 116951.7890625,
+ "low": 116031.484375,
+ "close": 116506.4453125,
+ "volume": 808.601318359375,
+ "amount": 93406744.0
+ },
+ {
+ "timestamp": "2025-09-02T02:00:00+08:00",
+ "open": 116429.640625,
+ "high": 116834.796875,
+ "low": 116019.84375,
+ "close": 116483.15625,
+ "volume": 710.8600463867188,
+ "amount": 82647384.0
+ },
+ {
+ "timestamp": "2025-09-02T03:00:00+08:00",
+ "open": 116495.25,
+ "high": 116970.953125,
+ "low": 116084.34375,
+ "close": 116569.046875,
+ "volume": 686.535400390625,
+ "amount": 79612024.0
+ },
+ {
+ "timestamp": "2025-09-02T04:00:00+08:00",
+ "open": 116586.171875,
+ "high": 117087.5234375,
+ "low": 116261.9609375,
+ "close": 116622.140625,
+ "volume": 735.083984375,
+ "amount": 85561152.0
+ },
+ {
+ "timestamp": "2025-09-02T05:00:00+08:00",
+ "open": 116569.5,
+ "high": 117161.53125,
+ "low": 116007.578125,
+ "close": 116711.9921875,
+ "volume": 816.1932983398438,
+ "amount": 94527072.0
+ },
+ {
+ "timestamp": "2025-09-02T06:00:00+08:00",
+ "open": 116695.4140625,
+ "high": 117297.7890625,
+ "low": 116287.859375,
+ "close": 116752.4765625,
+ "volume": 736.2598876953125,
+ "amount": 84852048.0
+ },
+ {
+ "timestamp": "2025-09-02T07:00:00+08:00",
+ "open": 116725.03125,
+ "high": 117269.546875,
+ "low": 116203.7109375,
+ "close": 116853.1640625,
+ "volume": 763.790771484375,
+ "amount": 87616032.0
+ },
+ {
+ "timestamp": "2025-09-02T08:00:00+08:00",
+ "open": 116773.21875,
+ "high": 117348.953125,
+ "low": 116227.7109375,
+ "close": 116833.1328125,
+ "volume": 725.4615478515625,
+ "amount": 83941232.0
+ },
+ {
+ "timestamp": "2025-09-02T09:00:00+08:00",
+ "open": 116720.015625,
+ "high": 117093.6796875,
+ "low": 116395.734375,
+ "close": 116710.140625,
+ "volume": 614.5234375,
+ "amount": 70651232.0
+ },
+ {
+ "timestamp": "2025-09-02T10:00:00+08:00",
+ "open": 116630.1328125,
+ "high": 117353.0625,
+ "low": 116104.546875,
+ "close": 116951.4296875,
+ "volume": 880.6514892578125,
+ "amount": 101482296.0
+ },
+ {
+ "timestamp": "2025-09-02T11:00:00+08:00",
+ "open": 116990.328125,
+ "high": 117588.421875,
+ "low": 116374.0234375,
+ "close": 117017.65625,
+ "volume": 1038.6826171875,
+ "amount": 119858336.0
+ },
+ {
+ "timestamp": "2025-09-02T12:00:00+08:00",
+ "open": 116960.0390625,
+ "high": 117878.4453125,
+ "low": 116285.1171875,
+ "close": 117057.5390625,
+ "volume": 1086.5096435546875,
+ "amount": 126333256.0
+ },
+ {
+ "timestamp": "2025-09-02T13:00:00+08:00",
+ "open": 116975.890625,
+ "high": 117648.390625,
+ "low": 116486.5078125,
+ "close": 116986.75,
+ "volume": 1048.0028076171875,
+ "amount": 121992384.0
+ },
+ {
+ "timestamp": "2025-09-02T14:00:00+08:00",
+ "open": 116970.4609375,
+ "high": 117512.6171875,
+ "low": 116285.015625,
+ "close": 116903.984375,
+ "volume": 1220.4796142578125,
+ "amount": 141025200.0
+ },
+ {
+ "timestamp": "2025-09-02T15:00:00+08:00",
+ "open": 116793.2734375,
+ "high": 117350.84375,
+ "low": 116253.96875,
+ "close": 116932.8828125,
+ "volume": 1061.6988525390625,
+ "amount": 122746336.0
+ },
+ {
+ "timestamp": "2025-09-02T16:00:00+08:00",
+ "open": 116853.75,
+ "high": 117340.28125,
+ "low": 116209.3203125,
+ "close": 116892.1953125,
+ "volume": 974.4564819335938,
+ "amount": 113368176.0
+ },
+ {
+ "timestamp": "2025-09-02T17:00:00+08:00",
+ "open": 116773.203125,
+ "high": 117273.4921875,
+ "low": 116271.046875,
+ "close": 116836.796875,
+ "volume": 854.284912109375,
+ "amount": 99006200.0
+ },
+ {
+ "timestamp": "2025-09-02T18:00:00+08:00",
+ "open": 116814.1796875,
+ "high": 117335.03125,
+ "low": 116232.4609375,
+ "close": 116615.2109375,
+ "volume": 915.4868774414062,
+ "amount": 106284608.0
+ },
+ {
+ "timestamp": "2025-09-02T19:00:00+08:00",
+ "open": 116645.75,
+ "high": 117190.46875,
+ "low": 116190.78125,
+ "close": 116695.890625,
+ "volume": 877.5885009765625,
+ "amount": 102406208.0
+ },
+ {
+ "timestamp": "2025-09-02T20:00:00+08:00",
+ "open": 116690.3359375,
+ "high": 117289.0,
+ "low": 116284.9921875,
+ "close": 116861.890625,
+ "volume": 813.2171020507812,
+ "amount": 95104096.0
+ },
+ {
+ "timestamp": "2025-09-02T21:00:00+08:00",
+ "open": 116586.84375,
+ "high": 117456.0390625,
+ "low": 116077.8515625,
+ "close": 116976.3046875,
+ "volume": 837.3500366210938,
+ "amount": 97072624.0
+ },
+ {
+ "timestamp": "2025-09-02T22:00:00+08:00",
+ "open": 116821.7734375,
+ "high": 117490.1875,
+ "low": 116459.0625,
+ "close": 117040.109375,
+ "volume": 823.6553955078125,
+ "amount": 95456992.0
+ },
+ {
+ "timestamp": "2025-09-02T23:00:00+08:00",
+ "open": 116939.8359375,
+ "high": 117548.5,
+ "low": 116343.2734375,
+ "close": 116860.359375,
+ "volume": 903.7700805664062,
+ "amount": 106190528.0
+ },
+ {
+ "timestamp": "2025-09-03T00:00:00+08:00",
+ "open": 116851.59375,
+ "high": 117449.265625,
+ "low": 116460.4609375,
+ "close": 116942.8671875,
+ "volume": 916.7927856445312,
+ "amount": 105813096.0
+ },
+ {
+ "timestamp": "2025-09-03T01:00:00+08:00",
+ "open": 116909.53125,
+ "high": 117407.3828125,
+ "low": 116448.3515625,
+ "close": 117044.453125,
+ "volume": 970.6868286132812,
+ "amount": 111699568.0
+ },
+ {
+ "timestamp": "2025-09-03T02:00:00+08:00",
+ "open": 116947.421875,
+ "high": 117452.09375,
+ "low": 116580.1796875,
+ "close": 117036.84375,
+ "volume": 878.35986328125,
+ "amount": 101479472.0
+ },
+ {
+ "timestamp": "2025-09-03T03:00:00+08:00",
+ "open": 117057.7265625,
+ "high": 117585.34375,
+ "low": 116583.21875,
+ "close": 116957.5,
+ "volume": 864.3232421875,
+ "amount": 101240544.0
+ },
+ {
+ "timestamp": "2025-09-03T04:00:00+08:00",
+ "open": 116940.359375,
+ "high": 117445.15625,
+ "low": 116404.328125,
+ "close": 116904.671875,
+ "volume": 965.25244140625,
+ "amount": 111657992.0
+ },
+ {
+ "timestamp": "2025-09-03T05:00:00+08:00",
+ "open": 116881.9921875,
+ "high": 117506.8359375,
+ "low": 116296.328125,
+ "close": 116913.8828125,
+ "volume": 894.0365600585938,
+ "amount": 102694544.0
+ },
+ {
+ "timestamp": "2025-09-03T06:00:00+08:00",
+ "open": 116839.6875,
+ "high": 117333.625,
+ "low": 116448.0,
+ "close": 116912.3828125,
+ "volume": 804.3404541015625,
+ "amount": 92952784.0
+ },
+ {
+ "timestamp": "2025-09-03T07:00:00+08:00",
+ "open": 116795.6796875,
+ "high": 117417.1875,
+ "low": 116176.1875,
+ "close": 116844.609375,
+ "volume": 940.32763671875,
+ "amount": 107772080.0
+ },
+ {
+ "timestamp": "2025-09-03T08:00:00+08:00",
+ "open": 116873.9609375,
+ "high": 117542.6484375,
+ "low": 116350.9140625,
+ "close": 117018.234375,
+ "volume": 1004.404541015625,
+ "amount": 116074672.0
+ },
+ {
+ "timestamp": "2025-09-03T09:00:00+08:00",
+ "open": 117027.796875,
+ "high": 117507.4765625,
+ "low": 116469.2890625,
+ "close": 117087.5,
+ "volume": 854.998291015625,
+ "amount": 97757368.0
+ },
+ {
+ "timestamp": "2025-09-03T10:00:00+08:00",
+ "open": 117158.8203125,
+ "high": 117742.921875,
+ "low": 116412.296875,
+ "close": 117156.15625,
+ "volume": 863.2265014648438,
+ "amount": 99458456.0
+ },
+ {
+ "timestamp": "2025-09-03T11:00:00+08:00",
+ "open": 117090.3984375,
+ "high": 117729.953125,
+ "low": 116688.0703125,
+ "close": 117370.34375,
+ "volume": 1098.5123291015625,
+ "amount": 125798176.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_144119.json b/webui/prediction_results/prediction_20250829_144119.json
new file mode 100644
index 0000000000000000000000000000000000000000..b99f2807c37494cdb7fa213dd8f15d8369092746
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_144119.json
@@ -0,0 +1,2243 @@
+{
+ "timestamp": "2025-08-29T14:41:19.787855",
+ "file_path": "SOLUSDT_1h",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "SOLUSDT",
+ "interval": "1h",
+ "limit": 1000,
+ "lookback": 400,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 1,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 400,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 156.64,
+ "max": 205.7
+ },
+ "high": {
+ "min": 158.52,
+ "max": 206.3
+ },
+ "low": {
+ "min": 155.83,
+ "max": 203.36
+ },
+ "close": {
+ "min": 156.63,
+ "max": 205.7
+ }
+ },
+ "last_values": {
+ "open": 162.23,
+ "high": 162.44,
+ "low": 161.26,
+ "close": 162.23
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 161.17906188964844,
+ "high": 161.45286560058594,
+ "low": 160.79344177246094,
+ "close": 160.83462524414062,
+ "volume": 70348.1953125,
+ "amount": 11386960.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 161.05076599121094,
+ "high": 161.78805541992188,
+ "low": 159.93914794921875,
+ "close": 160.9297637939453,
+ "volume": 167794.0625,
+ "amount": 26701548.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 160.85980224609375,
+ "high": 161.50103759765625,
+ "low": 159.98812866210938,
+ "close": 160.59483337402344,
+ "volume": 126656.7421875,
+ "amount": 20341272.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 161.05235290527344,
+ "high": 161.1339111328125,
+ "low": 157.01278686523438,
+ "close": 157.97239685058594,
+ "volume": 227488.5625,
+ "amount": 36477924.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 157.89866638183594,
+ "high": 158.9061737060547,
+ "low": 156.7437744140625,
+ "close": 157.7850341796875,
+ "volume": 184277.515625,
+ "amount": 29438422.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 158.34718322753906,
+ "high": 159.40484619140625,
+ "low": 158.11962890625,
+ "close": 158.8380889892578,
+ "volume": 92614.171875,
+ "amount": 14456772.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 160.07186889648438,
+ "high": 161.02035522460938,
+ "low": 158.61012268066406,
+ "close": 160.25523376464844,
+ "volume": 85173.9375,
+ "amount": 11956822.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 160.3734893798828,
+ "high": 161.83810424804688,
+ "low": 159.63441467285156,
+ "close": 161.0004119873047,
+ "volume": 132487.359375,
+ "amount": 20846220.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 162.53939819335938,
+ "high": 163.0418701171875,
+ "low": 159.56105041503906,
+ "close": 159.72625732421875,
+ "volume": 145127.640625,
+ "amount": 23415742.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 160.64381408691406,
+ "high": 161.28497314453125,
+ "low": 160.38970947265625,
+ "close": 160.77296447753906,
+ "volume": 71809.2265625,
+ "amount": 11642340.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 160.72378540039062,
+ "high": 162.29811096191406,
+ "low": 160.02459716796875,
+ "close": 161.84666442871094,
+ "volume": 87875.03125,
+ "amount": 14132009.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 161.62696838378906,
+ "high": 161.76670837402344,
+ "low": 160.96514892578125,
+ "close": 160.9419403076172,
+ "volume": 74637.171875,
+ "amount": 12041958.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 161.14598083496094,
+ "high": 161.54042053222656,
+ "low": 160.8828887939453,
+ "close": 160.97665405273438,
+ "volume": 61887.0625,
+ "amount": 10198354.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 161.08091735839844,
+ "high": 161.11135864257812,
+ "low": 160.46658325195312,
+ "close": 160.5911865234375,
+ "volume": 55093.03125,
+ "amount": 9022342.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 160.5637664794922,
+ "high": 161.41160583496094,
+ "low": 159.7776641845703,
+ "close": 160.62754821777344,
+ "volume": 108710.03125,
+ "amount": 17464460.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 159.79046630859375,
+ "high": 162.5747833251953,
+ "low": 158.92007446289062,
+ "close": 162.000732421875,
+ "volume": 146738.90625,
+ "amount": 23292004.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 161.6672821044922,
+ "high": 162.92276000976562,
+ "low": 160.92135620117188,
+ "close": 162.2119598388672,
+ "volume": 113902.171875,
+ "amount": 18079454.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 161.6236572265625,
+ "high": 162.6363983154297,
+ "low": 160.5178985595703,
+ "close": 161.68124389648438,
+ "volume": 124147.4296875,
+ "amount": 19821166.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 161.41561889648438,
+ "high": 162.56195068359375,
+ "low": 160.4806671142578,
+ "close": 161.75148010253906,
+ "volume": 129868.703125,
+ "amount": 20738592.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 162.20692443847656,
+ "high": 162.2939453125,
+ "low": 159.66802978515625,
+ "close": 159.9722900390625,
+ "volume": 165946.34375,
+ "amount": 26951640.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 159.56224060058594,
+ "high": 162.63214111328125,
+ "low": 158.2108154296875,
+ "close": 161.28077697753906,
+ "volume": 248590.21875,
+ "amount": 38900288.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 161.2432403564453,
+ "high": 161.38619995117188,
+ "low": 160.46864318847656,
+ "close": 160.70884704589844,
+ "volume": 72224.78125,
+ "amount": 11461064.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 161.16954040527344,
+ "high": 162.46363830566406,
+ "low": 160.8431396484375,
+ "close": 161.90090942382812,
+ "volume": 89050.453125,
+ "amount": 14281813.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 161.4658203125,
+ "high": 162.0313720703125,
+ "low": 160.48248291015625,
+ "close": 161.01217651367188,
+ "volume": 112678.671875,
+ "amount": 18114584.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 160.9954071044922,
+ "high": 161.2670135498047,
+ "low": 159.81051635742188,
+ "close": 159.9397430419922,
+ "volume": 103631.3203125,
+ "amount": 16626471.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 160.16465759277344,
+ "high": 162.23768615722656,
+ "low": 159.4470977783203,
+ "close": 161.68736267089844,
+ "volume": 94569.109375,
+ "amount": 15133030.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 161.5039825439453,
+ "high": 162.46461486816406,
+ "low": 160.74798583984375,
+ "close": 161.6398162841797,
+ "volume": 104232.078125,
+ "amount": 17014232.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 161.4305877685547,
+ "high": 162.67420959472656,
+ "low": 160.66598510742188,
+ "close": 162.05223083496094,
+ "volume": 91566.140625,
+ "amount": 14759682.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 163.6189422607422,
+ "high": 163.2269287109375,
+ "low": 159.4185791015625,
+ "close": 159.3329315185547,
+ "volume": 174770.5,
+ "amount": 29251498.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 161.492919921875,
+ "high": 162.29168701171875,
+ "low": 159.6300506591797,
+ "close": 161.3277130126953,
+ "volume": 96570.21875,
+ "amount": 14269164.0
+ },
+ {
+ "timestamp": "2025-08-30T21:00:00+08:00",
+ "open": 161.47935485839844,
+ "high": 162.03028869628906,
+ "low": 161.01309204101562,
+ "close": 161.294677734375,
+ "volume": 77153.609375,
+ "amount": 12156504.0
+ },
+ {
+ "timestamp": "2025-08-30T22:00:00+08:00",
+ "open": 161.44398498535156,
+ "high": 161.51011657714844,
+ "low": 160.69593811035156,
+ "close": 160.8939971923828,
+ "volume": 60425.140625,
+ "amount": 9547498.0
+ },
+ {
+ "timestamp": "2025-08-30T23:00:00+08:00",
+ "open": 160.93128967285156,
+ "high": 161.4699249267578,
+ "low": 160.6180877685547,
+ "close": 160.85044860839844,
+ "volume": 67414.671875,
+ "amount": 10920558.0
+ },
+ {
+ "timestamp": "2025-08-31T00:00:00+08:00",
+ "open": 160.69317626953125,
+ "high": 161.03347778320312,
+ "low": 159.5727996826172,
+ "close": 159.81100463867188,
+ "volume": 90971.5390625,
+ "amount": 14634173.0
+ },
+ {
+ "timestamp": "2025-08-31T01:00:00+08:00",
+ "open": 160.38609313964844,
+ "high": 163.7931671142578,
+ "low": 159.31918334960938,
+ "close": 163.0769500732422,
+ "volume": 117866.2734375,
+ "amount": 18909072.0
+ },
+ {
+ "timestamp": "2025-08-31T02:00:00+08:00",
+ "open": 162.4783477783203,
+ "high": 162.56265258789062,
+ "low": 160.9515838623047,
+ "close": 161.543701171875,
+ "volume": 80715.6640625,
+ "amount": 11966504.0
+ },
+ {
+ "timestamp": "2025-08-31T03:00:00+08:00",
+ "open": 162.1942596435547,
+ "high": 163.8866424560547,
+ "low": 161.9018096923828,
+ "close": 163.31442260742188,
+ "volume": 79117.4765625,
+ "amount": 12835516.0
+ },
+ {
+ "timestamp": "2025-08-31T04:00:00+08:00",
+ "open": 163.2894287109375,
+ "high": 163.20985412597656,
+ "low": 160.4002685546875,
+ "close": 160.60891723632812,
+ "volume": 143881.578125,
+ "amount": 23569008.0
+ },
+ {
+ "timestamp": "2025-08-31T05:00:00+08:00",
+ "open": 161.2875518798828,
+ "high": 162.34719848632812,
+ "low": 159.91839599609375,
+ "close": 161.49600219726562,
+ "volume": 78041.7109375,
+ "amount": 11359644.0
+ },
+ {
+ "timestamp": "2025-08-31T06:00:00+08:00",
+ "open": 162.6195068359375,
+ "high": 163.1264190673828,
+ "low": 161.93960571289062,
+ "close": 162.53570556640625,
+ "volume": 69858.921875,
+ "amount": 11077598.0
+ },
+ {
+ "timestamp": "2025-08-31T07:00:00+08:00",
+ "open": 162.4152374267578,
+ "high": 162.33221435546875,
+ "low": 161.5100860595703,
+ "close": 161.56878662109375,
+ "volume": 56789.3671875,
+ "amount": 8957020.0
+ },
+ {
+ "timestamp": "2025-08-31T08:00:00+08:00",
+ "open": 162.19097900390625,
+ "high": 164.0687255859375,
+ "low": 161.6475830078125,
+ "close": 163.48123168945312,
+ "volume": 106377.65625,
+ "amount": 17364742.0
+ },
+ {
+ "timestamp": "2025-08-31T09:00:00+08:00",
+ "open": 163.2387237548828,
+ "high": 164.34071350097656,
+ "low": 161.87831115722656,
+ "close": 163.06814575195312,
+ "volume": 161232.453125,
+ "amount": 26354684.0
+ },
+ {
+ "timestamp": "2025-08-31T10:00:00+08:00",
+ "open": 163.49978637695312,
+ "high": 165.74432373046875,
+ "low": 162.79638671875,
+ "close": 164.7208251953125,
+ "volume": 301892.375,
+ "amount": 50468612.0
+ },
+ {
+ "timestamp": "2025-08-31T11:00:00+08:00",
+ "open": 164.99673461914062,
+ "high": 166.3669891357422,
+ "low": 164.15130615234375,
+ "close": 165.47671508789062,
+ "volume": 199991.78125,
+ "amount": 33256228.0
+ },
+ {
+ "timestamp": "2025-08-31T12:00:00+08:00",
+ "open": 165.79513549804688,
+ "high": 167.0158233642578,
+ "low": 165.00082397460938,
+ "close": 166.29966735839844,
+ "volume": 154040.796875,
+ "amount": 25580630.0
+ },
+ {
+ "timestamp": "2025-08-31T13:00:00+08:00",
+ "open": 166.0205841064453,
+ "high": 166.70193481445312,
+ "low": 164.46112060546875,
+ "close": 165.34878540039062,
+ "volume": 178085.3125,
+ "amount": 29476518.0
+ },
+ {
+ "timestamp": "2025-08-31T14:00:00+08:00",
+ "open": 166.24501037597656,
+ "high": 167.0667724609375,
+ "low": 164.58224487304688,
+ "close": 166.05015563964844,
+ "volume": 129364.75,
+ "amount": 21628500.0
+ },
+ {
+ "timestamp": "2025-08-31T15:00:00+08:00",
+ "open": 166.03521728515625,
+ "high": 167.3617706298828,
+ "low": 165.32102966308594,
+ "close": 166.63978576660156,
+ "volume": 211953.453125,
+ "amount": 35320700.0
+ },
+ {
+ "timestamp": "2025-08-31T16:00:00+08:00",
+ "open": 166.36239624023438,
+ "high": 167.03709411621094,
+ "low": 165.2759246826172,
+ "close": 165.89297485351562,
+ "volume": 194446.28125,
+ "amount": 32096862.0
+ },
+ {
+ "timestamp": "2025-08-31T17:00:00+08:00",
+ "open": 165.83676147460938,
+ "high": 167.5804443359375,
+ "low": 165.13429260253906,
+ "close": 167.40374755859375,
+ "volume": 117510.796875,
+ "amount": 19549350.0
+ },
+ {
+ "timestamp": "2025-08-31T18:00:00+08:00",
+ "open": 167.718505859375,
+ "high": 169.7425994873047,
+ "low": 165.9463348388672,
+ "close": 167.79901123046875,
+ "volume": 154990.125,
+ "amount": 25936012.0
+ },
+ {
+ "timestamp": "2025-08-31T19:00:00+08:00",
+ "open": 166.98268127441406,
+ "high": 169.21694946289062,
+ "low": 166.4047088623047,
+ "close": 168.42735290527344,
+ "volume": 150092.703125,
+ "amount": 24862448.0
+ },
+ {
+ "timestamp": "2025-08-31T20:00:00+08:00",
+ "open": 169.00360107421875,
+ "high": 170.40652465820312,
+ "low": 167.4154510498047,
+ "close": 168.48382568359375,
+ "volume": 163585.84375,
+ "amount": 27783852.0
+ },
+ {
+ "timestamp": "2025-08-31T21:00:00+08:00",
+ "open": 171.0612030029297,
+ "high": 170.92372131347656,
+ "low": 166.41586303710938,
+ "close": 166.46148681640625,
+ "volume": 211049.984375,
+ "amount": 35654996.0
+ },
+ {
+ "timestamp": "2025-08-31T22:00:00+08:00",
+ "open": 167.1434326171875,
+ "high": 169.17343139648438,
+ "low": 166.25559997558594,
+ "close": 168.48736572265625,
+ "volume": 108616.5234375,
+ "amount": 18216512.0
+ },
+ {
+ "timestamp": "2025-08-31T23:00:00+08:00",
+ "open": 168.4060516357422,
+ "high": 169.8519287109375,
+ "low": 167.69500732421875,
+ "close": 169.23049926757812,
+ "volume": 132322.421875,
+ "amount": 22429392.0
+ },
+ {
+ "timestamp": "2025-09-01T00:00:00+08:00",
+ "open": 169.1307373046875,
+ "high": 169.9923858642578,
+ "low": 168.27291870117188,
+ "close": 169.3440704345703,
+ "volume": 130938.1953125,
+ "amount": 22266326.0
+ },
+ {
+ "timestamp": "2025-09-01T01:00:00+08:00",
+ "open": 170.71987915039062,
+ "high": 172.1166229248047,
+ "low": 166.57391357421875,
+ "close": 166.91111755371094,
+ "volume": 178145.109375,
+ "amount": 31085734.0
+ },
+ {
+ "timestamp": "2025-09-01T02:00:00+08:00",
+ "open": 167.87940979003906,
+ "high": 169.94754028320312,
+ "low": 167.2145233154297,
+ "close": 169.26026916503906,
+ "volume": 237452.25,
+ "amount": 40556208.0
+ },
+ {
+ "timestamp": "2025-09-01T03:00:00+08:00",
+ "open": 169.79873657226562,
+ "high": 172.52313232421875,
+ "low": 168.80136108398438,
+ "close": 170.95692443847656,
+ "volume": 153268.984375,
+ "amount": 26564128.0
+ },
+ {
+ "timestamp": "2025-09-01T04:00:00+08:00",
+ "open": 171.47755432128906,
+ "high": 173.36245727539062,
+ "low": 170.61672973632812,
+ "close": 172.36859130859375,
+ "volume": 163983.890625,
+ "amount": 28440466.0
+ },
+ {
+ "timestamp": "2025-09-01T05:00:00+08:00",
+ "open": 171.81057739257812,
+ "high": 172.78013610839844,
+ "low": 170.8435821533203,
+ "close": 171.7489776611328,
+ "volume": 197065.3125,
+ "amount": 34102096.0
+ },
+ {
+ "timestamp": "2025-09-01T06:00:00+08:00",
+ "open": 172.0683135986328,
+ "high": 172.26524353027344,
+ "low": 170.71437072753906,
+ "close": 171.19569396972656,
+ "volume": 107609.1171875,
+ "amount": 18627106.0
+ },
+ {
+ "timestamp": "2025-09-01T07:00:00+08:00",
+ "open": 172.02198791503906,
+ "high": 172.12525939941406,
+ "low": 170.07484436035156,
+ "close": 170.31605529785156,
+ "volume": 85563.9375,
+ "amount": 14812041.0
+ },
+ {
+ "timestamp": "2025-09-01T08:00:00+08:00",
+ "open": 170.72235107421875,
+ "high": 171.53712463378906,
+ "low": 170.04710388183594,
+ "close": 170.90992736816406,
+ "volume": 79716.265625,
+ "amount": 13632395.0
+ },
+ {
+ "timestamp": "2025-09-01T09:00:00+08:00",
+ "open": 169.92446899414062,
+ "high": 171.5326385498047,
+ "low": 168.66513061523438,
+ "close": 170.45872497558594,
+ "volume": 90610.1171875,
+ "amount": 15508768.0
+ },
+ {
+ "timestamp": "2025-09-01T10:00:00+08:00",
+ "open": 170.16798400878906,
+ "high": 170.7797393798828,
+ "low": 169.3549346923828,
+ "close": 170.08651733398438,
+ "volume": 62793.8125,
+ "amount": 10855436.0
+ },
+ {
+ "timestamp": "2025-09-01T11:00:00+08:00",
+ "open": 170.4576873779297,
+ "high": 171.4794921875,
+ "low": 169.7115020751953,
+ "close": 170.74472045898438,
+ "volume": 70444.0859375,
+ "amount": 12303686.0
+ },
+ {
+ "timestamp": "2025-09-01T12:00:00+08:00",
+ "open": 170.3846435546875,
+ "high": 170.76490783691406,
+ "low": 169.48455810546875,
+ "close": 170.03225708007812,
+ "volume": 55656.328125,
+ "amount": 9871196.0
+ },
+ {
+ "timestamp": "2025-09-01T13:00:00+08:00",
+ "open": 169.16986083984375,
+ "high": 169.72764587402344,
+ "low": 168.61109924316406,
+ "close": 169.28616333007812,
+ "volume": 45208.1796875,
+ "amount": 7306340.0
+ },
+ {
+ "timestamp": "2025-09-01T14:00:00+08:00",
+ "open": 169.48617553710938,
+ "high": 170.8197021484375,
+ "low": 168.74118041992188,
+ "close": 170.28099060058594,
+ "volume": 96348.890625,
+ "amount": 16455361.0
+ },
+ {
+ "timestamp": "2025-09-01T15:00:00+08:00",
+ "open": 171.13844299316406,
+ "high": 171.14691162109375,
+ "low": 169.20101928710938,
+ "close": 169.30259704589844,
+ "volume": 75712.1171875,
+ "amount": 13124450.0
+ },
+ {
+ "timestamp": "2025-09-01T16:00:00+08:00",
+ "open": 169.6844024658203,
+ "high": 170.75648498535156,
+ "low": 168.8416290283203,
+ "close": 170.13108825683594,
+ "volume": 97837.0,
+ "amount": 16710126.0
+ },
+ {
+ "timestamp": "2025-09-01T17:00:00+08:00",
+ "open": 170.2710723876953,
+ "high": 171.19650268554688,
+ "low": 169.44618225097656,
+ "close": 170.04685974121094,
+ "volume": 74498.9453125,
+ "amount": 12934730.0
+ },
+ {
+ "timestamp": "2025-09-01T18:00:00+08:00",
+ "open": 170.1904754638672,
+ "high": 171.22679138183594,
+ "low": 169.22848510742188,
+ "close": 170.45179748535156,
+ "volume": 152042.359375,
+ "amount": 26143896.0
+ },
+ {
+ "timestamp": "2025-09-01T19:00:00+08:00",
+ "open": 170.73147583007812,
+ "high": 171.6114959716797,
+ "low": 169.873046875,
+ "close": 170.72625732421875,
+ "volume": 105481.890625,
+ "amount": 18068312.0
+ },
+ {
+ "timestamp": "2025-09-01T20:00:00+08:00",
+ "open": 171.06761169433594,
+ "high": 172.69766235351562,
+ "low": 170.50868225097656,
+ "close": 172.04443359375,
+ "volume": 135309.109375,
+ "amount": 23287214.0
+ },
+ {
+ "timestamp": "2025-09-01T21:00:00+08:00",
+ "open": 172.0660400390625,
+ "high": 173.3494873046875,
+ "low": 171.3815460205078,
+ "close": 172.69503784179688,
+ "volume": 167505.40625,
+ "amount": 29050666.0
+ },
+ {
+ "timestamp": "2025-09-01T22:00:00+08:00",
+ "open": 172.3904266357422,
+ "high": 172.7864532470703,
+ "low": 170.29837036132812,
+ "close": 170.63870239257812,
+ "volume": 301409.03125,
+ "amount": 51769616.0
+ },
+ {
+ "timestamp": "2025-09-01T23:00:00+08:00",
+ "open": 172.06173706054688,
+ "high": 172.8977813720703,
+ "low": 170.80819702148438,
+ "close": 171.73826599121094,
+ "volume": 104111.421875,
+ "amount": 18266884.0
+ },
+ {
+ "timestamp": "2025-09-02T00:00:00+08:00",
+ "open": 171.26173400878906,
+ "high": 173.4921875,
+ "low": 170.76124572753906,
+ "close": 172.94126892089844,
+ "volume": 122761.265625,
+ "amount": 21003698.0
+ },
+ {
+ "timestamp": "2025-09-02T01:00:00+08:00",
+ "open": 172.88360595703125,
+ "high": 173.62242126464844,
+ "low": 171.92535400390625,
+ "close": 172.69586181640625,
+ "volume": 94996.3515625,
+ "amount": 16521730.0
+ },
+ {
+ "timestamp": "2025-09-02T02:00:00+08:00",
+ "open": 173.1378173828125,
+ "high": 172.5879669189453,
+ "low": 171.05499267578125,
+ "close": 171.13232421875,
+ "volume": 109271.3203125,
+ "amount": 19259964.0
+ },
+ {
+ "timestamp": "2025-09-02T03:00:00+08:00",
+ "open": 172.68212890625,
+ "high": 174.18875122070312,
+ "low": 169.23243713378906,
+ "close": 169.4415740966797,
+ "volume": 142279.40625,
+ "amount": 24221024.0
+ },
+ {
+ "timestamp": "2025-09-02T04:00:00+08:00",
+ "open": 170.35081481933594,
+ "high": 172.00311279296875,
+ "low": 169.50978088378906,
+ "close": 171.177978515625,
+ "volume": 116025.5625,
+ "amount": 20077584.0
+ },
+ {
+ "timestamp": "2025-09-02T05:00:00+08:00",
+ "open": 171.27137756347656,
+ "high": 172.49578857421875,
+ "low": 170.58456420898438,
+ "close": 171.75389099121094,
+ "volume": 92343.4453125,
+ "amount": 15935463.0
+ },
+ {
+ "timestamp": "2025-09-02T06:00:00+08:00",
+ "open": 171.88011169433594,
+ "high": 172.8335418701172,
+ "low": 171.1839141845703,
+ "close": 172.137939453125,
+ "volume": 87056.3359375,
+ "amount": 15105010.0
+ },
+ {
+ "timestamp": "2025-09-02T07:00:00+08:00",
+ "open": 172.30003356933594,
+ "high": 173.23089599609375,
+ "low": 171.3990020751953,
+ "close": 172.49359130859375,
+ "volume": 149420.609375,
+ "amount": 26362652.0
+ },
+ {
+ "timestamp": "2025-09-02T08:00:00+08:00",
+ "open": 172.6053009033203,
+ "high": 173.82785034179688,
+ "low": 171.89857482910156,
+ "close": 173.19960021972656,
+ "volume": 170247.453125,
+ "amount": 29726446.0
+ },
+ {
+ "timestamp": "2025-09-02T09:00:00+08:00",
+ "open": 173.422119140625,
+ "high": 174.26101684570312,
+ "low": 172.7417449951172,
+ "close": 173.6376495361328,
+ "volume": 78947.53125,
+ "amount": 13900633.0
+ },
+ {
+ "timestamp": "2025-09-02T10:00:00+08:00",
+ "open": 173.60279846191406,
+ "high": 174.1590118408203,
+ "low": 172.65638732910156,
+ "close": 173.3321533203125,
+ "volume": 85853.453125,
+ "amount": 15012355.0
+ },
+ {
+ "timestamp": "2025-09-02T11:00:00+08:00",
+ "open": 173.75494384765625,
+ "high": 174.98439025878906,
+ "low": 173.13827514648438,
+ "close": 174.35629272460938,
+ "volume": 103285.15625,
+ "amount": 18170972.0
+ },
+ {
+ "timestamp": "2025-09-02T12:00:00+08:00",
+ "open": 174.3738555908203,
+ "high": 175.6508026123047,
+ "low": 173.41061401367188,
+ "close": 175.03883361816406,
+ "volume": 187793.34375,
+ "amount": 33190078.0
+ },
+ {
+ "timestamp": "2025-09-02T13:00:00+08:00",
+ "open": 175.10772705078125,
+ "high": 177.5194091796875,
+ "low": 173.93133544921875,
+ "close": 176.3385467529297,
+ "volume": 135665.421875,
+ "amount": 24008888.0
+ },
+ {
+ "timestamp": "2025-09-02T14:00:00+08:00",
+ "open": 176.3673095703125,
+ "high": 177.819091796875,
+ "low": 175.21450805664062,
+ "close": 177.1330108642578,
+ "volume": 176910.390625,
+ "amount": 31357882.0
+ },
+ {
+ "timestamp": "2025-09-02T15:00:00+08:00",
+ "open": 176.37306213378906,
+ "high": 177.49002075195312,
+ "low": 174.83949279785156,
+ "close": 176.60696411132812,
+ "volume": 140812.421875,
+ "amount": 24919428.0
+ },
+ {
+ "timestamp": "2025-09-02T16:00:00+08:00",
+ "open": 176.0399169921875,
+ "high": 176.607666015625,
+ "low": 174.42787170410156,
+ "close": 175.29393005371094,
+ "volume": 104101.8125,
+ "amount": 18057188.0
+ },
+ {
+ "timestamp": "2025-09-02T17:00:00+08:00",
+ "open": 175.9430694580078,
+ "high": 177.2678680419922,
+ "low": 174.47486877441406,
+ "close": 175.67279052734375,
+ "volume": 169130.03125,
+ "amount": 29807220.0
+ },
+ {
+ "timestamp": "2025-09-02T18:00:00+08:00",
+ "open": 175.82568359375,
+ "high": 176.75839233398438,
+ "low": 174.56826782226562,
+ "close": 175.5581512451172,
+ "volume": 169220.21875,
+ "amount": 29845672.0
+ },
+ {
+ "timestamp": "2025-09-02T19:00:00+08:00",
+ "open": 175.6074981689453,
+ "high": 178.08590698242188,
+ "low": 174.42449951171875,
+ "close": 176.9770050048828,
+ "volume": 135605.125,
+ "amount": 23945990.0
+ },
+ {
+ "timestamp": "2025-09-02T20:00:00+08:00",
+ "open": 177.2335205078125,
+ "high": 177.9937744140625,
+ "low": 175.6226043701172,
+ "close": 176.60552978515625,
+ "volume": 96588.1875,
+ "amount": 17118386.0
+ },
+ {
+ "timestamp": "2025-09-02T21:00:00+08:00",
+ "open": 176.52210998535156,
+ "high": 177.1573944091797,
+ "low": 175.49166870117188,
+ "close": 176.2715301513672,
+ "volume": 78103.421875,
+ "amount": 13693300.0
+ },
+ {
+ "timestamp": "2025-09-02T22:00:00+08:00",
+ "open": 176.7212677001953,
+ "high": 178.14431762695312,
+ "low": 176.14109802246094,
+ "close": 177.5001220703125,
+ "volume": 96987.625,
+ "amount": 17102190.0
+ },
+ {
+ "timestamp": "2025-09-02T23:00:00+08:00",
+ "open": 177.41270446777344,
+ "high": 177.8789520263672,
+ "low": 176.53936767578125,
+ "close": 177.11184692382812,
+ "volume": 50418.796875,
+ "amount": 8836982.0
+ },
+ {
+ "timestamp": "2025-09-03T00:00:00+08:00",
+ "open": 177.38307189941406,
+ "high": 178.13760375976562,
+ "low": 176.84130859375,
+ "close": 177.6638946533203,
+ "volume": 55947.140625,
+ "amount": 9850114.0
+ },
+ {
+ "timestamp": "2025-09-03T01:00:00+08:00",
+ "open": 177.52337646484375,
+ "high": 177.96353149414062,
+ "low": 176.839599609375,
+ "close": 177.4904022216797,
+ "volume": 41717.828125,
+ "amount": 7215820.0
+ },
+ {
+ "timestamp": "2025-09-03T02:00:00+08:00",
+ "open": 177.45333862304688,
+ "high": 179.24002075195312,
+ "low": 176.14212036132812,
+ "close": 178.16275024414062,
+ "volume": 118730.640625,
+ "amount": 21027116.0
+ },
+ {
+ "timestamp": "2025-09-03T03:00:00+08:00",
+ "open": 178.5370635986328,
+ "high": 180.56956481933594,
+ "low": 177.5654296875,
+ "close": 179.0944061279297,
+ "volume": 147129.921875,
+ "amount": 26418422.0
+ },
+ {
+ "timestamp": "2025-09-03T04:00:00+08:00",
+ "open": 179.23562622070312,
+ "high": 180.2884521484375,
+ "low": 178.24453735351562,
+ "close": 179.3507537841797,
+ "volume": 137848.046875,
+ "amount": 24822310.0
+ },
+ {
+ "timestamp": "2025-09-03T05:00:00+08:00",
+ "open": 179.2522430419922,
+ "high": 180.3149871826172,
+ "low": 178.25698852539062,
+ "close": 179.59359741210938,
+ "volume": 142900.984375,
+ "amount": 25635280.0
+ },
+ {
+ "timestamp": "2025-09-03T06:00:00+08:00",
+ "open": 180.89599609375,
+ "high": 185.49746704101562,
+ "low": 177.82252502441406,
+ "close": 182.8541717529297,
+ "volume": 260915.296875,
+ "amount": 49695936.0
+ },
+ {
+ "timestamp": "2025-09-03T07:00:00+08:00",
+ "open": 180.2205047607422,
+ "high": 186.1641387939453,
+ "low": 174.51675415039062,
+ "close": 185.35244750976562,
+ "volume": 148369.46875,
+ "amount": 26892272.0
+ },
+ {
+ "timestamp": "2025-09-03T08:00:00+08:00",
+ "open": 183.45098876953125,
+ "high": 184.46099853515625,
+ "low": 181.01943969726562,
+ "close": 182.07785034179688,
+ "volume": 162732.40625,
+ "amount": 29322210.0
+ },
+ {
+ "timestamp": "2025-09-03T09:00:00+08:00",
+ "open": 182.52078247070312,
+ "high": 183.9163818359375,
+ "low": 181.5021209716797,
+ "close": 183.0242156982422,
+ "volume": 113012.6875,
+ "amount": 20492764.0
+ },
+ {
+ "timestamp": "2025-09-03T10:00:00+08:00",
+ "open": 182.77818298339844,
+ "high": 183.3599090576172,
+ "low": 181.3691864013672,
+ "close": 182.08364868164062,
+ "volume": 78449.921875,
+ "amount": 14072343.0
+ },
+ {
+ "timestamp": "2025-09-03T11:00:00+08:00",
+ "open": 181.9405975341797,
+ "high": 182.52511596679688,
+ "low": 180.5789794921875,
+ "close": 181.54661560058594,
+ "volume": 98601.484375,
+ "amount": 17860920.0
+ },
+ {
+ "timestamp": "2025-09-03T12:00:00+08:00",
+ "open": 181.1760711669922,
+ "high": 181.62213134765625,
+ "low": 180.15235900878906,
+ "close": 180.6356964111328,
+ "volume": 52819.78125,
+ "amount": 9259378.0
+ },
+ {
+ "timestamp": "2025-09-03T13:00:00+08:00",
+ "open": 180.7042694091797,
+ "high": 181.27230834960938,
+ "low": 179.67007446289062,
+ "close": 180.5001678466797,
+ "volume": 84131.140625,
+ "amount": 15167241.0
+ },
+ {
+ "timestamp": "2025-09-03T14:00:00+08:00",
+ "open": 180.37013244628906,
+ "high": 180.78932189941406,
+ "low": 179.5408477783203,
+ "close": 180.01419067382812,
+ "volume": 48513.5390625,
+ "amount": 8444374.0
+ }
+ ],
+ "actual_data": [
+ {
+ "timestamp": "2025-08-04T15:00:00+08:00",
+ "open": 162.23,
+ "high": 163.3,
+ "low": 162.06,
+ "close": 163.03,
+ "volume": 74136.921,
+ "amount": 12059770.94194
+ },
+ {
+ "timestamp": "2025-08-04T16:00:00+08:00",
+ "open": 163.04,
+ "high": 164.06,
+ "low": 162.64,
+ "close": 163.77,
+ "volume": 117525.213,
+ "amount": 19210826.27414
+ },
+ {
+ "timestamp": "2025-08-04T17:00:00+08:00",
+ "open": 163.77,
+ "high": 164.08,
+ "low": 162.43,
+ "close": 162.47,
+ "volume": 85060.23,
+ "amount": 13892276.8872
+ },
+ {
+ "timestamp": "2025-08-04T18:00:00+08:00",
+ "open": 162.47,
+ "high": 163.0,
+ "low": 162.12,
+ "close": 162.38,
+ "volume": 100129.901,
+ "amount": 16272640.11824
+ },
+ {
+ "timestamp": "2025-08-04T19:00:00+08:00",
+ "open": 162.38,
+ "high": 162.58,
+ "low": 161.64,
+ "close": 162.38,
+ "volume": 72772.577,
+ "amount": 11798816.78322
+ },
+ {
+ "timestamp": "2025-08-04T20:00:00+08:00",
+ "open": 162.39,
+ "high": 163.7,
+ "low": 162.14,
+ "close": 163.69,
+ "volume": 101723.541,
+ "amount": 16578100.9589
+ },
+ {
+ "timestamp": "2025-08-04T21:00:00+08:00",
+ "open": 163.7,
+ "high": 165.79,
+ "low": 163.21,
+ "close": 165.47,
+ "volume": 193752.012,
+ "amount": 31851746.47853
+ },
+ {
+ "timestamp": "2025-08-04T22:00:00+08:00",
+ "open": 165.47,
+ "high": 166.91,
+ "low": 164.5,
+ "close": 165.03,
+ "volume": 275254.258,
+ "amount": 45750129.99692
+ },
+ {
+ "timestamp": "2025-08-04T23:00:00+08:00",
+ "open": 165.03,
+ "high": 166.01,
+ "low": 164.53,
+ "close": 165.49,
+ "volume": 106764.854,
+ "amount": 17656292.42605
+ },
+ {
+ "timestamp": "2025-08-05T00:00:00+08:00",
+ "open": 165.49,
+ "high": 168.17,
+ "low": 165.48,
+ "close": 168.02,
+ "volume": 158859.491,
+ "amount": 26562796.92357
+ },
+ {
+ "timestamp": "2025-08-05T01:00:00+08:00",
+ "open": 168.02,
+ "high": 169.8,
+ "low": 167.63,
+ "close": 167.83,
+ "volume": 225977.749,
+ "amount": 38135115.37123
+ },
+ {
+ "timestamp": "2025-08-05T02:00:00+08:00",
+ "open": 167.82,
+ "high": 168.15,
+ "low": 166.43,
+ "close": 166.67,
+ "volume": 62494.281,
+ "amount": 10449570.22186
+ },
+ {
+ "timestamp": "2025-08-05T03:00:00+08:00",
+ "open": 166.66,
+ "high": 166.66,
+ "low": 165.0,
+ "close": 165.65,
+ "volume": 92910.808,
+ "amount": 15399091.07364
+ },
+ {
+ "timestamp": "2025-08-05T04:00:00+08:00",
+ "open": 165.64,
+ "high": 168.44,
+ "low": 165.3,
+ "close": 167.29,
+ "volume": 138413.064,
+ "amount": 23120298.99166
+ },
+ {
+ "timestamp": "2025-08-05T05:00:00+08:00",
+ "open": 167.28,
+ "high": 168.78,
+ "low": 167.27,
+ "close": 168.54,
+ "volume": 90532.368,
+ "amount": 15213774.63313
+ },
+ {
+ "timestamp": "2025-08-05T06:00:00+08:00",
+ "open": 168.54,
+ "high": 169.54,
+ "low": 168.23,
+ "close": 169.47,
+ "volume": 99295.578,
+ "amount": 16765316.64126
+ },
+ {
+ "timestamp": "2025-08-05T07:00:00+08:00",
+ "open": 169.47,
+ "high": 169.78,
+ "low": 168.96,
+ "close": 169.55,
+ "volume": 76925.323,
+ "amount": 13027064.79868
+ },
+ {
+ "timestamp": "2025-08-05T08:00:00+08:00",
+ "open": 169.55,
+ "high": 169.76,
+ "low": 168.59,
+ "close": 169.31,
+ "volume": 82214.747,
+ "amount": 13902743.33407
+ },
+ {
+ "timestamp": "2025-08-05T09:00:00+08:00",
+ "open": 169.31,
+ "high": 169.97,
+ "low": 168.15,
+ "close": 168.21,
+ "volume": 70824.086,
+ "amount": 11973446.20439
+ },
+ {
+ "timestamp": "2025-08-05T10:00:00+08:00",
+ "open": 168.22,
+ "high": 169.48,
+ "low": 167.95,
+ "close": 169.42,
+ "volume": 60355.659,
+ "amount": 10174298.68738
+ },
+ {
+ "timestamp": "2025-08-05T11:00:00+08:00",
+ "open": 169.42,
+ "high": 169.44,
+ "low": 167.57,
+ "close": 167.92,
+ "volume": 67324.879,
+ "amount": 11319806.88757
+ },
+ {
+ "timestamp": "2025-08-05T12:00:00+08:00",
+ "open": 167.92,
+ "high": 168.51,
+ "low": 167.23,
+ "close": 167.48,
+ "volume": 53783.38,
+ "amount": 9020520.47306
+ },
+ {
+ "timestamp": "2025-08-05T13:00:00+08:00",
+ "open": 167.48,
+ "high": 168.6,
+ "low": 167.42,
+ "close": 168.42,
+ "volume": 58015.301,
+ "amount": 9746167.59901
+ },
+ {
+ "timestamp": "2025-08-05T14:00:00+08:00",
+ "open": 168.42,
+ "high": 169.28,
+ "low": 167.31,
+ "close": 167.71,
+ "volume": 64403.219,
+ "amount": 10853931.01296
+ },
+ {
+ "timestamp": "2025-08-05T15:00:00+08:00",
+ "open": 167.71,
+ "high": 168.52,
+ "low": 165.78,
+ "close": 166.22,
+ "volume": 144397.434,
+ "amount": 24077310.95995
+ },
+ {
+ "timestamp": "2025-08-05T16:00:00+08:00",
+ "open": 166.21,
+ "high": 167.25,
+ "low": 165.66,
+ "close": 166.84,
+ "volume": 72724.394,
+ "amount": 12107991.17777
+ },
+ {
+ "timestamp": "2025-08-05T17:00:00+08:00",
+ "open": 166.83,
+ "high": 169.4,
+ "low": 166.77,
+ "close": 168.88,
+ "volume": 93974.184,
+ "amount": 15800043.81255
+ },
+ {
+ "timestamp": "2025-08-05T18:00:00+08:00",
+ "open": 168.89,
+ "high": 171.73,
+ "low": 168.43,
+ "close": 171.03,
+ "volume": 146021.969,
+ "amount": 24859549.09327
+ },
+ {
+ "timestamp": "2025-08-05T19:00:00+08:00",
+ "open": 171.04,
+ "high": 171.65,
+ "low": 170.56,
+ "close": 170.89,
+ "volume": 89180.665,
+ "amount": 15249888.4715
+ },
+ {
+ "timestamp": "2025-08-05T20:00:00+08:00",
+ "open": 170.89,
+ "high": 171.04,
+ "low": 166.77,
+ "close": 167.23,
+ "volume": 187653.275,
+ "amount": 31608650.29139
+ },
+ {
+ "timestamp": "2025-08-05T21:00:00+08:00",
+ "open": 167.23,
+ "high": 168.14,
+ "low": 166.63,
+ "close": 167.76,
+ "volume": 184125.095,
+ "amount": 30820396.27592
+ },
+ {
+ "timestamp": "2025-08-05T22:00:00+08:00",
+ "open": 167.76,
+ "high": 167.8,
+ "low": 163.61,
+ "close": 164.3,
+ "volume": 343847.03,
+ "amount": 56680992.41483
+ },
+ {
+ "timestamp": "2025-08-05T23:00:00+08:00",
+ "open": 164.29,
+ "high": 165.33,
+ "low": 162.9,
+ "close": 163.78,
+ "volume": 192355.206,
+ "amount": 31563223.60904
+ },
+ {
+ "timestamp": "2025-08-06T00:00:00+08:00",
+ "open": 163.77,
+ "high": 164.73,
+ "low": 162.74,
+ "close": 163.83,
+ "volume": 167910.678,
+ "amount": 27507045.08349
+ },
+ {
+ "timestamp": "2025-08-06T01:00:00+08:00",
+ "open": 163.83,
+ "high": 164.93,
+ "low": 163.36,
+ "close": 164.81,
+ "volume": 100989.57,
+ "amount": 16570106.54807
+ },
+ {
+ "timestamp": "2025-08-06T02:00:00+08:00",
+ "open": 164.8,
+ "high": 164.94,
+ "low": 163.0,
+ "close": 164.02,
+ "volume": 99084.727,
+ "amount": 16253427.6356
+ },
+ {
+ "timestamp": "2025-08-06T03:00:00+08:00",
+ "open": 164.02,
+ "high": 164.53,
+ "low": 162.28,
+ "close": 162.76,
+ "volume": 64811.187,
+ "amount": 10588413.05836
+ },
+ {
+ "timestamp": "2025-08-06T04:00:00+08:00",
+ "open": 162.76,
+ "high": 163.7,
+ "low": 162.37,
+ "close": 162.61,
+ "volume": 48970.354,
+ "amount": 7983830.49318
+ },
+ {
+ "timestamp": "2025-08-06T05:00:00+08:00",
+ "open": 162.62,
+ "high": 163.46,
+ "low": 161.6,
+ "close": 162.38,
+ "volume": 49155.96,
+ "amount": 7994559.93456
+ },
+ {
+ "timestamp": "2025-08-06T06:00:00+08:00",
+ "open": 162.37,
+ "high": 163.88,
+ "low": 161.3,
+ "close": 163.87,
+ "volume": 64389.815,
+ "amount": 10473223.66777
+ },
+ {
+ "timestamp": "2025-08-06T07:00:00+08:00",
+ "open": 163.88,
+ "high": 164.54,
+ "low": 163.62,
+ "close": 164.09,
+ "volume": 48445.195,
+ "amount": 7953475.18119
+ },
+ {
+ "timestamp": "2025-08-06T08:00:00+08:00",
+ "open": 164.09,
+ "high": 164.17,
+ "low": 162.55,
+ "close": 162.75,
+ "volume": 43163.896,
+ "amount": 7057842.77139
+ },
+ {
+ "timestamp": "2025-08-06T09:00:00+08:00",
+ "open": 162.74,
+ "high": 163.1,
+ "low": 161.72,
+ "close": 162.86,
+ "volume": 76846.534,
+ "amount": 12480634.75106
+ },
+ {
+ "timestamp": "2025-08-06T10:00:00+08:00",
+ "open": 162.85,
+ "high": 163.3,
+ "low": 161.89,
+ "close": 162.68,
+ "volume": 29810.556,
+ "amount": 4852556.5443
+ },
+ {
+ "timestamp": "2025-08-06T11:00:00+08:00",
+ "open": 162.68,
+ "high": 162.78,
+ "low": 161.13,
+ "close": 161.86,
+ "volume": 54824.373,
+ "amount": 8873539.23202
+ },
+ {
+ "timestamp": "2025-08-06T12:00:00+08:00",
+ "open": 161.86,
+ "high": 162.56,
+ "low": 161.25,
+ "close": 162.44,
+ "volume": 41127.848,
+ "amount": 6663819.62399
+ },
+ {
+ "timestamp": "2025-08-06T13:00:00+08:00",
+ "open": 162.43,
+ "high": 164.79,
+ "low": 162.13,
+ "close": 164.26,
+ "volume": 80618.825,
+ "amount": 13207339.73608
+ },
+ {
+ "timestamp": "2025-08-06T14:00:00+08:00",
+ "open": 164.26,
+ "high": 164.3,
+ "low": 163.4,
+ "close": 163.91,
+ "volume": 39135.78,
+ "amount": 6413948.17988
+ },
+ {
+ "timestamp": "2025-08-06T15:00:00+08:00",
+ "open": 163.91,
+ "high": 164.63,
+ "low": 163.62,
+ "close": 164.25,
+ "volume": 55141.803,
+ "amount": 9055194.53629
+ },
+ {
+ "timestamp": "2025-08-06T16:00:00+08:00",
+ "open": 164.26,
+ "high": 164.51,
+ "low": 162.72,
+ "close": 163.31,
+ "volume": 110996.881,
+ "amount": 18152710.47713
+ },
+ {
+ "timestamp": "2025-08-06T17:00:00+08:00",
+ "open": 163.3,
+ "high": 164.51,
+ "low": 162.93,
+ "close": 163.97,
+ "volume": 51789.523,
+ "amount": 8484891.56098
+ },
+ {
+ "timestamp": "2025-08-06T18:00:00+08:00",
+ "open": 163.98,
+ "high": 164.17,
+ "low": 162.91,
+ "close": 163.64,
+ "volume": 45388.472,
+ "amount": 7421376.01486
+ },
+ {
+ "timestamp": "2025-08-06T19:00:00+08:00",
+ "open": 163.65,
+ "high": 164.64,
+ "low": 163.25,
+ "close": 164.2,
+ "volume": 43880.215,
+ "amount": 7196384.74457
+ },
+ {
+ "timestamp": "2025-08-06T20:00:00+08:00",
+ "open": 164.2,
+ "high": 164.7,
+ "low": 162.65,
+ "close": 163.29,
+ "volume": 66651.944,
+ "amount": 10919521.63981
+ },
+ {
+ "timestamp": "2025-08-06T21:00:00+08:00",
+ "open": 163.3,
+ "high": 164.74,
+ "low": 163.11,
+ "close": 164.29,
+ "volume": 118473.808,
+ "amount": 19442562.65022
+ },
+ {
+ "timestamp": "2025-08-06T22:00:00+08:00",
+ "open": 164.29,
+ "high": 168.03,
+ "low": 163.99,
+ "close": 167.9,
+ "volume": 229018.348,
+ "amount": 38017718.63702
+ },
+ {
+ "timestamp": "2025-08-06T23:00:00+08:00",
+ "open": 167.9,
+ "high": 169.42,
+ "low": 167.18,
+ "close": 169.04,
+ "volume": 188836.518,
+ "amount": 31752467.168
+ },
+ {
+ "timestamp": "2025-08-07T00:00:00+08:00",
+ "open": 169.05,
+ "high": 169.5,
+ "low": 167.3,
+ "close": 167.74,
+ "volume": 134701.749,
+ "amount": 22684012.2248
+ },
+ {
+ "timestamp": "2025-08-07T01:00:00+08:00",
+ "open": 167.74,
+ "high": 169.14,
+ "low": 167.18,
+ "close": 169.13,
+ "volume": 71216.863,
+ "amount": 11976517.48489
+ },
+ {
+ "timestamp": "2025-08-07T02:00:00+08:00",
+ "open": 169.13,
+ "high": 169.93,
+ "low": 168.39,
+ "close": 168.53,
+ "volume": 91193.689,
+ "amount": 15425414.34944
+ },
+ {
+ "timestamp": "2025-08-07T03:00:00+08:00",
+ "open": 168.54,
+ "high": 169.1,
+ "low": 167.97,
+ "close": 168.82,
+ "volume": 63496.229,
+ "amount": 10701215.20875
+ },
+ {
+ "timestamp": "2025-08-07T04:00:00+08:00",
+ "open": 168.82,
+ "high": 168.85,
+ "low": 167.77,
+ "close": 168.01,
+ "volume": 37725.966,
+ "amount": 6345885.41282
+ },
+ {
+ "timestamp": "2025-08-07T05:00:00+08:00",
+ "open": 168.01,
+ "high": 168.6,
+ "low": 167.32,
+ "close": 168.05,
+ "volume": 45074.396,
+ "amount": 7572011.80834
+ },
+ {
+ "timestamp": "2025-08-07T06:00:00+08:00",
+ "open": 168.06,
+ "high": 168.52,
+ "low": 167.84,
+ "close": 168.4,
+ "volume": 40030.181,
+ "amount": 6734961.48444
+ },
+ {
+ "timestamp": "2025-08-07T07:00:00+08:00",
+ "open": 168.39,
+ "high": 168.43,
+ "low": 167.9,
+ "close": 168.09,
+ "volume": 38347.032,
+ "amount": 6447076.81682
+ },
+ {
+ "timestamp": "2025-08-07T08:00:00+08:00",
+ "open": 168.1,
+ "high": 168.43,
+ "low": 167.5,
+ "close": 167.89,
+ "volume": 42120.103,
+ "amount": 7073984.82298
+ },
+ {
+ "timestamp": "2025-08-07T09:00:00+08:00",
+ "open": 167.9,
+ "high": 169.0,
+ "low": 167.7,
+ "close": 167.87,
+ "volume": 63347.932,
+ "amount": 10667891.24492
+ },
+ {
+ "timestamp": "2025-08-07T10:00:00+08:00",
+ "open": 167.88,
+ "high": 168.03,
+ "low": 166.77,
+ "close": 167.07,
+ "volume": 62002.104,
+ "amount": 10381788.88788
+ },
+ {
+ "timestamp": "2025-08-07T11:00:00+08:00",
+ "open": 167.07,
+ "high": 167.45,
+ "low": 166.7,
+ "close": 166.89,
+ "volume": 32383.859,
+ "amount": 5409448.35906
+ },
+ {
+ "timestamp": "2025-08-07T12:00:00+08:00",
+ "open": 166.9,
+ "high": 167.59,
+ "low": 166.76,
+ "close": 167.14,
+ "volume": 54513.73,
+ "amount": 9113596.06166
+ },
+ {
+ "timestamp": "2025-08-07T13:00:00+08:00",
+ "open": 167.14,
+ "high": 168.78,
+ "low": 166.9,
+ "close": 168.76,
+ "volume": 67272.7,
+ "amount": 11282713.31824
+ },
+ {
+ "timestamp": "2025-08-07T14:00:00+08:00",
+ "open": 168.75,
+ "high": 169.78,
+ "low": 168.59,
+ "close": 169.2,
+ "volume": 142910.245,
+ "amount": 24187068.86434
+ },
+ {
+ "timestamp": "2025-08-07T15:00:00+08:00",
+ "open": 169.2,
+ "high": 170.45,
+ "low": 169.17,
+ "close": 169.99,
+ "volume": 101757.927,
+ "amount": 17292602.95288
+ },
+ {
+ "timestamp": "2025-08-07T16:00:00+08:00",
+ "open": 169.99,
+ "high": 170.54,
+ "low": 169.25,
+ "close": 169.38,
+ "volume": 53396.157,
+ "amount": 9070993.83894
+ },
+ {
+ "timestamp": "2025-08-07T17:00:00+08:00",
+ "open": 169.39,
+ "high": 169.74,
+ "low": 169.06,
+ "close": 169.64,
+ "volume": 62798.597,
+ "amount": 10638595.19901
+ },
+ {
+ "timestamp": "2025-08-07T18:00:00+08:00",
+ "open": 169.64,
+ "high": 173.33,
+ "low": 169.41,
+ "close": 173.11,
+ "volume": 384304.067,
+ "amount": 66077162.88463
+ },
+ {
+ "timestamp": "2025-08-07T19:00:00+08:00",
+ "open": 173.12,
+ "high": 173.49,
+ "low": 172.55,
+ "close": 172.82,
+ "volume": 186048.277,
+ "amount": 32193407.74879
+ },
+ {
+ "timestamp": "2025-08-07T20:00:00+08:00",
+ "open": 172.83,
+ "high": 173.18,
+ "low": 171.53,
+ "close": 172.44,
+ "volume": 239496.463,
+ "amount": 41268302.40848
+ },
+ {
+ "timestamp": "2025-08-07T21:00:00+08:00",
+ "open": 172.44,
+ "high": 172.63,
+ "low": 171.3,
+ "close": 171.71,
+ "volume": 190193.126,
+ "amount": 32729635.12419
+ },
+ {
+ "timestamp": "2025-08-07T22:00:00+08:00",
+ "open": 171.71,
+ "high": 171.78,
+ "low": 169.93,
+ "close": 170.29,
+ "volume": 195035.421,
+ "amount": 33279394.99653
+ },
+ {
+ "timestamp": "2025-08-07T23:00:00+08:00",
+ "open": 170.3,
+ "high": 170.83,
+ "low": 169.7,
+ "close": 170.49,
+ "volume": 103344.875,
+ "amount": 17605556.63468
+ },
+ {
+ "timestamp": "2025-08-08T00:00:00+08:00",
+ "open": 170.48,
+ "high": 170.6,
+ "low": 167.0,
+ "close": 168.21,
+ "volume": 195488.878,
+ "amount": 33013670.23084
+ },
+ {
+ "timestamp": "2025-08-08T01:00:00+08:00",
+ "open": 168.22,
+ "high": 169.56,
+ "low": 167.97,
+ "close": 169.43,
+ "volume": 118983.774,
+ "amount": 20088079.37201
+ },
+ {
+ "timestamp": "2025-08-08T02:00:00+08:00",
+ "open": 169.43,
+ "high": 169.97,
+ "low": 168.77,
+ "close": 169.83,
+ "volume": 81531.6,
+ "amount": 13805010.09553
+ },
+ {
+ "timestamp": "2025-08-08T03:00:00+08:00",
+ "open": 169.82,
+ "high": 171.94,
+ "low": 169.8,
+ "close": 171.75,
+ "volume": 90401.494,
+ "amount": 15451891.70214
+ },
+ {
+ "timestamp": "2025-08-08T04:00:00+08:00",
+ "open": 171.76,
+ "high": 173.18,
+ "low": 171.52,
+ "close": 172.93,
+ "volume": 165662.361,
+ "amount": 28588575.41687
+ },
+ {
+ "timestamp": "2025-08-08T05:00:00+08:00",
+ "open": 172.94,
+ "high": 174.29,
+ "low": 172.52,
+ "close": 173.56,
+ "volume": 134633.652,
+ "amount": 23367840.25631
+ },
+ {
+ "timestamp": "2025-08-08T06:00:00+08:00",
+ "open": 173.56,
+ "high": 175.16,
+ "low": 173.56,
+ "close": 175.09,
+ "volume": 156328.311,
+ "amount": 27254689.66104
+ },
+ {
+ "timestamp": "2025-08-08T07:00:00+08:00",
+ "open": 175.1,
+ "high": 175.51,
+ "low": 174.39,
+ "close": 175.36,
+ "volume": 90707.342,
+ "amount": 15871027.6557
+ },
+ {
+ "timestamp": "2025-08-08T08:00:00+08:00",
+ "open": 175.37,
+ "high": 175.55,
+ "low": 173.56,
+ "close": 174.28,
+ "volume": 285971.901,
+ "amount": 49905519.86187
+ },
+ {
+ "timestamp": "2025-08-08T09:00:00+08:00",
+ "open": 174.28,
+ "high": 174.84,
+ "low": 173.43,
+ "close": 174.54,
+ "volume": 229160.382,
+ "amount": 39899798.41686
+ },
+ {
+ "timestamp": "2025-08-08T10:00:00+08:00",
+ "open": 174.53,
+ "high": 175.28,
+ "low": 173.85,
+ "close": 174.84,
+ "volume": 111560.099,
+ "amount": 19472752.49667
+ },
+ {
+ "timestamp": "2025-08-08T11:00:00+08:00",
+ "open": 174.84,
+ "high": 175.92,
+ "low": 174.49,
+ "close": 174.71,
+ "volume": 107748.238,
+ "amount": 18887951.95409
+ },
+ {
+ "timestamp": "2025-08-08T12:00:00+08:00",
+ "open": 174.71,
+ "high": 175.2,
+ "low": 173.89,
+ "close": 174.38,
+ "volume": 98808.746,
+ "amount": 17249425.80614
+ },
+ {
+ "timestamp": "2025-08-08T13:00:00+08:00",
+ "open": 174.39,
+ "high": 174.8,
+ "low": 174.07,
+ "close": 174.21,
+ "volume": 71768.975,
+ "amount": 12520281.86918
+ },
+ {
+ "timestamp": "2025-08-08T14:00:00+08:00",
+ "open": 174.2,
+ "high": 175.12,
+ "low": 173.88,
+ "close": 175.07,
+ "volume": 47720.465,
+ "amount": 8326921.08184
+ },
+ {
+ "timestamp": "2025-08-08T15:00:00+08:00",
+ "open": 175.08,
+ "high": 177.87,
+ "low": 174.33,
+ "close": 177.14,
+ "volume": 229541.676,
+ "amount": 40528429.97951
+ },
+ {
+ "timestamp": "2025-08-08T16:00:00+08:00",
+ "open": 177.13,
+ "high": 177.86,
+ "low": 174.88,
+ "close": 175.37,
+ "volume": 221907.145,
+ "amount": 39115276.85478
+ },
+ {
+ "timestamp": "2025-08-08T17:00:00+08:00",
+ "open": 175.38,
+ "high": 176.13,
+ "low": 175.01,
+ "close": 176.06,
+ "volume": 73177.332,
+ "amount": 12844547.6769
+ },
+ {
+ "timestamp": "2025-08-08T18:00:00+08:00",
+ "open": 176.06,
+ "high": 177.0,
+ "low": 175.73,
+ "close": 176.65,
+ "volume": 97484.632,
+ "amount": 17194816.92097
+ },
+ {
+ "timestamp": "2025-08-08T19:00:00+08:00",
+ "open": 176.65,
+ "high": 177.95,
+ "low": 176.57,
+ "close": 177.65,
+ "volume": 123436.572,
+ "amount": 21896869.12395
+ },
+ {
+ "timestamp": "2025-08-08T20:00:00+08:00",
+ "open": 177.65,
+ "high": 177.67,
+ "low": 176.11,
+ "close": 176.45,
+ "volume": 136248.014,
+ "amount": 24089803.31777
+ },
+ {
+ "timestamp": "2025-08-08T21:00:00+08:00",
+ "open": 176.45,
+ "high": 178.8,
+ "low": 175.47,
+ "close": 178.63,
+ "volume": 251938.117,
+ "amount": 44630741.1163
+ },
+ {
+ "timestamp": "2025-08-08T22:00:00+08:00",
+ "open": 178.64,
+ "high": 179.14,
+ "low": 175.43,
+ "close": 176.51,
+ "volume": 323953.21,
+ "amount": 57372288.63739
+ },
+ {
+ "timestamp": "2025-08-08T23:00:00+08:00",
+ "open": 176.51,
+ "high": 176.7,
+ "low": 174.21,
+ "close": 175.23,
+ "volume": 213655.986,
+ "amount": 37441428.9877
+ },
+ {
+ "timestamp": "2025-08-09T00:00:00+08:00",
+ "open": 175.23,
+ "high": 176.33,
+ "low": 175.01,
+ "close": 175.9,
+ "volume": 163119.182,
+ "amount": 28646747.51801
+ },
+ {
+ "timestamp": "2025-08-09T01:00:00+08:00",
+ "open": 175.89,
+ "high": 179.36,
+ "low": 175.55,
+ "close": 179.34,
+ "volume": 205835.192,
+ "amount": 36560503.20317
+ },
+ {
+ "timestamp": "2025-08-09T02:00:00+08:00",
+ "open": 179.35,
+ "high": 179.66,
+ "low": 177.21,
+ "close": 177.6,
+ "volume": 275884.101,
+ "amount": 49304914.38911
+ },
+ {
+ "timestamp": "2025-08-09T03:00:00+08:00",
+ "open": 177.59,
+ "high": 178.47,
+ "low": 177.4,
+ "close": 178.47,
+ "volume": 166152.661,
+ "amount": 29570335.49701
+ },
+ {
+ "timestamp": "2025-08-09T04:00:00+08:00",
+ "open": 178.46,
+ "high": 178.76,
+ "low": 177.24,
+ "close": 178.25,
+ "volume": 70076.448,
+ "amount": 12463914.31461
+ },
+ {
+ "timestamp": "2025-08-09T05:00:00+08:00",
+ "open": 178.24,
+ "high": 178.6,
+ "low": 177.41,
+ "close": 177.61,
+ "volume": 53024.121,
+ "amount": 9434502.51846
+ },
+ {
+ "timestamp": "2025-08-09T06:00:00+08:00",
+ "open": 177.61,
+ "high": 178.07,
+ "low": 177.07,
+ "close": 177.63,
+ "volume": 77857.406,
+ "amount": 13832572.48314
+ },
+ {
+ "timestamp": "2025-08-09T07:00:00+08:00",
+ "open": 177.63,
+ "high": 177.91,
+ "low": 176.62,
+ "close": 176.78,
+ "volume": 42760.054,
+ "amount": 7574519.60434
+ },
+ {
+ "timestamp": "2025-08-09T08:00:00+08:00",
+ "open": 176.79,
+ "high": 177.22,
+ "low": 176.64,
+ "close": 176.94,
+ "volume": 65341.697,
+ "amount": 11561450.4816
+ },
+ {
+ "timestamp": "2025-08-09T09:00:00+08:00",
+ "open": 176.94,
+ "high": 179.02,
+ "low": 176.67,
+ "close": 178.67,
+ "volume": 98455.121,
+ "amount": 17508615.06199
+ },
+ {
+ "timestamp": "2025-08-09T10:00:00+08:00",
+ "open": 178.68,
+ "high": 178.71,
+ "low": 177.56,
+ "close": 177.58,
+ "volume": 83765.293,
+ "amount": 14920736.18133
+ },
+ {
+ "timestamp": "2025-08-09T11:00:00+08:00",
+ "open": 177.58,
+ "high": 177.75,
+ "low": 177.03,
+ "close": 177.26,
+ "volume": 64366.253,
+ "amount": 11413770.00552
+ },
+ {
+ "timestamp": "2025-08-09T12:00:00+08:00",
+ "open": 177.26,
+ "high": 178.82,
+ "low": 176.94,
+ "close": 178.67,
+ "volume": 127054.29,
+ "amount": 22593505.13424
+ },
+ {
+ "timestamp": "2025-08-09T13:00:00+08:00",
+ "open": 178.66,
+ "high": 182.15,
+ "low": 178.26,
+ "close": 180.85,
+ "volume": 439624.908,
+ "amount": 79481177.72109
+ },
+ {
+ "timestamp": "2025-08-09T14:00:00+08:00",
+ "open": 180.85,
+ "high": 180.93,
+ "low": 179.26,
+ "close": 179.59,
+ "volume": 208875.43,
+ "amount": 37596188.47394
+ }
+ ],
+ "analysis": {
+ "continuity": {
+ "last_prediction": {
+ "open": 161.17906188964844,
+ "high": 161.45286560058594,
+ "low": 160.79344177246094,
+ "close": 160.83462524414062
+ },
+ "first_actual": {
+ "open": 162.23,
+ "high": 163.3,
+ "low": 162.06,
+ "close": 163.03
+ },
+ "gaps": {
+ "open_gap": 1.0509381103515523,
+ "high_gap": 1.8471343994140739,
+ "low_gap": 1.2665582275390648,
+ "close_gap": 2.195374755859376
+ },
+ "gap_percentages": {
+ "open_gap_pct": 0.6478075019118241,
+ "high_gap_pct": 1.1311294546320108,
+ "low_gap_pct": 0.7815366083790354,
+ "close_gap_pct": 1.3466078365082355
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_144330.json b/webui/prediction_results/prediction_20250829_144330.json
new file mode 100644
index 0000000000000000000000000000000000000000..d369bada57fd38719771da9f8447671111b975bc
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_144330.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T14:43:30.188199",
+ "file_path": "SOLUSDT_15m",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "SOLUSDT",
+ "interval": "15m",
+ "limit": 1000,
+ "lookback": 1000,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 1,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 1000,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 176.01,
+ "max": 217.72
+ },
+ "high": {
+ "min": 176.72,
+ "max": 218.0
+ },
+ "low": {
+ "min": 175.69,
+ "max": 217.13
+ },
+ "close": {
+ "min": 176.01,
+ "max": 217.72
+ }
+ },
+ "last_values": {
+ "open": 213.07,
+ "high": 214.52,
+ "low": 212.7,
+ "close": 214.23
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T14:45:00+08:00",
+ "open": 211.51339721679688,
+ "high": 214.00616455078125,
+ "low": 209.9340362548828,
+ "close": 213.39547729492188,
+ "volume": 86834.421875,
+ "amount": 18310972.0
+ },
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 212.58941650390625,
+ "high": 213.1258087158203,
+ "low": 211.07875061035156,
+ "close": 212.0814666748047,
+ "volume": 130910.078125,
+ "amount": 27360328.0
+ },
+ {
+ "timestamp": "2025-08-29T15:15:00+08:00",
+ "open": 212.44505310058594,
+ "high": 213.10435485839844,
+ "low": 211.4364013671875,
+ "close": 212.0792236328125,
+ "volume": 126443.1640625,
+ "amount": 26386130.0
+ },
+ {
+ "timestamp": "2025-08-29T15:30:00+08:00",
+ "open": 211.63641357421875,
+ "high": 211.96054077148438,
+ "low": 210.07322692871094,
+ "close": 210.6654510498047,
+ "volume": 108974.0,
+ "amount": 22760646.0
+ },
+ {
+ "timestamp": "2025-08-29T15:45:00+08:00",
+ "open": 212.30247497558594,
+ "high": 214.23239135742188,
+ "low": 210.99102783203125,
+ "close": 212.90011596679688,
+ "volume": 140603.53125,
+ "amount": 29848152.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 212.1909637451172,
+ "high": 212.7652130126953,
+ "low": 211.329345703125,
+ "close": 212.16781616210938,
+ "volume": 73370.21875,
+ "amount": 15517934.0
+ },
+ {
+ "timestamp": "2025-08-29T16:15:00+08:00",
+ "open": 211.7748260498047,
+ "high": 212.1476593017578,
+ "low": 210.31756591796875,
+ "close": 210.9963836669922,
+ "volume": 52782.3359375,
+ "amount": 11086273.0
+ },
+ {
+ "timestamp": "2025-08-29T16:30:00+08:00",
+ "open": 210.53074645996094,
+ "high": 211.03573608398438,
+ "low": 209.6986083984375,
+ "close": 210.32786560058594,
+ "volume": 41089.17578125,
+ "amount": 8539190.0
+ },
+ {
+ "timestamp": "2025-08-29T16:45:00+08:00",
+ "open": 210.44935607910156,
+ "high": 212.29441833496094,
+ "low": 210.07159423828125,
+ "close": 211.98670959472656,
+ "volume": 68096.4765625,
+ "amount": 14205086.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 210.83738708496094,
+ "high": 212.97824096679688,
+ "low": 209.92237854003906,
+ "close": 212.56190490722656,
+ "volume": 82293.9375,
+ "amount": 17353550.0
+ },
+ {
+ "timestamp": "2025-08-29T17:15:00+08:00",
+ "open": 211.63482666015625,
+ "high": 211.90684509277344,
+ "low": 210.16702270507812,
+ "close": 210.8386688232422,
+ "volume": 70014.984375,
+ "amount": 14754854.0
+ },
+ {
+ "timestamp": "2025-08-29T17:30:00+08:00",
+ "open": 210.51437377929688,
+ "high": 211.04525756835938,
+ "low": 209.57029724121094,
+ "close": 210.1754608154297,
+ "volume": 42686.02734375,
+ "amount": 8864302.0
+ },
+ {
+ "timestamp": "2025-08-29T17:45:00+08:00",
+ "open": 210.36618041992188,
+ "high": 210.45816040039062,
+ "low": 207.9525146484375,
+ "close": 208.2962646484375,
+ "volume": 92520.171875,
+ "amount": 19173682.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 210.05482482910156,
+ "high": 211.09640502929688,
+ "low": 208.7134246826172,
+ "close": 210.0265655517578,
+ "volume": 110214.2265625,
+ "amount": 22950180.0
+ },
+ {
+ "timestamp": "2025-08-29T18:15:00+08:00",
+ "open": 210.1600341796875,
+ "high": 211.27049255371094,
+ "low": 209.66726684570312,
+ "close": 210.81997680664062,
+ "volume": 72831.359375,
+ "amount": 15233739.0
+ },
+ {
+ "timestamp": "2025-08-29T18:30:00+08:00",
+ "open": 210.5278778076172,
+ "high": 210.79995727539062,
+ "low": 209.1676025390625,
+ "close": 209.78085327148438,
+ "volume": 43755.91015625,
+ "amount": 9176511.0
+ },
+ {
+ "timestamp": "2025-08-29T18:45:00+08:00",
+ "open": 210.052734375,
+ "high": 210.8660888671875,
+ "low": 209.5419921875,
+ "close": 210.33163452148438,
+ "volume": 29026.037109375,
+ "amount": 5859170.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 210.54861450195312,
+ "high": 211.3253631591797,
+ "low": 209.9462127685547,
+ "close": 210.8623504638672,
+ "volume": 44435.34375,
+ "amount": 9155286.0
+ },
+ {
+ "timestamp": "2025-08-29T19:15:00+08:00",
+ "open": 211.11680603027344,
+ "high": 211.7168426513672,
+ "low": 210.35516357421875,
+ "close": 211.09742736816406,
+ "volume": 35745.59375,
+ "amount": 7474263.5
+ },
+ {
+ "timestamp": "2025-08-29T19:30:00+08:00",
+ "open": 209.4849853515625,
+ "high": 211.83053588867188,
+ "low": 208.27938842773438,
+ "close": 211.5763702392578,
+ "volume": 80538.65625,
+ "amount": 16946778.0
+ },
+ {
+ "timestamp": "2025-08-29T19:45:00+08:00",
+ "open": 210.48641967773438,
+ "high": 210.95533752441406,
+ "low": 209.174560546875,
+ "close": 209.92507934570312,
+ "volume": 53238.65234375,
+ "amount": 11103928.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 209.8693084716797,
+ "high": 210.39688110351562,
+ "low": 208.95127868652344,
+ "close": 209.66575622558594,
+ "volume": 49658.05078125,
+ "amount": 10256466.0
+ },
+ {
+ "timestamp": "2025-08-29T20:15:00+08:00",
+ "open": 209.44285583496094,
+ "high": 210.0704345703125,
+ "low": 208.9563446044922,
+ "close": 209.46649169921875,
+ "volume": 20944.90234375,
+ "amount": 4152075.5
+ },
+ {
+ "timestamp": "2025-08-29T20:30:00+08:00",
+ "open": 209.97705078125,
+ "high": 210.73448181152344,
+ "low": 209.5391082763672,
+ "close": 210.39401245117188,
+ "volume": 33596.3984375,
+ "amount": 6804480.5
+ },
+ {
+ "timestamp": "2025-08-29T20:45:00+08:00",
+ "open": 210.44635009765625,
+ "high": 211.0862274169922,
+ "low": 209.93402099609375,
+ "close": 210.67153930664062,
+ "volume": 35226.9765625,
+ "amount": 7165888.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 210.67523193359375,
+ "high": 211.26776123046875,
+ "low": 210.13519287109375,
+ "close": 210.83396911621094,
+ "volume": 35266.84375,
+ "amount": 7175695.5
+ },
+ {
+ "timestamp": "2025-08-29T21:15:00+08:00",
+ "open": 210.49832153320312,
+ "high": 210.7288818359375,
+ "low": 209.61260986328125,
+ "close": 210.11769104003906,
+ "volume": 55429.57421875,
+ "amount": 11461123.0
+ },
+ {
+ "timestamp": "2025-08-29T21:30:00+08:00",
+ "open": 210.3923797607422,
+ "high": 211.1156768798828,
+ "low": 209.90573120117188,
+ "close": 210.68084716796875,
+ "volume": 38174.9453125,
+ "amount": 7821370.0
+ },
+ {
+ "timestamp": "2025-08-29T21:45:00+08:00",
+ "open": 210.8993682861328,
+ "high": 212.03997802734375,
+ "low": 210.72451782226562,
+ "close": 211.70399475097656,
+ "volume": 38179.03125,
+ "amount": 7661766.5
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 211.4993438720703,
+ "high": 211.9414520263672,
+ "low": 210.78012084960938,
+ "close": 211.36322021484375,
+ "volume": 34923.05859375,
+ "amount": 7115356.0
+ },
+ {
+ "timestamp": "2025-08-29T22:15:00+08:00",
+ "open": 211.34388732910156,
+ "high": 211.81924438476562,
+ "low": 210.72543334960938,
+ "close": 211.34307861328125,
+ "volume": 34331.078125,
+ "amount": 6967878.5
+ },
+ {
+ "timestamp": "2025-08-29T22:30:00+08:00",
+ "open": 211.2760772705078,
+ "high": 211.70272827148438,
+ "low": 210.6693572998047,
+ "close": 211.16433715820312,
+ "volume": 25462.25390625,
+ "amount": 5064244.0
+ },
+ {
+ "timestamp": "2025-08-29T22:45:00+08:00",
+ "open": 211.3609619140625,
+ "high": 211.8013153076172,
+ "low": 210.67880249023438,
+ "close": 211.30140686035156,
+ "volume": 30539.8046875,
+ "amount": 6341840.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 211.2964324951172,
+ "high": 211.74449157714844,
+ "low": 210.7322540283203,
+ "close": 211.23956298828125,
+ "volume": 24322.55078125,
+ "amount": 4848314.0
+ },
+ {
+ "timestamp": "2025-08-29T23:15:00+08:00",
+ "open": 211.30015563964844,
+ "high": 211.79763793945312,
+ "low": 210.7742156982422,
+ "close": 211.39276123046875,
+ "volume": 32017.6796875,
+ "amount": 6489058.0
+ },
+ {
+ "timestamp": "2025-08-29T23:30:00+08:00",
+ "open": 211.47940063476562,
+ "high": 211.96221923828125,
+ "low": 210.8484649658203,
+ "close": 211.52926635742188,
+ "volume": 41659.9921875,
+ "amount": 8555861.0
+ },
+ {
+ "timestamp": "2025-08-29T23:45:00+08:00",
+ "open": 211.63604736328125,
+ "high": 212.12120056152344,
+ "low": 210.98277282714844,
+ "close": 211.65774536132812,
+ "volume": 43134.015625,
+ "amount": 8890192.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 210.55528259277344,
+ "high": 212.9385986328125,
+ "low": 209.76622009277344,
+ "close": 212.5945281982422,
+ "volume": 78540.40625,
+ "amount": 16541705.0
+ },
+ {
+ "timestamp": "2025-08-30T00:15:00+08:00",
+ "open": 212.27511596679688,
+ "high": 212.74612426757812,
+ "low": 211.2952117919922,
+ "close": 211.95860290527344,
+ "volume": 36397.0234375,
+ "amount": 7663594.0
+ },
+ {
+ "timestamp": "2025-08-30T00:30:00+08:00",
+ "open": 211.87197875976562,
+ "high": 212.40676879882812,
+ "low": 211.25355529785156,
+ "close": 211.89537048339844,
+ "volume": 33833.78125,
+ "amount": 6902406.5
+ },
+ {
+ "timestamp": "2025-08-30T00:45:00+08:00",
+ "open": 211.7979736328125,
+ "high": 212.30690002441406,
+ "low": 211.20896911621094,
+ "close": 211.82948303222656,
+ "volume": 33770.0234375,
+ "amount": 6861364.5
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 210.84812927246094,
+ "high": 212.1645050048828,
+ "low": 209.8130340576172,
+ "close": 211.9027557373047,
+ "volume": 66634.1328125,
+ "amount": 13859492.0
+ },
+ {
+ "timestamp": "2025-08-30T01:15:00+08:00",
+ "open": 210.95025634765625,
+ "high": 211.3640899658203,
+ "low": 209.91064453125,
+ "close": 210.35145568847656,
+ "volume": 40140.0703125,
+ "amount": 8325933.0
+ },
+ {
+ "timestamp": "2025-08-30T01:30:00+08:00",
+ "open": 210.76486206054688,
+ "high": 211.3911590576172,
+ "low": 210.25592041015625,
+ "close": 210.86212158203125,
+ "volume": 26227.634765625,
+ "amount": 5215925.5
+ },
+ {
+ "timestamp": "2025-08-30T01:45:00+08:00",
+ "open": 210.96017456054688,
+ "high": 211.4601287841797,
+ "low": 210.43228149414062,
+ "close": 210.94363403320312,
+ "volume": 24321.9921875,
+ "amount": 4820165.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 211.06475830078125,
+ "high": 211.60125732421875,
+ "low": 210.5694122314453,
+ "close": 211.2263946533203,
+ "volume": 32565.541015625,
+ "amount": 6602710.0
+ },
+ {
+ "timestamp": "2025-08-30T02:15:00+08:00",
+ "open": 211.19464111328125,
+ "high": 211.62118530273438,
+ "low": 210.66087341308594,
+ "close": 211.14324951171875,
+ "volume": 24745.34765625,
+ "amount": 4926806.5
+ },
+ {
+ "timestamp": "2025-08-30T02:30:00+08:00",
+ "open": 210.58091735839844,
+ "high": 210.76492309570312,
+ "low": 209.6467742919922,
+ "close": 210.01905822753906,
+ "volume": 34922.8828125,
+ "amount": 7261115.5
+ },
+ {
+ "timestamp": "2025-08-30T02:45:00+08:00",
+ "open": 210.32757568359375,
+ "high": 211.07138061523438,
+ "low": 209.89422607421875,
+ "close": 210.7227325439453,
+ "volume": 34217.8203125,
+ "amount": 6954625.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 210.42422485351562,
+ "high": 210.68772888183594,
+ "low": 209.50099182128906,
+ "close": 209.9556121826172,
+ "volume": 44837.74609375,
+ "amount": 9235406.0
+ },
+ {
+ "timestamp": "2025-08-30T03:15:00+08:00",
+ "open": 209.80821228027344,
+ "high": 210.2867889404297,
+ "low": 209.33633422851562,
+ "close": 209.73934936523438,
+ "volume": 18545.98046875,
+ "amount": 3663702.0
+ },
+ {
+ "timestamp": "2025-08-30T03:30:00+08:00",
+ "open": 210.1922149658203,
+ "high": 210.8268280029297,
+ "low": 209.78961181640625,
+ "close": 210.5609893798828,
+ "volume": 31621.603515625,
+ "amount": 6376182.0
+ },
+ {
+ "timestamp": "2025-08-30T03:45:00+08:00",
+ "open": 210.94371032714844,
+ "high": 211.93673706054688,
+ "low": 210.4797821044922,
+ "close": 211.73333740234375,
+ "volume": 50752.0703125,
+ "amount": 10396533.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 211.6557159423828,
+ "high": 212.0537872314453,
+ "low": 210.9847412109375,
+ "close": 211.52381896972656,
+ "volume": 35644.7421875,
+ "amount": 7314861.0
+ },
+ {
+ "timestamp": "2025-08-30T04:15:00+08:00",
+ "open": 211.4846649169922,
+ "high": 211.84259033203125,
+ "low": 210.87466430664062,
+ "close": 211.3356475830078,
+ "volume": 25026.9140625,
+ "amount": 4980066.5
+ },
+ {
+ "timestamp": "2025-08-30T04:30:00+08:00",
+ "open": 211.29684448242188,
+ "high": 211.747314453125,
+ "low": 210.76278686523438,
+ "close": 211.36915588378906,
+ "volume": 32053.091796875,
+ "amount": 6492776.5
+ },
+ {
+ "timestamp": "2025-08-30T04:45:00+08:00",
+ "open": 211.348876953125,
+ "high": 211.7285614013672,
+ "low": 210.78187561035156,
+ "close": 211.2506561279297,
+ "volume": 24300.98828125,
+ "amount": 4828423.5
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 211.336181640625,
+ "high": 211.69810485839844,
+ "low": 210.79225158691406,
+ "close": 211.24884033203125,
+ "volume": 22949.3828125,
+ "amount": 4546290.5
+ },
+ {
+ "timestamp": "2025-08-30T05:15:00+08:00",
+ "open": 211.3269500732422,
+ "high": 211.691650390625,
+ "low": 210.7984619140625,
+ "close": 211.25265502929688,
+ "volume": 22618.08984375,
+ "amount": 4475127.0
+ },
+ {
+ "timestamp": "2025-08-30T05:30:00+08:00",
+ "open": 211.289306640625,
+ "high": 211.66055297851562,
+ "low": 210.77154541015625,
+ "close": 211.22607421875,
+ "volume": 22380.26953125,
+ "amount": 4421126.5
+ },
+ {
+ "timestamp": "2025-08-30T05:45:00+08:00",
+ "open": 211.2808380126953,
+ "high": 211.74436950683594,
+ "low": 210.79595947265625,
+ "close": 211.40455627441406,
+ "volume": 31100.044921875,
+ "amount": 6286864.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 210.76229858398438,
+ "high": 211.18490600585938,
+ "low": 210.05076599121094,
+ "close": 210.6517791748047,
+ "volume": 43474.8203125,
+ "amount": 8886004.0
+ },
+ {
+ "timestamp": "2025-08-30T06:15:00+08:00",
+ "open": 209.90682983398438,
+ "high": 210.40191650390625,
+ "low": 207.84718322753906,
+ "close": 209.27548217773438,
+ "volume": 61941.90625,
+ "amount": 12910675.0
+ },
+ {
+ "timestamp": "2025-08-30T06:30:00+08:00",
+ "open": 206.94691467285156,
+ "high": 207.7908172607422,
+ "low": 203.89559936523438,
+ "close": 204.99234008789062,
+ "volume": 81169.890625,
+ "amount": 17041364.0
+ },
+ {
+ "timestamp": "2025-08-30T06:45:00+08:00",
+ "open": 205.01893615722656,
+ "high": 206.74095153808594,
+ "low": 204.5406494140625,
+ "close": 206.2381591796875,
+ "volume": 69149.890625,
+ "amount": 14121952.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 205.64878845214844,
+ "high": 206.30490112304688,
+ "low": 203.89483642578125,
+ "close": 205.00003051757812,
+ "volume": 111015.3046875,
+ "amount": 22658542.0
+ },
+ {
+ "timestamp": "2025-08-30T07:15:00+08:00",
+ "open": 204.421630859375,
+ "high": 208.46713256835938,
+ "low": 203.50547790527344,
+ "close": 207.89694213867188,
+ "volume": 121007.5546875,
+ "amount": 24426236.0
+ },
+ {
+ "timestamp": "2025-08-30T07:30:00+08:00",
+ "open": 206.92843627929688,
+ "high": 207.72479248046875,
+ "low": 206.15213012695312,
+ "close": 207.23660278320312,
+ "volume": 46236.0546875,
+ "amount": 9422554.0
+ },
+ {
+ "timestamp": "2025-08-30T07:45:00+08:00",
+ "open": 207.0982666015625,
+ "high": 207.7059783935547,
+ "low": 206.4016571044922,
+ "close": 207.19973754882812,
+ "volume": 34567.2265625,
+ "amount": 7014663.5
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 207.47459411621094,
+ "high": 209.49899291992188,
+ "low": 207.2506103515625,
+ "close": 209.15408325195312,
+ "volume": 65896.5390625,
+ "amount": 13479186.0
+ },
+ {
+ "timestamp": "2025-08-30T08:15:00+08:00",
+ "open": 208.68939208984375,
+ "high": 209.53033447265625,
+ "low": 208.0458526611328,
+ "close": 208.9080047607422,
+ "volume": 55882.3125,
+ "amount": 11488814.0
+ },
+ {
+ "timestamp": "2025-08-30T08:30:00+08:00",
+ "open": 209.2847137451172,
+ "high": 210.0909423828125,
+ "low": 208.68968200683594,
+ "close": 209.6594696044922,
+ "volume": 39269.265625,
+ "amount": 7994326.5
+ },
+ {
+ "timestamp": "2025-08-30T08:45:00+08:00",
+ "open": 209.3502655029297,
+ "high": 209.6461944580078,
+ "low": 208.42019653320312,
+ "close": 209.08448791503906,
+ "volume": 57113.2734375,
+ "amount": 11677034.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 208.2587432861328,
+ "high": 208.58682250976562,
+ "low": 206.73037719726562,
+ "close": 207.2214813232422,
+ "volume": 43398.9453125,
+ "amount": 9030006.0
+ },
+ {
+ "timestamp": "2025-08-30T09:15:00+08:00",
+ "open": 207.32313537597656,
+ "high": 208.15773010253906,
+ "low": 206.9442138671875,
+ "close": 207.73532104492188,
+ "volume": 33828.48828125,
+ "amount": 6862379.0
+ },
+ {
+ "timestamp": "2025-08-30T09:30:00+08:00",
+ "open": 207.28106689453125,
+ "high": 207.620361328125,
+ "low": 206.23338317871094,
+ "close": 206.6953125,
+ "volume": 40982.328125,
+ "amount": 8440633.0
+ },
+ {
+ "timestamp": "2025-08-30T09:45:00+08:00",
+ "open": 206.6194305419922,
+ "high": 207.24417114257812,
+ "low": 206.20986938476562,
+ "close": 206.69509887695312,
+ "volume": 29271.65234375,
+ "amount": 5902997.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 206.8211669921875,
+ "high": 209.52674865722656,
+ "low": 206.14599609375,
+ "close": 207.52096557617188,
+ "volume": 21463.578125,
+ "amount": 4311557.0
+ },
+ {
+ "timestamp": "2025-08-30T10:15:00+08:00",
+ "open": 207.5680389404297,
+ "high": 208.1266632080078,
+ "low": 206.99095153808594,
+ "close": 207.58596801757812,
+ "volume": 19337.65234375,
+ "amount": 3745935.5
+ },
+ {
+ "timestamp": "2025-08-30T10:30:00+08:00",
+ "open": 207.1122283935547,
+ "high": 207.41647338867188,
+ "low": 206.59402465820312,
+ "close": 207.01211547851562,
+ "volume": 23504.7265625,
+ "amount": 4754291.0
+ },
+ {
+ "timestamp": "2025-08-30T10:45:00+08:00",
+ "open": 206.93002319335938,
+ "high": 211.2899169921875,
+ "low": 205.90670776367188,
+ "close": 208.10205078125,
+ "volume": 32952.453125,
+ "amount": 6630525.5
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 207.5081787109375,
+ "high": 207.791748046875,
+ "low": 206.83070373535156,
+ "close": 207.2534637451172,
+ "volume": 24705.60546875,
+ "amount": 5013673.5
+ },
+ {
+ "timestamp": "2025-08-30T11:15:00+08:00",
+ "open": 207.28826904296875,
+ "high": 209.80618286132812,
+ "low": 206.54495239257812,
+ "close": 207.70274353027344,
+ "volume": 19185.953125,
+ "amount": 3812771.5
+ },
+ {
+ "timestamp": "2025-08-30T11:30:00+08:00",
+ "open": 207.8123016357422,
+ "high": 208.32888793945312,
+ "low": 207.2188262939453,
+ "close": 207.74874877929688,
+ "volume": 17542.2265625,
+ "amount": 3351547.0
+ },
+ {
+ "timestamp": "2025-08-30T11:45:00+08:00",
+ "open": 207.8240966796875,
+ "high": 208.3235321044922,
+ "low": 207.2559814453125,
+ "close": 207.74180603027344,
+ "volume": 16876.01953125,
+ "amount": 3185554.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 207.29611206054688,
+ "high": 207.60755920410156,
+ "low": 206.78382873535156,
+ "close": 207.21327209472656,
+ "volume": 21559.8359375,
+ "amount": 4304230.5
+ },
+ {
+ "timestamp": "2025-08-30T12:15:00+08:00",
+ "open": 207.2395782470703,
+ "high": 207.78256225585938,
+ "low": 206.77745056152344,
+ "close": 207.4265594482422,
+ "volume": 28205.36328125,
+ "amount": 5654142.5
+ },
+ {
+ "timestamp": "2025-08-30T12:30:00+08:00",
+ "open": 207.29664611816406,
+ "high": 208.02996826171875,
+ "low": 206.9815673828125,
+ "close": 207.25357055664062,
+ "volume": 9578.18359375,
+ "amount": 1760535.0
+ },
+ {
+ "timestamp": "2025-08-30T12:45:00+08:00",
+ "open": 206.562255859375,
+ "high": 206.92535400390625,
+ "low": 205.78204345703125,
+ "close": 206.21188354492188,
+ "volume": 27746.986328125,
+ "amount": 5597320.5
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 206.0684814453125,
+ "high": 206.7278289794922,
+ "low": 205.73089599609375,
+ "close": 206.02276611328125,
+ "volume": 27872.4921875,
+ "amount": 5547554.0
+ },
+ {
+ "timestamp": "2025-08-30T13:15:00+08:00",
+ "open": 206.22244262695312,
+ "high": 207.2269287109375,
+ "low": 206.0123291015625,
+ "close": 206.50833129882812,
+ "volume": 10387.8359375,
+ "amount": 1889385.0
+ },
+ {
+ "timestamp": "2025-08-30T13:30:00+08:00",
+ "open": 206.5584716796875,
+ "high": 207.3116455078125,
+ "low": 206.27244567871094,
+ "close": 206.59613037109375,
+ "volume": 7669.484375,
+ "amount": 1410481.0
+ },
+ {
+ "timestamp": "2025-08-30T13:45:00+08:00",
+ "open": 206.06491088867188,
+ "high": 206.4641571044922,
+ "low": 205.33670043945312,
+ "close": 205.78799438476562,
+ "volume": 28521.083984375,
+ "amount": 5766101.5
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 206.30789184570312,
+ "high": 206.7210235595703,
+ "low": 205.69021606445312,
+ "close": 206.29412841796875,
+ "volume": 19588.84375,
+ "amount": 3672096.5
+ },
+ {
+ "timestamp": "2025-08-30T14:15:00+08:00",
+ "open": 206.56814575195312,
+ "high": 207.3887481689453,
+ "low": 206.25823974609375,
+ "close": 207.09091186523438,
+ "volume": 36508.96484375,
+ "amount": 7403843.0
+ },
+ {
+ "timestamp": "2025-08-30T14:30:00+08:00",
+ "open": 206.72618103027344,
+ "high": 207.0769805908203,
+ "low": 206.1815643310547,
+ "close": 206.6709442138672,
+ "volume": 24982.01953125,
+ "amount": 5016495.5
+ },
+ {
+ "timestamp": "2025-08-30T14:45:00+08:00",
+ "open": 206.42266845703125,
+ "high": 206.9484100341797,
+ "low": 206.0428466796875,
+ "close": 206.47726440429688,
+ "volume": 34478.90625,
+ "amount": 7017496.5
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 207.3406982421875,
+ "high": 208.54075622558594,
+ "low": 206.9233856201172,
+ "close": 208.2393798828125,
+ "volume": 35766.29296875,
+ "amount": 7149538.0
+ },
+ {
+ "timestamp": "2025-08-30T15:15:00+08:00",
+ "open": 208.33697509765625,
+ "high": 209.1883087158203,
+ "low": 207.91339111328125,
+ "close": 208.81930541992188,
+ "volume": 34788.0625,
+ "amount": 6995742.5
+ },
+ {
+ "timestamp": "2025-08-30T15:30:00+08:00",
+ "open": 208.88450622558594,
+ "high": 209.39715576171875,
+ "low": 208.3055419921875,
+ "close": 208.8970947265625,
+ "volume": 25539.2734375,
+ "amount": 5015440.5
+ },
+ {
+ "timestamp": "2025-08-30T15:45:00+08:00",
+ "open": 208.9174346923828,
+ "high": 209.41851806640625,
+ "low": 208.37869262695312,
+ "close": 208.94873046875,
+ "volume": 23665.64453125,
+ "amount": 4615060.5
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 208.49978637695312,
+ "high": 208.89210510253906,
+ "low": 207.89845275878906,
+ "close": 208.331787109375,
+ "volume": 35396.58984375,
+ "amount": 7224694.5
+ },
+ {
+ "timestamp": "2025-08-30T16:15:00+08:00",
+ "open": 208.30181884765625,
+ "high": 208.77146911621094,
+ "low": 207.7388916015625,
+ "close": 208.17803955078125,
+ "volume": 17787.4609375,
+ "amount": 3379139.5
+ },
+ {
+ "timestamp": "2025-08-30T16:30:00+08:00",
+ "open": 208.68223571777344,
+ "high": 209.24478149414062,
+ "low": 208.20973205566406,
+ "close": 208.84716796875,
+ "volume": 22763.6875,
+ "amount": 4388920.5
+ },
+ {
+ "timestamp": "2025-08-30T16:45:00+08:00",
+ "open": 209.03126525878906,
+ "high": 209.5188751220703,
+ "low": 208.5084228515625,
+ "close": 209.06687927246094,
+ "volume": 23088.17578125,
+ "amount": 4485907.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 208.74835205078125,
+ "high": 209.1454315185547,
+ "low": 208.1572265625,
+ "close": 208.51858520507812,
+ "volume": 15801.97265625,
+ "amount": 3012316.0
+ },
+ {
+ "timestamp": "2025-08-30T17:15:00+08:00",
+ "open": 209.06504821777344,
+ "high": 209.78887939453125,
+ "low": 208.71043395996094,
+ "close": 209.54180908203125,
+ "volume": 31049.439453125,
+ "amount": 6195858.5
+ },
+ {
+ "timestamp": "2025-08-30T17:30:00+08:00",
+ "open": 210.06785583496094,
+ "high": 211.21372985839844,
+ "low": 209.65682983398438,
+ "close": 211.02857971191406,
+ "volume": 50952.578125,
+ "amount": 10393463.0
+ },
+ {
+ "timestamp": "2025-08-30T17:45:00+08:00",
+ "open": 210.6922607421875,
+ "high": 212.7685089111328,
+ "low": 210.48013305664062,
+ "close": 212.44638061523438,
+ "volume": 77230.0703125,
+ "amount": 16116440.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 212.39254760742188,
+ "high": 212.92198181152344,
+ "low": 211.56918334960938,
+ "close": 212.4889373779297,
+ "volume": 55172.46875,
+ "amount": 11482781.0
+ },
+ {
+ "timestamp": "2025-08-30T18:15:00+08:00",
+ "open": 211.56109619140625,
+ "high": 212.07351684570312,
+ "low": 210.49551391601562,
+ "close": 211.1416473388672,
+ "volume": 38471.2109375,
+ "amount": 7931743.0
+ },
+ {
+ "timestamp": "2025-08-30T18:30:00+08:00",
+ "open": 211.31785583496094,
+ "high": 211.90797424316406,
+ "low": 210.52484130859375,
+ "close": 211.40509033203125,
+ "volume": 43308.4140625,
+ "amount": 8856770.0
+ },
+ {
+ "timestamp": "2025-08-30T18:45:00+08:00",
+ "open": 211.40362548828125,
+ "high": 211.97486877441406,
+ "low": 210.7671661376953,
+ "close": 211.47540283203125,
+ "volume": 34866.4140625,
+ "amount": 7060054.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 209.8347625732422,
+ "high": 211.67477416992188,
+ "low": 209.2275390625,
+ "close": 211.0730743408203,
+ "volume": 50929.08203125,
+ "amount": 10501012.0
+ },
+ {
+ "timestamp": "2025-08-30T19:15:00+08:00",
+ "open": 211.29388427734375,
+ "high": 212.3085174560547,
+ "low": 210.6793212890625,
+ "close": 212.03553771972656,
+ "volume": 52482.7265625,
+ "amount": 10795927.0
+ },
+ {
+ "timestamp": "2025-08-30T19:30:00+08:00",
+ "open": 211.76470947265625,
+ "high": 212.2696533203125,
+ "low": 211.07388305664062,
+ "close": 211.60971069335938,
+ "volume": 25636.4609375,
+ "amount": 5085773.0
+ },
+ {
+ "timestamp": "2025-08-30T19:45:00+08:00",
+ "open": 211.4890899658203,
+ "high": 211.96034240722656,
+ "low": 210.89694213867188,
+ "close": 211.39459228515625,
+ "volume": 22473.10546875,
+ "amount": 4375774.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 211.45584106445312,
+ "high": 211.98915100097656,
+ "low": 210.77133178710938,
+ "close": 211.5296630859375,
+ "volume": 40627.421875,
+ "amount": 8282252.0
+ },
+ {
+ "timestamp": "2025-08-30T20:15:00+08:00",
+ "open": 211.48614501953125,
+ "high": 212.0394744873047,
+ "low": 210.8609161376953,
+ "close": 211.54188537597656,
+ "volume": 34246.671875,
+ "amount": 6913385.0
+ },
+ {
+ "timestamp": "2025-08-30T20:30:00+08:00",
+ "open": 211.10330200195312,
+ "high": 211.35922241210938,
+ "low": 209.96116638183594,
+ "close": 210.44415283203125,
+ "volume": 44392.234375,
+ "amount": 9109514.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_144445.json b/webui/prediction_results/prediction_20250829_144445.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e59deeda7a45b5f08d79d493f29b4add12baac6
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_144445.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T14:44:45.923056",
+ "file_path": "ETHUSDT_15m",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "ETHUSDT",
+ "interval": "15m",
+ "limit": 1000,
+ "lookback": 1000,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 1,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 1000,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 4075.58,
+ "max": 4942.98
+ },
+ "high": {
+ "min": 4095.0,
+ "max": 4956.78
+ },
+ "low": {
+ "min": 4060.0,
+ "max": 4933.85
+ },
+ "close": {
+ "min": 4075.59,
+ "max": 4942.98
+ }
+ },
+ "last_values": {
+ "open": 4453.89,
+ "high": 4471.42,
+ "low": 4443.37,
+ "close": 4467.7
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T14:45:00+08:00",
+ "open": 4475.39306640625,
+ "high": 4490.494140625,
+ "low": 4457.38525390625,
+ "close": 4468.2412109375,
+ "volume": 7627.9443359375,
+ "amount": 33887576.0
+ },
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 4471.74755859375,
+ "high": 4493.09619140625,
+ "low": 4463.29248046875,
+ "close": 4484.59619140625,
+ "volume": 9789.4853515625,
+ "amount": 43127524.0
+ },
+ {
+ "timestamp": "2025-08-29T15:15:00+08:00",
+ "open": 4488.310546875,
+ "high": 4509.32568359375,
+ "low": 4453.65966796875,
+ "close": 4467.154296875,
+ "volume": 7698.359375,
+ "amount": 33999204.0
+ },
+ {
+ "timestamp": "2025-08-29T15:30:00+08:00",
+ "open": 4470.44287109375,
+ "high": 4481.6591796875,
+ "low": 4454.85302734375,
+ "close": 4465.54345703125,
+ "volume": 5820.64453125,
+ "amount": 25431182.0
+ },
+ {
+ "timestamp": "2025-08-29T15:45:00+08:00",
+ "open": 4458.853515625,
+ "high": 4468.3095703125,
+ "low": 4434.0849609375,
+ "close": 4444.95361328125,
+ "volume": 5545.421875,
+ "amount": 24117800.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 4447.17041015625,
+ "high": 4458.72998046875,
+ "low": 4426.33642578125,
+ "close": 4441.75537109375,
+ "volume": 9062.5048828125,
+ "amount": 40147176.0
+ },
+ {
+ "timestamp": "2025-08-29T16:15:00+08:00",
+ "open": 4439.44677734375,
+ "high": 4446.65380859375,
+ "low": 4415.10205078125,
+ "close": 4421.83154296875,
+ "volume": 5505.30810546875,
+ "amount": 24136666.0
+ },
+ {
+ "timestamp": "2025-08-29T16:30:00+08:00",
+ "open": 4436.0615234375,
+ "high": 4456.52001953125,
+ "low": 4425.62109375,
+ "close": 4446.4462890625,
+ "volume": 4403.462890625,
+ "amount": 19484500.0
+ },
+ {
+ "timestamp": "2025-08-29T16:45:00+08:00",
+ "open": 4451.66552734375,
+ "high": 4470.400390625,
+ "low": 4444.31201171875,
+ "close": 4457.67724609375,
+ "volume": 5625.443359375,
+ "amount": 25156120.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 4459.34326171875,
+ "high": 4469.34423828125,
+ "low": 4447.14306640625,
+ "close": 4456.50830078125,
+ "volume": 3870.957763671875,
+ "amount": 17261686.0
+ },
+ {
+ "timestamp": "2025-08-29T17:15:00+08:00",
+ "open": 4460.0244140625,
+ "high": 4470.13037109375,
+ "low": 4450.25341796875,
+ "close": 4459.39453125,
+ "volume": 3543.47998046875,
+ "amount": 15846772.0
+ },
+ {
+ "timestamp": "2025-08-29T17:30:00+08:00",
+ "open": 4457.65625,
+ "high": 4465.13232421875,
+ "low": 4441.35498046875,
+ "close": 4445.8349609375,
+ "volume": 3931.339599609375,
+ "amount": 17498512.0
+ },
+ {
+ "timestamp": "2025-08-29T17:45:00+08:00",
+ "open": 4452.3505859375,
+ "high": 4463.13037109375,
+ "low": 4439.46484375,
+ "close": 4449.302734375,
+ "volume": 4718.111328125,
+ "amount": 21203534.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 4447.71484375,
+ "high": 4456.546875,
+ "low": 4434.51416015625,
+ "close": 4440.126953125,
+ "volume": 4100.62890625,
+ "amount": 18166164.0
+ },
+ {
+ "timestamp": "2025-08-29T18:15:00+08:00",
+ "open": 4447.2802734375,
+ "high": 4460.69677734375,
+ "low": 4439.892578125,
+ "close": 4451.873046875,
+ "volume": 3434.46240234375,
+ "amount": 15316880.0
+ },
+ {
+ "timestamp": "2025-08-29T18:30:00+08:00",
+ "open": 4452.91162109375,
+ "high": 4459.91748046875,
+ "low": 4444.13720703125,
+ "close": 4448.80908203125,
+ "volume": 2484.7412109375,
+ "amount": 11067866.0
+ },
+ {
+ "timestamp": "2025-08-29T18:45:00+08:00",
+ "open": 4452.9365234375,
+ "high": 4458.94677734375,
+ "low": 4444.92529296875,
+ "close": 4449.43408203125,
+ "volume": 2297.6748046875,
+ "amount": 10239600.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 4455.3037109375,
+ "high": 4465.3408203125,
+ "low": 4448.1884765625,
+ "close": 4458.28271484375,
+ "volume": 3101.412109375,
+ "amount": 13888214.0
+ },
+ {
+ "timestamp": "2025-08-29T19:15:00+08:00",
+ "open": 4460.62255859375,
+ "high": 4469.52099609375,
+ "low": 4452.10693359375,
+ "close": 4460.59228515625,
+ "volume": 3259.80224609375,
+ "amount": 14603738.0
+ },
+ {
+ "timestamp": "2025-08-29T19:30:00+08:00",
+ "open": 4457.66943359375,
+ "high": 4464.20361328125,
+ "low": 4441.87646484375,
+ "close": 4445.90478515625,
+ "volume": 3729.024658203125,
+ "amount": 16602088.0
+ },
+ {
+ "timestamp": "2025-08-29T19:45:00+08:00",
+ "open": 4443.259765625,
+ "high": 4448.1943359375,
+ "low": 4430.2275390625,
+ "close": 4432.64892578125,
+ "volume": 2764.3388671875,
+ "amount": 12397988.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 4437.5859375,
+ "high": 4446.86962890625,
+ "low": 4427.27392578125,
+ "close": 4434.41015625,
+ "volume": 3517.18896484375,
+ "amount": 15581724.0
+ },
+ {
+ "timestamp": "2025-08-29T20:15:00+08:00",
+ "open": 4439.7998046875,
+ "high": 4448.30908203125,
+ "low": 4431.89111328125,
+ "close": 4438.5234375,
+ "volume": 2338.8857421875,
+ "amount": 10383752.0
+ },
+ {
+ "timestamp": "2025-08-29T20:30:00+08:00",
+ "open": 4443.41943359375,
+ "high": 4450.49560546875,
+ "low": 4435.98095703125,
+ "close": 4441.56591796875,
+ "volume": 2189.70361328125,
+ "amount": 9767136.0
+ },
+ {
+ "timestamp": "2025-08-29T20:45:00+08:00",
+ "open": 4445.99462890625,
+ "high": 4452.1650390625,
+ "low": 4438.48876953125,
+ "close": 4443.62646484375,
+ "volume": 2149.84619140625,
+ "amount": 9582980.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 4447.6494140625,
+ "high": 4453.33251953125,
+ "low": 4440.0693359375,
+ "close": 4445.0166015625,
+ "volume": 2126.830078125,
+ "amount": 9457254.0
+ },
+ {
+ "timestamp": "2025-08-29T21:15:00+08:00",
+ "open": 4451.2958984375,
+ "high": 4461.515625,
+ "low": 4444.52685546875,
+ "close": 4455.0224609375,
+ "volume": 2950.3798828125,
+ "amount": 13174318.0
+ },
+ {
+ "timestamp": "2025-08-29T21:30:00+08:00",
+ "open": 4463.78369140625,
+ "high": 4474.42919921875,
+ "low": 4457.12158203125,
+ "close": 4465.7509765625,
+ "volume": 2112.369140625,
+ "amount": 9460990.0
+ },
+ {
+ "timestamp": "2025-08-29T21:45:00+08:00",
+ "open": 4465.39599609375,
+ "high": 4468.57373046875,
+ "low": 4455.44970703125,
+ "close": 4458.39306640625,
+ "volume": 2150.73779296875,
+ "amount": 9565008.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 4463.8203125,
+ "high": 4470.90673828125,
+ "low": 4455.60888671875,
+ "close": 4464.00634765625,
+ "volume": 2996.248046875,
+ "amount": 13370722.0
+ },
+ {
+ "timestamp": "2025-08-29T22:15:00+08:00",
+ "open": 4466.0341796875,
+ "high": 4473.34423828125,
+ "low": 4457.1318359375,
+ "close": 4464.7451171875,
+ "volume": 3177.6201171875,
+ "amount": 14182380.0
+ },
+ {
+ "timestamp": "2025-08-29T22:30:00+08:00",
+ "open": 4465.1748046875,
+ "high": 4469.259765625,
+ "low": 4455.42333984375,
+ "close": 4458.80810546875,
+ "volume": 2305.25341796875,
+ "amount": 10204460.0
+ },
+ {
+ "timestamp": "2025-08-29T22:45:00+08:00",
+ "open": 4456.71875,
+ "high": 4462.33642578125,
+ "low": 4442.1904296875,
+ "close": 4446.46240234375,
+ "volume": 3515.01318359375,
+ "amount": 15601176.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 4447.88720703125,
+ "high": 4455.390625,
+ "low": 4435.08056640625,
+ "close": 4440.0048828125,
+ "volume": 3668.009765625,
+ "amount": 16222542.0
+ },
+ {
+ "timestamp": "2025-08-29T23:15:00+08:00",
+ "open": 4451.14794921875,
+ "high": 4467.03515625,
+ "low": 4430.35009765625,
+ "close": 4438.390625,
+ "volume": 6680.0849609375,
+ "amount": 29301914.0
+ },
+ {
+ "timestamp": "2025-08-29T23:30:00+08:00",
+ "open": 4434.3623046875,
+ "high": 4437.36328125,
+ "low": 4405.90869140625,
+ "close": 4405.78857421875,
+ "volume": 10929.482421875,
+ "amount": 48557132.0
+ },
+ {
+ "timestamp": "2025-08-29T23:45:00+08:00",
+ "open": 4408.3837890625,
+ "high": 4422.7353515625,
+ "low": 4396.68017578125,
+ "close": 4406.693359375,
+ "volume": 5351.13671875,
+ "amount": 23324156.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 4407.900390625,
+ "high": 4426.98193359375,
+ "low": 4399.10302734375,
+ "close": 4414.2802734375,
+ "volume": 4985.232421875,
+ "amount": 21656318.0
+ },
+ {
+ "timestamp": "2025-08-30T00:15:00+08:00",
+ "open": 4419.51171875,
+ "high": 4432.8291015625,
+ "low": 4409.4990234375,
+ "close": 4419.48876953125,
+ "volume": 3905.1591796875,
+ "amount": 17215756.0
+ },
+ {
+ "timestamp": "2025-08-30T00:30:00+08:00",
+ "open": 4423.07568359375,
+ "high": 4434.990234375,
+ "low": 4413.3447265625,
+ "close": 4421.8095703125,
+ "volume": 3696.855712890625,
+ "amount": 16365186.0
+ },
+ {
+ "timestamp": "2025-08-30T00:45:00+08:00",
+ "open": 4425.412109375,
+ "high": 4436.4072265625,
+ "low": 4415.48828125,
+ "close": 4423.09716796875,
+ "volume": 3656.831298828125,
+ "amount": 16200730.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 4427.07421875,
+ "high": 4437.56103515625,
+ "low": 4417.10791015625,
+ "close": 4424.1650390625,
+ "volume": 3650.77880859375,
+ "amount": 16163038.0
+ },
+ {
+ "timestamp": "2025-08-30T01:15:00+08:00",
+ "open": 4423.990234375,
+ "high": 4429.60546875,
+ "low": 4412.88525390625,
+ "close": 4416.09716796875,
+ "volume": 2709.11767578125,
+ "amount": 12078352.0
+ },
+ {
+ "timestamp": "2025-08-30T01:30:00+08:00",
+ "open": 4422.77978515625,
+ "high": 4433.359375,
+ "low": 4414.36279296875,
+ "close": 4422.4248046875,
+ "volume": 3398.93310546875,
+ "amount": 15033004.0
+ },
+ {
+ "timestamp": "2025-08-30T01:45:00+08:00",
+ "open": 4422.82080078125,
+ "high": 4428.03125,
+ "low": 4412.04345703125,
+ "close": 4415.1455078125,
+ "volume": 2624.51025390625,
+ "amount": 11725686.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 4417.7353515625,
+ "high": 4422.8154296875,
+ "low": 4408.658203125,
+ "close": 4412.39111328125,
+ "volume": 2436.2763671875,
+ "amount": 10884686.0
+ },
+ {
+ "timestamp": "2025-08-30T02:15:00+08:00",
+ "open": 4419.49658203125,
+ "high": 4430.1337890625,
+ "low": 4411.44287109375,
+ "close": 4419.994140625,
+ "volume": 3253.17236328125,
+ "amount": 14373996.0
+ },
+ {
+ "timestamp": "2025-08-30T02:30:00+08:00",
+ "open": 4426.5625,
+ "high": 4434.4697265625,
+ "low": 4419.0185546875,
+ "close": 4425.71240234375,
+ "volume": 2173.82421875,
+ "amount": 9593102.0
+ },
+ {
+ "timestamp": "2025-08-30T02:45:00+08:00",
+ "open": 4431.125,
+ "high": 4437.8212890625,
+ "low": 4424.39501953125,
+ "close": 4430.10595703125,
+ "volume": 2030.0625,
+ "amount": 8996584.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 4432.4482421875,
+ "high": 4440.4033203125,
+ "low": 4422.708984375,
+ "close": 4428.4755859375,
+ "volume": 3258.76123046875,
+ "amount": 14471588.0
+ },
+ {
+ "timestamp": "2025-08-30T03:15:00+08:00",
+ "open": 4434.09423828125,
+ "high": 4440.85595703125,
+ "low": 4426.19775390625,
+ "close": 4432.1748046875,
+ "volume": 2192.650390625,
+ "amount": 9661786.0
+ },
+ {
+ "timestamp": "2025-08-30T03:30:00+08:00",
+ "open": 4436.89794921875,
+ "high": 4449.38525390625,
+ "low": 4430.4541015625,
+ "close": 4439.28173828125,
+ "volume": 3777.546630859375,
+ "amount": 16553222.0
+ },
+ {
+ "timestamp": "2025-08-30T03:45:00+08:00",
+ "open": 4443.34521484375,
+ "high": 4448.34521484375,
+ "low": 4433.31396484375,
+ "close": 4437.76025390625,
+ "volume": 2307.06494140625,
+ "amount": 10187352.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 4445.75830078125,
+ "high": 4456.35498046875,
+ "low": 4439.30908203125,
+ "close": 4449.79833984375,
+ "volume": 2986.740234375,
+ "amount": 13296126.0
+ },
+ {
+ "timestamp": "2025-08-30T04:15:00+08:00",
+ "open": 4453.3271484375,
+ "high": 4461.97900390625,
+ "low": 4445.7275390625,
+ "close": 4454.1044921875,
+ "volume": 3141.96240234375,
+ "amount": 14019666.0
+ },
+ {
+ "timestamp": "2025-08-30T04:30:00+08:00",
+ "open": 4460.35302734375,
+ "high": 4468.6044921875,
+ "low": 4449.45751953125,
+ "close": 4458.955078125,
+ "volume": 3893.1748046875,
+ "amount": 17371366.0
+ },
+ {
+ "timestamp": "2025-08-30T04:45:00+08:00",
+ "open": 4458.69091796875,
+ "high": 4462.13525390625,
+ "low": 4448.71923828125,
+ "close": 4451.681640625,
+ "volume": 2403.53173828125,
+ "amount": 10631452.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 4455.412109375,
+ "high": 4458.86572265625,
+ "low": 4447.08447265625,
+ "close": 4450.326171875,
+ "volume": 2194.31005859375,
+ "amount": 9697510.0
+ },
+ {
+ "timestamp": "2025-08-30T05:15:00+08:00",
+ "open": 4456.33349609375,
+ "high": 4464.39599609375,
+ "low": 4449.61181640625,
+ "close": 4458.34228515625,
+ "volume": 3008.1005859375,
+ "amount": 13391762.0
+ },
+ {
+ "timestamp": "2025-08-30T05:30:00+08:00",
+ "open": 4459.1015625,
+ "high": 4462.34814453125,
+ "low": 4449.98876953125,
+ "close": 4452.84326171875,
+ "volume": 2261.19775390625,
+ "amount": 10009704.0
+ },
+ {
+ "timestamp": "2025-08-30T05:45:00+08:00",
+ "open": 4458.75244140625,
+ "high": 4466.1484375,
+ "low": 4451.54150390625,
+ "close": 4459.73583984375,
+ "volume": 3006.083984375,
+ "amount": 13381342.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 4460.3203125,
+ "high": 4463.41259765625,
+ "low": 4451.142578125,
+ "close": 4453.876953125,
+ "volume": 2250.26123046875,
+ "amount": 9964284.0
+ },
+ {
+ "timestamp": "2025-08-30T06:15:00+08:00",
+ "open": 4459.52685546875,
+ "high": 4466.78955078125,
+ "low": 4452.3046875,
+ "close": 4460.33642578125,
+ "volume": 2989.49072265625,
+ "amount": 13307256.0
+ },
+ {
+ "timestamp": "2025-08-30T06:30:00+08:00",
+ "open": 4466.103515625,
+ "high": 4473.357421875,
+ "low": 4455.0498046875,
+ "close": 4463.7744140625,
+ "volume": 3843.999755859375,
+ "amount": 17168558.0
+ },
+ {
+ "timestamp": "2025-08-30T06:45:00+08:00",
+ "open": 4463.78955078125,
+ "high": 4466.755859375,
+ "low": 4453.74658203125,
+ "close": 4456.37109375,
+ "volume": 2359.63232421875,
+ "amount": 10438442.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 4460.02587890625,
+ "high": 4462.9697265625,
+ "low": 4451.57958984375,
+ "close": 4454.49169921875,
+ "volume": 2149.61865234375,
+ "amount": 9492492.0
+ },
+ {
+ "timestamp": "2025-08-30T07:15:00+08:00",
+ "open": 4458.18701171875,
+ "high": 4461.1494140625,
+ "low": 4450.248046875,
+ "close": 4453.38916015625,
+ "volume": 2091.15185546875,
+ "amount": 9235408.0
+ },
+ {
+ "timestamp": "2025-08-30T07:30:00+08:00",
+ "open": 4456.94775390625,
+ "high": 4459.888671875,
+ "low": 4449.107421875,
+ "close": 4452.421875,
+ "volume": 2046.2802734375,
+ "amount": 9028306.0
+ },
+ {
+ "timestamp": "2025-08-30T07:45:00+08:00",
+ "open": 4450.64111328125,
+ "high": 4455.8544921875,
+ "low": 4437.90234375,
+ "close": 4442.01123046875,
+ "volume": 3325.45947265625,
+ "amount": 14708284.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 4443.60009765625,
+ "high": 4450.54150390625,
+ "low": 4431.58544921875,
+ "close": 4436.2099609375,
+ "volume": 3507.669921875,
+ "amount": 15459794.0
+ },
+ {
+ "timestamp": "2025-08-30T08:15:00+08:00",
+ "open": 4442.1611328125,
+ "high": 4448.74267578125,
+ "low": 4434.025390625,
+ "close": 4439.4833984375,
+ "volume": 2220.54150390625,
+ "amount": 9763768.0
+ },
+ {
+ "timestamp": "2025-08-30T08:30:00+08:00",
+ "open": 4444.66455078125,
+ "high": 4449.8037109375,
+ "low": 4437.31982421875,
+ "close": 4441.72900390625,
+ "volume": 2054.14501953125,
+ "amount": 9095126.0
+ },
+ {
+ "timestamp": "2025-08-30T08:45:00+08:00",
+ "open": 4446.98876953125,
+ "high": 4451.1435546875,
+ "low": 4439.60498046875,
+ "close": 4443.5478515625,
+ "volume": 1997.9091796875,
+ "amount": 8857388.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 4448.36767578125,
+ "high": 4452.1748046875,
+ "low": 4440.8837890625,
+ "close": 4444.8212890625,
+ "volume": 1971.53466796875,
+ "amount": 8724846.0
+ },
+ {
+ "timestamp": "2025-08-30T09:15:00+08:00",
+ "open": 4449.26171875,
+ "high": 4452.9658203125,
+ "low": 4441.6767578125,
+ "close": 4445.7197265625,
+ "volume": 1957.69775390625,
+ "amount": 8646988.0
+ },
+ {
+ "timestamp": "2025-08-30T09:30:00+08:00",
+ "open": 4450.08984375,
+ "high": 4453.64404296875,
+ "low": 4442.3984375,
+ "close": 4446.4521484375,
+ "volume": 1940.76513671875,
+ "amount": 8560176.0
+ },
+ {
+ "timestamp": "2025-08-30T09:45:00+08:00",
+ "open": 4441.83154296875,
+ "high": 4444.29736328125,
+ "low": 4430.7626953125,
+ "close": 4432.7177734375,
+ "volume": 2199.5634765625,
+ "amount": 9831958.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 4435.56201171875,
+ "high": 4443.05859375,
+ "low": 4425.48876953125,
+ "close": 4431.7099609375,
+ "volume": 3201.94921875,
+ "amount": 14076856.0
+ },
+ {
+ "timestamp": "2025-08-30T10:15:00+08:00",
+ "open": 4435.11669921875,
+ "high": 4443.1513671875,
+ "low": 4424.16748046875,
+ "close": 4429.5693359375,
+ "volume": 3393.9794921875,
+ "amount": 14940854.0
+ },
+ {
+ "timestamp": "2025-08-30T10:30:00+08:00",
+ "open": 4449.251953125,
+ "high": 4468.1787109375,
+ "low": 4407.73876953125,
+ "close": 4413.61572265625,
+ "volume": 6180.857421875,
+ "amount": 27232986.0
+ },
+ {
+ "timestamp": "2025-08-30T10:45:00+08:00",
+ "open": 4418.56640625,
+ "high": 4426.99755859375,
+ "low": 4407.890625,
+ "close": 4414.6923828125,
+ "volume": 2911.21923828125,
+ "amount": 12764714.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 4423.27490234375,
+ "high": 4434.11669921875,
+ "low": 4414.24365234375,
+ "close": 4423.75830078125,
+ "volume": 2159.18115234375,
+ "amount": 9464844.0
+ },
+ {
+ "timestamp": "2025-08-30T11:15:00+08:00",
+ "open": 4422.890625,
+ "high": 4430.45263671875,
+ "low": 4406.41748046875,
+ "close": 4413.015625,
+ "volume": 4069.020263671875,
+ "amount": 17834534.0
+ },
+ {
+ "timestamp": "2025-08-30T11:30:00+08:00",
+ "open": 4422.1123046875,
+ "high": 4432.6279296875,
+ "low": 4413.69677734375,
+ "close": 4422.66162109375,
+ "volume": 2245.869140625,
+ "amount": 9839772.0
+ },
+ {
+ "timestamp": "2025-08-30T11:45:00+08:00",
+ "open": 4426.66943359375,
+ "high": 4437.044921875,
+ "low": 4417.4345703125,
+ "close": 4424.703125,
+ "volume": 3279.62548828125,
+ "amount": 14532810.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 4428.41796875,
+ "high": 4438.08251953125,
+ "low": 4417.6142578125,
+ "close": 4424.30712890625,
+ "volume": 3482.80322265625,
+ "amount": 15369926.0
+ },
+ {
+ "timestamp": "2025-08-30T12:15:00+08:00",
+ "open": 4424.35693359375,
+ "high": 4429.4638671875,
+ "low": 4413.07470703125,
+ "close": 4416.146484375,
+ "volume": 2542.1484375,
+ "amount": 11286276.0
+ },
+ {
+ "timestamp": "2025-08-30T12:30:00+08:00",
+ "open": 4424.92626953125,
+ "high": 4433.3505859375,
+ "low": 4417.375,
+ "close": 4425.17724609375,
+ "volume": 2033.24462890625,
+ "amount": 8929204.0
+ },
+ {
+ "timestamp": "2025-08-30T12:45:00+08:00",
+ "open": 4431.095703125,
+ "high": 4437.9970703125,
+ "low": 4424.1591796875,
+ "close": 4430.1064453125,
+ "volume": 1961.21630859375,
+ "amount": 8675884.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 4435.22412109375,
+ "high": 4440.904296875,
+ "low": 4427.9931640625,
+ "close": 4433.2490234375,
+ "volume": 1934.3203125,
+ "amount": 8542236.0
+ },
+ {
+ "timestamp": "2025-08-30T13:15:00+08:00",
+ "open": 4441.78955078125,
+ "high": 4452.7998046875,
+ "low": 4435.89892578125,
+ "close": 4447.0693359375,
+ "volume": 2780.62744140625,
+ "amount": 12354512.0
+ },
+ {
+ "timestamp": "2025-08-30T13:30:00+08:00",
+ "open": 4450.72314453125,
+ "high": 4459.70361328125,
+ "low": 4443.11572265625,
+ "close": 4451.88916015625,
+ "volume": 2998.10791015625,
+ "amount": 13337032.0
+ },
+ {
+ "timestamp": "2025-08-30T13:45:00+08:00",
+ "open": 4453.06103515625,
+ "high": 4456.916015625,
+ "low": 4443.51220703125,
+ "close": 4446.93359375,
+ "volume": 2147.71728515625,
+ "amount": 9464878.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 4451.41259765625,
+ "high": 4454.98291015625,
+ "low": 4443.05126953125,
+ "close": 4446.6728515625,
+ "volume": 2020.13720703125,
+ "amount": 8899476.0
+ },
+ {
+ "timestamp": "2025-08-30T14:15:00+08:00",
+ "open": 4450.83984375,
+ "high": 4454.37158203125,
+ "low": 4442.8291015625,
+ "close": 4446.57470703125,
+ "volume": 1977.5205078125,
+ "amount": 8720166.0
+ },
+ {
+ "timestamp": "2025-08-30T14:30:00+08:00",
+ "open": 4450.6123046875,
+ "high": 4454.08056640625,
+ "low": 4442.6259765625,
+ "close": 4446.470703125,
+ "volume": 1946.2275390625,
+ "amount": 8577792.0
+ },
+ {
+ "timestamp": "2025-08-30T14:45:00+08:00",
+ "open": 4450.72314453125,
+ "high": 4454.1025390625,
+ "low": 4442.66650390625,
+ "close": 4446.58935546875,
+ "volume": 1925.15380859375,
+ "amount": 8472904.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 4450.73486328125,
+ "high": 4454.03125,
+ "low": 4442.70361328125,
+ "close": 4446.6357421875,
+ "volume": 1902.77197265625,
+ "amount": 8358786.0
+ },
+ {
+ "timestamp": "2025-08-30T15:15:00+08:00",
+ "open": 4449.1904296875,
+ "high": 4458.5654296875,
+ "low": 4439.82958984375,
+ "close": 4447.3193359375,
+ "volume": 3754.225830078125,
+ "amount": 16352920.0
+ },
+ {
+ "timestamp": "2025-08-30T15:30:00+08:00",
+ "open": 4451.1796875,
+ "high": 4455.5283203125,
+ "low": 4440.46484375,
+ "close": 4444.556640625,
+ "volume": 2196.74560546875,
+ "amount": 9607372.0
+ },
+ {
+ "timestamp": "2025-08-30T15:45:00+08:00",
+ "open": 4449.95751953125,
+ "high": 4454.2392578125,
+ "low": 4441.34423828125,
+ "close": 4445.36962890625,
+ "volume": 2033.66259765625,
+ "amount": 8954060.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 4452.71826171875,
+ "high": 4461.85302734375,
+ "low": 4445.93310546875,
+ "close": 4455.3662109375,
+ "volume": 2869.0107421875,
+ "amount": 12766232.0
+ },
+ {
+ "timestamp": "2025-08-30T16:15:00+08:00",
+ "open": 4456.76904296875,
+ "high": 4460.29638671875,
+ "low": 4447.1376953125,
+ "close": 4450.2431640625,
+ "volume": 2119.6484375,
+ "amount": 9350508.0
+ },
+ {
+ "timestamp": "2025-08-30T16:30:00+08:00",
+ "open": 4454.650390625,
+ "high": 4458.021484375,
+ "low": 4446.01904296875,
+ "close": 4449.41552734375,
+ "volume": 2001.9658203125,
+ "amount": 8809458.0
+ },
+ {
+ "timestamp": "2025-08-30T16:45:00+08:00",
+ "open": 4456.00244140625,
+ "high": 4464.26953125,
+ "low": 4449.099609375,
+ "close": 4457.9091796875,
+ "volume": 2862.791015625,
+ "amount": 12715424.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 4461.19921875,
+ "high": 4468.45654296875,
+ "low": 4452.8603515625,
+ "close": 4460.0908203125,
+ "volume": 3035.2373046875,
+ "amount": 13495972.0
+ },
+ {
+ "timestamp": "2025-08-30T17:15:00+08:00",
+ "open": 4461.71875,
+ "high": 4464.89501953125,
+ "low": 4451.8251953125,
+ "close": 4454.52490234375,
+ "volume": 2150.0859375,
+ "amount": 9457424.0
+ },
+ {
+ "timestamp": "2025-08-30T17:30:00+08:00",
+ "open": 4458.8837890625,
+ "high": 4461.86376953125,
+ "low": 4450.1875,
+ "close": 4453.25,
+ "volume": 2018.88818359375,
+ "amount": 8873592.0
+ },
+ {
+ "timestamp": "2025-08-30T17:45:00+08:00",
+ "open": 4457.4638671875,
+ "high": 4460.474609375,
+ "low": 4449.154296875,
+ "close": 4452.4384765625,
+ "volume": 1968.6240234375,
+ "amount": 8652570.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 4456.51953125,
+ "high": 4459.55078125,
+ "low": 4448.25439453125,
+ "close": 4451.73388671875,
+ "volume": 1931.48046875,
+ "amount": 8480152.0
+ },
+ {
+ "timestamp": "2025-08-30T18:15:00+08:00",
+ "open": 4455.92236328125,
+ "high": 4458.9658203125,
+ "low": 4447.59814453125,
+ "close": 4451.22705078125,
+ "volume": 1906.451171875,
+ "amount": 8359996.0
+ },
+ {
+ "timestamp": "2025-08-30T18:30:00+08:00",
+ "open": 4455.41015625,
+ "high": 4458.42578125,
+ "low": 4447.06884765625,
+ "close": 4450.74853515625,
+ "volume": 1881.97705078125,
+ "amount": 8244206.0
+ },
+ {
+ "timestamp": "2025-08-30T18:45:00+08:00",
+ "open": 4454.880859375,
+ "high": 4457.85888671875,
+ "low": 4446.56298828125,
+ "close": 4450.24365234375,
+ "volume": 1859.8369140625,
+ "amount": 8143162.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 4454.4931640625,
+ "high": 4457.44384765625,
+ "low": 4446.19677734375,
+ "close": 4449.88427734375,
+ "volume": 1844.34375,
+ "amount": 8072410.0
+ },
+ {
+ "timestamp": "2025-08-30T19:15:00+08:00",
+ "open": 4448.9033203125,
+ "high": 4454.20166015625,
+ "low": 4436.1005859375,
+ "close": 4440.21728515625,
+ "volume": 3178.27099609375,
+ "amount": 14001542.0
+ },
+ {
+ "timestamp": "2025-08-30T19:30:00+08:00",
+ "open": 4438.18408203125,
+ "high": 4441.70556640625,
+ "low": 4426.0986328125,
+ "close": 4428.201171875,
+ "volume": 2323.46044921875,
+ "amount": 10249692.0
+ },
+ {
+ "timestamp": "2025-08-30T19:45:00+08:00",
+ "open": 4436.38818359375,
+ "high": 4443.2783203125,
+ "low": 4428.2373046875,
+ "close": 4435.158203125,
+ "volume": 1885.62255859375,
+ "amount": 8202620.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 4441.103515625,
+ "high": 4446.53515625,
+ "low": 4433.41796875,
+ "close": 4438.57958984375,
+ "volume": 1831.78271484375,
+ "amount": 8041696.0
+ },
+ {
+ "timestamp": "2025-08-30T20:15:00+08:00",
+ "open": 4436.1572265625,
+ "high": 4438.953125,
+ "low": 4425.17529296875,
+ "close": 4427.3349609375,
+ "volume": 2042.33837890625,
+ "amount": 9105280.0
+ },
+ {
+ "timestamp": "2025-08-30T20:30:00+08:00",
+ "open": 4427.47021484375,
+ "high": 4430.9775390625,
+ "low": 4417.41259765625,
+ "close": 4420.6572265625,
+ "volume": 2053.37890625,
+ "amount": 9087156.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_144621.json b/webui/prediction_results/prediction_20250829_144621.json
new file mode 100644
index 0000000000000000000000000000000000000000..95b865a10cfb31c15eee7c2cb7fe3a4179ab27e6
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_144621.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T14:46:21.732774",
+ "file_path": "BTCUSDT_15m",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "BTCUSDT",
+ "interval": "15m",
+ "limit": 1000,
+ "lookback": 1000,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 1,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 1000,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 109100.24,
+ "max": 117410.0
+ },
+ "high": {
+ "min": 109580.0,
+ "max": 117429.05
+ },
+ "low": {
+ "min": 108666.66,
+ "max": 117024.0
+ },
+ "close": {
+ "min": 109100.23,
+ "max": 117410.0
+ }
+ },
+ "last_values": {
+ "open": 111000.01,
+ "high": 111252.83,
+ "low": 110955.41,
+ "close": 111236.0
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T14:45:00+08:00",
+ "open": 111168.84375,
+ "high": 111428.984375,
+ "low": 111069.21875,
+ "close": 111291.6328125,
+ "volume": 107.74244689941406,
+ "amount": 11905271.0
+ },
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 111459.4765625,
+ "high": 111390.40625,
+ "low": 111016.0390625,
+ "close": 111065.3515625,
+ "volume": 100.44855499267578,
+ "amount": 11109445.0
+ },
+ {
+ "timestamp": "2025-08-29T15:15:00+08:00",
+ "open": 111008.5390625,
+ "high": 111307.0,
+ "low": 110882.4375,
+ "close": 111207.53125,
+ "volume": 102.61687469482422,
+ "amount": 11261764.0
+ },
+ {
+ "timestamp": "2025-08-29T15:30:00+08:00",
+ "open": 111131.90625,
+ "high": 111246.015625,
+ "low": 110920.6953125,
+ "close": 111047.25,
+ "volume": 148.45530700683594,
+ "amount": 16270636.0
+ },
+ {
+ "timestamp": "2025-08-29T15:45:00+08:00",
+ "open": 111185.6171875,
+ "high": 111286.0859375,
+ "low": 110959.171875,
+ "close": 111138.0078125,
+ "volume": 92.29530334472656,
+ "amount": 10299675.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 111115.3125,
+ "high": 111351.90625,
+ "low": 110853.75,
+ "close": 111050.90625,
+ "volume": 266.1111755371094,
+ "amount": 29438244.0
+ },
+ {
+ "timestamp": "2025-08-29T16:15:00+08:00",
+ "open": 111077.7265625,
+ "high": 111302.3359375,
+ "low": 110955.71875,
+ "close": 111179.125,
+ "volume": 106.41625213623047,
+ "amount": 11760253.0
+ },
+ {
+ "timestamp": "2025-08-29T16:30:00+08:00",
+ "open": 111089.0859375,
+ "high": 111214.0234375,
+ "low": 110989.0625,
+ "close": 111124.0,
+ "volume": 68.92633056640625,
+ "amount": 7498789.0
+ },
+ {
+ "timestamp": "2025-08-29T16:45:00+08:00",
+ "open": 110984.625,
+ "high": 111356.890625,
+ "low": 110859.59375,
+ "close": 111248.921875,
+ "volume": 124.86672973632812,
+ "amount": 13508892.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 111104.5703125,
+ "high": 111239.1875,
+ "low": 110994.875,
+ "close": 111135.6328125,
+ "volume": 69.62108612060547,
+ "amount": 7636843.0
+ },
+ {
+ "timestamp": "2025-08-29T17:15:00+08:00",
+ "open": 111193.140625,
+ "high": 111428.375,
+ "low": 111081.0,
+ "close": 111280.5234375,
+ "volume": 126.43584442138672,
+ "amount": 13772505.0
+ },
+ {
+ "timestamp": "2025-08-29T17:30:00+08:00",
+ "open": 111309.828125,
+ "high": 111541.59375,
+ "low": 111185.7578125,
+ "close": 111401.3125,
+ "volume": 123.78298950195312,
+ "amount": 13412482.0
+ },
+ {
+ "timestamp": "2025-08-29T17:45:00+08:00",
+ "open": 111806.9375,
+ "high": 112311.90625,
+ "low": 111424.1171875,
+ "close": 111659.2109375,
+ "volume": 139.4436798095703,
+ "amount": 15323338.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 111639.109375,
+ "high": 111780.765625,
+ "low": 111386.4375,
+ "close": 111548.6875,
+ "volume": 148.95150756835938,
+ "amount": 16218812.0
+ },
+ {
+ "timestamp": "2025-08-29T18:15:00+08:00",
+ "open": 111710.59375,
+ "high": 111658.40625,
+ "low": 111286.703125,
+ "close": 111321.578125,
+ "volume": 100.94964599609375,
+ "amount": 11356062.0
+ },
+ {
+ "timestamp": "2025-08-29T18:30:00+08:00",
+ "open": 111373.3125,
+ "high": 111577.5546875,
+ "low": 111266.9765625,
+ "close": 111429.0390625,
+ "volume": 116.31037139892578,
+ "amount": 12787782.0
+ },
+ {
+ "timestamp": "2025-08-29T18:45:00+08:00",
+ "open": 111474.4921875,
+ "high": 111660.609375,
+ "low": 111365.328125,
+ "close": 111485.296875,
+ "volume": 71.23162841796875,
+ "amount": 7891943.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 111475.9140625,
+ "high": 111648.7265625,
+ "low": 111353.3046875,
+ "close": 111510.1796875,
+ "volume": 95.99016571044922,
+ "amount": 10584742.0
+ },
+ {
+ "timestamp": "2025-08-29T19:15:00+08:00",
+ "open": 111467.125,
+ "high": 111612.3125,
+ "low": 111319.375,
+ "close": 111469.078125,
+ "volume": 92.43978881835938,
+ "amount": 10077935.0
+ },
+ {
+ "timestamp": "2025-08-29T19:30:00+08:00",
+ "open": 111579.0625,
+ "high": 111583.6875,
+ "low": 111324.40625,
+ "close": 111378.0703125,
+ "volume": 74.32500457763672,
+ "amount": 8576552.0
+ },
+ {
+ "timestamp": "2025-08-29T19:45:00+08:00",
+ "open": 111421.875,
+ "high": 111553.3671875,
+ "low": 111267.4921875,
+ "close": 111383.75,
+ "volume": 87.70850372314453,
+ "amount": 9725700.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 111450.9609375,
+ "high": 111654.7109375,
+ "low": 111406.65625,
+ "close": 111571.953125,
+ "volume": 82.95088195800781,
+ "amount": 9009520.0
+ },
+ {
+ "timestamp": "2025-08-29T20:15:00+08:00",
+ "open": 111704.140625,
+ "high": 111806.5078125,
+ "low": 111532.9765625,
+ "close": 111625.3046875,
+ "volume": 62.82911682128906,
+ "amount": 6942181.0
+ },
+ {
+ "timestamp": "2025-08-29T20:30:00+08:00",
+ "open": 111683.0078125,
+ "high": 111835.5703125,
+ "low": 111585.109375,
+ "close": 111725.78125,
+ "volume": 88.10262298583984,
+ "amount": 9629783.0
+ },
+ {
+ "timestamp": "2025-08-29T20:45:00+08:00",
+ "open": 111672.40625,
+ "high": 111736.0859375,
+ "low": 111539.4765625,
+ "close": 111606.6171875,
+ "volume": 63.07331848144531,
+ "amount": 7014140.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 111628.25,
+ "high": 111734.5703125,
+ "low": 111528.4453125,
+ "close": 111635.3828125,
+ "volume": 76.92945098876953,
+ "amount": 8487643.0
+ },
+ {
+ "timestamp": "2025-08-29T21:15:00+08:00",
+ "open": 111788.8046875,
+ "high": 111873.2265625,
+ "low": 111618.5234375,
+ "close": 111706.25,
+ "volume": 63.47200012207031,
+ "amount": 7041327.0
+ },
+ {
+ "timestamp": "2025-08-29T21:30:00+08:00",
+ "open": 111694.3828125,
+ "high": 111812.2734375,
+ "low": 111560.140625,
+ "close": 111667.34375,
+ "volume": 118.85958862304688,
+ "amount": 13174423.0
+ },
+ {
+ "timestamp": "2025-08-29T21:45:00+08:00",
+ "open": 111660.84375,
+ "high": 111736.3046875,
+ "low": 111542.3515625,
+ "close": 111613.125,
+ "volume": 66.44634246826172,
+ "amount": 7380835.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 111611.671875,
+ "high": 111753.0,
+ "low": 111515.1796875,
+ "close": 111639.390625,
+ "volume": 117.2723388671875,
+ "amount": 13000749.0
+ },
+ {
+ "timestamp": "2025-08-29T22:15:00+08:00",
+ "open": 111548.84375,
+ "high": 111896.4375,
+ "low": 111464.296875,
+ "close": 111789.859375,
+ "volume": 117.73016357421875,
+ "amount": 12884928.0
+ },
+ {
+ "timestamp": "2025-08-29T22:30:00+08:00",
+ "open": 111776.890625,
+ "high": 111730.734375,
+ "low": 111468.46875,
+ "close": 111497.65625,
+ "volume": 106.01500701904297,
+ "amount": 12278978.0
+ },
+ {
+ "timestamp": "2025-08-29T22:45:00+08:00",
+ "open": 111485.265625,
+ "high": 111664.640625,
+ "low": 111365.3125,
+ "close": 111527.875,
+ "volume": 95.62970733642578,
+ "amount": 10423011.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 111498.1640625,
+ "high": 111645.5234375,
+ "low": 111360.5546875,
+ "close": 111507.578125,
+ "volume": 92.1799087524414,
+ "amount": 10050062.0
+ },
+ {
+ "timestamp": "2025-08-29T23:15:00+08:00",
+ "open": 111642.765625,
+ "high": 111824.0,
+ "low": 111321.234375,
+ "close": 111405.5859375,
+ "volume": 158.8213653564453,
+ "amount": 17752150.0
+ },
+ {
+ "timestamp": "2025-08-29T23:30:00+08:00",
+ "open": 111522.359375,
+ "high": 111740.6484375,
+ "low": 111156.6328125,
+ "close": 111259.046875,
+ "volume": 166.03677368164062,
+ "amount": 18484528.0
+ },
+ {
+ "timestamp": "2025-08-29T23:45:00+08:00",
+ "open": 111239.0625,
+ "high": 111474.8828125,
+ "low": 111154.921875,
+ "close": 111369.359375,
+ "volume": 94.53020477294922,
+ "amount": 10369703.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 111352.203125,
+ "high": 111583.1796875,
+ "low": 111202.46875,
+ "close": 111437.015625,
+ "volume": 212.87124633789062,
+ "amount": 23654354.0
+ },
+ {
+ "timestamp": "2025-08-30T00:15:00+08:00",
+ "open": 111412.140625,
+ "high": 111516.265625,
+ "low": 111201.3828125,
+ "close": 111324.140625,
+ "volume": 142.65975952148438,
+ "amount": 15808126.0
+ },
+ {
+ "timestamp": "2025-08-30T00:30:00+08:00",
+ "open": 111400.1875,
+ "high": 111569.53125,
+ "low": 111256.2265625,
+ "close": 111396.8359375,
+ "volume": 108.13775634765625,
+ "amount": 11788523.0
+ },
+ {
+ "timestamp": "2025-08-30T00:45:00+08:00",
+ "open": 111395.734375,
+ "high": 111568.5703125,
+ "low": 111188.984375,
+ "close": 111384.4140625,
+ "volume": 62.96758270263672,
+ "amount": 7546139.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 111406.9296875,
+ "high": 111587.65625,
+ "low": 111283.796875,
+ "close": 111462.921875,
+ "volume": 137.7883758544922,
+ "amount": 15157422.0
+ },
+ {
+ "timestamp": "2025-08-30T01:15:00+08:00",
+ "open": 111458.4453125,
+ "high": 111513.3359375,
+ "low": 111148.125,
+ "close": 111252.4140625,
+ "volume": 121.01518249511719,
+ "amount": 13389022.0
+ },
+ {
+ "timestamp": "2025-08-30T01:30:00+08:00",
+ "open": 111255.6640625,
+ "high": 111435.0703125,
+ "low": 111158.890625,
+ "close": 111313.296875,
+ "volume": 79.61592864990234,
+ "amount": 8713377.0
+ },
+ {
+ "timestamp": "2025-08-30T01:45:00+08:00",
+ "open": 111379.46875,
+ "high": 111572.53125,
+ "low": 111265.3203125,
+ "close": 111417.7109375,
+ "volume": 62.886993408203125,
+ "amount": 7012918.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 111602.8515625,
+ "high": 111522.2578125,
+ "low": 111240.671875,
+ "close": 111260.25,
+ "volume": 81.55489349365234,
+ "amount": 9592672.0
+ },
+ {
+ "timestamp": "2025-08-30T02:15:00+08:00",
+ "open": 111423.7265625,
+ "high": 111425.953125,
+ "low": 111084.0234375,
+ "close": 111178.9765625,
+ "volume": 114.49605560302734,
+ "amount": 12567647.0
+ },
+ {
+ "timestamp": "2025-08-30T02:30:00+08:00",
+ "open": 111168.109375,
+ "high": 111316.1953125,
+ "low": 110965.4296875,
+ "close": 111112.0078125,
+ "volume": 152.15391540527344,
+ "amount": 16635125.0
+ },
+ {
+ "timestamp": "2025-08-30T02:45:00+08:00",
+ "open": 111271.6953125,
+ "high": 111295.9921875,
+ "low": 110945.421875,
+ "close": 110998.375,
+ "volume": 104.71627044677734,
+ "amount": 11526440.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 111188.0390625,
+ "high": 111354.46875,
+ "low": 110829.703125,
+ "close": 110948.078125,
+ "volume": 198.8612518310547,
+ "amount": 21980518.0
+ },
+ {
+ "timestamp": "2025-08-30T03:15:00+08:00",
+ "open": 111046.65625,
+ "high": 111285.4765625,
+ "low": 110955.609375,
+ "close": 111169.65625,
+ "volume": 78.87939453125,
+ "amount": 8709723.0
+ },
+ {
+ "timestamp": "2025-08-30T03:30:00+08:00",
+ "open": 111305.7109375,
+ "high": 111389.1484375,
+ "low": 110939.3203125,
+ "close": 110998.0703125,
+ "volume": 76.06775665283203,
+ "amount": 8735864.0
+ },
+ {
+ "timestamp": "2025-08-30T03:45:00+08:00",
+ "open": 111046.5078125,
+ "high": 111175.2421875,
+ "low": 110940.5078125,
+ "close": 111065.453125,
+ "volume": 72.09185791015625,
+ "amount": 8154678.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 111200.796875,
+ "high": 111230.2265625,
+ "low": 110947.1640625,
+ "close": 111034.1875,
+ "volume": 58.83280944824219,
+ "amount": 6855019.0
+ },
+ {
+ "timestamp": "2025-08-30T04:15:00+08:00",
+ "open": 111298.2734375,
+ "high": 111350.6875,
+ "low": 110913.875,
+ "close": 110961.2734375,
+ "volume": 71.72576904296875,
+ "amount": 8369619.0
+ },
+ {
+ "timestamp": "2025-08-30T04:30:00+08:00",
+ "open": 111184.7265625,
+ "high": 111339.1796875,
+ "low": 111071.125,
+ "close": 111272.921875,
+ "volume": 80.84431457519531,
+ "amount": 9332349.0
+ },
+ {
+ "timestamp": "2025-08-30T04:45:00+08:00",
+ "open": 111137.078125,
+ "high": 111276.15625,
+ "low": 111081.3984375,
+ "close": 111169.453125,
+ "volume": 50.87566375732422,
+ "amount": 5981040.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 111146.21875,
+ "high": 111289.640625,
+ "low": 111074.0,
+ "close": 111205.7890625,
+ "volume": 62.981712341308594,
+ "amount": 7147150.0
+ },
+ {
+ "timestamp": "2025-08-30T05:15:00+08:00",
+ "open": 111189.3359375,
+ "high": 111331.0078125,
+ "low": 111096.0078125,
+ "close": 111216.2578125,
+ "volume": 88.78456115722656,
+ "amount": 9649521.0
+ },
+ {
+ "timestamp": "2025-08-30T05:30:00+08:00",
+ "open": 111248.21875,
+ "high": 111398.6640625,
+ "low": 111152.5,
+ "close": 111276.7265625,
+ "volume": 105.08946228027344,
+ "amount": 11606438.0
+ },
+ {
+ "timestamp": "2025-08-30T05:45:00+08:00",
+ "open": 111323.9296875,
+ "high": 111515.6875,
+ "low": 111232.875,
+ "close": 111386.34375,
+ "volume": 111.58527374267578,
+ "amount": 12095142.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 111330.3984375,
+ "high": 111404.796875,
+ "low": 111099.1015625,
+ "close": 111189.7578125,
+ "volume": 138.23782348632812,
+ "amount": 15181994.0
+ },
+ {
+ "timestamp": "2025-08-30T06:15:00+08:00",
+ "open": 111208.2109375,
+ "high": 111355.484375,
+ "low": 111119.1953125,
+ "close": 111242.671875,
+ "volume": 75.48944854736328,
+ "amount": 8307290.0
+ },
+ {
+ "timestamp": "2025-08-30T06:30:00+08:00",
+ "open": 111203.984375,
+ "high": 111348.0859375,
+ "low": 111128.1015625,
+ "close": 111248.0859375,
+ "volume": 68.8346939086914,
+ "amount": 7675256.0
+ },
+ {
+ "timestamp": "2025-08-30T06:45:00+08:00",
+ "open": 111149.890625,
+ "high": 111254.7265625,
+ "low": 111073.734375,
+ "close": 111187.6328125,
+ "volume": 60.28900146484375,
+ "amount": 6712586.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 111281.0,
+ "high": 111334.4140625,
+ "low": 111057.453125,
+ "close": 111196.4140625,
+ "volume": 78.940673828125,
+ "amount": 8958955.0
+ },
+ {
+ "timestamp": "2025-08-30T07:15:00+08:00",
+ "open": 111443.6171875,
+ "high": 111337.5859375,
+ "low": 111000.703125,
+ "close": 111027.3984375,
+ "volume": 93.67547607421875,
+ "amount": 10425298.0
+ },
+ {
+ "timestamp": "2025-08-30T07:30:00+08:00",
+ "open": 111074.453125,
+ "high": 111263.03125,
+ "low": 111003.2421875,
+ "close": 111170.5234375,
+ "volume": 71.69232940673828,
+ "amount": 7894782.0
+ },
+ {
+ "timestamp": "2025-08-30T07:45:00+08:00",
+ "open": 111064.8828125,
+ "high": 111130.5078125,
+ "low": 110878.1875,
+ "close": 110962.265625,
+ "volume": 98.40040588378906,
+ "amount": 10814296.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 110991.0078125,
+ "high": 111117.1015625,
+ "low": 110826.4609375,
+ "close": 110969.5859375,
+ "volume": 127.24305725097656,
+ "amount": 13824850.0
+ },
+ {
+ "timestamp": "2025-08-30T08:15:00+08:00",
+ "open": 110994.9609375,
+ "high": 111071.3125,
+ "low": 110919.9765625,
+ "close": 110983.1171875,
+ "volume": 57.98933410644531,
+ "amount": 6384177.0
+ },
+ {
+ "timestamp": "2025-08-30T08:30:00+08:00",
+ "open": 110996.9921875,
+ "high": 111095.3203125,
+ "low": 110909.4375,
+ "close": 111008.5703125,
+ "volume": 65.76761627197266,
+ "amount": 7413650.0
+ },
+ {
+ "timestamp": "2025-08-30T08:45:00+08:00",
+ "open": 110994.78125,
+ "high": 111086.03125,
+ "low": 110901.421875,
+ "close": 110998.9453125,
+ "volume": 66.78579711914062,
+ "amount": 7532935.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 110868.3125,
+ "high": 111005.109375,
+ "low": 110722.5234375,
+ "close": 110864.375,
+ "volume": 89.55391693115234,
+ "amount": 9613289.0
+ },
+ {
+ "timestamp": "2025-08-30T09:15:00+08:00",
+ "open": 111109.953125,
+ "high": 111155.0390625,
+ "low": 110744.25,
+ "close": 110791.71875,
+ "volume": 81.81380462646484,
+ "amount": 9516021.0
+ },
+ {
+ "timestamp": "2025-08-30T09:30:00+08:00",
+ "open": 110878.703125,
+ "high": 110999.453125,
+ "low": 110786.625,
+ "close": 110907.1953125,
+ "volume": 66.76164245605469,
+ "amount": 7531565.0
+ },
+ {
+ "timestamp": "2025-08-30T09:45:00+08:00",
+ "open": 110905.5859375,
+ "high": 111014.9765625,
+ "low": 110812.3203125,
+ "close": 110928.3984375,
+ "volume": 64.68898010253906,
+ "amount": 7343935.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 110908.890625,
+ "high": 111054.390625,
+ "low": 110804.765625,
+ "close": 110956.7265625,
+ "volume": 89.25154876708984,
+ "amount": 9904305.0
+ },
+ {
+ "timestamp": "2025-08-30T10:15:00+08:00",
+ "open": 110964.859375,
+ "high": 111038.703125,
+ "low": 110882.09375,
+ "close": 110939.984375,
+ "volume": 53.86793518066406,
+ "amount": 6138050.0
+ },
+ {
+ "timestamp": "2025-08-30T10:30:00+08:00",
+ "open": 111180.3515625,
+ "high": 111243.3359375,
+ "low": 110826.78125,
+ "close": 110872.359375,
+ "volume": 69.9632797241211,
+ "amount": 8204932.0
+ },
+ {
+ "timestamp": "2025-08-30T10:45:00+08:00",
+ "open": 111078.0078125,
+ "high": 111255.7734375,
+ "low": 110944.671875,
+ "close": 111095.2578125,
+ "volume": 85.97515106201172,
+ "amount": 9346369.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 111070.4921875,
+ "high": 111222.1796875,
+ "low": 110985.1015625,
+ "close": 111117.421875,
+ "volume": 67.38510131835938,
+ "amount": 7617978.0
+ },
+ {
+ "timestamp": "2025-08-30T11:15:00+08:00",
+ "open": 111142.640625,
+ "high": 111293.6640625,
+ "low": 110922.6640625,
+ "close": 111123.4921875,
+ "volume": 52.77381896972656,
+ "amount": 6502052.0
+ },
+ {
+ "timestamp": "2025-08-30T11:30:00+08:00",
+ "open": 111001.75,
+ "high": 111129.828125,
+ "low": 110914.2265625,
+ "close": 111010.484375,
+ "volume": 73.64842224121094,
+ "amount": 8380469.0
+ },
+ {
+ "timestamp": "2025-08-30T11:45:00+08:00",
+ "open": 110982.8125,
+ "high": 111070.375,
+ "low": 110928.6484375,
+ "close": 110997.75,
+ "volume": 49.78855895996094,
+ "amount": 5833820.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 110996.421875,
+ "high": 111005.6875,
+ "low": 110855.921875,
+ "close": 110899.25,
+ "volume": 63.615753173828125,
+ "amount": 7277021.0
+ },
+ {
+ "timestamp": "2025-08-30T12:15:00+08:00",
+ "open": 110929.8515625,
+ "high": 111037.703125,
+ "low": 110848.328125,
+ "close": 110964.484375,
+ "volume": 63.891075134277344,
+ "amount": 7312494.0
+ },
+ {
+ "timestamp": "2025-08-30T12:30:00+08:00",
+ "open": 110853.8203125,
+ "high": 110985.0,
+ "low": 110792.171875,
+ "close": 110900.03125,
+ "volume": 68.45826721191406,
+ "amount": 7849445.0
+ },
+ {
+ "timestamp": "2025-08-30T12:45:00+08:00",
+ "open": 111015.1484375,
+ "high": 110955.515625,
+ "low": 110751.078125,
+ "close": 110813.703125,
+ "volume": 75.043701171875,
+ "amount": 7848931.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 110887.0703125,
+ "high": 110912.3515625,
+ "low": 110747.8671875,
+ "close": 110803.015625,
+ "volume": 66.48946380615234,
+ "amount": 7494755.0
+ },
+ {
+ "timestamp": "2025-08-30T13:15:00+08:00",
+ "open": 110844.734375,
+ "high": 110979.796875,
+ "low": 110708.3359375,
+ "close": 110928.40625,
+ "volume": 66.75776672363281,
+ "amount": 7387242.0
+ },
+ {
+ "timestamp": "2025-08-30T13:30:00+08:00",
+ "open": 110775.0,
+ "high": 110924.09375,
+ "low": 110717.328125,
+ "close": 110830.84375,
+ "volume": 70.78501892089844,
+ "amount": 7972145.0
+ },
+ {
+ "timestamp": "2025-08-30T13:45:00+08:00",
+ "open": 110833.28125,
+ "high": 110947.5390625,
+ "low": 110763.578125,
+ "close": 110875.84375,
+ "volume": 63.871124267578125,
+ "amount": 7286225.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 111067.2734375,
+ "high": 111097.4609375,
+ "low": 110724.8984375,
+ "close": 110760.6875,
+ "volume": 75.15328979492188,
+ "amount": 8855330.0
+ },
+ {
+ "timestamp": "2025-08-30T14:15:00+08:00",
+ "open": 110825.8828125,
+ "high": 110946.3984375,
+ "low": 110743.375,
+ "close": 110870.3828125,
+ "volume": 64.47406005859375,
+ "amount": 7334688.0
+ },
+ {
+ "timestamp": "2025-08-30T14:30:00+08:00",
+ "open": 110851.4375,
+ "high": 110960.671875,
+ "low": 110774.8203125,
+ "close": 110891.5859375,
+ "volume": 62.37579345703125,
+ "amount": 7147503.0
+ },
+ {
+ "timestamp": "2025-08-30T14:45:00+08:00",
+ "open": 111086.1484375,
+ "high": 111111.4140625,
+ "low": 110732.9453125,
+ "close": 110762.1640625,
+ "volume": 74.91941833496094,
+ "amount": 8832942.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 110826.671875,
+ "high": 110946.5390625,
+ "low": 110743.2734375,
+ "close": 110867.84375,
+ "volume": 64.68904113769531,
+ "amount": 7379103.0
+ },
+ {
+ "timestamp": "2025-08-30T15:15:00+08:00",
+ "open": 110845.203125,
+ "high": 110956.1015625,
+ "low": 110766.65625,
+ "close": 110883.2578125,
+ "volume": 62.80986022949219,
+ "amount": 7212651.0
+ },
+ {
+ "timestamp": "2025-08-30T15:30:00+08:00",
+ "open": 110774.6328125,
+ "high": 110912.4375,
+ "low": 110717.5859375,
+ "close": 110837.96875,
+ "volume": 68.65061950683594,
+ "amount": 7879980.0
+ },
+ {
+ "timestamp": "2025-08-30T15:45:00+08:00",
+ "open": 110752.3046875,
+ "high": 110891.3828125,
+ "low": 110698.609375,
+ "close": 110820.7421875,
+ "volume": 68.49166107177734,
+ "amount": 7869639.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 110910.8671875,
+ "high": 110867.8828125,
+ "low": 110657.7109375,
+ "close": 110741.84375,
+ "volume": 75.15116119384766,
+ "amount": 7797491.0
+ },
+ {
+ "timestamp": "2025-08-30T16:15:00+08:00",
+ "open": 110678.7890625,
+ "high": 110852.3125,
+ "low": 110629.0078125,
+ "close": 110770.859375,
+ "volume": 71.22074890136719,
+ "amount": 8026450.0
+ },
+ {
+ "timestamp": "2025-08-30T16:30:00+08:00",
+ "open": 110977.21875,
+ "high": 111027.8359375,
+ "low": 110648.453125,
+ "close": 110694.2421875,
+ "volume": 74.5619888305664,
+ "amount": 8765571.0
+ },
+ {
+ "timestamp": "2025-08-30T16:45:00+08:00",
+ "open": 110753.90625,
+ "high": 110884.296875,
+ "low": 110679.0390625,
+ "close": 110808.078125,
+ "volume": 65.1622314453125,
+ "amount": 7421333.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 111011.8515625,
+ "high": 111050.7890625,
+ "low": 110662.1796875,
+ "close": 110702.8515625,
+ "volume": 75.08160400390625,
+ "amount": 8876836.0
+ },
+ {
+ "timestamp": "2025-08-30T17:15:00+08:00",
+ "open": 110804.1875,
+ "high": 110993.1328125,
+ "low": 110669.8125,
+ "close": 110865.9296875,
+ "volume": 105.89447021484375,
+ "amount": 11376246.0
+ },
+ {
+ "timestamp": "2025-08-30T17:30:00+08:00",
+ "open": 110987.3984375,
+ "high": 111073.7421875,
+ "low": 110757.609375,
+ "close": 110928.6953125,
+ "volume": 78.04934692382812,
+ "amount": 8805081.0
+ },
+ {
+ "timestamp": "2025-08-30T17:45:00+08:00",
+ "open": 110913.5390625,
+ "high": 111018.328125,
+ "low": 110806.9609375,
+ "close": 110912.1171875,
+ "volume": 69.97149658203125,
+ "amount": 7867074.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 110883.9140625,
+ "high": 111017.6328125,
+ "low": 110724.890625,
+ "close": 110871.0234375,
+ "volume": 137.30715942382812,
+ "amount": 14961190.0
+ },
+ {
+ "timestamp": "2025-08-30T18:15:00+08:00",
+ "open": 110785.1328125,
+ "high": 111097.7265625,
+ "low": 110732.7421875,
+ "close": 111020.8203125,
+ "volume": 80.94500732421875,
+ "amount": 8915283.0
+ },
+ {
+ "timestamp": "2025-08-30T18:30:00+08:00",
+ "open": 110945.2890625,
+ "high": 111135.4140625,
+ "low": 110863.984375,
+ "close": 111046.390625,
+ "volume": 84.47595977783203,
+ "amount": 9454623.0
+ },
+ {
+ "timestamp": "2025-08-30T18:45:00+08:00",
+ "open": 111020.5078125,
+ "high": 111117.5234375,
+ "low": 110903.8359375,
+ "close": 110997.609375,
+ "volume": 80.08727264404297,
+ "amount": 9038030.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 111046.0703125,
+ "high": 111251.0234375,
+ "low": 110897.7421875,
+ "close": 111167.0,
+ "volume": 92.00077056884766,
+ "amount": 10341724.0
+ },
+ {
+ "timestamp": "2025-08-30T19:15:00+08:00",
+ "open": 111134.3515625,
+ "high": 111302.265625,
+ "low": 111040.1640625,
+ "close": 111166.890625,
+ "volume": 107.83051300048828,
+ "amount": 11930536.0
+ },
+ {
+ "timestamp": "2025-08-30T19:30:00+08:00",
+ "open": 111245.265625,
+ "high": 111351.8671875,
+ "low": 111086.3828125,
+ "close": 111214.5390625,
+ "volume": 86.44621276855469,
+ "amount": 9522093.0
+ },
+ {
+ "timestamp": "2025-08-30T19:45:00+08:00",
+ "open": 111218.578125,
+ "high": 111397.09375,
+ "low": 111111.78125,
+ "close": 111279.8671875,
+ "volume": 131.67941284179688,
+ "amount": 14411454.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 111295.90625,
+ "high": 111435.515625,
+ "low": 111150.9765625,
+ "close": 111280.5390625,
+ "volume": 114.0282211303711,
+ "amount": 12461344.0
+ },
+ {
+ "timestamp": "2025-08-30T20:15:00+08:00",
+ "open": 111325.8125,
+ "high": 111426.296875,
+ "low": 111154.25,
+ "close": 111243.4921875,
+ "volume": 89.13931274414062,
+ "amount": 9991889.0
+ },
+ {
+ "timestamp": "2025-08-30T20:30:00+08:00",
+ "open": 111194.6328125,
+ "high": 111269.7734375,
+ "low": 111033.0546875,
+ "close": 111162.5078125,
+ "volume": 78.17929077148438,
+ "amount": 8710262.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_145631.json b/webui/prediction_results/prediction_20250829_145631.json
new file mode 100644
index 0000000000000000000000000000000000000000..7177e2e8c2ca04d8a497ccc2a4b5129bfae64ada
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_145631.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T14:56:31.758230",
+ "file_path": "BTCUSDT_15m",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "BTCUSDT",
+ "interval": "15m",
+ "limit": 1000,
+ "lookback": 1000,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 12,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 1000,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 109100.24,
+ "max": 117410.0
+ },
+ "high": {
+ "min": 109580.0,
+ "max": 117429.05
+ },
+ "low": {
+ "min": 108666.66,
+ "max": 117024.0
+ },
+ "close": {
+ "min": 109100.23,
+ "max": 117410.0
+ }
+ },
+ "last_values": {
+ "open": 111245.69,
+ "high": 111246.09,
+ "low": 111221.98,
+ "close": 111221.98
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 111169.4765625,
+ "high": 111286.6640625,
+ "low": 110882.9609375,
+ "close": 111017.2109375,
+ "volume": 133.6641387939453,
+ "amount": 14748266.0
+ },
+ {
+ "timestamp": "2025-08-29T15:15:00+08:00",
+ "open": 111093.3671875,
+ "high": 111210.0859375,
+ "low": 110862.734375,
+ "close": 110999.046875,
+ "volume": 126.7567138671875,
+ "amount": 13991243.0
+ },
+ {
+ "timestamp": "2025-08-29T15:30:00+08:00",
+ "open": 111040.875,
+ "high": 111257.1796875,
+ "low": 110860.765625,
+ "close": 111082.9921875,
+ "volume": 145.006591796875,
+ "amount": 15980576.0
+ },
+ {
+ "timestamp": "2025-08-29T15:45:00+08:00",
+ "open": 111099.1875,
+ "high": 111268.6484375,
+ "low": 110866.734375,
+ "close": 111056.4765625,
+ "volume": 134.9705047607422,
+ "amount": 14906833.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 111123.6796875,
+ "high": 111281.125,
+ "low": 110875.1796875,
+ "close": 111063.046875,
+ "volume": 164.16329956054688,
+ "amount": 17778158.0
+ },
+ {
+ "timestamp": "2025-08-29T16:15:00+08:00",
+ "open": 111086.90625,
+ "high": 111265.375,
+ "low": 110925.2578125,
+ "close": 111095.921875,
+ "volume": 113.75747680664062,
+ "amount": 12440173.0
+ },
+ {
+ "timestamp": "2025-08-29T16:30:00+08:00",
+ "open": 111235.6640625,
+ "high": 111391.5390625,
+ "low": 110984.625,
+ "close": 111131.421875,
+ "volume": 109.91775512695312,
+ "amount": 12183982.0
+ },
+ {
+ "timestamp": "2025-08-29T16:45:00+08:00",
+ "open": 111174.734375,
+ "high": 111321.5390625,
+ "low": 110994.046875,
+ "close": 111141.2890625,
+ "volume": 97.423095703125,
+ "amount": 10803830.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 111238.4453125,
+ "high": 111352.1171875,
+ "low": 111004.296875,
+ "close": 111139.5234375,
+ "volume": 105.70687866210938,
+ "amount": 11692542.0
+ },
+ {
+ "timestamp": "2025-08-29T17:15:00+08:00",
+ "open": 111214.609375,
+ "high": 111364.3671875,
+ "low": 111043.34375,
+ "close": 111206.6328125,
+ "volume": 102.69979095458984,
+ "amount": 11316412.0
+ },
+ {
+ "timestamp": "2025-08-29T17:30:00+08:00",
+ "open": 111237.984375,
+ "high": 111420.6640625,
+ "low": 111090.375,
+ "close": 111253.3125,
+ "volume": 110.2011489868164,
+ "amount": 12105284.0
+ },
+ {
+ "timestamp": "2025-08-29T17:45:00+08:00",
+ "open": 111270.828125,
+ "high": 111402.953125,
+ "low": 111143.3125,
+ "close": 111269.484375,
+ "volume": 93.22903442382812,
+ "amount": 10318237.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 111266.0390625,
+ "high": 111480.8828125,
+ "low": 111111.5859375,
+ "close": 111340.1875,
+ "volume": 116.34564971923828,
+ "amount": 12560659.0
+ },
+ {
+ "timestamp": "2025-08-29T18:15:00+08:00",
+ "open": 111337.7265625,
+ "high": 111505.6015625,
+ "low": 111196.328125,
+ "close": 111353.4140625,
+ "volume": 95.64814758300781,
+ "amount": 10498123.0
+ },
+ {
+ "timestamp": "2025-08-29T18:30:00+08:00",
+ "open": 111431.0625,
+ "high": 111531.34375,
+ "low": 111202.6875,
+ "close": 111307.6484375,
+ "volume": 116.13081359863281,
+ "amount": 12837304.0
+ },
+ {
+ "timestamp": "2025-08-29T18:45:00+08:00",
+ "open": 111382.796875,
+ "high": 111552.734375,
+ "low": 111208.2734375,
+ "close": 111377.6796875,
+ "volume": 105.46437072753906,
+ "amount": 11618260.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 111442.6796875,
+ "high": 111582.515625,
+ "low": 111269.0625,
+ "close": 111414.59375,
+ "volume": 89.62226867675781,
+ "amount": 9996248.0
+ },
+ {
+ "timestamp": "2025-08-29T19:15:00+08:00",
+ "open": 111442.640625,
+ "high": 111603.28125,
+ "low": 111299.03125,
+ "close": 111441.359375,
+ "volume": 88.33848571777344,
+ "amount": 9741673.0
+ },
+ {
+ "timestamp": "2025-08-29T19:30:00+08:00",
+ "open": 111508.421875,
+ "high": 111696.1171875,
+ "low": 111364.078125,
+ "close": 111553.671875,
+ "volume": 114.33439636230469,
+ "amount": 12555341.0
+ },
+ {
+ "timestamp": "2025-08-29T19:45:00+08:00",
+ "open": 111602.21875,
+ "high": 111801.7734375,
+ "low": 111454.265625,
+ "close": 111627.0703125,
+ "volume": 102.29329681396484,
+ "amount": 11272232.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 111652.2265625,
+ "high": 111782.796875,
+ "low": 111488.9375,
+ "close": 111626.5,
+ "volume": 110.90338134765625,
+ "amount": 12250775.0
+ },
+ {
+ "timestamp": "2025-08-29T20:15:00+08:00",
+ "open": 111661.375,
+ "high": 111839.46875,
+ "low": 111522.984375,
+ "close": 111695.3203125,
+ "volume": 105.9512710571289,
+ "amount": 11719609.0
+ },
+ {
+ "timestamp": "2025-08-29T20:30:00+08:00",
+ "open": 111711.1328125,
+ "high": 111839.234375,
+ "low": 111548.765625,
+ "close": 111687.9296875,
+ "volume": 121.10868835449219,
+ "amount": 13405922.0
+ },
+ {
+ "timestamp": "2025-08-29T20:45:00+08:00",
+ "open": 111704.6875,
+ "high": 111814.9921875,
+ "low": 111504.6796875,
+ "close": 111603.9765625,
+ "volume": 99.18999481201172,
+ "amount": 11010030.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 111686.125,
+ "high": 111873.609375,
+ "low": 111489.6953125,
+ "close": 111669.3203125,
+ "volume": 134.42730712890625,
+ "amount": 14908210.0
+ },
+ {
+ "timestamp": "2025-08-29T21:15:00+08:00",
+ "open": 111712.0390625,
+ "high": 111954.4453125,
+ "low": 111570.4140625,
+ "close": 111808.0859375,
+ "volume": 126.19930267333984,
+ "amount": 13898752.0
+ },
+ {
+ "timestamp": "2025-08-29T21:30:00+08:00",
+ "open": 111850.0859375,
+ "high": 111966.5,
+ "low": 111690.546875,
+ "close": 111807.3828125,
+ "volume": 106.12403106689453,
+ "amount": 11793642.0
+ },
+ {
+ "timestamp": "2025-08-29T21:45:00+08:00",
+ "open": 111852.90625,
+ "high": 111977.1875,
+ "low": 111675.109375,
+ "close": 111789.2109375,
+ "volume": 107.31920623779297,
+ "amount": 11903872.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 111809.515625,
+ "high": 111929.6015625,
+ "low": 111644.6640625,
+ "close": 111765.1640625,
+ "volume": 115.47978973388672,
+ "amount": 12797432.0
+ },
+ {
+ "timestamp": "2025-08-29T22:15:00+08:00",
+ "open": 111760.046875,
+ "high": 111913.3828125,
+ "low": 111627.3203125,
+ "close": 111784.5234375,
+ "volume": 97.37040710449219,
+ "amount": 10761853.0
+ },
+ {
+ "timestamp": "2025-08-29T22:30:00+08:00",
+ "open": 111811.53125,
+ "high": 112017.453125,
+ "low": 111670.1171875,
+ "close": 111852.3203125,
+ "volume": 116.19581604003906,
+ "amount": 12838051.0
+ },
+ {
+ "timestamp": "2025-08-29T22:45:00+08:00",
+ "open": 111866.375,
+ "high": 112028.640625,
+ "low": 111739.7734375,
+ "close": 111900.65625,
+ "volume": 84.4815902709961,
+ "amount": 9403430.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 111902.5078125,
+ "high": 112064.609375,
+ "low": 111773.296875,
+ "close": 111926.8828125,
+ "volume": 107.46073913574219,
+ "amount": 11871028.0
+ },
+ {
+ "timestamp": "2025-08-29T23:15:00+08:00",
+ "open": 111941.4140625,
+ "high": 112092.2109375,
+ "low": 111812.4140625,
+ "close": 111954.140625,
+ "volume": 123.07998657226562,
+ "amount": 13605938.0
+ },
+ {
+ "timestamp": "2025-08-29T23:30:00+08:00",
+ "open": 111966.984375,
+ "high": 112076.828125,
+ "low": 111744.3828125,
+ "close": 111852.8671875,
+ "volume": 134.875,
+ "amount": 14929412.0
+ },
+ {
+ "timestamp": "2025-08-29T23:45:00+08:00",
+ "open": 111886.5625,
+ "high": 111993.1015625,
+ "low": 111712.6640625,
+ "close": 111824.2265625,
+ "volume": 109.18719482421875,
+ "amount": 12098620.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 111936.2578125,
+ "high": 112101.8515625,
+ "low": 111745.0859375,
+ "close": 111918.59375,
+ "volume": 166.5782012939453,
+ "amount": 18353800.0
+ },
+ {
+ "timestamp": "2025-08-30T00:15:00+08:00",
+ "open": 112043.0390625,
+ "high": 112194.6328125,
+ "low": 111838.015625,
+ "close": 111964.796875,
+ "volume": 128.78582763671875,
+ "amount": 14352829.0
+ },
+ {
+ "timestamp": "2025-08-30T00:30:00+08:00",
+ "open": 112008.046875,
+ "high": 112152.8125,
+ "low": 111833.3828125,
+ "close": 111985.0703125,
+ "volume": 132.19151306152344,
+ "amount": 14571858.0
+ },
+ {
+ "timestamp": "2025-08-30T00:45:00+08:00",
+ "open": 111999.578125,
+ "high": 112109.4921875,
+ "low": 111831.28125,
+ "close": 111943.8359375,
+ "volume": 90.95932006835938,
+ "amount": 10064076.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 111992.421875,
+ "high": 112106.9453125,
+ "low": 111810.296875,
+ "close": 111930.1875,
+ "volume": 116.3121109008789,
+ "amount": 12883970.0
+ },
+ {
+ "timestamp": "2025-08-30T01:15:00+08:00",
+ "open": 111951.890625,
+ "high": 112050.828125,
+ "low": 111795.2421875,
+ "close": 111897.8359375,
+ "volume": 99.48136901855469,
+ "amount": 11042675.0
+ },
+ {
+ "timestamp": "2025-08-30T01:30:00+08:00",
+ "open": 111911.1171875,
+ "high": 112012.4921875,
+ "low": 111775.34375,
+ "close": 111879.5546875,
+ "volume": 87.62853240966797,
+ "amount": 9714546.0
+ },
+ {
+ "timestamp": "2025-08-30T01:45:00+08:00",
+ "open": 111922.4921875,
+ "high": 112033.8515625,
+ "low": 111772.203125,
+ "close": 111884.46875,
+ "volume": 79.35269927978516,
+ "amount": 8829243.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 111904.71875,
+ "high": 112034.4453125,
+ "low": 111734.1875,
+ "close": 111853.9921875,
+ "volume": 103.8651351928711,
+ "amount": 11505330.0
+ },
+ {
+ "timestamp": "2025-08-30T02:15:00+08:00",
+ "open": 111881.6171875,
+ "high": 111984.9609375,
+ "low": 111733.96875,
+ "close": 111843.5859375,
+ "volume": 84.92535400390625,
+ "amount": 9402822.0
+ },
+ {
+ "timestamp": "2025-08-30T02:30:00+08:00",
+ "open": 111882.4140625,
+ "high": 111945.1640625,
+ "low": 111701.3359375,
+ "close": 111773.6796875,
+ "volume": 81.62976837158203,
+ "amount": 9231286.0
+ },
+ {
+ "timestamp": "2025-08-30T02:45:00+08:00",
+ "open": 111778.2734375,
+ "high": 111900.0,
+ "low": 111670.3671875,
+ "close": 111778.9375,
+ "volume": 72.34359741210938,
+ "amount": 8040056.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 111820.140625,
+ "high": 111915.9453125,
+ "low": 111659.1328125,
+ "close": 111760.0234375,
+ "volume": 83.56487274169922,
+ "amount": 9336540.0
+ },
+ {
+ "timestamp": "2025-08-30T03:15:00+08:00",
+ "open": 111793.2578125,
+ "high": 111904.2578125,
+ "low": 111603.4921875,
+ "close": 111718.0078125,
+ "volume": 96.4046630859375,
+ "amount": 10660871.0
+ },
+ {
+ "timestamp": "2025-08-30T03:30:00+08:00",
+ "open": 111786.0234375,
+ "high": 111858.8828125,
+ "low": 111600.8828125,
+ "close": 111691.359375,
+ "volume": 97.03984069824219,
+ "amount": 10867320.0
+ },
+ {
+ "timestamp": "2025-08-30T03:45:00+08:00",
+ "open": 111744.2265625,
+ "high": 111844.625,
+ "low": 111580.078125,
+ "close": 111688.328125,
+ "volume": 80.87574768066406,
+ "amount": 8981413.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 111693.109375,
+ "high": 111871.7734375,
+ "low": 111535.46875,
+ "close": 111712.7734375,
+ "volume": 110.76882934570312,
+ "amount": 12306102.0
+ },
+ {
+ "timestamp": "2025-08-30T04:15:00+08:00",
+ "open": 111736.9609375,
+ "high": 111863.3984375,
+ "low": 111607.453125,
+ "close": 111733.71875,
+ "volume": 93.17861938476562,
+ "amount": 10339148.0
+ },
+ {
+ "timestamp": "2025-08-30T04:30:00+08:00",
+ "open": 111752.90625,
+ "high": 111921.0703125,
+ "low": 111617.3515625,
+ "close": 111777.6640625,
+ "volume": 96.2171401977539,
+ "amount": 10661223.0
+ },
+ {
+ "timestamp": "2025-08-30T04:45:00+08:00",
+ "open": 111761.75,
+ "high": 111850.28125,
+ "low": 111638.984375,
+ "close": 111722.2890625,
+ "volume": 76.68721771240234,
+ "amount": 8542356.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 111786.890625,
+ "high": 111873.078125,
+ "low": 111596.203125,
+ "close": 111717.6484375,
+ "volume": 88.36457061767578,
+ "amount": 9837959.0
+ },
+ {
+ "timestamp": "2025-08-30T05:15:00+08:00",
+ "open": 111741.0546875,
+ "high": 111860.7578125,
+ "low": 111597.9453125,
+ "close": 111709.0390625,
+ "volume": 82.78638458251953,
+ "amount": 9248871.0
+ },
+ {
+ "timestamp": "2025-08-30T05:30:00+08:00",
+ "open": 111770.078125,
+ "high": 111864.828125,
+ "low": 111613.421875,
+ "close": 111732.0,
+ "volume": 92.80091857910156,
+ "amount": 10290091.0
+ },
+ {
+ "timestamp": "2025-08-30T05:45:00+08:00",
+ "open": 111777.15625,
+ "high": 111882.9375,
+ "low": 111646.125,
+ "close": 111744.5390625,
+ "volume": 80.8597183227539,
+ "amount": 9073378.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 111800.859375,
+ "high": 111938.375,
+ "low": 111671.09375,
+ "close": 111800.7421875,
+ "volume": 101.37644958496094,
+ "amount": 11161978.0
+ },
+ {
+ "timestamp": "2025-08-30T06:15:00+08:00",
+ "open": 111865.828125,
+ "high": 111955.46875,
+ "low": 111720.3671875,
+ "close": 111810.359375,
+ "volume": 86.99627685546875,
+ "amount": 9755229.0
+ },
+ {
+ "timestamp": "2025-08-30T06:30:00+08:00",
+ "open": 111851.5703125,
+ "high": 111958.3671875,
+ "low": 111734.375,
+ "close": 111843.6484375,
+ "volume": 88.52561950683594,
+ "amount": 9861068.0
+ },
+ {
+ "timestamp": "2025-08-30T06:45:00+08:00",
+ "open": 111887.4609375,
+ "high": 112047.5,
+ "low": 111738.125,
+ "close": 111886.375,
+ "volume": 93.07894897460938,
+ "amount": 10285172.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 111904.703125,
+ "high": 112049.0,
+ "low": 111783.890625,
+ "close": 111914.28125,
+ "volume": 101.98164367675781,
+ "amount": 11277976.0
+ },
+ {
+ "timestamp": "2025-08-30T07:15:00+08:00",
+ "open": 111953.59375,
+ "high": 112048.1328125,
+ "low": 111810.1796875,
+ "close": 111912.203125,
+ "volume": 90.25052642822266,
+ "amount": 10097586.0
+ },
+ {
+ "timestamp": "2025-08-30T07:30:00+08:00",
+ "open": 111954.34375,
+ "high": 112084.640625,
+ "low": 111825.828125,
+ "close": 111951.5703125,
+ "volume": 107.92276763916016,
+ "amount": 12070878.0
+ },
+ {
+ "timestamp": "2025-08-30T07:45:00+08:00",
+ "open": 111998.9453125,
+ "high": 112103.9140625,
+ "low": 111885.984375,
+ "close": 111988.4375,
+ "volume": 89.00755310058594,
+ "amount": 9932353.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 111981.3984375,
+ "high": 112115.8125,
+ "low": 111802.6484375,
+ "close": 111927.5625,
+ "volume": 138.4607696533203,
+ "amount": 15368191.0
+ },
+ {
+ "timestamp": "2025-08-30T08:15:00+08:00",
+ "open": 111991.828125,
+ "high": 112120.1484375,
+ "low": 111838.8515625,
+ "close": 111957.40625,
+ "volume": 96.40286254882812,
+ "amount": 10699868.0
+ },
+ {
+ "timestamp": "2025-08-30T08:30:00+08:00",
+ "open": 112027.2421875,
+ "high": 112202.109375,
+ "low": 111859.90625,
+ "close": 112022.984375,
+ "volume": 104.6871109008789,
+ "amount": 11840170.0
+ },
+ {
+ "timestamp": "2025-08-30T08:45:00+08:00",
+ "open": 112084.765625,
+ "high": 112172.71875,
+ "low": 111945.5234375,
+ "close": 112030.3515625,
+ "volume": 87.16902160644531,
+ "amount": 9773938.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 112086.7578125,
+ "high": 112191.5546875,
+ "low": 111950.78125,
+ "close": 112052.703125,
+ "volume": 90.99862670898438,
+ "amount": 10224398.0
+ },
+ {
+ "timestamp": "2025-08-30T09:15:00+08:00",
+ "open": 112069.4453125,
+ "high": 112144.140625,
+ "low": 111943.921875,
+ "close": 112027.84375,
+ "volume": 83.24454498291016,
+ "amount": 9354530.0
+ },
+ {
+ "timestamp": "2025-08-30T09:30:00+08:00",
+ "open": 112062.3828125,
+ "high": 112144.5859375,
+ "low": 111947.4453125,
+ "close": 112031.3125,
+ "volume": 75.74029541015625,
+ "amount": 8507400.0
+ },
+ {
+ "timestamp": "2025-08-30T09:45:00+08:00",
+ "open": 112060.421875,
+ "high": 112142.796875,
+ "low": 111946.3125,
+ "close": 112026.5078125,
+ "volume": 70.72943878173828,
+ "amount": 7964594.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 112063.7734375,
+ "high": 112130.296875,
+ "low": 111945.7734375,
+ "close": 112021.2421875,
+ "volume": 72.86896514892578,
+ "amount": 8181000.0
+ },
+ {
+ "timestamp": "2025-08-30T10:15:00+08:00",
+ "open": 112043.078125,
+ "high": 112167.390625,
+ "low": 111937.6640625,
+ "close": 112062.125,
+ "volume": 70.6407699584961,
+ "amount": 7922684.0
+ },
+ {
+ "timestamp": "2025-08-30T10:30:00+08:00",
+ "open": 112128.0703125,
+ "high": 112195.6640625,
+ "low": 111976.859375,
+ "close": 112047.421875,
+ "volume": 73.72329711914062,
+ "amount": 8318643.0
+ },
+ {
+ "timestamp": "2025-08-30T10:45:00+08:00",
+ "open": 112072.640625,
+ "high": 112233.65625,
+ "low": 111945.4296875,
+ "close": 112103.5234375,
+ "volume": 92.0282211303711,
+ "amount": 10267641.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 112120.6484375,
+ "high": 112217.265625,
+ "low": 111969.171875,
+ "close": 112067.8984375,
+ "volume": 87.43103790283203,
+ "amount": 9765810.0
+ },
+ {
+ "timestamp": "2025-08-30T11:15:00+08:00",
+ "open": 112122.0,
+ "high": 112232.53125,
+ "low": 111983.203125,
+ "close": 112085.2734375,
+ "volume": 87.32120513916016,
+ "amount": 9764636.0
+ },
+ {
+ "timestamp": "2025-08-30T11:30:00+08:00",
+ "open": 112173.453125,
+ "high": 112280.3203125,
+ "low": 111924.140625,
+ "close": 112050.2890625,
+ "volume": 104.56067657470703,
+ "amount": 11663960.0
+ },
+ {
+ "timestamp": "2025-08-30T11:45:00+08:00",
+ "open": 112102.8515625,
+ "high": 112175.84375,
+ "low": 111970.4375,
+ "close": 112039.4140625,
+ "volume": 67.20665740966797,
+ "amount": 7588341.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 112095.015625,
+ "high": 112197.7734375,
+ "low": 111970.75,
+ "close": 112071.9140625,
+ "volume": 82.2674331665039,
+ "amount": 9231251.0
+ },
+ {
+ "timestamp": "2025-08-30T12:15:00+08:00",
+ "open": 112097.65625,
+ "high": 112238.28125,
+ "low": 112002.1796875,
+ "close": 112131.1640625,
+ "volume": 74.65169525146484,
+ "amount": 8348942.0
+ },
+ {
+ "timestamp": "2025-08-30T12:30:00+08:00",
+ "open": 112165.5625,
+ "high": 112277.359375,
+ "low": 112072.671875,
+ "close": 112185.0625,
+ "volume": 78.97994995117188,
+ "amount": 8826491.0
+ },
+ {
+ "timestamp": "2025-08-30T12:45:00+08:00",
+ "open": 112188.453125,
+ "high": 112269.015625,
+ "low": 112072.109375,
+ "close": 112162.1484375,
+ "volume": 68.9449691772461,
+ "amount": 7831554.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 112190.953125,
+ "high": 112286.2734375,
+ "low": 112089.34375,
+ "close": 112197.96875,
+ "volume": 69.2558364868164,
+ "amount": 7745253.0
+ },
+ {
+ "timestamp": "2025-08-30T13:15:00+08:00",
+ "open": 112230.0234375,
+ "high": 112326.9765625,
+ "low": 112138.2109375,
+ "close": 112239.3515625,
+ "volume": 71.58203887939453,
+ "amount": 8026911.0
+ },
+ {
+ "timestamp": "2025-08-30T13:30:00+08:00",
+ "open": 112250.0625,
+ "high": 112334.2578125,
+ "low": 112113.515625,
+ "close": 112198.328125,
+ "volume": 75.6541748046875,
+ "amount": 8507868.0
+ },
+ {
+ "timestamp": "2025-08-30T13:45:00+08:00",
+ "open": 112255.828125,
+ "high": 112339.78125,
+ "low": 112117.1953125,
+ "close": 112196.53125,
+ "volume": 74.15754699707031,
+ "amount": 8361086.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 112249.3671875,
+ "high": 112332.6171875,
+ "low": 112101.8046875,
+ "close": 112185.9296875,
+ "volume": 82.35772705078125,
+ "amount": 9188284.0
+ },
+ {
+ "timestamp": "2025-08-30T14:15:00+08:00",
+ "open": 112195.1484375,
+ "high": 112349.9609375,
+ "low": 112043.9609375,
+ "close": 112164.9296875,
+ "volume": 82.1603012084961,
+ "amount": 9130755.0
+ },
+ {
+ "timestamp": "2025-08-30T14:30:00+08:00",
+ "open": 112181.140625,
+ "high": 112298.6640625,
+ "low": 112052.1171875,
+ "close": 112171.046875,
+ "volume": 73.72782897949219,
+ "amount": 8197644.0
+ },
+ {
+ "timestamp": "2025-08-30T14:45:00+08:00",
+ "open": 112212.1484375,
+ "high": 112305.9453125,
+ "low": 112067.921875,
+ "close": 112163.2578125,
+ "volume": 89.1031723022461,
+ "amount": 9989858.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 112197.5078125,
+ "high": 112334.5234375,
+ "low": 112076.546875,
+ "close": 112194.546875,
+ "volume": 96.2724838256836,
+ "amount": 10684269.0
+ },
+ {
+ "timestamp": "2025-08-30T15:15:00+08:00",
+ "open": 112215.59375,
+ "high": 112327.1328125,
+ "low": 112075.84375,
+ "close": 112177.7578125,
+ "volume": 98.1348648071289,
+ "amount": 10984503.0
+ },
+ {
+ "timestamp": "2025-08-30T15:30:00+08:00",
+ "open": 112247.8046875,
+ "high": 112380.296875,
+ "low": 112065.3515625,
+ "close": 112184.8359375,
+ "volume": 117.23890686035156,
+ "amount": 13090492.0
+ },
+ {
+ "timestamp": "2025-08-30T15:45:00+08:00",
+ "open": 112227.4453125,
+ "high": 112360.484375,
+ "low": 112096.953125,
+ "close": 112219.25,
+ "volume": 101.76166534423828,
+ "amount": 11302862.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 112248.3984375,
+ "high": 112330.0390625,
+ "low": 112007.75,
+ "close": 112110.765625,
+ "volume": 136.02972412109375,
+ "amount": 15218441.0
+ },
+ {
+ "timestamp": "2025-08-30T16:15:00+08:00",
+ "open": 112173.9453125,
+ "high": 112297.421875,
+ "low": 112001.265625,
+ "close": 112124.15625,
+ "volume": 98.07292175292969,
+ "amount": 10773396.0
+ },
+ {
+ "timestamp": "2025-08-30T16:30:00+08:00",
+ "open": 112145.5,
+ "high": 112270.2890625,
+ "low": 112032.4453125,
+ "close": 112150.6875,
+ "volume": 86.155029296875,
+ "amount": 9518677.0
+ },
+ {
+ "timestamp": "2025-08-30T16:45:00+08:00",
+ "open": 112177.875,
+ "high": 112292.3515625,
+ "low": 112050.734375,
+ "close": 112165.8125,
+ "volume": 76.6077651977539,
+ "amount": 8471837.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 112174.21875,
+ "high": 112284.34375,
+ "low": 112049.046875,
+ "close": 112156.375,
+ "volume": 81.96548461914062,
+ "amount": 9135485.0
+ },
+ {
+ "timestamp": "2025-08-30T17:15:00+08:00",
+ "open": 112184.1640625,
+ "high": 112277.8828125,
+ "low": 112051.7890625,
+ "close": 112147.7421875,
+ "volume": 83.50753784179688,
+ "amount": 9276246.0
+ },
+ {
+ "timestamp": "2025-08-30T17:30:00+08:00",
+ "open": 112181.4375,
+ "high": 112288.28125,
+ "low": 112052.3984375,
+ "close": 112151.71875,
+ "volume": 88.9229507446289,
+ "amount": 10006353.0
+ },
+ {
+ "timestamp": "2025-08-30T17:45:00+08:00",
+ "open": 112181.1171875,
+ "high": 112297.25,
+ "low": 112080.8046875,
+ "close": 112190.5703125,
+ "volume": 92.39521026611328,
+ "amount": 10375275.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 112265.875,
+ "high": 112427.671875,
+ "low": 112139.6328125,
+ "close": 112282.640625,
+ "volume": 91.09273529052734,
+ "amount": 10151012.0
+ },
+ {
+ "timestamp": "2025-08-30T18:15:00+08:00",
+ "open": 112281.40625,
+ "high": 112404.9140625,
+ "low": 112166.8125,
+ "close": 112291.3671875,
+ "volume": 84.6778793334961,
+ "amount": 9539039.0
+ },
+ {
+ "timestamp": "2025-08-30T18:30:00+08:00",
+ "open": 112314.3828125,
+ "high": 112437.8046875,
+ "low": 112219.8203125,
+ "close": 112333.734375,
+ "volume": 77.6357421875,
+ "amount": 8722920.0
+ },
+ {
+ "timestamp": "2025-08-30T18:45:00+08:00",
+ "open": 112369.96875,
+ "high": 112510.7734375,
+ "low": 112258.5234375,
+ "close": 112373.3671875,
+ "volume": 73.10360717773438,
+ "amount": 8268064.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 112385.9609375,
+ "high": 112491.5625,
+ "low": 112263.2421875,
+ "close": 112373.234375,
+ "volume": 88.50096893310547,
+ "amount": 9900305.0
+ },
+ {
+ "timestamp": "2025-08-30T19:15:00+08:00",
+ "open": 112416.546875,
+ "high": 112574.28125,
+ "low": 112231.359375,
+ "close": 112403.921875,
+ "volume": 95.40093994140625,
+ "amount": 10958724.0
+ },
+ {
+ "timestamp": "2025-08-30T19:30:00+08:00",
+ "open": 112374.75,
+ "high": 112452.265625,
+ "low": 112208.7421875,
+ "close": 112308.953125,
+ "volume": 84.44782257080078,
+ "amount": 9512642.0
+ },
+ {
+ "timestamp": "2025-08-30T19:45:00+08:00",
+ "open": 112311.4765625,
+ "high": 112407.1796875,
+ "low": 112191.4140625,
+ "close": 112291.9296875,
+ "volume": 82.6038589477539,
+ "amount": 9220620.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 112325.7265625,
+ "high": 112453.875,
+ "low": 112119.9453125,
+ "close": 112248.5078125,
+ "volume": 125.05335998535156,
+ "amount": 13905253.0
+ },
+ {
+ "timestamp": "2025-08-30T20:15:00+08:00",
+ "open": 112286.2421875,
+ "high": 112426.1484375,
+ "low": 112129.5078125,
+ "close": 112260.8046875,
+ "volume": 101.14073944091797,
+ "amount": 11259147.0
+ },
+ {
+ "timestamp": "2025-08-30T20:30:00+08:00",
+ "open": 112336.9609375,
+ "high": 112460.3828125,
+ "low": 112170.1328125,
+ "close": 112296.9609375,
+ "volume": 108.94501495361328,
+ "amount": 12218919.0
+ },
+ {
+ "timestamp": "2025-08-30T20:45:00+08:00",
+ "open": 112325.484375,
+ "high": 112446.140625,
+ "low": 112197.1171875,
+ "close": 112315.21875,
+ "volume": 83.64878845214844,
+ "amount": 9414279.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_150514.json b/webui/prediction_results/prediction_20250829_150514.json
new file mode 100644
index 0000000000000000000000000000000000000000..57f4e661797d0aaf56e3f6baee06643e17727783
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_150514.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T15:05:14.962361",
+ "file_path": "ETHUSDT_15m",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "ETHUSDT",
+ "interval": "15m",
+ "limit": 1000,
+ "lookback": 1000,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 12,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 1000,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 4075.58,
+ "max": 4942.98
+ },
+ "high": {
+ "min": 4095.0,
+ "max": 4956.78
+ },
+ "low": {
+ "min": 4060.0,
+ "max": 4933.85
+ },
+ "close": {
+ "min": 4075.59,
+ "max": 4942.98
+ }
+ },
+ "last_values": {
+ "open": 4472.29,
+ "high": 4473.17,
+ "low": 4454.28,
+ "close": 4458.7
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T15:00:00+08:00",
+ "open": 4444.56591796875,
+ "high": 4465.90478515625,
+ "low": 4415.63671875,
+ "close": 4443.26953125,
+ "volume": 9217.275390625,
+ "amount": 40805148.0
+ },
+ {
+ "timestamp": "2025-08-29T15:15:00+08:00",
+ "open": 4445.2421875,
+ "high": 4461.99365234375,
+ "low": 4426.9677734375,
+ "close": 4441.669921875,
+ "volume": 6457.33642578125,
+ "amount": 28364656.0
+ },
+ {
+ "timestamp": "2025-08-29T15:30:00+08:00",
+ "open": 4444.40185546875,
+ "high": 4458.494140625,
+ "low": 4425.56494140625,
+ "close": 4438.82763671875,
+ "volume": 6437.61962890625,
+ "amount": 28472140.0
+ },
+ {
+ "timestamp": "2025-08-29T15:45:00+08:00",
+ "open": 4442.63916015625,
+ "high": 4460.41064453125,
+ "low": 4428.01123046875,
+ "close": 4443.92333984375,
+ "volume": 6154.728515625,
+ "amount": 27168418.0
+ },
+ {
+ "timestamp": "2025-08-29T16:00:00+08:00",
+ "open": 4443.24267578125,
+ "high": 4465.15625,
+ "low": 4426.150390625,
+ "close": 4446.44677734375,
+ "volume": 7082.49755859375,
+ "amount": 31837018.0
+ },
+ {
+ "timestamp": "2025-08-29T16:15:00+08:00",
+ "open": 4448.5888671875,
+ "high": 4461.3193359375,
+ "low": 4433.79638671875,
+ "close": 4446.01904296875,
+ "volume": 5071.296875,
+ "amount": 22424840.0
+ },
+ {
+ "timestamp": "2025-08-29T16:30:00+08:00",
+ "open": 4450.31201171875,
+ "high": 4462.99462890625,
+ "low": 4432.09912109375,
+ "close": 4443.74365234375,
+ "volume": 5389.142578125,
+ "amount": 24045034.0
+ },
+ {
+ "timestamp": "2025-08-29T16:45:00+08:00",
+ "open": 4447.33740234375,
+ "high": 4460.9599609375,
+ "low": 4434.24658203125,
+ "close": 4446.2080078125,
+ "volume": 4811.583984375,
+ "amount": 21232422.0
+ },
+ {
+ "timestamp": "2025-08-29T17:00:00+08:00",
+ "open": 4450.42822265625,
+ "high": 4462.5126953125,
+ "low": 4429.68017578125,
+ "close": 4442.61669921875,
+ "volume": 5684.46728515625,
+ "amount": 25023126.0
+ },
+ {
+ "timestamp": "2025-08-29T17:15:00+08:00",
+ "open": 4444.83349609375,
+ "high": 4456.32470703125,
+ "low": 4431.37158203125,
+ "close": 4441.24755859375,
+ "volume": 5026.57861328125,
+ "amount": 22191646.0
+ },
+ {
+ "timestamp": "2025-08-29T17:30:00+08:00",
+ "open": 4444.7890625,
+ "high": 4456.08203125,
+ "low": 4431.85986328125,
+ "close": 4441.16748046875,
+ "volume": 3917.94140625,
+ "amount": 17363496.0
+ },
+ {
+ "timestamp": "2025-08-29T17:45:00+08:00",
+ "open": 4444.8046875,
+ "high": 4455.31298828125,
+ "low": 4431.2138671875,
+ "close": 4441.10693359375,
+ "volume": 4654.3193359375,
+ "amount": 20566798.0
+ },
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 4444.2880859375,
+ "high": 4455.0703125,
+ "low": 4429.15380859375,
+ "close": 4439.7666015625,
+ "volume": 6178.53515625,
+ "amount": 27322580.0
+ },
+ {
+ "timestamp": "2025-08-29T18:15:00+08:00",
+ "open": 4442.96142578125,
+ "high": 4453.37841796875,
+ "low": 4426.81103515625,
+ "close": 4436.28076171875,
+ "volume": 4740.16357421875,
+ "amount": 20856040.0
+ },
+ {
+ "timestamp": "2025-08-29T18:30:00+08:00",
+ "open": 4439.814453125,
+ "high": 4453.78515625,
+ "low": 4423.60693359375,
+ "close": 4435.65380859375,
+ "volume": 4550.0615234375,
+ "amount": 19977028.0
+ },
+ {
+ "timestamp": "2025-08-29T18:45:00+08:00",
+ "open": 4437.978515625,
+ "high": 4447.69873046875,
+ "low": 4425.95751953125,
+ "close": 4433.853515625,
+ "volume": 3539.611328125,
+ "amount": 15629640.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 4439.0234375,
+ "high": 4451.14794921875,
+ "low": 4427.4091796875,
+ "close": 4437.88330078125,
+ "volume": 4457.74072265625,
+ "amount": 19741456.0
+ },
+ {
+ "timestamp": "2025-08-29T19:15:00+08:00",
+ "open": 4440.67236328125,
+ "high": 4450.251953125,
+ "low": 4424.75244140625,
+ "close": 4434.4404296875,
+ "volume": 4041.19970703125,
+ "amount": 17870412.0
+ },
+ {
+ "timestamp": "2025-08-29T19:30:00+08:00",
+ "open": 4439.81591796875,
+ "high": 4448.09716796875,
+ "low": 4422.6083984375,
+ "close": 4431.39306640625,
+ "volume": 4699.3359375,
+ "amount": 21181264.0
+ },
+ {
+ "timestamp": "2025-08-29T19:45:00+08:00",
+ "open": 4435.97265625,
+ "high": 4446.8984375,
+ "low": 4424.90283203125,
+ "close": 4434.27978515625,
+ "volume": 4268.640625,
+ "amount": 18895636.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 4434.98291015625,
+ "high": 4444.10107421875,
+ "low": 4415.77880859375,
+ "close": 4425.10498046875,
+ "volume": 5284.3544921875,
+ "amount": 23360280.0
+ },
+ {
+ "timestamp": "2025-08-29T20:15:00+08:00",
+ "open": 4430.73779296875,
+ "high": 4446.8466796875,
+ "low": 4416.8623046875,
+ "close": 4430.75537109375,
+ "volume": 4821.13671875,
+ "amount": 21274184.0
+ },
+ {
+ "timestamp": "2025-08-29T20:30:00+08:00",
+ "open": 4433.912109375,
+ "high": 4441.0498046875,
+ "low": 4418.09033203125,
+ "close": 4425.23291015625,
+ "volume": 5097.58984375,
+ "amount": 22713672.0
+ },
+ {
+ "timestamp": "2025-08-29T20:45:00+08:00",
+ "open": 4429.697265625,
+ "high": 4442.6748046875,
+ "low": 4417.91455078125,
+ "close": 4429.427734375,
+ "volume": 4236.5927734375,
+ "amount": 18617122.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 4431.796875,
+ "high": 4440.27001953125,
+ "low": 4416.4306640625,
+ "close": 4424.44287109375,
+ "volume": 4971.64501953125,
+ "amount": 22127160.0
+ },
+ {
+ "timestamp": "2025-08-29T21:15:00+08:00",
+ "open": 4428.65380859375,
+ "high": 4438.82666015625,
+ "low": 4410.0908203125,
+ "close": 4419.958984375,
+ "volume": 4880.84814453125,
+ "amount": 21470996.0
+ },
+ {
+ "timestamp": "2025-08-29T21:30:00+08:00",
+ "open": 4423.84765625,
+ "high": 4435.455078125,
+ "low": 4408.8212890625,
+ "close": 4418.8388671875,
+ "volume": 5310.017578125,
+ "amount": 23468740.0
+ },
+ {
+ "timestamp": "2025-08-29T21:45:00+08:00",
+ "open": 4422.228515625,
+ "high": 4436.84912109375,
+ "low": 4406.013671875,
+ "close": 4421.1357421875,
+ "volume": 5691.2919921875,
+ "amount": 25062086.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 4423.30615234375,
+ "high": 4432.3310546875,
+ "low": 4410.02978515625,
+ "close": 4418.75,
+ "volume": 4468.89208984375,
+ "amount": 19694380.0
+ },
+ {
+ "timestamp": "2025-08-29T22:15:00+08:00",
+ "open": 4424.423828125,
+ "high": 4431.634765625,
+ "low": 4408.798828125,
+ "close": 4415.80712890625,
+ "volume": 4531.4365234375,
+ "amount": 20034978.0
+ },
+ {
+ "timestamp": "2025-08-29T22:30:00+08:00",
+ "open": 4421.29541015625,
+ "high": 4434.6357421875,
+ "low": 4405.32470703125,
+ "close": 4418.87744140625,
+ "volume": 6036.533203125,
+ "amount": 26565786.0
+ },
+ {
+ "timestamp": "2025-08-29T22:45:00+08:00",
+ "open": 4420.73046875,
+ "high": 4433.45703125,
+ "low": 4409.806640625,
+ "close": 4420.74609375,
+ "volume": 4460.77197265625,
+ "amount": 19610600.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 4420.107421875,
+ "high": 4434.1953125,
+ "low": 4408.61767578125,
+ "close": 4422.34716796875,
+ "volume": 4672.87890625,
+ "amount": 20587718.0
+ },
+ {
+ "timestamp": "2025-08-29T23:15:00+08:00",
+ "open": 4422.76708984375,
+ "high": 4432.43115234375,
+ "low": 4408.826171875,
+ "close": 4417.640625,
+ "volume": 4759.7646484375,
+ "amount": 21004958.0
+ },
+ {
+ "timestamp": "2025-08-29T23:30:00+08:00",
+ "open": 4419.259765625,
+ "high": 4428.599609375,
+ "low": 4404.37060546875,
+ "close": 4413.42822265625,
+ "volume": 5411.2177734375,
+ "amount": 23824832.0
+ },
+ {
+ "timestamp": "2025-08-29T23:45:00+08:00",
+ "open": 4417.21240234375,
+ "high": 4429.10791015625,
+ "low": 4404.77587890625,
+ "close": 4415.55810546875,
+ "volume": 4215.689453125,
+ "amount": 18526096.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 4418.54345703125,
+ "high": 4428.8037109375,
+ "low": 4398.87255859375,
+ "close": 4407.85986328125,
+ "volume": 6221.10546875,
+ "amount": 27428534.0
+ },
+ {
+ "timestamp": "2025-08-30T00:15:00+08:00",
+ "open": 4413.6416015625,
+ "high": 4426.369140625,
+ "low": 4397.6455078125,
+ "close": 4408.888671875,
+ "volume": 4846.1611328125,
+ "amount": 21438312.0
+ },
+ {
+ "timestamp": "2025-08-30T00:30:00+08:00",
+ "open": 4415.146484375,
+ "high": 4429.01708984375,
+ "low": 4403.10888671875,
+ "close": 4415.638671875,
+ "volume": 4306.1875,
+ "amount": 18928148.0
+ },
+ {
+ "timestamp": "2025-08-30T00:45:00+08:00",
+ "open": 4418.8798828125,
+ "high": 4428.71044921875,
+ "low": 4404.5888671875,
+ "close": 4413.03857421875,
+ "volume": 3644.2890625,
+ "amount": 16080228.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 4415.8271484375,
+ "high": 4426.33251953125,
+ "low": 4402.8564453125,
+ "close": 4412.7236328125,
+ "volume": 4705.95751953125,
+ "amount": 20670044.0
+ },
+ {
+ "timestamp": "2025-08-30T01:15:00+08:00",
+ "open": 4418.57470703125,
+ "high": 4431.08935546875,
+ "low": 4401.22021484375,
+ "close": 4412.13916015625,
+ "volume": 4448.58349609375,
+ "amount": 19791164.0
+ },
+ {
+ "timestamp": "2025-08-30T01:30:00+08:00",
+ "open": 4416.92333984375,
+ "high": 4427.01806640625,
+ "low": 4405.50732421875,
+ "close": 4414.26513671875,
+ "volume": 4067.416259765625,
+ "amount": 17912714.0
+ },
+ {
+ "timestamp": "2025-08-30T01:45:00+08:00",
+ "open": 4418.7880859375,
+ "high": 4427.201171875,
+ "low": 4408.40576171875,
+ "close": 4416.146484375,
+ "volume": 3535.79296875,
+ "amount": 15609990.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 4419.7021484375,
+ "high": 4431.84228515625,
+ "low": 4407.12841796875,
+ "close": 4418.0009765625,
+ "volume": 4544.619140625,
+ "amount": 20005372.0
+ },
+ {
+ "timestamp": "2025-08-30T02:15:00+08:00",
+ "open": 4421.0029296875,
+ "high": 4432.982421875,
+ "low": 4407.189453125,
+ "close": 4418.17529296875,
+ "volume": 4134.5302734375,
+ "amount": 18248920.0
+ },
+ {
+ "timestamp": "2025-08-30T02:30:00+08:00",
+ "open": 4421.5673828125,
+ "high": 4432.07568359375,
+ "low": 4411.0654296875,
+ "close": 4420.30322265625,
+ "volume": 3632.405517578125,
+ "amount": 15964916.0
+ },
+ {
+ "timestamp": "2025-08-30T02:45:00+08:00",
+ "open": 4420.4794921875,
+ "high": 4431.26806640625,
+ "low": 4410.98583984375,
+ "close": 4420.8994140625,
+ "volume": 3259.43212890625,
+ "amount": 14317208.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 4423.84521484375,
+ "high": 4432.77978515625,
+ "low": 4412.89208984375,
+ "close": 4420.69189453125,
+ "volume": 3624.80908203125,
+ "amount": 15956880.0
+ },
+ {
+ "timestamp": "2025-08-30T03:15:00+08:00",
+ "open": 4425.9189453125,
+ "high": 4437.70751953125,
+ "low": 4414.8876953125,
+ "close": 4424.462890625,
+ "volume": 3949.387939453125,
+ "amount": 17384614.0
+ },
+ {
+ "timestamp": "2025-08-30T03:30:00+08:00",
+ "open": 4426.03955078125,
+ "high": 4433.37841796875,
+ "low": 4415.3369140625,
+ "close": 4421.17626953125,
+ "volume": 3493.44189453125,
+ "amount": 15436086.0
+ },
+ {
+ "timestamp": "2025-08-30T03:45:00+08:00",
+ "open": 4424.3330078125,
+ "high": 4430.51416015625,
+ "low": 4414.5927734375,
+ "close": 4420.818359375,
+ "volume": 2994.544921875,
+ "amount": 13187168.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 4423.94580078125,
+ "high": 4431.31982421875,
+ "low": 4411.32568359375,
+ "close": 4419.4541015625,
+ "volume": 3898.42138671875,
+ "amount": 17125172.0
+ },
+ {
+ "timestamp": "2025-08-30T04:15:00+08:00",
+ "open": 4422.64306640625,
+ "high": 4428.61767578125,
+ "low": 4410.3349609375,
+ "close": 4416.2822265625,
+ "volume": 3311.53125,
+ "amount": 14581276.0
+ },
+ {
+ "timestamp": "2025-08-30T04:30:00+08:00",
+ "open": 4422.2939453125,
+ "high": 4430.4462890625,
+ "low": 4410.84912109375,
+ "close": 4417.822265625,
+ "volume": 3295.32958984375,
+ "amount": 14558054.0
+ },
+ {
+ "timestamp": "2025-08-30T04:45:00+08:00",
+ "open": 4421.650390625,
+ "high": 4430.6005859375,
+ "low": 4412.48828125,
+ "close": 4420.51025390625,
+ "volume": 3250.7177734375,
+ "amount": 14294590.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 4422.33837890625,
+ "high": 4428.3662109375,
+ "low": 4412.38232421875,
+ "close": 4418.01171875,
+ "volume": 3147.05908203125,
+ "amount": 13809538.0
+ },
+ {
+ "timestamp": "2025-08-30T05:15:00+08:00",
+ "open": 4421.9990234375,
+ "high": 4427.93212890625,
+ "low": 4411.55712890625,
+ "close": 4417.81494140625,
+ "volume": 3193.78662109375,
+ "amount": 14034316.0
+ },
+ {
+ "timestamp": "2025-08-30T05:30:00+08:00",
+ "open": 4419.53759765625,
+ "high": 4425.20166015625,
+ "low": 4408.55810546875,
+ "close": 4414.31982421875,
+ "volume": 3129.86669921875,
+ "amount": 13743752.0
+ },
+ {
+ "timestamp": "2025-08-30T05:45:00+08:00",
+ "open": 4417.65576171875,
+ "high": 4424.513671875,
+ "low": 4407.9814453125,
+ "close": 4414.47705078125,
+ "volume": 3058.30224609375,
+ "amount": 13429728.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 4414.5751953125,
+ "high": 4424.234375,
+ "low": 4404.935546875,
+ "close": 4414.05419921875,
+ "volume": 3295.88916015625,
+ "amount": 14439916.0
+ },
+ {
+ "timestamp": "2025-08-30T06:15:00+08:00",
+ "open": 4418.474609375,
+ "high": 4425.13134765625,
+ "low": 4407.90576171875,
+ "close": 4414.169921875,
+ "volume": 3265.73095703125,
+ "amount": 14369210.0
+ },
+ {
+ "timestamp": "2025-08-30T06:30:00+08:00",
+ "open": 4421.73046875,
+ "high": 4428.77392578125,
+ "low": 4406.12353515625,
+ "close": 4412.76416015625,
+ "volume": 3599.36767578125,
+ "amount": 15863754.0
+ },
+ {
+ "timestamp": "2025-08-30T06:45:00+08:00",
+ "open": 4414.2158203125,
+ "high": 4421.57666015625,
+ "low": 4402.5341796875,
+ "close": 4409.57470703125,
+ "volume": 3420.73876953125,
+ "amount": 15046830.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 4414.4306640625,
+ "high": 4425.03564453125,
+ "low": 4401.88525390625,
+ "close": 4409.59375,
+ "volume": 3124.46044921875,
+ "amount": 13750980.0
+ },
+ {
+ "timestamp": "2025-08-30T07:15:00+08:00",
+ "open": 4414.96923828125,
+ "high": 4424.0751953125,
+ "low": 4404.77734375,
+ "close": 4412.271484375,
+ "volume": 3336.994140625,
+ "amount": 14746958.0
+ },
+ {
+ "timestamp": "2025-08-30T07:30:00+08:00",
+ "open": 4414.515625,
+ "high": 4425.46875,
+ "low": 4403.79638671875,
+ "close": 4413.37158203125,
+ "volume": 3633.9140625,
+ "amount": 15962774.0
+ },
+ {
+ "timestamp": "2025-08-30T07:45:00+08:00",
+ "open": 4416.53369140625,
+ "high": 4424.92333984375,
+ "low": 4407.9765625,
+ "close": 4415.19140625,
+ "volume": 3039.89111328125,
+ "amount": 13374326.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 4417.24267578125,
+ "high": 4436.892578125,
+ "low": 4397.80615234375,
+ "close": 4422.52490234375,
+ "volume": 3849.573974609375,
+ "amount": 17092132.0
+ },
+ {
+ "timestamp": "2025-08-30T08:15:00+08:00",
+ "open": 4424.06396484375,
+ "high": 4436.06640625,
+ "low": 4410.9990234375,
+ "close": 4420.64990234375,
+ "volume": 3848.12060546875,
+ "amount": 17000952.0
+ },
+ {
+ "timestamp": "2025-08-30T08:30:00+08:00",
+ "open": 4423.544921875,
+ "high": 4436.00146484375,
+ "low": 4409.4111328125,
+ "close": 4421.40771484375,
+ "volume": 4132.8212890625,
+ "amount": 18360988.0
+ },
+ {
+ "timestamp": "2025-08-30T08:45:00+08:00",
+ "open": 4422.3837890625,
+ "high": 4434.77099609375,
+ "low": 4411.365234375,
+ "close": 4422.79541015625,
+ "volume": 3339.5146484375,
+ "amount": 14676568.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 4424.86083984375,
+ "high": 4433.580078125,
+ "low": 4412.78125,
+ "close": 4421.5048828125,
+ "volume": 3503.95654296875,
+ "amount": 15373982.0
+ },
+ {
+ "timestamp": "2025-08-30T09:15:00+08:00",
+ "open": 4427.529296875,
+ "high": 4435.2880859375,
+ "low": 4413.16796875,
+ "close": 4419.97998046875,
+ "volume": 3335.650390625,
+ "amount": 14718534.0
+ },
+ {
+ "timestamp": "2025-08-30T09:30:00+08:00",
+ "open": 4426.05126953125,
+ "high": 4436.7822265625,
+ "low": 4416.0390625,
+ "close": 4425.57763671875,
+ "volume": 3070.638671875,
+ "amount": 13595170.0
+ },
+ {
+ "timestamp": "2025-08-30T09:45:00+08:00",
+ "open": 4431.537109375,
+ "high": 4436.86328125,
+ "low": 4414.892578125,
+ "close": 4421.59326171875,
+ "volume": 3467.83447265625,
+ "amount": 15386442.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 4425.47314453125,
+ "high": 4432.24365234375,
+ "low": 4413.5439453125,
+ "close": 4419.54931640625,
+ "volume": 3326.73974609375,
+ "amount": 14762258.0
+ },
+ {
+ "timestamp": "2025-08-30T10:15:00+08:00",
+ "open": 4422.1220703125,
+ "high": 4431.0966796875,
+ "low": 4410.22314453125,
+ "close": 4419.17333984375,
+ "volume": 3139.20849609375,
+ "amount": 13884208.0
+ },
+ {
+ "timestamp": "2025-08-30T10:30:00+08:00",
+ "open": 4421.65576171875,
+ "high": 4429.0693359375,
+ "low": 4411.23291015625,
+ "close": 4418.46484375,
+ "volume": 2916.35888671875,
+ "amount": 12854348.0
+ },
+ {
+ "timestamp": "2025-08-30T10:45:00+08:00",
+ "open": 4424.79833984375,
+ "high": 4432.74267578125,
+ "low": 4411.53955078125,
+ "close": 4418.89453125,
+ "volume": 3240.97021484375,
+ "amount": 14294440.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 4421.3486328125,
+ "high": 4426.65625,
+ "low": 4407.02880859375,
+ "close": 4413.22509765625,
+ "volume": 3523.09814453125,
+ "amount": 15522222.0
+ },
+ {
+ "timestamp": "2025-08-30T11:15:00+08:00",
+ "open": 4418.146484375,
+ "high": 4424.46630859375,
+ "low": 4400.74853515625,
+ "close": 4406.23779296875,
+ "volume": 4581.16748046875,
+ "amount": 20284268.0
+ },
+ {
+ "timestamp": "2025-08-30T11:30:00+08:00",
+ "open": 4408.302734375,
+ "high": 4422.57177734375,
+ "low": 4397.77685546875,
+ "close": 4413.76611328125,
+ "volume": 3456.4287109375,
+ "amount": 15155204.0
+ },
+ {
+ "timestamp": "2025-08-30T11:45:00+08:00",
+ "open": 4412.24169921875,
+ "high": 4419.21875,
+ "low": 4401.53564453125,
+ "close": 4408.38330078125,
+ "volume": 2967.7177734375,
+ "amount": 13093582.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 4413.201171875,
+ "high": 4420.21533203125,
+ "low": 4403.00146484375,
+ "close": 4409.58447265625,
+ "volume": 2852.73388671875,
+ "amount": 12607770.0
+ },
+ {
+ "timestamp": "2025-08-30T12:15:00+08:00",
+ "open": 4410.72509765625,
+ "high": 4417.58642578125,
+ "low": 4399.541015625,
+ "close": 4405.8291015625,
+ "volume": 2915.83349609375,
+ "amount": 12912654.0
+ },
+ {
+ "timestamp": "2025-08-30T12:30:00+08:00",
+ "open": 4410.140625,
+ "high": 4417.90771484375,
+ "low": 4400.58056640625,
+ "close": 4408.63916015625,
+ "volume": 3110.79296875,
+ "amount": 13686536.0
+ },
+ {
+ "timestamp": "2025-08-30T12:45:00+08:00",
+ "open": 4410.9755859375,
+ "high": 4416.7744140625,
+ "low": 4400.47705078125,
+ "close": 4405.619140625,
+ "volume": 2681.83349609375,
+ "amount": 11842682.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 4410.396484375,
+ "high": 4414.861328125,
+ "low": 4399.03662109375,
+ "close": 4403.9638671875,
+ "volume": 2766.78173828125,
+ "amount": 12221064.0
+ },
+ {
+ "timestamp": "2025-08-30T13:15:00+08:00",
+ "open": 4408.42724609375,
+ "high": 4413.07861328125,
+ "low": 4398.11328125,
+ "close": 4402.30126953125,
+ "volume": 2492.78515625,
+ "amount": 11033420.0
+ },
+ {
+ "timestamp": "2025-08-30T13:30:00+08:00",
+ "open": 4404.88037109375,
+ "high": 4410.33837890625,
+ "low": 4393.736328125,
+ "close": 4399.4814453125,
+ "volume": 2845.458984375,
+ "amount": 12485714.0
+ },
+ {
+ "timestamp": "2025-08-30T13:45:00+08:00",
+ "open": 4404.4873046875,
+ "high": 4407.4208984375,
+ "low": 4391.830078125,
+ "close": 4395.24951171875,
+ "volume": 2740.58203125,
+ "amount": 12119266.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 4398.63330078125,
+ "high": 4405.14208984375,
+ "low": 4386.615234375,
+ "close": 4393.927734375,
+ "volume": 3936.732666015625,
+ "amount": 17217616.0
+ },
+ {
+ "timestamp": "2025-08-30T14:15:00+08:00",
+ "open": 4396.3203125,
+ "high": 4403.37841796875,
+ "low": 4384.75537109375,
+ "close": 4391.39697265625,
+ "volume": 3536.3125,
+ "amount": 15451760.0
+ },
+ {
+ "timestamp": "2025-08-30T14:30:00+08:00",
+ "open": 4400.17822265625,
+ "high": 4404.41748046875,
+ "low": 4379.8505859375,
+ "close": 4384.228515625,
+ "volume": 3587.30029296875,
+ "amount": 16007364.0
+ },
+ {
+ "timestamp": "2025-08-30T14:45:00+08:00",
+ "open": 4389.55224609375,
+ "high": 4398.9892578125,
+ "low": 4378.63427734375,
+ "close": 4387.65869140625,
+ "volume": 3590.80126953125,
+ "amount": 15753638.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 4391.515625,
+ "high": 4396.142578125,
+ "low": 4374.96044921875,
+ "close": 4380.99658203125,
+ "volume": 4202.033203125,
+ "amount": 18451072.0
+ },
+ {
+ "timestamp": "2025-08-30T15:15:00+08:00",
+ "open": 4385.1337890625,
+ "high": 4396.03466796875,
+ "low": 4373.654296875,
+ "close": 4383.20458984375,
+ "volume": 3860.292236328125,
+ "amount": 16817400.0
+ },
+ {
+ "timestamp": "2025-08-30T15:30:00+08:00",
+ "open": 4386.3564453125,
+ "high": 4397.07568359375,
+ "low": 4372.4892578125,
+ "close": 4380.6318359375,
+ "volume": 4397.4423828125,
+ "amount": 19344552.0
+ },
+ {
+ "timestamp": "2025-08-30T15:45:00+08:00",
+ "open": 4388.64599609375,
+ "high": 4400.20068359375,
+ "low": 4376.72314453125,
+ "close": 4385.39599609375,
+ "volume": 3529.169921875,
+ "amount": 15449336.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 4393.103515625,
+ "high": 4406.48095703125,
+ "low": 4376.4130859375,
+ "close": 4388.72119140625,
+ "volume": 4653.05078125,
+ "amount": 20416496.0
+ },
+ {
+ "timestamp": "2025-08-30T16:15:00+08:00",
+ "open": 4392.412109375,
+ "high": 4400.7255859375,
+ "low": 4380.5771484375,
+ "close": 4387.78466796875,
+ "volume": 3571.53466796875,
+ "amount": 15618524.0
+ },
+ {
+ "timestamp": "2025-08-30T16:30:00+08:00",
+ "open": 4392.3642578125,
+ "high": 4400.869140625,
+ "low": 4381.845703125,
+ "close": 4388.1064453125,
+ "volume": 3050.03564453125,
+ "amount": 13407420.0
+ },
+ {
+ "timestamp": "2025-08-30T16:45:00+08:00",
+ "open": 4392.14892578125,
+ "high": 4400.43408203125,
+ "low": 4381.8828125,
+ "close": 4388.71728515625,
+ "volume": 3258.2666015625,
+ "amount": 14306942.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 4392.5986328125,
+ "high": 4399.025390625,
+ "low": 4379.68798828125,
+ "close": 4386.57666015625,
+ "volume": 3694.155517578125,
+ "amount": 16192044.0
+ },
+ {
+ "timestamp": "2025-08-30T17:15:00+08:00",
+ "open": 4390.42919921875,
+ "high": 4394.9580078125,
+ "low": 4377.2666015625,
+ "close": 4382.47705078125,
+ "volume": 3545.0595703125,
+ "amount": 15581308.0
+ },
+ {
+ "timestamp": "2025-08-30T17:30:00+08:00",
+ "open": 4393.29833984375,
+ "high": 4401.6435546875,
+ "low": 4377.59619140625,
+ "close": 4385.189453125,
+ "volume": 3497.0185546875,
+ "amount": 15394266.0
+ },
+ {
+ "timestamp": "2025-08-30T17:45:00+08:00",
+ "open": 4391.01513671875,
+ "high": 4397.365234375,
+ "low": 4379.25537109375,
+ "close": 4385.8173828125,
+ "volume": 3270.29345703125,
+ "amount": 14417080.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 4389.8994140625,
+ "high": 4396.234375,
+ "low": 4373.8671875,
+ "close": 4381.0380859375,
+ "volume": 3859.208251953125,
+ "amount": 16922050.0
+ },
+ {
+ "timestamp": "2025-08-30T18:15:00+08:00",
+ "open": 4385.35009765625,
+ "high": 4395.9814453125,
+ "low": 4371.84619140625,
+ "close": 4382.32373046875,
+ "volume": 4179.4794921875,
+ "amount": 18383076.0
+ },
+ {
+ "timestamp": "2025-08-30T18:30:00+08:00",
+ "open": 4384.7890625,
+ "high": 4393.91845703125,
+ "low": 4372.982421875,
+ "close": 4381.81884765625,
+ "volume": 3708.03662109375,
+ "amount": 16251688.0
+ },
+ {
+ "timestamp": "2025-08-30T18:45:00+08:00",
+ "open": 4385.36376953125,
+ "high": 4391.58154296875,
+ "low": 4370.24853515625,
+ "close": 4376.2255859375,
+ "volume": 3531.42431640625,
+ "amount": 15498266.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 4379.822265625,
+ "high": 4391.349609375,
+ "low": 4362.35009765625,
+ "close": 4377.1650390625,
+ "volume": 5046.7177734375,
+ "amount": 22327908.0
+ },
+ {
+ "timestamp": "2025-08-30T19:15:00+08:00",
+ "open": 4383.283203125,
+ "high": 4397.99853515625,
+ "low": 4366.62890625,
+ "close": 4378.2568359375,
+ "volume": 5746.00146484375,
+ "amount": 25179304.0
+ },
+ {
+ "timestamp": "2025-08-30T19:30:00+08:00",
+ "open": 4380.6630859375,
+ "high": 4394.68994140625,
+ "low": 4369.58154296875,
+ "close": 4381.57568359375,
+ "volume": 4714.3505859375,
+ "amount": 20650648.0
+ },
+ {
+ "timestamp": "2025-08-30T19:45:00+08:00",
+ "open": 4381.564453125,
+ "high": 4391.97705078125,
+ "low": 4368.33447265625,
+ "close": 4378.0390625,
+ "volume": 3612.40185546875,
+ "amount": 15722476.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 4383.794921875,
+ "high": 4393.82861328125,
+ "low": 4369.12744140625,
+ "close": 4379.046875,
+ "volume": 4308.6005859375,
+ "amount": 18862996.0
+ },
+ {
+ "timestamp": "2025-08-30T20:15:00+08:00",
+ "open": 4386.48583984375,
+ "high": 4397.3115234375,
+ "low": 4375.50439453125,
+ "close": 4384.826171875,
+ "volume": 3685.409912109375,
+ "amount": 16122716.0
+ },
+ {
+ "timestamp": "2025-08-30T20:30:00+08:00",
+ "open": 4389.767578125,
+ "high": 4403.5791015625,
+ "low": 4374.4814453125,
+ "close": 4388.224609375,
+ "volume": 4619.0830078125,
+ "amount": 20723512.0
+ },
+ {
+ "timestamp": "2025-08-30T20:45:00+08:00",
+ "open": 4389.21533203125,
+ "high": 4398.07958984375,
+ "low": 4378.00634765625,
+ "close": 4386.8154296875,
+ "volume": 3414.56640625,
+ "amount": 14915880.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_172152.json b/webui/prediction_results/prediction_20250829_172152.json
new file mode 100644
index 0000000000000000000000000000000000000000..cb5b4b9fe36815b7d80a77dd04f3eb859bafd5a1
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_172152.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T17:21:52.373116",
+ "file_path": "ETHUSDT_1h",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "ETHUSDT",
+ "interval": "1h",
+ "limit": 400,
+ "lookback": 400,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 3,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 400,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 4075.58,
+ "max": 4935.01
+ },
+ "high": {
+ "min": 4115.51,
+ "max": 4956.78
+ },
+ "low": {
+ "min": 4060.0,
+ "max": 4897.31
+ },
+ "close": {
+ "min": 4075.59,
+ "max": 4935.0
+ }
+ },
+ "last_values": {
+ "open": 4334.5,
+ "high": 4336.71,
+ "low": 4318.57,
+ "close": 4329.22
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 4282.4912109375,
+ "high": 4361.2294921875,
+ "low": 4234.88427734375,
+ "close": 4333.234375,
+ "volume": 41564.41015625,
+ "amount": 185734416.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 4352.28759765625,
+ "high": 4410.75634765625,
+ "low": 4319.48388671875,
+ "close": 4363.30517578125,
+ "volume": 42923.6640625,
+ "amount": 192469344.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 4382.796875,
+ "high": 4430.58544921875,
+ "low": 4314.2060546875,
+ "close": 4372.49755859375,
+ "volume": 41269.53515625,
+ "amount": 186288384.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 4385.24951171875,
+ "high": 4419.478515625,
+ "low": 4358.85302734375,
+ "close": 4396.03173828125,
+ "volume": 21383.30859375,
+ "amount": 97311136.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 4368.0087890625,
+ "high": 4440.18017578125,
+ "low": 4311.091796875,
+ "close": 4390.7529296875,
+ "volume": 29735.900390625,
+ "amount": 132181960.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 4408.7294921875,
+ "high": 4463.3076171875,
+ "low": 4390.833984375,
+ "close": 4445.92236328125,
+ "volume": 28343.66015625,
+ "amount": 127795416.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 4442.02197265625,
+ "high": 4481.58544921875,
+ "low": 4408.95068359375,
+ "close": 4432.58251953125,
+ "volume": 24402.416015625,
+ "amount": 110463672.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 4444.79833984375,
+ "high": 4468.03466796875,
+ "low": 4411.03369140625,
+ "close": 4432.7431640625,
+ "volume": 19657.90234375,
+ "amount": 89113328.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 4429.126953125,
+ "high": 4453.34521484375,
+ "low": 4399.0439453125,
+ "close": 4421.98046875,
+ "volume": 21773.8125,
+ "amount": 101144800.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 4429.234375,
+ "high": 4436.63671875,
+ "low": 4387.5693359375,
+ "close": 4397.3525390625,
+ "volume": 28516.181640625,
+ "amount": 129596288.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 4381.88671875,
+ "high": 4439.51806640625,
+ "low": 4374.1650390625,
+ "close": 4430.93994140625,
+ "volume": 23852.7734375,
+ "amount": 104623216.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 4423.650390625,
+ "high": 4441.466796875,
+ "low": 4400.42529296875,
+ "close": 4420.38037109375,
+ "volume": 14760.81640625,
+ "amount": 67411320.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 4420.02099609375,
+ "high": 4445.5625,
+ "low": 4397.81298828125,
+ "close": 4426.611328125,
+ "volume": 17794.2890625,
+ "amount": 80365224.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 4424.841796875,
+ "high": 4445.0068359375,
+ "low": 4403.95947265625,
+ "close": 4427.0380859375,
+ "volume": 13068.787109375,
+ "amount": 58870920.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 4428.99658203125,
+ "high": 4447.88134765625,
+ "low": 4410.6669921875,
+ "close": 4428.81201171875,
+ "volume": 11668.935546875,
+ "amount": 53033040.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 4428.638671875,
+ "high": 4449.5693359375,
+ "low": 4412.54345703125,
+ "close": 4433.689453125,
+ "volume": 10685.646484375,
+ "amount": 48891032.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 4438.92626953125,
+ "high": 4459.74560546875,
+ "low": 4411.07470703125,
+ "close": 4426.2802734375,
+ "volume": 13976.712890625,
+ "amount": 63491480.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 4426.97412109375,
+ "high": 4449.53076171875,
+ "low": 4408.8984375,
+ "close": 4430.98095703125,
+ "volume": 18471.4375,
+ "amount": 83599296.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 4428.93212890625,
+ "high": 4451.17529296875,
+ "low": 4413.1083984375,
+ "close": 4436.455078125,
+ "volume": 13301.4609375,
+ "amount": 60281400.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 4439.32177734375,
+ "high": 4464.7841796875,
+ "low": 4427.1044921875,
+ "close": 4451.64599609375,
+ "volume": 14181.94140625,
+ "amount": 65029576.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 4446.501953125,
+ "high": 4464.52685546875,
+ "low": 4429.45751953125,
+ "close": 4445.22265625,
+ "volume": 18854.76171875,
+ "amount": 85267664.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 4435.689453125,
+ "high": 4471.3876953125,
+ "low": 4402.07421875,
+ "close": 4443.52734375,
+ "volume": 30264.58984375,
+ "amount": 136563376.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 4441.3876953125,
+ "high": 4467.85107421875,
+ "low": 4422.400390625,
+ "close": 4452.53564453125,
+ "volume": 19033.14453125,
+ "amount": 86610320.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 4465.3056640625,
+ "high": 4488.111328125,
+ "low": 4449.31884765625,
+ "close": 4473.35595703125,
+ "volume": 15677.2705078125,
+ "amount": 71282888.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 4476.12939453125,
+ "high": 4488.830078125,
+ "low": 4455.40185546875,
+ "close": 4467.69189453125,
+ "volume": 18212.05859375,
+ "amount": 83243360.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 4463.439453125,
+ "high": 4500.99755859375,
+ "low": 4454.453125,
+ "close": 4495.87451171875,
+ "volume": 23368.607421875,
+ "amount": 104860384.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 4475.77294921875,
+ "high": 4525.76708984375,
+ "low": 4459.5869140625,
+ "close": 4489.36572265625,
+ "volume": 25631.126953125,
+ "amount": 116907184.0
+ },
+ {
+ "timestamp": "2025-08-30T21:00:00+08:00",
+ "open": 4500.6728515625,
+ "high": 4516.06201171875,
+ "low": 4467.33984375,
+ "close": 4486.43701171875,
+ "volume": 27984.078125,
+ "amount": 126316808.0
+ },
+ {
+ "timestamp": "2025-08-30T22:00:00+08:00",
+ "open": 4486.53125,
+ "high": 4519.55419921875,
+ "low": 4467.80810546875,
+ "close": 4495.17236328125,
+ "volume": 20402.703125,
+ "amount": 93258720.0
+ },
+ {
+ "timestamp": "2025-08-30T23:00:00+08:00",
+ "open": 4498.48779296875,
+ "high": 4538.9287109375,
+ "low": 4484.64453125,
+ "close": 4522.88671875,
+ "volume": 26715.03125,
+ "amount": 121698272.0
+ },
+ {
+ "timestamp": "2025-08-31T00:00:00+08:00",
+ "open": 4524.87255859375,
+ "high": 4621.68310546875,
+ "low": 4499.73486328125,
+ "close": 4561.12060546875,
+ "volume": 49894.8984375,
+ "amount": 223559728.0
+ },
+ {
+ "timestamp": "2025-08-31T01:00:00+08:00",
+ "open": 4559.73876953125,
+ "high": 4587.0126953125,
+ "low": 4533.35546875,
+ "close": 4568.609375,
+ "volume": 36147.6328125,
+ "amount": 165589824.0
+ },
+ {
+ "timestamp": "2025-08-31T02:00:00+08:00",
+ "open": 4567.623046875,
+ "high": 4598.1220703125,
+ "low": 4537.68798828125,
+ "close": 4569.8056640625,
+ "volume": 35936.2109375,
+ "amount": 160498608.0
+ },
+ {
+ "timestamp": "2025-08-31T03:00:00+08:00",
+ "open": 4573.375,
+ "high": 4600.0380859375,
+ "low": 4548.076171875,
+ "close": 4575.8720703125,
+ "volume": 30765.90234375,
+ "amount": 136558160.0
+ },
+ {
+ "timestamp": "2025-08-31T04:00:00+08:00",
+ "open": 4567.00927734375,
+ "high": 4590.32958984375,
+ "low": 4541.55126953125,
+ "close": 4569.16162109375,
+ "volume": 22723.94921875,
+ "amount": 103475488.0
+ },
+ {
+ "timestamp": "2025-08-31T05:00:00+08:00",
+ "open": 4553.81298828125,
+ "high": 4608.302734375,
+ "low": 4506.8779296875,
+ "close": 4545.40283203125,
+ "volume": 34898.23046875,
+ "amount": 160449520.0
+ },
+ {
+ "timestamp": "2025-08-31T06:00:00+08:00",
+ "open": 4550.72216796875,
+ "high": 4573.18310546875,
+ "low": 4529.55419921875,
+ "close": 4552.14599609375,
+ "volume": 20792.20703125,
+ "amount": 94255152.0
+ },
+ {
+ "timestamp": "2025-08-31T07:00:00+08:00",
+ "open": 4552.25732421875,
+ "high": 4581.28759765625,
+ "low": 4536.3828125,
+ "close": 4563.97509765625,
+ "volume": 22510.587890625,
+ "amount": 101917040.0
+ },
+ {
+ "timestamp": "2025-08-31T08:00:00+08:00",
+ "open": 4561.23095703125,
+ "high": 4580.966796875,
+ "low": 4530.3701171875,
+ "close": 4544.28466796875,
+ "volume": 14353.876953125,
+ "amount": 65249832.0
+ },
+ {
+ "timestamp": "2025-08-31T09:00:00+08:00",
+ "open": 4539.275390625,
+ "high": 4580.435546875,
+ "low": 4495.68701171875,
+ "close": 4527.88623046875,
+ "volume": 26263.330078125,
+ "amount": 120025968.0
+ },
+ {
+ "timestamp": "2025-08-31T10:00:00+08:00",
+ "open": 4517.18701171875,
+ "high": 4541.53564453125,
+ "low": 4482.7607421875,
+ "close": 4515.69873046875,
+ "volume": 34039.8203125,
+ "amount": 152376688.0
+ },
+ {
+ "timestamp": "2025-08-31T11:00:00+08:00",
+ "open": 4523.0908203125,
+ "high": 4567.8837890625,
+ "low": 4500.87548828125,
+ "close": 4524.88671875,
+ "volume": 34569.421875,
+ "amount": 157650848.0
+ },
+ {
+ "timestamp": "2025-08-31T12:00:00+08:00",
+ "open": 4521.97607421875,
+ "high": 4554.66796875,
+ "low": 4492.2939453125,
+ "close": 4518.55908203125,
+ "volume": 29718.35546875,
+ "amount": 133930088.0
+ },
+ {
+ "timestamp": "2025-08-31T13:00:00+08:00",
+ "open": 4512.5498046875,
+ "high": 4543.76611328125,
+ "low": 4498.451171875,
+ "close": 4519.244140625,
+ "volume": 26441.828125,
+ "amount": 121619864.0
+ },
+ {
+ "timestamp": "2025-08-31T14:00:00+08:00",
+ "open": 4518.3701171875,
+ "high": 4539.8212890625,
+ "low": 4493.92431640625,
+ "close": 4520.0908203125,
+ "volume": 19778.484375,
+ "amount": 89527424.0
+ },
+ {
+ "timestamp": "2025-08-31T15:00:00+08:00",
+ "open": 4515.78857421875,
+ "high": 4536.0283203125,
+ "low": 4492.599609375,
+ "close": 4519.13720703125,
+ "volume": 19288.88671875,
+ "amount": 87809264.0
+ },
+ {
+ "timestamp": "2025-08-31T16:00:00+08:00",
+ "open": 4511.93701171875,
+ "high": 4534.26904296875,
+ "low": 4489.48095703125,
+ "close": 4516.10986328125,
+ "volume": 23741.22265625,
+ "amount": 107723896.0
+ },
+ {
+ "timestamp": "2025-08-31T17:00:00+08:00",
+ "open": 4505.01904296875,
+ "high": 4531.9072265625,
+ "low": 4491.36474609375,
+ "close": 4512.52734375,
+ "volume": 37825.3046875,
+ "amount": 166912688.0
+ },
+ {
+ "timestamp": "2025-08-31T18:00:00+08:00",
+ "open": 4511.67529296875,
+ "high": 4537.43798828125,
+ "low": 4485.5615234375,
+ "close": 4495.9404296875,
+ "volume": 27621.8984375,
+ "amount": 125282592.0
+ },
+ {
+ "timestamp": "2025-08-31T19:00:00+08:00",
+ "open": 4484.9697265625,
+ "high": 4529.4853515625,
+ "low": 4471.75,
+ "close": 4513.2138671875,
+ "volume": 29425.353515625,
+ "amount": 132308856.0
+ },
+ {
+ "timestamp": "2025-08-31T20:00:00+08:00",
+ "open": 4512.09716796875,
+ "high": 4541.115234375,
+ "low": 4498.42724609375,
+ "close": 4524.0126953125,
+ "volume": 20643.24609375,
+ "amount": 93192464.0
+ },
+ {
+ "timestamp": "2025-08-31T21:00:00+08:00",
+ "open": 4528.1806640625,
+ "high": 4561.1640625,
+ "low": 4511.8212890625,
+ "close": 4544.34228515625,
+ "volume": 25064.21484375,
+ "amount": 114048264.0
+ },
+ {
+ "timestamp": "2025-08-31T22:00:00+08:00",
+ "open": 4546.2099609375,
+ "high": 4575.966796875,
+ "low": 4506.91259765625,
+ "close": 4550.21923828125,
+ "volume": 26318.26953125,
+ "amount": 119626688.0
+ },
+ {
+ "timestamp": "2025-08-31T23:00:00+08:00",
+ "open": 4557.521484375,
+ "high": 4577.556640625,
+ "low": 4541.15478515625,
+ "close": 4554.4970703125,
+ "volume": 23678.0859375,
+ "amount": 107923184.0
+ },
+ {
+ "timestamp": "2025-09-01T00:00:00+08:00",
+ "open": 4543.68798828125,
+ "high": 4581.7158203125,
+ "low": 4528.740234375,
+ "close": 4565.15576171875,
+ "volume": 25644.58984375,
+ "amount": 116082848.0
+ },
+ {
+ "timestamp": "2025-09-01T01:00:00+08:00",
+ "open": 4579.47607421875,
+ "high": 4603.38134765625,
+ "low": 4550.8212890625,
+ "close": 4568.69189453125,
+ "volume": 27431.19921875,
+ "amount": 123956640.0
+ },
+ {
+ "timestamp": "2025-09-01T02:00:00+08:00",
+ "open": 4573.646484375,
+ "high": 4592.0595703125,
+ "low": 4554.6572265625,
+ "close": 4572.03759765625,
+ "volume": 25802.00390625,
+ "amount": 118018480.0
+ },
+ {
+ "timestamp": "2025-09-01T03:00:00+08:00",
+ "open": 4566.6142578125,
+ "high": 4581.90576171875,
+ "low": 4545.2978515625,
+ "close": 4558.9677734375,
+ "volume": 24661.32421875,
+ "amount": 112163976.0
+ },
+ {
+ "timestamp": "2025-09-01T04:00:00+08:00",
+ "open": 4552.43603515625,
+ "high": 4585.63037109375,
+ "low": 4529.01025390625,
+ "close": 4554.7109375,
+ "volume": 16708.92578125,
+ "amount": 77551888.0
+ },
+ {
+ "timestamp": "2025-09-01T05:00:00+08:00",
+ "open": 4558.77001953125,
+ "high": 4584.6142578125,
+ "low": 4528.00146484375,
+ "close": 4559.5107421875,
+ "volume": 17492.35546875,
+ "amount": 80375648.0
+ },
+ {
+ "timestamp": "2025-09-01T06:00:00+08:00",
+ "open": 4564.69189453125,
+ "high": 4595.5302734375,
+ "low": 4538.27001953125,
+ "close": 4562.96826171875,
+ "volume": 24135.6484375,
+ "amount": 111718280.0
+ },
+ {
+ "timestamp": "2025-09-01T07:00:00+08:00",
+ "open": 4567.8740234375,
+ "high": 4609.28955078125,
+ "low": 4555.80029296875,
+ "close": 4590.12890625,
+ "volume": 24418.46484375,
+ "amount": 111945312.0
+ },
+ {
+ "timestamp": "2025-09-01T08:00:00+08:00",
+ "open": 4585.9306640625,
+ "high": 4629.86474609375,
+ "low": 4554.5703125,
+ "close": 4597.60693359375,
+ "volume": 45699.41796875,
+ "amount": 208058048.0
+ },
+ {
+ "timestamp": "2025-09-01T09:00:00+08:00",
+ "open": 4598.7119140625,
+ "high": 4632.7607421875,
+ "low": 4570.5556640625,
+ "close": 4599.759765625,
+ "volume": 55701.24609375,
+ "amount": 251193984.0
+ },
+ {
+ "timestamp": "2025-09-01T10:00:00+08:00",
+ "open": 4600.978515625,
+ "high": 4629.189453125,
+ "low": 4584.8876953125,
+ "close": 4618.509765625,
+ "volume": 34998.15234375,
+ "amount": 159200544.0
+ },
+ {
+ "timestamp": "2025-09-01T11:00:00+08:00",
+ "open": 4623.90673828125,
+ "high": 4666.21142578125,
+ "low": 4594.66650390625,
+ "close": 4639.1611328125,
+ "volume": 49190.8046875,
+ "amount": 218169760.0
+ },
+ {
+ "timestamp": "2025-09-01T12:00:00+08:00",
+ "open": 4637.67041015625,
+ "high": 4650.14697265625,
+ "low": 4608.2109375,
+ "close": 4624.9609375,
+ "volume": 29688.853515625,
+ "amount": 135407440.0
+ },
+ {
+ "timestamp": "2025-09-01T13:00:00+08:00",
+ "open": 4621.27734375,
+ "high": 4648.79541015625,
+ "low": 4603.6044921875,
+ "close": 4627.67529296875,
+ "volume": 35657.02734375,
+ "amount": 163058880.0
+ },
+ {
+ "timestamp": "2025-09-01T14:00:00+08:00",
+ "open": 4620.064453125,
+ "high": 4647.880859375,
+ "low": 4600.5810546875,
+ "close": 4630.55859375,
+ "volume": 30879.0625,
+ "amount": 140533136.0
+ },
+ {
+ "timestamp": "2025-09-01T15:00:00+08:00",
+ "open": 4630.5087890625,
+ "high": 4653.1083984375,
+ "low": 4609.7763671875,
+ "close": 4633.50146484375,
+ "volume": 29725.2421875,
+ "amount": 135044912.0
+ },
+ {
+ "timestamp": "2025-09-01T16:00:00+08:00",
+ "open": 4625.20361328125,
+ "high": 4680.0771484375,
+ "low": 4594.08544921875,
+ "close": 4629.0224609375,
+ "volume": 32395.45703125,
+ "amount": 149289776.0
+ },
+ {
+ "timestamp": "2025-09-01T17:00:00+08:00",
+ "open": 4618.87646484375,
+ "high": 4660.0810546875,
+ "low": 4586.17578125,
+ "close": 4616.03076171875,
+ "volume": 40876.6875,
+ "amount": 185788720.0
+ },
+ {
+ "timestamp": "2025-09-01T18:00:00+08:00",
+ "open": 4612.5302734375,
+ "high": 4631.13427734375,
+ "low": 4579.44287109375,
+ "close": 4603.97705078125,
+ "volume": 44852.16796875,
+ "amount": 201618656.0
+ },
+ {
+ "timestamp": "2025-09-01T19:00:00+08:00",
+ "open": 4596.31201171875,
+ "high": 4615.9482421875,
+ "low": 4551.85302734375,
+ "close": 4571.9765625,
+ "volume": 32732.37109375,
+ "amount": 147656352.0
+ },
+ {
+ "timestamp": "2025-09-01T20:00:00+08:00",
+ "open": 4553.04443359375,
+ "high": 4598.6025390625,
+ "low": 4526.375,
+ "close": 4574.17333984375,
+ "volume": 45349.90234375,
+ "amount": 205476416.0
+ },
+ {
+ "timestamp": "2025-09-01T21:00:00+08:00",
+ "open": 4535.736328125,
+ "high": 4593.24072265625,
+ "low": 4484.623046875,
+ "close": 4544.16064453125,
+ "volume": 50606.8515625,
+ "amount": 228750848.0
+ },
+ {
+ "timestamp": "2025-09-01T22:00:00+08:00",
+ "open": 4546.3798828125,
+ "high": 4574.67333984375,
+ "low": 4518.16015625,
+ "close": 4546.830078125,
+ "volume": 34987.0390625,
+ "amount": 157888992.0
+ },
+ {
+ "timestamp": "2025-09-01T23:00:00+08:00",
+ "open": 4539.12841796875,
+ "high": 4574.484375,
+ "low": 4536.7412109375,
+ "close": 4570.06396484375,
+ "volume": 41529.95703125,
+ "amount": 184078144.0
+ },
+ {
+ "timestamp": "2025-09-02T00:00:00+08:00",
+ "open": 4573.04443359375,
+ "high": 4606.427734375,
+ "low": 4546.5576171875,
+ "close": 4579.04150390625,
+ "volume": 45473.6953125,
+ "amount": 205677600.0
+ },
+ {
+ "timestamp": "2025-09-02T01:00:00+08:00",
+ "open": 4562.56005859375,
+ "high": 4578.8427734375,
+ "low": 4512.76318359375,
+ "close": 4533.95947265625,
+ "volume": 51186.8671875,
+ "amount": 231018080.0
+ },
+ {
+ "timestamp": "2025-09-02T02:00:00+08:00",
+ "open": 4542.1748046875,
+ "high": 4573.12939453125,
+ "low": 4522.77783203125,
+ "close": 4552.6904296875,
+ "volume": 28601.126953125,
+ "amount": 129992528.0
+ },
+ {
+ "timestamp": "2025-09-02T03:00:00+08:00",
+ "open": 4522.6396484375,
+ "high": 4578.81689453125,
+ "low": 4459.96044921875,
+ "close": 4558.75,
+ "volume": 41981.30859375,
+ "amount": 188149632.0
+ },
+ {
+ "timestamp": "2025-09-02T04:00:00+08:00",
+ "open": 4559.30322265625,
+ "high": 4581.96240234375,
+ "low": 4525.0703125,
+ "close": 4553.23681640625,
+ "volume": 36516.484375,
+ "amount": 165957904.0
+ },
+ {
+ "timestamp": "2025-09-02T05:00:00+08:00",
+ "open": 4570.3994140625,
+ "high": 4598.8740234375,
+ "low": 4522.03173828125,
+ "close": 4544.6806640625,
+ "volume": 50358.54296875,
+ "amount": 227078368.0
+ },
+ {
+ "timestamp": "2025-09-02T06:00:00+08:00",
+ "open": 4544.51806640625,
+ "high": 4590.9169921875,
+ "low": 4500.47705078125,
+ "close": 4557.3349609375,
+ "volume": 39941.49609375,
+ "amount": 178581312.0
+ },
+ {
+ "timestamp": "2025-09-02T07:00:00+08:00",
+ "open": 4553.31884765625,
+ "high": 4580.443359375,
+ "low": 4497.81884765625,
+ "close": 4559.482421875,
+ "volume": 32119.33984375,
+ "amount": 143948256.0
+ },
+ {
+ "timestamp": "2025-09-02T08:00:00+08:00",
+ "open": 4554.10888671875,
+ "high": 4582.85595703125,
+ "low": 4533.85986328125,
+ "close": 4564.11181640625,
+ "volume": 30980.69140625,
+ "amount": 140477920.0
+ },
+ {
+ "timestamp": "2025-09-02T09:00:00+08:00",
+ "open": 4558.92333984375,
+ "high": 4581.53125,
+ "low": 4531.6513671875,
+ "close": 4551.93212890625,
+ "volume": 33996.38671875,
+ "amount": 151220016.0
+ },
+ {
+ "timestamp": "2025-09-02T10:00:00+08:00",
+ "open": 4575.06787109375,
+ "high": 4607.47314453125,
+ "low": 4522.3984375,
+ "close": 4549.4853515625,
+ "volume": 42086.359375,
+ "amount": 190869376.0
+ },
+ {
+ "timestamp": "2025-09-02T11:00:00+08:00",
+ "open": 4544.6484375,
+ "high": 4584.3056640625,
+ "low": 4518.8369140625,
+ "close": 4554.1689453125,
+ "volume": 47829.125,
+ "amount": 217350336.0
+ },
+ {
+ "timestamp": "2025-09-02T12:00:00+08:00",
+ "open": 4543.71826171875,
+ "high": 4579.34716796875,
+ "low": 4523.8759765625,
+ "close": 4551.22265625,
+ "volume": 39084.0859375,
+ "amount": 176619664.0
+ },
+ {
+ "timestamp": "2025-09-02T13:00:00+08:00",
+ "open": 4528.4853515625,
+ "high": 4599.97021484375,
+ "low": 4511.2265625,
+ "close": 4575.837890625,
+ "volume": 48299.79296875,
+ "amount": 217204640.0
+ },
+ {
+ "timestamp": "2025-09-02T14:00:00+08:00",
+ "open": 4567.57177734375,
+ "high": 4607.9677734375,
+ "low": 4530.62744140625,
+ "close": 4586.640625,
+ "volume": 36176.4609375,
+ "amount": 164095360.0
+ },
+ {
+ "timestamp": "2025-09-02T15:00:00+08:00",
+ "open": 4588.90478515625,
+ "high": 4646.93505859375,
+ "low": 4577.720703125,
+ "close": 4602.759765625,
+ "volume": 58277.03125,
+ "amount": 267393888.0
+ },
+ {
+ "timestamp": "2025-09-02T16:00:00+08:00",
+ "open": 4607.30126953125,
+ "high": 4632.18701171875,
+ "low": 4572.208984375,
+ "close": 4604.7998046875,
+ "volume": 40777.45703125,
+ "amount": 185327616.0
+ },
+ {
+ "timestamp": "2025-09-02T17:00:00+08:00",
+ "open": 4587.7373046875,
+ "high": 4626.07177734375,
+ "low": 4576.98291015625,
+ "close": 4617.84716796875,
+ "volume": 41108.71484375,
+ "amount": 185267584.0
+ },
+ {
+ "timestamp": "2025-09-02T18:00:00+08:00",
+ "open": 4594.61572265625,
+ "high": 4657.50927734375,
+ "low": 4554.33251953125,
+ "close": 4631.79345703125,
+ "volume": 78342.4609375,
+ "amount": 357262880.0
+ },
+ {
+ "timestamp": "2025-09-02T19:00:00+08:00",
+ "open": 4610.7978515625,
+ "high": 4696.26123046875,
+ "low": 4592.91259765625,
+ "close": 4631.50439453125,
+ "volume": 55026.8046875,
+ "amount": 257604768.0
+ },
+ {
+ "timestamp": "2025-09-02T20:00:00+08:00",
+ "open": 4641.12939453125,
+ "high": 4685.048828125,
+ "low": 4615.712890625,
+ "close": 4654.58837890625,
+ "volume": 54181.140625,
+ "amount": 246508448.0
+ },
+ {
+ "timestamp": "2025-09-02T21:00:00+08:00",
+ "open": 4637.77978515625,
+ "high": 4682.42138671875,
+ "low": 4610.5810546875,
+ "close": 4665.576171875,
+ "volume": 49693.25,
+ "amount": 225123552.0
+ },
+ {
+ "timestamp": "2025-09-02T22:00:00+08:00",
+ "open": 4681.29248046875,
+ "high": 4740.318359375,
+ "low": 4597.82177734375,
+ "close": 4661.62451171875,
+ "volume": 60103.78515625,
+ "amount": 267436096.0
+ },
+ {
+ "timestamp": "2025-09-02T23:00:00+08:00",
+ "open": 4633.21435546875,
+ "high": 4710.7861328125,
+ "low": 4590.373046875,
+ "close": 4670.8994140625,
+ "volume": 55723.1484375,
+ "amount": 251792720.0
+ },
+ {
+ "timestamp": "2025-09-03T00:00:00+08:00",
+ "open": 4662.916015625,
+ "high": 4708.58056640625,
+ "low": 4635.18994140625,
+ "close": 4685.55712890625,
+ "volume": 59321.28125,
+ "amount": 268025536.0
+ },
+ {
+ "timestamp": "2025-09-03T01:00:00+08:00",
+ "open": 4688.93896484375,
+ "high": 4734.8369140625,
+ "low": 4644.1123046875,
+ "close": 4670.93994140625,
+ "volume": 51711.8046875,
+ "amount": 231927232.0
+ },
+ {
+ "timestamp": "2025-09-03T02:00:00+08:00",
+ "open": 4700.83154296875,
+ "high": 4733.08837890625,
+ "low": 4619.01025390625,
+ "close": 4650.29052734375,
+ "volume": 58490.3359375,
+ "amount": 262043264.0
+ },
+ {
+ "timestamp": "2025-09-03T03:00:00+08:00",
+ "open": 4645.990234375,
+ "high": 4683.6787109375,
+ "low": 4609.28662109375,
+ "close": 4649.47265625,
+ "volume": 61720.171875,
+ "amount": 276722752.0
+ },
+ {
+ "timestamp": "2025-09-03T04:00:00+08:00",
+ "open": 4614.64697265625,
+ "high": 4655.0869140625,
+ "low": 4592.39697265625,
+ "close": 4627.66357421875,
+ "volume": 51670.4375,
+ "amount": 232529280.0
+ },
+ {
+ "timestamp": "2025-09-03T05:00:00+08:00",
+ "open": 4610.529296875,
+ "high": 4671.7578125,
+ "low": 4584.61083984375,
+ "close": 4645.67529296875,
+ "volume": 74684.5703125,
+ "amount": 338857920.0
+ },
+ {
+ "timestamp": "2025-09-03T06:00:00+08:00",
+ "open": 4643.1103515625,
+ "high": 4667.91748046875,
+ "low": 4590.53515625,
+ "close": 4614.19970703125,
+ "volume": 59175.0625,
+ "amount": 268682688.0
+ },
+ {
+ "timestamp": "2025-09-03T07:00:00+08:00",
+ "open": 4609.8515625,
+ "high": 4640.9453125,
+ "low": 4520.59423828125,
+ "close": 4598.2822265625,
+ "volume": 72765.0859375,
+ "amount": 325068256.0
+ },
+ {
+ "timestamp": "2025-09-03T08:00:00+08:00",
+ "open": 4603.22412109375,
+ "high": 4634.6767578125,
+ "low": 4572.61474609375,
+ "close": 4598.98583984375,
+ "volume": 43102.9765625,
+ "amount": 197034048.0
+ },
+ {
+ "timestamp": "2025-09-03T09:00:00+08:00",
+ "open": 4593.30810546875,
+ "high": 4633.56103515625,
+ "low": 4552.8984375,
+ "close": 4581.37548828125,
+ "volume": 51989.66015625,
+ "amount": 234605216.0
+ },
+ {
+ "timestamp": "2025-09-03T10:00:00+08:00",
+ "open": 4575.935546875,
+ "high": 4641.82080078125,
+ "low": 4497.005859375,
+ "close": 4603.63623046875,
+ "volume": 47871.4765625,
+ "amount": 214601440.0
+ },
+ {
+ "timestamp": "2025-09-03T11:00:00+08:00",
+ "open": 4609.21337890625,
+ "high": 4645.482421875,
+ "low": 4578.58740234375,
+ "close": 4612.64599609375,
+ "volume": 35885.48046875,
+ "amount": 162265200.0
+ },
+ {
+ "timestamp": "2025-09-03T12:00:00+08:00",
+ "open": 4633.18310546875,
+ "high": 4665.02978515625,
+ "low": 4602.62548828125,
+ "close": 4638.02978515625,
+ "volume": 53854.7734375,
+ "amount": 248254848.0
+ },
+ {
+ "timestamp": "2025-09-03T13:00:00+08:00",
+ "open": 4646.67626953125,
+ "high": 4653.615234375,
+ "low": 4592.232421875,
+ "close": 4604.73486328125,
+ "volume": 49153.4453125,
+ "amount": 221965440.0
+ },
+ {
+ "timestamp": "2025-09-03T14:00:00+08:00",
+ "open": 4606.6630859375,
+ "high": 4637.55029296875,
+ "low": 4580.646484375,
+ "close": 4610.39453125,
+ "volume": 39266.15625,
+ "amount": 178462880.0
+ },
+ {
+ "timestamp": "2025-09-03T15:00:00+08:00",
+ "open": 4606.39208984375,
+ "high": 4638.4033203125,
+ "low": 4580.3828125,
+ "close": 4618.9287109375,
+ "volume": 43400.5703125,
+ "amount": 195518320.0
+ },
+ {
+ "timestamp": "2025-09-03T16:00:00+08:00",
+ "open": 4588.09130859375,
+ "high": 4660.7490234375,
+ "low": 4518.75439453125,
+ "close": 4625.62841796875,
+ "volume": 51758.93359375,
+ "amount": 237718176.0
+ },
+ {
+ "timestamp": "2025-09-03T17:00:00+08:00",
+ "open": 4626.99951171875,
+ "high": 4668.74755859375,
+ "low": 4595.6923828125,
+ "close": 4633.265625,
+ "volume": 50869.5859375,
+ "amount": 233086032.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/prediction_results/prediction_20250829_174512.json b/webui/prediction_results/prediction_20250829_174512.json
new file mode 100644
index 0000000000000000000000000000000000000000..14ae61cc2a5a320a876407937e848a10992c230d
--- /dev/null
+++ b/webui/prediction_results/prediction_20250829_174512.json
@@ -0,0 +1,1135 @@
+{
+ "timestamp": "2025-08-29T17:45:12.583135",
+ "file_path": "BTCUSDT_1h",
+ "prediction_type": "Kronos model prediction (latest data)",
+ "prediction_params": {
+ "symbol": "BTCUSDT",
+ "interval": "1h",
+ "limit": 400,
+ "lookback": 400,
+ "pred_len": 120,
+ "temperature": 1.0,
+ "top_p": 0.9,
+ "sample_count": 3,
+ "start_date": "latest"
+ },
+ "input_data_summary": {
+ "rows": 400,
+ "columns": [
+ "open",
+ "high",
+ "low",
+ "close",
+ "volume",
+ "amount"
+ ],
+ "price_range": {
+ "open": {
+ "min": 109100.24,
+ "max": 123847.82
+ },
+ "high": {
+ "min": 109820.0,
+ "max": 124474.0
+ },
+ "low": {
+ "min": 108666.66,
+ "max": 123337.66
+ },
+ "close": {
+ "min": 109100.23,
+ "max": 123847.83
+ }
+ },
+ "last_values": {
+ "open": 109628.02,
+ "high": 109820.0,
+ "low": 109414.18,
+ "close": 109650.01
+ }
+ },
+ "prediction_results": [
+ {
+ "timestamp": "2025-08-29T18:00:00+08:00",
+ "open": 109989.078125,
+ "high": 110265.78125,
+ "low": 109641.5390625,
+ "close": 109916.625,
+ "volume": 627.8924560546875,
+ "amount": 70676808.0
+ },
+ {
+ "timestamp": "2025-08-29T19:00:00+08:00",
+ "open": 110000.1015625,
+ "high": 110452.390625,
+ "low": 109748.3125,
+ "close": 110159.5625,
+ "volume": 685.267822265625,
+ "amount": 76917992.0
+ },
+ {
+ "timestamp": "2025-08-29T20:00:00+08:00",
+ "open": 110210.7578125,
+ "high": 110545.859375,
+ "low": 109911.6015625,
+ "close": 110264.625,
+ "volume": 730.9044799804688,
+ "amount": 82896848.0
+ },
+ {
+ "timestamp": "2025-08-29T21:00:00+08:00",
+ "open": 110314.0,
+ "high": 110650.8984375,
+ "low": 110033.0234375,
+ "close": 110397.8671875,
+ "volume": 705.9290771484375,
+ "amount": 79941088.0
+ },
+ {
+ "timestamp": "2025-08-29T22:00:00+08:00",
+ "open": 110451.7734375,
+ "high": 110818.890625,
+ "low": 110164.546875,
+ "close": 110540.6875,
+ "volume": 655.7239379882812,
+ "amount": 73756096.0
+ },
+ {
+ "timestamp": "2025-08-29T23:00:00+08:00",
+ "open": 110663.921875,
+ "high": 111021.390625,
+ "low": 110317.53125,
+ "close": 110544.1015625,
+ "volume": 641.74462890625,
+ "amount": 72749648.0
+ },
+ {
+ "timestamp": "2025-08-30T00:00:00+08:00",
+ "open": 110630.46875,
+ "high": 111003.8203125,
+ "low": 110387.125,
+ "close": 110765.984375,
+ "volume": 814.8414916992188,
+ "amount": 91376848.0
+ },
+ {
+ "timestamp": "2025-08-30T01:00:00+08:00",
+ "open": 110701.09375,
+ "high": 111115.6484375,
+ "low": 110373.234375,
+ "close": 110859.140625,
+ "volume": 750.8322143554688,
+ "amount": 85174224.0
+ },
+ {
+ "timestamp": "2025-08-30T02:00:00+08:00",
+ "open": 110889.234375,
+ "high": 111205.375,
+ "low": 110581.6328125,
+ "close": 110983.40625,
+ "volume": 542.2075805664062,
+ "amount": 61425928.0
+ },
+ {
+ "timestamp": "2025-08-30T03:00:00+08:00",
+ "open": 111040.796875,
+ "high": 111270.59375,
+ "low": 110729.671875,
+ "close": 110988.5703125,
+ "volume": 685.9732055664062,
+ "amount": 78312376.0
+ },
+ {
+ "timestamp": "2025-08-30T04:00:00+08:00",
+ "open": 111109.46875,
+ "high": 111465.6953125,
+ "low": 110825.4296875,
+ "close": 111189.28125,
+ "volume": 670.3822021484375,
+ "amount": 74248520.0
+ },
+ {
+ "timestamp": "2025-08-30T05:00:00+08:00",
+ "open": 111234.5625,
+ "high": 111426.1796875,
+ "low": 110864.078125,
+ "close": 111106.53125,
+ "volume": 661.5116577148438,
+ "amount": 75669488.0
+ },
+ {
+ "timestamp": "2025-08-30T06:00:00+08:00",
+ "open": 111124.78125,
+ "high": 111416.7578125,
+ "low": 110870.0625,
+ "close": 111203.109375,
+ "volume": 492.3244323730469,
+ "amount": 56358632.0
+ },
+ {
+ "timestamp": "2025-08-30T07:00:00+08:00",
+ "open": 111241.5625,
+ "high": 111507.3046875,
+ "low": 110998.3671875,
+ "close": 111285.5546875,
+ "volume": 590.5341796875,
+ "amount": 67482832.0
+ },
+ {
+ "timestamp": "2025-08-30T08:00:00+08:00",
+ "open": 111318.4453125,
+ "high": 111643.0546875,
+ "low": 111105.09375,
+ "close": 111426.8671875,
+ "volume": 537.841796875,
+ "amount": 61140888.0
+ },
+ {
+ "timestamp": "2025-08-30T09:00:00+08:00",
+ "open": 111511.046875,
+ "high": 111797.5234375,
+ "low": 111302.421875,
+ "close": 111600.609375,
+ "volume": 447.5302734375,
+ "amount": 51203944.0
+ },
+ {
+ "timestamp": "2025-08-30T10:00:00+08:00",
+ "open": 111680.7265625,
+ "high": 111997.859375,
+ "low": 111401.2578125,
+ "close": 111603.5,
+ "volume": 456.79754638671875,
+ "amount": 52236296.0
+ },
+ {
+ "timestamp": "2025-08-30T11:00:00+08:00",
+ "open": 111673.1640625,
+ "high": 112128.5546875,
+ "low": 111548.875,
+ "close": 111947.7265625,
+ "volume": 660.991943359375,
+ "amount": 75800072.0
+ },
+ {
+ "timestamp": "2025-08-30T12:00:00+08:00",
+ "open": 111959.15625,
+ "high": 112372.046875,
+ "low": 111797.8671875,
+ "close": 112148.609375,
+ "volume": 595.9371337890625,
+ "amount": 67353040.0
+ },
+ {
+ "timestamp": "2025-08-30T13:00:00+08:00",
+ "open": 111093.828125,
+ "high": 112439.1484375,
+ "low": 110307.0234375,
+ "close": 112177.1484375,
+ "volume": 835.015380859375,
+ "amount": 95019656.0
+ },
+ {
+ "timestamp": "2025-08-30T14:00:00+08:00",
+ "open": 111849.359375,
+ "high": 112804.8515625,
+ "low": 111177.4453125,
+ "close": 112452.4453125,
+ "volume": 1012.3090209960938,
+ "amount": 110147408.0
+ },
+ {
+ "timestamp": "2025-08-30T15:00:00+08:00",
+ "open": 112529.078125,
+ "high": 113123.9765625,
+ "low": 112327.3828125,
+ "close": 112844.8359375,
+ "volume": 808.5069580078125,
+ "amount": 91476528.0
+ },
+ {
+ "timestamp": "2025-08-30T16:00:00+08:00",
+ "open": 112747.3671875,
+ "high": 113493.5390625,
+ "low": 111947.4609375,
+ "close": 113244.2578125,
+ "volume": 914.501220703125,
+ "amount": 105005536.0
+ },
+ {
+ "timestamp": "2025-08-30T17:00:00+08:00",
+ "open": 112330.4921875,
+ "high": 113235.7890625,
+ "low": 111005.0859375,
+ "close": 112886.140625,
+ "volume": 807.544921875,
+ "amount": 91814120.0
+ },
+ {
+ "timestamp": "2025-08-30T18:00:00+08:00",
+ "open": 112937.71875,
+ "high": 114315.0859375,
+ "low": 112402.7421875,
+ "close": 113464.328125,
+ "volume": 1143.06884765625,
+ "amount": 129610816.0
+ },
+ {
+ "timestamp": "2025-08-30T19:00:00+08:00",
+ "open": 113396.0859375,
+ "high": 114622.953125,
+ "low": 112981.734375,
+ "close": 113775.3828125,
+ "volume": 1213.400146484375,
+ "amount": 139813408.0
+ },
+ {
+ "timestamp": "2025-08-30T20:00:00+08:00",
+ "open": 113907.2421875,
+ "high": 114731.53125,
+ "low": 113032.140625,
+ "close": 114059.078125,
+ "volume": 2598.03857421875,
+ "amount": 294959488.0
+ },
+ {
+ "timestamp": "2025-08-30T21:00:00+08:00",
+ "open": 114284.828125,
+ "high": 115904.1875,
+ "low": 113997.5,
+ "close": 114969.1484375,
+ "volume": 1590.675048828125,
+ "amount": 184308192.0
+ },
+ {
+ "timestamp": "2025-08-30T22:00:00+08:00",
+ "open": 114828.8046875,
+ "high": 116308.59375,
+ "low": 114538.2265625,
+ "close": 115440.578125,
+ "volume": 1304.0458984375,
+ "amount": 151819792.0
+ },
+ {
+ "timestamp": "2025-08-30T23:00:00+08:00",
+ "open": 115189.6484375,
+ "high": 115992.0625,
+ "low": 114843.984375,
+ "close": 115592.6171875,
+ "volume": 1219.1142578125,
+ "amount": 139545392.0
+ },
+ {
+ "timestamp": "2025-08-31T00:00:00+08:00",
+ "open": 115468.6015625,
+ "high": 115895.90625,
+ "low": 114351.875,
+ "close": 115581.2265625,
+ "volume": 1104.2752685546875,
+ "amount": 126711840.0
+ },
+ {
+ "timestamp": "2025-08-31T01:00:00+08:00",
+ "open": 115424.28125,
+ "high": 115910.1484375,
+ "low": 114946.0625,
+ "close": 115834.953125,
+ "volume": 870.6441650390625,
+ "amount": 100883336.0
+ },
+ {
+ "timestamp": "2025-08-31T02:00:00+08:00",
+ "open": 115847.515625,
+ "high": 116182.65625,
+ "low": 115561.8046875,
+ "close": 115971.8671875,
+ "volume": 921.3431396484375,
+ "amount": 107598976.0
+ },
+ {
+ "timestamp": "2025-08-31T03:00:00+08:00",
+ "open": 115994.7421875,
+ "high": 116306.0703125,
+ "low": 115562.65625,
+ "close": 115828.1484375,
+ "volume": 642.1741333007812,
+ "amount": 75006304.0
+ },
+ {
+ "timestamp": "2025-08-31T04:00:00+08:00",
+ "open": 115921.734375,
+ "high": 116244.8984375,
+ "low": 115712.078125,
+ "close": 116033.6015625,
+ "volume": 505.94732666015625,
+ "amount": 59262168.0
+ },
+ {
+ "timestamp": "2025-08-31T05:00:00+08:00",
+ "open": 115958.21875,
+ "high": 116452.65625,
+ "low": 115713.234375,
+ "close": 116095.578125,
+ "volume": 609.6773681640625,
+ "amount": 70587072.0
+ },
+ {
+ "timestamp": "2025-08-31T06:00:00+08:00",
+ "open": 116121.8984375,
+ "high": 116620.0625,
+ "low": 115962.609375,
+ "close": 116454.4296875,
+ "volume": 640.0159301757812,
+ "amount": 74051648.0
+ },
+ {
+ "timestamp": "2025-08-31T07:00:00+08:00",
+ "open": 116426.484375,
+ "high": 116725.8125,
+ "low": 116041.03125,
+ "close": 116267.921875,
+ "volume": 521.4869384765625,
+ "amount": 60825040.0
+ },
+ {
+ "timestamp": "2025-08-31T08:00:00+08:00",
+ "open": 116294.046875,
+ "high": 117435.09375,
+ "low": 116001.703125,
+ "close": 116646.9140625,
+ "volume": 725.5126953125,
+ "amount": 86050440.0
+ },
+ {
+ "timestamp": "2025-08-31T09:00:00+08:00",
+ "open": 116667.5625,
+ "high": 116891.96875,
+ "low": 116301.8359375,
+ "close": 116566.0625,
+ "volume": 597.289306640625,
+ "amount": 69542832.0
+ },
+ {
+ "timestamp": "2025-08-31T10:00:00+08:00",
+ "open": 116404.7109375,
+ "high": 117108.453125,
+ "low": 115857.2109375,
+ "close": 116499.671875,
+ "volume": 604.7589111328125,
+ "amount": 70911896.0
+ },
+ {
+ "timestamp": "2025-08-31T11:00:00+08:00",
+ "open": 116483.296875,
+ "high": 117029.8125,
+ "low": 116218.0703125,
+ "close": 116588.4609375,
+ "volume": 576.3558959960938,
+ "amount": 66855228.0
+ },
+ {
+ "timestamp": "2025-08-31T12:00:00+08:00",
+ "open": 116677.796875,
+ "high": 117275.96875,
+ "low": 116499.7578125,
+ "close": 116950.453125,
+ "volume": 963.6697998046875,
+ "amount": 113185680.0
+ },
+ {
+ "timestamp": "2025-08-31T13:00:00+08:00",
+ "open": 116933.8125,
+ "high": 117281.875,
+ "low": 116733.8203125,
+ "close": 117084.859375,
+ "volume": 540.0557250976562,
+ "amount": 62664576.0
+ },
+ {
+ "timestamp": "2025-08-31T14:00:00+08:00",
+ "open": 117134.171875,
+ "high": 117430.046875,
+ "low": 116822.578125,
+ "close": 117156.171875,
+ "volume": 927.888671875,
+ "amount": 108121280.0
+ },
+ {
+ "timestamp": "2025-08-31T15:00:00+08:00",
+ "open": 117161.6875,
+ "high": 117559.7421875,
+ "low": 116984.671875,
+ "close": 117346.8046875,
+ "volume": 690.5162353515625,
+ "amount": 80051552.0
+ },
+ {
+ "timestamp": "2025-08-31T16:00:00+08:00",
+ "open": 117318.8671875,
+ "high": 117910.71875,
+ "low": 117112.453125,
+ "close": 117620.9296875,
+ "volume": 839.7683715820312,
+ "amount": 96812280.0
+ },
+ {
+ "timestamp": "2025-08-31T17:00:00+08:00",
+ "open": 117694.625,
+ "high": 118015.8828125,
+ "low": 117355.9609375,
+ "close": 117672.6875,
+ "volume": 752.4297485351562,
+ "amount": 87594768.0
+ },
+ {
+ "timestamp": "2025-08-31T18:00:00+08:00",
+ "open": 117680.1484375,
+ "high": 118060.1875,
+ "low": 117430.7578125,
+ "close": 117786.046875,
+ "volume": 761.8284301757812,
+ "amount": 88925744.0
+ },
+ {
+ "timestamp": "2025-08-31T19:00:00+08:00",
+ "open": 117811.359375,
+ "high": 118120.7421875,
+ "low": 117454.40625,
+ "close": 117689.4375,
+ "volume": 645.6129150390625,
+ "amount": 74831208.0
+ },
+ {
+ "timestamp": "2025-08-31T20:00:00+08:00",
+ "open": 117769.921875,
+ "high": 118045.875,
+ "low": 117095.4921875,
+ "close": 117209.0625,
+ "volume": 883.0957641601562,
+ "amount": 102683848.0
+ },
+ {
+ "timestamp": "2025-08-31T21:00:00+08:00",
+ "open": 117362.2421875,
+ "high": 117876.625,
+ "low": 117189.5,
+ "close": 117745.6953125,
+ "volume": 801.125244140625,
+ "amount": 92646760.0
+ },
+ {
+ "timestamp": "2025-08-31T22:00:00+08:00",
+ "open": 117733.859375,
+ "high": 118181.75,
+ "low": 117308.265625,
+ "close": 117627.7734375,
+ "volume": 692.9324951171875,
+ "amount": 80183216.0
+ },
+ {
+ "timestamp": "2025-08-31T23:00:00+08:00",
+ "open": 117750.6484375,
+ "high": 117998.484375,
+ "low": 117480.3515625,
+ "close": 117750.640625,
+ "volume": 721.0577392578125,
+ "amount": 83936712.0
+ },
+ {
+ "timestamp": "2025-09-01T00:00:00+08:00",
+ "open": 117714.40625,
+ "high": 118173.6484375,
+ "low": 117451.2578125,
+ "close": 117848.828125,
+ "volume": 774.6973266601562,
+ "amount": 88577376.0
+ },
+ {
+ "timestamp": "2025-09-01T01:00:00+08:00",
+ "open": 117933.1875,
+ "high": 118192.6953125,
+ "low": 117548.6171875,
+ "close": 117749.3984375,
+ "volume": 598.19775390625,
+ "amount": 69476472.0
+ },
+ {
+ "timestamp": "2025-09-01T02:00:00+08:00",
+ "open": 117745.359375,
+ "high": 118047.9375,
+ "low": 117514.6484375,
+ "close": 117819.0390625,
+ "volume": 605.3733520507812,
+ "amount": 70555304.0
+ },
+ {
+ "timestamp": "2025-09-01T03:00:00+08:00",
+ "open": 117680.7109375,
+ "high": 117853.640625,
+ "low": 117426.234375,
+ "close": 117629.6484375,
+ "volume": 432.2090759277344,
+ "amount": 50118248.0
+ },
+ {
+ "timestamp": "2025-09-01T04:00:00+08:00",
+ "open": 117672.8515625,
+ "high": 117951.71875,
+ "low": 117397.2265625,
+ "close": 117592.453125,
+ "volume": 410.30029296875,
+ "amount": 47553968.0
+ },
+ {
+ "timestamp": "2025-09-01T05:00:00+08:00",
+ "open": 117602.1953125,
+ "high": 117950.84375,
+ "low": 117318.96875,
+ "close": 117478.8984375,
+ "volume": 543.6746215820312,
+ "amount": 63554424.0
+ },
+ {
+ "timestamp": "2025-09-01T06:00:00+08:00",
+ "open": 117302.453125,
+ "high": 117712.5859375,
+ "low": 116908.8046875,
+ "close": 117019.078125,
+ "volume": 817.952392578125,
+ "amount": 95272240.0
+ },
+ {
+ "timestamp": "2025-09-01T07:00:00+08:00",
+ "open": 117181.4296875,
+ "high": 117549.84375,
+ "low": 116902.375,
+ "close": 117126.2421875,
+ "volume": 490.0605163574219,
+ "amount": 57101476.0
+ },
+ {
+ "timestamp": "2025-09-01T08:00:00+08:00",
+ "open": 117191.484375,
+ "high": 117492.078125,
+ "low": 116947.6328125,
+ "close": 117249.5390625,
+ "volume": 543.8062744140625,
+ "amount": 63580680.0
+ },
+ {
+ "timestamp": "2025-09-01T09:00:00+08:00",
+ "open": 117236.6484375,
+ "high": 117530.71875,
+ "low": 117033.1171875,
+ "close": 117330.6015625,
+ "volume": 558.8201904296875,
+ "amount": 64919284.0
+ },
+ {
+ "timestamp": "2025-09-01T10:00:00+08:00",
+ "open": 117408.3359375,
+ "high": 117890.203125,
+ "low": 117208.359375,
+ "close": 117577.5625,
+ "volume": 573.93994140625,
+ "amount": 66725484.0
+ },
+ {
+ "timestamp": "2025-09-01T11:00:00+08:00",
+ "open": 117534.2109375,
+ "high": 117720.4609375,
+ "low": 117283.828125,
+ "close": 117486.3984375,
+ "volume": 439.7234191894531,
+ "amount": 51254032.0
+ },
+ {
+ "timestamp": "2025-09-01T12:00:00+08:00",
+ "open": 117464.453125,
+ "high": 117829.0859375,
+ "low": 117175.6796875,
+ "close": 117318.1875,
+ "volume": 541.9009399414062,
+ "amount": 63285128.0
+ },
+ {
+ "timestamp": "2025-09-01T13:00:00+08:00",
+ "open": 117339.09375,
+ "high": 117602.4140625,
+ "low": 117108.984375,
+ "close": 117365.8125,
+ "volume": 471.6361999511719,
+ "amount": 55236120.0
+ },
+ {
+ "timestamp": "2025-09-01T14:00:00+08:00",
+ "open": 117265.8125,
+ "high": 117515.4375,
+ "low": 117089.5234375,
+ "close": 117318.140625,
+ "volume": 468.1541748046875,
+ "amount": 54573116.0
+ },
+ {
+ "timestamp": "2025-09-01T15:00:00+08:00",
+ "open": 117329.2109375,
+ "high": 117553.6484375,
+ "low": 117129.828125,
+ "close": 117366.9609375,
+ "volume": 492.3451232910156,
+ "amount": 57263248.0
+ },
+ {
+ "timestamp": "2025-09-01T16:00:00+08:00",
+ "open": 117379.71875,
+ "high": 117720.8203125,
+ "low": 117207.671875,
+ "close": 117565.4609375,
+ "volume": 560.7298583984375,
+ "amount": 65221276.0
+ },
+ {
+ "timestamp": "2025-09-01T17:00:00+08:00",
+ "open": 117559.0625,
+ "high": 117889.90625,
+ "low": 117393.265625,
+ "close": 117714.0390625,
+ "volume": 522.3875732421875,
+ "amount": 60624240.0
+ },
+ {
+ "timestamp": "2025-09-01T18:00:00+08:00",
+ "open": 117697.625,
+ "high": 117786.21875,
+ "low": 117234.46875,
+ "close": 117377.828125,
+ "volume": 611.6768188476562,
+ "amount": 71184480.0
+ },
+ {
+ "timestamp": "2025-09-01T19:00:00+08:00",
+ "open": 117439.046875,
+ "high": 117732.7265625,
+ "low": 117271.609375,
+ "close": 117561.515625,
+ "volume": 502.8769836425781,
+ "amount": 58261064.0
+ },
+ {
+ "timestamp": "2025-09-01T20:00:00+08:00",
+ "open": 117583.1640625,
+ "high": 117985.859375,
+ "low": 117256.8515625,
+ "close": 117441.625,
+ "volume": 515.149169921875,
+ "amount": 60232196.0
+ },
+ {
+ "timestamp": "2025-09-01T21:00:00+08:00",
+ "open": 117514.0234375,
+ "high": 118046.3515625,
+ "low": 117345.5859375,
+ "close": 117733.8671875,
+ "volume": 528.814208984375,
+ "amount": 61419536.0
+ },
+ {
+ "timestamp": "2025-09-01T22:00:00+08:00",
+ "open": 117692.140625,
+ "high": 118043.8671875,
+ "low": 117337.515625,
+ "close": 117539.421875,
+ "volume": 658.7996215820312,
+ "amount": 76703200.0
+ },
+ {
+ "timestamp": "2025-09-01T23:00:00+08:00",
+ "open": 117539.6484375,
+ "high": 117863.8515625,
+ "low": 117171.9921875,
+ "close": 117486.78125,
+ "volume": 567.4519653320312,
+ "amount": 66392592.0
+ },
+ {
+ "timestamp": "2025-09-02T00:00:00+08:00",
+ "open": 117460.6328125,
+ "high": 117864.84375,
+ "low": 117305.1640625,
+ "close": 117696.515625,
+ "volume": 494.16204833984375,
+ "amount": 57336136.0
+ },
+ {
+ "timestamp": "2025-09-02T01:00:00+08:00",
+ "open": 117749.59375,
+ "high": 118059.0703125,
+ "low": 117398.734375,
+ "close": 117629.5,
+ "volume": 500.4404296875,
+ "amount": 58117108.0
+ },
+ {
+ "timestamp": "2025-09-02T02:00:00+08:00",
+ "open": 117702.171875,
+ "high": 117946.234375,
+ "low": 117363.8046875,
+ "close": 117563.5234375,
+ "volume": 482.9502258300781,
+ "amount": 56051784.0
+ },
+ {
+ "timestamp": "2025-09-02T03:00:00+08:00",
+ "open": 117642.3515625,
+ "high": 117910.7578125,
+ "low": 117336.25,
+ "close": 117516.359375,
+ "volume": 440.8436279296875,
+ "amount": 50922456.0
+ },
+ {
+ "timestamp": "2025-09-02T04:00:00+08:00",
+ "open": 117608.953125,
+ "high": 117891.421875,
+ "low": 117320.4609375,
+ "close": 117510.9609375,
+ "volume": 426.8426513671875,
+ "amount": 49579768.0
+ },
+ {
+ "timestamp": "2025-09-02T05:00:00+08:00",
+ "open": 117536.96875,
+ "high": 117841.9453125,
+ "low": 117419.109375,
+ "close": 117704.1953125,
+ "volume": 394.60711669921875,
+ "amount": 45816128.0
+ },
+ {
+ "timestamp": "2025-09-02T06:00:00+08:00",
+ "open": 117721.5,
+ "high": 117944.90625,
+ "low": 117432.6875,
+ "close": 117587.328125,
+ "volume": 384.7201232910156,
+ "amount": 44761908.0
+ },
+ {
+ "timestamp": "2025-09-02T07:00:00+08:00",
+ "open": 117623.859375,
+ "high": 117950.75,
+ "low": 117528.4140625,
+ "close": 117825.21875,
+ "volume": 392.6705322265625,
+ "amount": 45586688.0
+ },
+ {
+ "timestamp": "2025-09-02T08:00:00+08:00",
+ "open": 117731.390625,
+ "high": 117941.375,
+ "low": 117563.5546875,
+ "close": 117757.7421875,
+ "volume": 352.5827331542969,
+ "amount": 40703156.0
+ },
+ {
+ "timestamp": "2025-09-02T09:00:00+08:00",
+ "open": 117730.3203125,
+ "high": 117950.0,
+ "low": 117598.796875,
+ "close": 117812.171875,
+ "volume": 311.3836364746094,
+ "amount": 36077568.0
+ },
+ {
+ "timestamp": "2025-09-02T10:00:00+08:00",
+ "open": 117783.734375,
+ "high": 117987.1484375,
+ "low": 117539.2109375,
+ "close": 117744.0390625,
+ "volume": 499.2044677734375,
+ "amount": 58182112.0
+ },
+ {
+ "timestamp": "2025-09-02T11:00:00+08:00",
+ "open": 117686.9375,
+ "high": 117821.890625,
+ "low": 117416.4921875,
+ "close": 117582.0703125,
+ "volume": 399.803955078125,
+ "amount": 46386984.0
+ },
+ {
+ "timestamp": "2025-09-02T12:00:00+08:00",
+ "open": 117535.546875,
+ "high": 117754.5234375,
+ "low": 117389.6484375,
+ "close": 117604.7109375,
+ "volume": 400.4625549316406,
+ "amount": 46755360.0
+ },
+ {
+ "timestamp": "2025-09-02T13:00:00+08:00",
+ "open": 117588.6640625,
+ "high": 117858.1953125,
+ "low": 117473.3125,
+ "close": 117732.3671875,
+ "volume": 345.6575622558594,
+ "amount": 40166084.0
+ },
+ {
+ "timestamp": "2025-09-02T14:00:00+08:00",
+ "open": 117788.734375,
+ "high": 118056.2109375,
+ "low": 117536.328125,
+ "close": 117750.6015625,
+ "volume": 411.9129943847656,
+ "amount": 48080480.0
+ },
+ {
+ "timestamp": "2025-09-02T15:00:00+08:00",
+ "open": 117741.6875,
+ "high": 117953.8359375,
+ "low": 117410.015625,
+ "close": 117612.5,
+ "volume": 604.1829223632812,
+ "amount": 70646184.0
+ },
+ {
+ "timestamp": "2025-09-02T16:00:00+08:00",
+ "open": 117669.8203125,
+ "high": 117845.3984375,
+ "low": 117396.921875,
+ "close": 117606.5078125,
+ "volume": 668.0537719726562,
+ "amount": 77629112.0
+ },
+ {
+ "timestamp": "2025-09-02T17:00:00+08:00",
+ "open": 117345.4453125,
+ "high": 117836.921875,
+ "low": 117117.8515625,
+ "close": 117448.7578125,
+ "volume": 877.6190185546875,
+ "amount": 102623520.0
+ },
+ {
+ "timestamp": "2025-09-02T18:00:00+08:00",
+ "open": 117482.46875,
+ "high": 117687.796875,
+ "low": 117115.8125,
+ "close": 117322.921875,
+ "volume": 701.9891967773438,
+ "amount": 82027336.0
+ },
+ {
+ "timestamp": "2025-09-02T19:00:00+08:00",
+ "open": 117129.453125,
+ "high": 117866.09375,
+ "low": 117096.5234375,
+ "close": 117258.7734375,
+ "volume": 862.8124389648438,
+ "amount": 101801064.0
+ },
+ {
+ "timestamp": "2025-09-02T20:00:00+08:00",
+ "open": 117156.90625,
+ "high": 117473.9921875,
+ "low": 116831.625,
+ "close": 117217.2578125,
+ "volume": 670.8330078125,
+ "amount": 77588192.0
+ },
+ {
+ "timestamp": "2025-09-02T21:00:00+08:00",
+ "open": 117024.3046875,
+ "high": 117294.8984375,
+ "low": 116808.765625,
+ "close": 117122.0546875,
+ "volume": 745.16943359375,
+ "amount": 86670704.0
+ },
+ {
+ "timestamp": "2025-09-02T22:00:00+08:00",
+ "open": 117059.8671875,
+ "high": 117703.09375,
+ "low": 116770.8046875,
+ "close": 117335.7734375,
+ "volume": 951.328125,
+ "amount": 111004952.0
+ },
+ {
+ "timestamp": "2025-09-02T23:00:00+08:00",
+ "open": 116774.7109375,
+ "high": 117142.6171875,
+ "low": 115992.9375,
+ "close": 116546.7578125,
+ "volume": 1887.8934326171875,
+ "amount": 218140720.0
+ },
+ {
+ "timestamp": "2025-09-03T00:00:00+08:00",
+ "open": 116308.4296875,
+ "high": 116535.5546875,
+ "low": 115119.9453125,
+ "close": 115716.7578125,
+ "volume": 1822.717529296875,
+ "amount": 210095456.0
+ },
+ {
+ "timestamp": "2025-09-03T01:00:00+08:00",
+ "open": 115589.171875,
+ "high": 116601.671875,
+ "low": 115244.625,
+ "close": 115849.03125,
+ "volume": 1814.581298828125,
+ "amount": 206238144.0
+ },
+ {
+ "timestamp": "2025-09-03T02:00:00+08:00",
+ "open": 115471.8671875,
+ "high": 116010.2265625,
+ "low": 114966.8671875,
+ "close": 115536.65625,
+ "volume": 880.7437744140625,
+ "amount": 101153656.0
+ },
+ {
+ "timestamp": "2025-09-03T03:00:00+08:00",
+ "open": 115506.9921875,
+ "high": 115794.3359375,
+ "low": 115042.515625,
+ "close": 115340.015625,
+ "volume": 774.0452880859375,
+ "amount": 88908344.0
+ },
+ {
+ "timestamp": "2025-09-03T04:00:00+08:00",
+ "open": 115388.5,
+ "high": 115671.265625,
+ "low": 115029.359375,
+ "close": 115326.3671875,
+ "volume": 705.5819702148438,
+ "amount": 80512160.0
+ },
+ {
+ "timestamp": "2025-09-03T05:00:00+08:00",
+ "open": 115440.5234375,
+ "high": 115615.8984375,
+ "low": 115228.9453125,
+ "close": 115358.8828125,
+ "volume": 536.7360229492188,
+ "amount": 62220320.0
+ },
+ {
+ "timestamp": "2025-09-03T06:00:00+08:00",
+ "open": 115479.0859375,
+ "high": 115778.1796875,
+ "low": 115064.5,
+ "close": 115207.7109375,
+ "volume": 682.2289428710938,
+ "amount": 78939408.0
+ },
+ {
+ "timestamp": "2025-09-03T07:00:00+08:00",
+ "open": 115255.2265625,
+ "high": 115467.53125,
+ "low": 114928.0546875,
+ "close": 115216.75,
+ "volume": 543.549560546875,
+ "amount": 63054216.0
+ },
+ {
+ "timestamp": "2025-09-03T08:00:00+08:00",
+ "open": 114987.6640625,
+ "high": 115724.390625,
+ "low": 114266.0859375,
+ "close": 114983.53125,
+ "volume": 747.0625,
+ "amount": 86285112.0
+ },
+ {
+ "timestamp": "2025-09-03T09:00:00+08:00",
+ "open": 114988.8828125,
+ "high": 115310.265625,
+ "low": 114549.5234375,
+ "close": 114847.015625,
+ "volume": 955.66455078125,
+ "amount": 110837656.0
+ },
+ {
+ "timestamp": "2025-09-03T10:00:00+08:00",
+ "open": 114729.875,
+ "high": 114995.7734375,
+ "low": 114343.96875,
+ "close": 114641.1171875,
+ "volume": 736.4405517578125,
+ "amount": 84917664.0
+ },
+ {
+ "timestamp": "2025-09-03T11:00:00+08:00",
+ "open": 114616.1875,
+ "high": 115018.9453125,
+ "low": 113714.4375,
+ "close": 114583.6171875,
+ "volume": 835.0484619140625,
+ "amount": 94902544.0
+ },
+ {
+ "timestamp": "2025-09-03T12:00:00+08:00",
+ "open": 114638.921875,
+ "high": 114905.671875,
+ "low": 113567.1640625,
+ "close": 114440.578125,
+ "volume": 866.7816162109375,
+ "amount": 99151848.0
+ },
+ {
+ "timestamp": "2025-09-03T13:00:00+08:00",
+ "open": 114294.71875,
+ "high": 114610.890625,
+ "low": 113796.859375,
+ "close": 114289.9375,
+ "volume": 956.6331787109375,
+ "amount": 109755928.0
+ },
+ {
+ "timestamp": "2025-09-03T14:00:00+08:00",
+ "open": 114520.140625,
+ "high": 114870.7890625,
+ "low": 114264.96875,
+ "close": 114573.984375,
+ "volume": 629.0877685546875,
+ "amount": 71905760.0
+ },
+ {
+ "timestamp": "2025-09-03T15:00:00+08:00",
+ "open": 114578.6015625,
+ "high": 114719.421875,
+ "low": 114315.015625,
+ "close": 114509.0625,
+ "volume": 898.8456420898438,
+ "amount": 102280848.0
+ },
+ {
+ "timestamp": "2025-09-03T16:00:00+08:00",
+ "open": 114678.6484375,
+ "high": 114997.5,
+ "low": 114381.09375,
+ "close": 114653.25,
+ "volume": 832.753173828125,
+ "amount": 95922400.0
+ },
+ {
+ "timestamp": "2025-09-03T17:00:00+08:00",
+ "open": 114680.1953125,
+ "high": 114748.734375,
+ "low": 114096.6875,
+ "close": 114526.265625,
+ "volume": 645.5365600585938,
+ "amount": 74060824.0
+ }
+ ],
+ "actual_data": [],
+ "analysis": {}
+}
\ No newline at end of file
diff --git a/webui/requirements.txt b/webui/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a4392c71ad2b293b850adb8b1234368126c2e2bd
--- /dev/null
+++ b/webui/requirements.txt
@@ -0,0 +1,11 @@
+flask==2.3.3
+flask-cors==4.0.0
+pandas>=2.3.0
+numpy>=1.26.0
+plotly==5.17.0
+torch>=2.1.0
+huggingface_hub==0.33.1
+python-binance>=1.0.19
+requests>=2.25.0
+cryptography>=45.0.0
+pytz>=2023.3
diff --git a/webui/run.py b/webui/run.py
new file mode 100644
index 0000000000000000000000000000000000000000..a6b7548ce0da380a458b64b65910a431607a9f37
--- /dev/null
+++ b/webui/run.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+"""
+Kronos Web UI startup script
+"""
+
+import os
+import sys
+import subprocess
+import webbrowser
+import time
+
+def check_dependencies():
+ """Check if dependencies are installed"""
+ try:
+ import flask
+ import flask_cors
+ import pandas
+ import numpy
+ import plotly
+ print("✅ All dependencies installed")
+ return True
+ except ImportError as e:
+ print(f"❌ Missing dependency: {e}")
+ print("Please run: pip install -r requirements.txt")
+ return False
+
+def install_dependencies():
+ """Install dependencies"""
+ print("Installing dependencies...")
+ try:
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])
+ print("✅ Dependencies installation completed")
+ return True
+ except subprocess.CalledProcessError:
+ print("❌ Dependencies installation failed")
+ return False
+
+def main():
+ """Main function"""
+ print("🚀 Starting Kronos Web UI...")
+ print("=" * 50)
+
+ # Check dependencies
+ if not check_dependencies():
+ print("\nAuto-install dependencies? (y/n): ", end="")
+ if input().lower() == 'y':
+ if not install_dependencies():
+ return
+ else:
+ print("Please manually install dependencies and retry")
+ return
+
+ # Check model availability
+ try:
+ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+ from model import Kronos, KronosTokenizer, KronosPredictor
+ print("✅ Kronos model library available")
+ model_available = True
+ except ImportError:
+ print("⚠️ Kronos model library not available, will use simulated prediction")
+ model_available = False
+
+ # Start Flask application
+ print("\n🌐 Starting Web server...")
+
+ # Set environment variables
+ os.environ['FLASK_APP'] = 'app.py'
+ os.environ['FLASK_ENV'] = 'development'
+
+ # Start server
+ try:
+ from app import app
+ print("✅ Web server started successfully!")
+ print(f"🌐 Access URL: http://localhost:7070")
+ print("💡 Tip: Press Ctrl+C to stop server")
+
+ # Auto-open browser
+ time.sleep(2)
+ webbrowser.open('http://localhost:7070')
+
+ # Start Flask application
+ app.run(debug=True, host='0.0.0.0', port=7070)
+
+ except Exception as e:
+ print(f"❌ Startup failed: {e}")
+ print("Please check if port 7070 is occupied")
+
+if __name__ == "__main__":
+ main()
diff --git a/webui/start.sh b/webui/start.sh
new file mode 100644
index 0000000000000000000000000000000000000000..60110081761e82a4c1b87a9608f53e457f456172
--- /dev/null
+++ b/webui/start.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# Kronos Web UI startup script
+
+echo "🚀 Starting Kronos Web UI..."
+echo "================================"
+
+# Check if Python is installed
+if ! command -v python3 &> /dev/null; then
+ echo "❌ Python3 not installed, please install Python3 first"
+ exit 1
+fi
+
+# Check if in correct directory
+if [ ! -f "app.py" ]; then
+ echo "❌ Please run this script in the webui directory"
+ exit 1
+fi
+
+# Check dependencies
+echo "📦 Checking dependencies..."
+if ! python3 -c "import flask, flask_cors, pandas, numpy, plotly" &> /dev/null; then
+ echo "⚠️ Missing dependencies, installing..."
+ pip3 install -r requirements.txt
+ if [ $? -ne 0 ]; then
+ echo "❌ Dependencies installation failed"
+ exit 1
+ fi
+ echo "✅ Dependencies installation completed"
+else
+ echo "✅ All dependencies installed"
+fi
+
+# Start application
+echo "🌐 Starting Web server..."
+echo "Access URL: http://localhost:7070"
+echo "Press Ctrl+C to stop server"
+echo ""
+
+python3 app.py
diff --git a/webui/technical_indicators.py b/webui/technical_indicators.py
new file mode 100644
index 0000000000000000000000000000000000000000..8acc9145bfbaabe889aafc8de6f332b15cb57f05
--- /dev/null
+++ b/webui/technical_indicators.py
@@ -0,0 +1,196 @@
+#!/usr/bin/env python3
+"""
+技术指标计算模块 - 纯pandas实现
+支持常用的技术分析指标计算,无需外部依赖
+"""
+
+import pandas as pd
+import numpy as np
+
+
+def calculate_sma(data, window):
+ """简单移动平均线 (Simple Moving Average)"""
+ return data.rolling(window=window, min_periods=1).mean()
+
+
+def calculate_ema(data, window):
+ """指数移动平均线 (Exponential Moving Average)"""
+ return data.ewm(span=window, adjust=False).mean()
+
+
+def calculate_rsi(close, window=14):
+ """相对强弱指数 (Relative Strength Index)"""
+ delta = close.diff()
+ gain = delta.where(delta > 0, 0)
+ loss = -delta.where(delta < 0, 0)
+
+ avg_gain = gain.rolling(window=window, min_periods=1).mean()
+ avg_loss = loss.rolling(window=window, min_periods=1).mean()
+
+ rs = avg_gain / avg_loss
+ rsi = 100 - (100 / (1 + rs))
+ return rsi
+
+
+def calculate_macd(close, fast=12, slow=26, signal=9):
+ """MACD指标 (Moving Average Convergence Divergence)"""
+ ema_fast = calculate_ema(close, fast)
+ ema_slow = calculate_ema(close, slow)
+ macd = ema_fast - ema_slow
+ macd_signal = calculate_ema(macd, signal)
+ macd_hist = macd - macd_signal
+ return macd, macd_signal, macd_hist
+
+
+def calculate_bollinger_bands(close, window=20, std_dev=2):
+ """布林带 (Bollinger Bands)"""
+ sma = calculate_sma(close, window)
+ std = close.rolling(window=window, min_periods=1).std()
+ upper = sma + (std * std_dev)
+ lower = sma - (std * std_dev)
+ return upper, sma, lower
+
+
+def calculate_stochastic(high, low, close, k_window=14, d_window=3):
+ """随机指标 (Stochastic Oscillator)"""
+ lowest_low = low.rolling(window=k_window, min_periods=1).min()
+ highest_high = high.rolling(window=k_window, min_periods=1).max()
+
+ # 避免除零错误
+ range_hl = highest_high - lowest_low
+ range_hl = range_hl.replace(0, np.nan)
+
+ k_percent = 100 * ((close - lowest_low) / range_hl)
+ d_percent = k_percent.rolling(window=d_window, min_periods=1).mean()
+
+ return k_percent, d_percent
+
+
+def calculate_atr(high, low, close, window=14):
+ """平均真实波幅 (Average True Range)"""
+ tr1 = high - low
+ tr2 = abs(high - close.shift(1))
+ tr3 = abs(low - close.shift(1))
+
+ # 计算真实波幅
+ tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)
+
+ # 计算ATR
+ atr = tr.rolling(window=window, min_periods=1).mean()
+ return atr
+
+
+def calculate_williams_r(high, low, close, window=14):
+ """威廉指标 (Williams %R)"""
+ highest_high = high.rolling(window=window, min_periods=1).max()
+ lowest_low = low.rolling(window=window, min_periods=1).min()
+
+ # 避免除零错误
+ range_hl = highest_high - lowest_low
+ range_hl = range_hl.replace(0, np.nan)
+
+ wr = -100 * ((highest_high - close) / range_hl)
+ return wr
+
+
+def add_technical_indicators(df, indicators_config=None):
+ """
+ 为DataFrame添加技术指标
+
+ Args:
+ df: 包含OHLCV数据的DataFrame
+ indicators_config: 指标配置字典
+
+ Returns:
+ 添加了技术指标的DataFrame
+ """
+ if indicators_config is None:
+ # 默认指标配置 - 简化配置,减少指标数量
+ indicators_config = {
+ 'sma': [5, 10, 20],
+ 'ema': [12, 26],
+ 'rsi': [14],
+ 'macd': True,
+ 'bollinger': True,
+ 'atr': [14]
+ }
+
+ df = df.copy()
+
+ # 确保必要的列存在
+ required_cols = ['open', 'high', 'low', 'close']
+ if not all(col in df.columns for col in required_cols):
+ raise ValueError(f"DataFrame must contain columns: {required_cols}")
+
+ try:
+ # 简单移动平均线
+ if 'sma' in indicators_config:
+ for period in indicators_config['sma']:
+ df[f'sma_{period}'] = calculate_sma(df['close'], period)
+
+ # 指数移动平均线
+ if 'ema' in indicators_config:
+ for period in indicators_config['ema']:
+ df[f'ema_{period}'] = calculate_ema(df['close'], period)
+
+ # RSI
+ if 'rsi' in indicators_config:
+ for period in indicators_config['rsi']:
+ df[f'rsi_{period}'] = calculate_rsi(df['close'], period)
+
+ # MACD
+ if indicators_config.get('macd'):
+ macd, macd_signal, macd_hist = calculate_macd(df['close'])
+ df['macd'] = macd
+ df['macd_signal'] = macd_signal
+ df['macd_hist'] = macd_hist
+
+ # 布林带
+ if indicators_config.get('bollinger'):
+ bb_upper, bb_middle, bb_lower = calculate_bollinger_bands(df['close'])
+ df['bb_upper'] = bb_upper
+ df['bb_middle'] = bb_middle
+ df['bb_lower'] = bb_lower
+
+ # ATR
+ if 'atr' in indicators_config:
+ for period in indicators_config['atr']:
+ df[f'atr_{period}'] = calculate_atr(df['high'], df['low'], df['close'], period)
+
+ # 填充NaN值而不是删除行
+ df = df.fillna(method='bfill').fillna(method='ffill')
+
+ # 计算添加的指标数量
+ basic_cols = ['open', 'high', 'low', 'close', 'volume', 'amount', 'timestamps']
+ indicator_cols = [col for col in df.columns if col not in basic_cols]
+
+ print(f"✅ 技术指标计算完成,添加了 {len(indicator_cols)} 个指标")
+
+ except Exception as e:
+ print(f"❌ 技术指标计算失败: {e}")
+ # 如果指标计算失败,返回原始数据
+ basic_cols = ['open', 'high', 'low', 'close']
+ if 'volume' in df.columns:
+ basic_cols.append('volume')
+ if 'amount' in df.columns:
+ basic_cols.append('amount')
+ if 'timestamps' in df.columns:
+ basic_cols.append('timestamps')
+ return df[basic_cols]
+
+ return df
+
+
+def get_available_indicators():
+ """获取可用的技术指标列表"""
+ indicators = {
+ 'trend': ['sma', 'ema', 'macd', 'bollinger'],
+ 'momentum': ['rsi'],
+ 'volatility': ['atr'],
+ 'volume': []
+ }
+
+ return indicators
+
+
+
diff --git a/webui/templates/index.html b/webui/templates/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..241b5e5207146ab44d5f2d77d1ad542d642a237c
--- /dev/null
+++ b/webui/templates/index.html
@@ -0,0 +1,1270 @@
+
+
+
+
+
+ Kronos Financial Prediction Web UI
+
+
+
+
+
+
+
+
+
+
+
🎯 Control Panel
+
+
+
+ Select Model:
+
+ Please load available models first
+
+ Select the Kronos model to use
+
+
+
+
+ Select Device:
+
+ CPU
+ CUDA (NVIDIA GPU)
+ MPS (Apple Silicon)
+
+ Select the device to run the model on
+
+
+
+
+ Model status information
+
+
+
+
+ 🔄 Load Model
+
+
+
+
+
+
+ 选择交易对:
+
+ 请先加载交易对列表
+
+ 选择要分析的加密货币交易对
+
+
+
+ 选择时间周期:
+
+ 请先加载时间周期列表
+
+ 选择K线数据的时间间隔
+
+
+
+ 数据数量:
+
+ 400条
+ 1000条
+ 1500条
+
+ 获取最近的K线数据条数
+
+
+
+ 📈 获取币安数据
+
+
+
+
+
📊 Data Information
+
Rows: -
+
Columns: -
+
Time Range: -
+
Price Range: -
+
Time Frequency: -
+
Prediction Columns: -
+
+
+
+
+
+
+ 回看窗口大小:
+
+ 用于预测的历史数据点数量(默认400)
+
+
+
+
+ 回看窗口大小:
+
+ 自动从上方输入框同步
+
+
+
+ Prediction Length:
+
+ Fixed at 120 data points
+
+
+
+
+ Prediction Temperature (T):
+
+ 1.0
+ Controls prediction randomness, higher values make predictions more diverse, lower values make predictions more conservative
+
+
+
+ Nucleus Sampling Parameter (top_p):
+
+ 0.9
+ Controls prediction diversity, higher values consider broader probability distributions
+
+
+
+ Sample Count:
+
+ Generate multiple prediction samples to improve quality (recommended 1-3)
+
+
+
+ 🔮 Start Prediction
+
+
+
+
+
+
Processing, please wait...
+
+
+
+
+
📈 Prediction Results Chart
+
+
+
+
+
📊 Prediction vs Actual Data Comparison
+
+
Prediction Type: -
+
Comparison Data: -
+
+
+
+
+
Mean Absolute Error
+
-
+
Price Units
+
+
+
Root Mean Square Error
+
-
+
Price Units
+
+
+
Mean Absolute Percentage Error
+
-
+
%
+
+
+
+
+
Detailed Comparison Data:
+
+
+
+
+ Time
+ Actual Open
+ Predicted Open
+ Actual High
+ Predicted High
+ Actual Low
+ Predicted Low
+ Actual Close
+ Predicted Close
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webui/test_binance.py b/webui/test_binance.py
new file mode 100644
index 0000000000000000000000000000000000000000..354a5b346c22aa153d299421620ccdb8ebf278e8
--- /dev/null
+++ b/webui/test_binance.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+"""
+测试币安API连接和数据获取功能
+"""
+
+import sys
+import os
+sys.path.append(os.path.dirname(os.path.abspath(__file__)))
+
+from binance.client import Client
+import pandas as pd
+
+def test_binance_connection():
+ """测试币安连接"""
+ try:
+ # 初始化客户端(使用公开API)
+ client = Client("", "")
+
+ # 测试获取服务器时间
+ server_time = client.get_server_time()
+ print(f"✅ 币安服务器连接成功,服务器时间: {server_time}")
+
+ # 测试获取交易对信息
+ exchange_info = client.get_exchange_info()
+ print(f"✅ 获取交易所信息成功,共有 {len(exchange_info['symbols'])} 个交易对")
+
+ # 测试获取K线数据
+ klines = client.get_klines(symbol='BTCUSDT', interval='1h', limit=10)
+ print(f"✅ 获取BTCUSDT K线数据成功,获取到 {len(klines)} 条数据")
+
+ # 转换为DataFrame并显示
+ df = pd.DataFrame(klines, columns=[
+ 'timestamp', 'open', 'high', 'low', 'close', 'volume',
+ 'close_time', 'quote_asset_volume', 'number_of_trades',
+ 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
+ ])
+
+ df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
+ print("\n最新的5条K线数据:")
+ print(df[['timestamp', 'open', 'high', 'low', 'close', 'volume']].tail())
+
+ return True
+
+ except Exception as e:
+ print(f"❌ 币安连接测试失败: {e}")
+ return False
+
+if __name__ == "__main__":
+ print("🚀 开始测试币安API连接...")
+ success = test_binance_connection()
+
+ if success:
+ print("\n✅ 所有测试通过!币安API集成准备就绪。")
+ else:
+ print("\n❌ 测试失败,请检查网络连接。")