markaz_arshy/analyze_model.py
2025-08-12 14:36:24 +00:00

91 lines
3.3 KiB
Python

# analyze_model.py
#
# Deskripsi:
# Skrip ini memuat model AI (XGBoost) yang sudah dilatih dan menganalisisnya
# untuk mengetahui fitur-fitur pasar mana yang paling berpengaruh dalam
# membuat keputusan trading. Hasilnya akan disimpan sebagai gambar grafik.
#
# Cara Penggunaan:
# 1. Pastikan Anda sudah berhasil melatih model (misal: 'xgboost_model_BTCUSD.json').
# 2. Jalankan skrip ini dari terminal: python analyze_model.py
import xgboost as xgb
import matplotlib.pyplot as plt
import pandas as pd
import logging
import glob
# --- Konfigurasi ---
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Daftar nama fitur sesuai dengan urutan di 'extract_features_full'
# Ini sangat penting agar grafik bisa terbaca dengan benar.
FEATURE_NAMES = [
'last_price',
'atr_dynamic',
'distance_to_ob',
'strength_of_ob',
'distance_to_fvg',
'strength_of_fvg',
'has_engulfing_pattern',
'distance_to_daily_high',
'distance_to_daily_low',
'distance_from_r1',
'distance_from_s1'
]
def analyze_model(model_path):
"""Memuat satu model dan mem-plot feature importance-nya."""
try:
# Ekstrak nama simbol dari path file
symbol_name = model_path.split('_')[-1].replace('.json', '')
logging.info(f"--- Menganalisis Model untuk: {symbol_name} ---")
# Muat model
xgb_model = xgb.XGBClassifier()
xgb_model.load_model(model_path)
# Atur nama fitur di dalam model
xgb_model.get_booster().feature_names = FEATURE_NAMES
# Dapatkan skor kepentingan fitur
importance_scores = xgb_model.get_booster().get_score(importance_type='weight')
if not importance_scores:
logging.warning(f"Tidak dapat mengambil skor kepentingan untuk model {symbol_name}.")
return
# Buat plot
fig, ax = plt.subplots(figsize=(10, 8))
xgb.plot_importance(importance_scores, ax=ax, height=0.8, title=f'Feature Importance untuk {symbol_name}',
xlabel='Skor Kepentingan (Weight)', ylabel='Fitur Pasar')
# Simpan plot sebagai file gambar
output_image_path = f'feature_importance_{symbol_name}.png'
plt.tight_layout()
plt.savefig(output_image_path)
logging.info(f"Grafik untuk {symbol_name} telah disimpan ke '{output_image_path}'.")
plt.close(fig) # Tutup plot agar tidak ditampilkan di layar
except Exception as e:
logging.error(f"Gagal menganalisis model dari '{model_path}': {e}")
def main():
"""Mencari semua file model yang ada dan menganalisisnya satu per satu."""
# Cari semua file model xgboost di direktori saat ini
model_files = glob.glob('xgboost_model_*.json')
if not model_files:
logging.error("Tidak ada file model ('xgboost_model_*.json') yang ditemukan.")
logging.error("Pastikan Anda sudah menjalankan 'train_xgboost.py' terlebih dahulu.")
return
logging.info(f"Ditemukan {len(model_files)} model untuk dianalisis: {model_files}")
for model_file in model_files:
analyze_model(model_file)
if __name__ == '__main__':
# Pastikan Anda sudah menginstal matplotlib
# Jalankan dari terminal: pip install matplotlib
main()