FREDML / backup /redundant_files /test_alignment_divergence.py
Edwin Salguero
Enhanced FRED ML with improved Reports & Insights page, fixed alignment analysis, and comprehensive analytics improvements
2469150
#!/usr/bin/env python3
"""
Alignment and Divergence Analysis Test
Test the new alignment/divergence analyzer with real FRED data
"""
import os
import sys
import pandas as pd
import numpy as np
from datetime import datetime
# Add src to path
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
from src.core.enhanced_fred_client import EnhancedFREDClient
from src.analysis.alignment_divergence_analyzer import AlignmentDivergenceAnalyzer
def test_alignment_divergence_analysis():
"""Test the new alignment and divergence analysis"""
# Use the provided API key
api_key = "acf8bbec7efe3b6dfa6ae083e7152314"
print("=== ALIGNMENT & DIVERGENCE ANALYSIS TEST ===")
print("Using Spearman correlation for long-term alignment detection")
print("Using Z-score analysis for sudden deviation detection")
print()
try:
# Initialize FRED client
client = EnhancedFREDClient(api_key)
# Fetch economic data (last 5 years for better trend analysis)
end_date = datetime.now()
start_date = end_date.replace(year=end_date.year - 5)
print("1. Fetching economic data...")
data = client.fetch_economic_data(
start_date=start_date.strftime('%Y-%m-%d'),
end_date=end_date.strftime('%Y-%m-%d')
)
if data.empty:
print("❌ No data fetched")
return
print(f"βœ… Fetched {len(data)} observations across {len(data.columns)} indicators")
print(f" Date range: {data.index.min()} to {data.index.max()}")
print(f" Indicators: {list(data.columns)}")
print()
# Initialize alignment analyzer
analyzer = AlignmentDivergenceAnalyzer(data)
# 2. Analyze long-term alignment using Spearman correlation
print("2. Analyzing long-term alignment (Spearman correlation)...")
alignment_results = analyzer.analyze_long_term_alignment(
window_sizes=[12, 24, 48], # 1, 2, 4 years for quarterly data
min_periods=8
)
print("βœ… Long-term alignment analysis completed")
print(f" Analyzed {len(alignment_results['rolling_correlations'])} indicator pairs")
# Show alignment summary
summary = alignment_results['alignment_summary']
print(f" Increasing alignment pairs: {len(summary['increasing_alignment'])}")
print(f" Decreasing alignment pairs: {len(summary['decreasing_alignment'])}")
print(f" Stable alignment pairs: {len(summary['stable_alignment'])}")
print(f" Strong trends: {len(summary['strong_trends'])}")
print()
# Show some specific alignment trends
if summary['increasing_alignment']:
print("πŸ”Ί Examples of increasing alignment:")
for pair in summary['increasing_alignment'][:3]:
print(f" - {pair}")
print()
if summary['decreasing_alignment']:
print("πŸ”» Examples of decreasing alignment:")
for pair in summary['decreasing_alignment'][:3]:
print(f" - {pair}")
print()
# 3. Detect sudden deviations using Z-score analysis
print("3. Detecting sudden deviations (Z-score analysis)...")
deviation_results = analyzer.detect_sudden_deviations(
z_threshold=2.0, # Flag deviations beyond 2 standard deviations
window_size=12, # 3-year rolling window for quarterly data
min_periods=6
)
print("βœ… Sudden deviation detection completed")
# Show deviation summary
dev_summary = deviation_results['deviation_summary']
print(f" Total deviations detected: {dev_summary['total_deviations']}")
print(f" Indicators with deviations: {len(dev_summary['indicators_with_deviations'])}")
print(f" Extreme events: {dev_summary['extreme_events_count']}")
print()
# Show most volatile indicators
if dev_summary['most_volatile_indicators']:
print("πŸ“ˆ Most volatile indicators:")
for item in dev_summary['most_volatile_indicators'][:5]:
print(f" - {item['indicator']}: {item['volatility']:.4f} volatility")
print()
# Show extreme events
extreme_events = deviation_results['extreme_events']
if extreme_events:
print("🚨 Recent extreme events (Z-score > 3.0):")
for indicator, events in extreme_events.items():
if events['events']:
extreme_events_list = [e for e in events['events'] if abs(e['z_score']) > 3.0]
if extreme_events_list:
latest = extreme_events_list[0]
print(f" - {indicator}: {latest['date'].strftime('%Y-%m-%d')} "
f"(Z-score: {latest['z_score']:.2f}, Growth: {latest['growth_rate']:.2f}%)")
print()
# 4. Generate insights report
print("4. Generating comprehensive insights report...")
insights_report = analyzer.generate_insights_report()
print("βœ… Insights report generated")
print()
# Save insights to file
with open('alignment_divergence_insights.txt', 'w') as f:
f.write(insights_report)
print("πŸ“„ Insights report saved to 'alignment_divergence_insights.txt'")
print()
# 5. Create visualization
print("5. Creating alignment analysis visualization...")
analyzer.plot_alignment_analysis(save_path='alignment_analysis_plot.png')
print("πŸ“Š Visualization saved to 'alignment_analysis_plot.png'")
print()
# 6. Detailed analysis examples
print("6. Detailed analysis examples:")
print()
# Show specific correlation trends
if alignment_results['trend_analysis']:
print("πŸ“Š Correlation Trend Examples:")
for pair_name, trends in list(alignment_results['trend_analysis'].items())[:3]:
print(f" {pair_name}:")
for window_name, trend_info in trends.items():
if trend_info['trend'] != 'insufficient_data':
print(f" {window_name}: {trend_info['trend']} ({trend_info['strength']})")
print(f" Slope: {trend_info['slope']:.4f}, RΒ²: {trend_info['r_squared']:.3f}")
print()
# Show specific deviation patterns
if deviation_results['z_scores']:
print("⚠️ Deviation Pattern Examples:")
for indicator, z_scores in list(deviation_results['z_scores'].items())[:3]:
deviations = deviation_results['deviations'][indicator]
if not deviations.empty:
print(f" {indicator}:")
print(f" Total deviations: {len(deviations)}")
print(f" Max Z-score: {deviations.abs().max():.2f}")
print(f" Mean Z-score: {deviations.abs().mean():.2f}")
print(f" Recent deviations: {len(deviations[deviations.index > '2023-01-01'])}")
print()
print("=== ANALYSIS COMPLETED SUCCESSFULLY ===")
print("βœ… Spearman correlation analysis for long-term alignment")
print("βœ… Z-score analysis for sudden deviation detection")
print("βœ… Comprehensive insights and visualizations generated")
print()
print("Key findings:")
print("- Long-term alignment patterns identified using rolling Spearman correlation")
print("- Sudden deviations flagged using Z-score analysis")
print("- Extreme events detected and categorized")
print("- Volatility patterns analyzed across indicators")
except Exception as e:
print(f"❌ Error during alignment/divergence analysis: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
test_alignment_divergence_analysis()