mirror of
https://github.com/quachtinh113/main-fx.git
synced 2026-08-19 05:18:05 +00:00
update quant
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user