91 lines
3.3 KiB
Python
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()
|