update quant

This commit is contained in:
tinh
2026-03-21 14:36:58 +07:00
parent 2db5635602
commit 0948bda053
5 changed files with 534 additions and 49 deletions
+24 -48
View File
@@ -1,52 +1,28 @@
import pandas as pd
import os
from pathlib import Path
import numpy as np
def preprocess_all_symbols():
symbols = ['EURUSDm', 'GBPUSDm', 'USDJPYm', 'USDCHFm', 'USDCADm', 'NZDUSDm']
timeframes = ['M15', 'H1', 'H4']
raw_base = Path("data/raw")
processed_base = Path("data/processed")
def clean_and_prepare_data(df, symbol_name):
# 1. Loại bỏ nến trùng lặp
df = df[~df.index.duplicated(keep='first')]
print("--- BẮT ĐẦU TIỀN XỬ LÝ DỮ LIỆU ---")
# 2. Đảm bảo nến logic (OHLC)
bad_candles = df[(df['high'] < df['low']) | (df['high'] < df['open']) | (df['high'] < df['close'])]
if not bad_candles.empty:
print(f"Cảnh báo: Phát hiện {len(bad_candles)} nến lỗi tại {symbol_name}")
# Có thể xóa hoặc sửa tùy bạn, ở đây ta chọn xóa nến lỗi cực nặng
df = df.drop(bad_candles.index)
for symbol in symbols:
for tf in timeframes:
file_path = raw_base / symbol / tf / f"{symbol}_{tf}.parquet"
if not file_path.exists():
continue
# 1. Đọc dữ liệu
df = pd.read_parquet(file_path)
initial_count = len(df)
# 2. Xử lý logic cơ bản
# Chuyển index sang datetime nếu chưa có
df.index = pd.to_datetime(df['timestamp'])
df = df.sort_index()
# Loại bỏ trùng lặp
df = df[~df.index.duplicated(keep='first')]
# Loại bỏ nến lỗi (High < Low)
df = df[df['high'] >= df['low']]
# Lọc từ năm 2022 trở lại đây như bạn yêu cầu
df = df.loc['2022-01-01':]
# 3. Loại bỏ ngày cuối tuần (Forex nghỉ)
df = df[df.index.dayofweek < 5]
# 4. Lưu dữ liệu sạch
output_dir = processed_base / symbol / tf
output_dir.mkdir(parents=True, exist_ok=True)
output_path = output_dir / f"{symbol}_{tf}_clean.parquet"
df.to_parquet(output_path)
print(f"[OK] {symbol} {tf}: {initial_count} -> {len(df)} nến (Đã lưu tại {output_path})")
print("--- HOÀN THÀNH ---")
if __name__ == "__main__":
preprocess_all_symbols()
# 3. Tạo khung thời gian đầy đủ (không ngắt quãng)
# Giả sử khung M15, ta tạo range từ đầu đến cuối
full_range = pd.date_range(start=df.index.min(), end=df.index.max(), freq='15min')
df = df.reindex(full_range)
# 4. Điền nến thiếu (ffill cho giá, 0 cho volume)
df[['open', 'high', 'low', 'close']] = df[['open', 'high', 'low', 'close']].ffill()
df['tick_volume'] = df['tick_volume'].fillna(0)
# 5. Loại bỏ ngày cuối tuần (Forex nghỉ)
# Thứ 7 (5) và Chủ Nhật (6)
df = df[df.index.dayofweek < 5]
return df