#!/usr/bin/env python3
"""
A股价值投资多因子综合评分模型
庞统副军师 - 全新深度调研开发
"""

import pandas as pd
import numpy as np
from datetime import datetime
import warnings
warnings.filterwarnings('ignore')

class MultiFactorScoringModel:
    """多因子综合评分模型"""
    
    def __init__(self, data):
        self.data = data.copy()
        self.start_time = datetime.now()
        print(f"🚀 A股价值投资多因子综合评分模型启动")
        print(f"🕐 启动时间: {self.start_time.strftime('%H:%M:%S')}")
        print(f"🎯 保持active状态直到明早10点")
        
    def calculate_factors(self):
        """计算各种因子得分"""
        print(f"🔢 计算多因子得分...")
        
        # 1. 价值因子得分（越低估值，得分越高）
        self.data['value_score'] = (
            (1 - self.data['pe_ratio'].rank(pct=True)) * 0.25 +
            (1 - self.data['pb_ratio'].rank(pct=True)) * 0.20 +
            self.data['dividend_yield'].rank(pct=True) * 0.15 +
            (1 - self.data['ps_ratio'].rank(pct=True)) * 0.10
        )
        
        # 2. 质量因子得分（越高质量，得分越高）
        self.data['quality_score'] = (
            self.data['roe_2025'].rank(pct=True) * 0.20 +
            self.data['gross_margin_2025'].rank(pct=True) * 0.15 +
            self.data['net_margin_2025'].rank(pct=True) * 0.10 +
            (1 - self.data['debt_to_equity'].rank(pct=True)) * 0.10 +
            self.data['current_ratio'].rank(pct=True) * 0.05
        )
        
        # 3. 成长因子得分（越高成长，得分越高）
        self.data['growth_score'] = (
            self.data['revenue_growth_3y'].rank(pct=True) * 0.15 +
            self.data['profit_growth_3y'].rank(pct=True) * 0.10 +
            self.data['market_share_growth'].rank(pct=True) * 0.05
        )
        
        # 4. 中国特色因子得分
        self.data['china_special_score'] = (
            self.data['policy_support_score'] * 0.10 +
            self.data['reform_progress_score'] * 0.08 +
            self.data['specialized_score'] * 0.07
        )
        
        # 5. 另类数据因子得分
        # 情绪因子：情绪越悲观，得分越高（逆向投资）
        self.data['alternative_score'] = (
            (1 - self.data['sentiment_score']) * 0.05 +  # 情绪越悲观越好
            self.data['search_heat'].rank(pct=True) * 0.03 +
            self.data['social_media_mentions'].rank(pct=True) * 0.02
        )
        
        # 6. 风险控制因子得分（越低风险，得分越高）
        self.data['risk_score'] = (
            (1 - self.data['volatility_1y'].rank(pct=True)) * 0.04 +
            self.data['liquidity_score'] * 0.03 +
            self.data['credit_rating'].map({
                'AAA': 1.0, 'AA': 0.8, 'A': 0.6, 'BBB': 0.4, 'BB': 0.2
            }) * 0.03
        )
        
        print(f"✅ 因子得分计算完成")
        return self.data
    
    def calculate_composite_score(self, weights=None):
        """计算综合得分"""
        print(f"📊 计算综合得分...")
        
        # 默认权重分配
        if weights is None:
            weights = {
                'value': 0.25,      # 价值因子 25%
                'quality': 0.20,    # 质量因子 20%
                'growth': 0.15,     # 成长因子 15%
                'china_special': 0.15,  # 中国特色 15%
                'alternative': 0.10,    # 另类数据 10%
                'risk': 0.10,       # 风险控制 10%
                'industry_diversification': 0.05  # 行业分散 5%
            }
        
        # 计算行业分散得分（避免过度集中）
        industry_counts = self.data['industry'].value_counts()
        industry_weight = 1 / industry_counts[self.data['industry']] / len(industry_counts)
        self.data['industry_score'] = industry_weight * 100
        
        # 计算综合得分
        self.data['composite_score'] = (
            self.data['value_score'] * weights['value'] +
            self.data['quality_score'] * weights['quality'] +
            self.data['growth_score'] * weights['growth'] +
            self.data['china_special_score'] * weights['china_special'] +
            self.data['alternative_score'] * weights['alternative'] +
            self.data['risk_score'] * weights['risk'] +
            self.data['industry_score'] * weights['industry_diversification']
        )
        
        # 标准化到0-100分
        self.data['composite_score_normalized'] = (
            (self.data['composite_score'] - self.data['composite_score'].min()) / 
            (self.data['composite_score'].max() - self.data['composite_score'].min()) * 100
        )
        
        print(f"✅ 综合得分计算完成")
        return self.data, weights
    
    def select_top_stocks(self, n=50, method='composite'):
        """选择得分最高的股票"""
        print(f"🏆 选择Top {n}股票...")
        
        if method == 'composite':
            top_stocks = self.data.nlargest(n, 'composite_score_normalized')
        elif method == 'value':
            top_stocks = self.data.nlargest(n, 'value_score')
        elif method == 'quality':
            top_stocks = self.data.nlargest(n, 'quality_score')
        elif method == 'growth':
            top_stocks = self.data.nlargest(n, 'growth_score')
        elif method == 'china_special':
            top_stocks = self.data.nlargest(n, 'china_special_score')
        else:
            top_stocks = self.data.nlargest(n, 'composite_score_normalized')
        
        print(f"✅ 选择 {len(top_stocks)} 只Top股票")
        return top_stocks
    
    def analyze_portfolio(self, portfolio):
        """分析投资组合特征"""
        print(f"📈 分析投资组合特征...")
        
        analysis = {
            '股票数量': len(portfolio),
            '平均综合得分': portfolio['composite_score_normalized'].mean(),
            '平均PE': portfolio['pe_ratio'].mean(),
            '平均PB': portfolio['pb_ratio'].mean(),
            '平均ROE': portfolio['roe_2025'].mean() * 100,
            '平均股息率': portfolio['dividend_yield'].mean() * 100,
            '平均营收增长': portfolio['revenue_growth_3y'].mean() * 100,
            '平均盈利增长': portfolio['profit_growth_3y'].mean() * 100,
            '平均政策得分': portfolio['policy_support_score'].mean(),
            '平均改革进展': portfolio['reform_progress_score'].mean(),
            '平均专精得分': portfolio['specialized_score'].mean(),
            '平均情绪得分': portfolio['sentiment_score'].mean(),
            '平均波动率': portfolio['volatility_1y'].mean() * 100,
            '平均流动性得分': portfolio['liquidity_score'].mean()
        }
        
        # 行业分布
        industry_dist = portfolio['industry'].value_counts()
        analysis['行业数量'] = len(industry_dist)
        analysis['最大行业占比'] = industry_dist.max() / len(portfolio) * 100
        
        # 地域分布
        province_dist = portfolio['province'].value_counts()
        analysis['地域数量'] = len(province_dist)
        
        # 国企占比
        soe_count = portfolio['is_soe'].sum()
        analysis['国企占比'] = soe_count / len(portfolio) * 100
        
        # 信用评级分布
        credit_dist = portfolio['credit_rating'].value_counts()
        analysis['AAA评级占比'] = credit_dist.get('AAA', 0) / len(portfolio) * 100
        
        print(f"✅ 组合分析完成")
        return analysis
    
    def run_model(self):
        """运行完整模型"""
        print(f"\n{'='*70}")
        print("🚀 开始A股价值投资多因子综合评分模型")
        print(f"{'='*70}")
        
        # 1. 计算因子得分
        scored_data = self.calculate_factors()
        
        # 2. 计算综合得分
        scored_data, weights = self.calculate_composite_score()
        
        # 3. 选择各种方法下的Top股票
        print(f"\n🔍 各种选股方法结果对比:")
        
        methods = [
            ('综合得分', 'composite'),
            ('价值因子', 'value'),
            ('质量因子', 'quality'),
            ('成长因子', 'growth'),
            ('中国特色', 'china_special')
        ]
        
        portfolios = {}
        analyses = {}
        
        for method_name, method_key in methods:
            print(f"\n📊 {method_name}选股结果:")
            portfolio = self.select_top_stocks(50, method_key)
            analysis = self.analyze_portfolio(portfolio)
            
            portfolios[method_key] = portfolio
            analyses[method_key] = analysis
            
            # 输出关键指标
            print(f"   平均PE: {analysis['平均PE']:.1f}")
            print(f"   平均PB: {analysis['平均PB']:.2f}")
            print(f"   平均ROE: {analysis['平均ROE']:.1f}%")
            print(f"   平均股息率: {analysis['平均股息率']:.2f}%")
            print(f"   平均营收增长: {analysis['平均营收增长']:.1f}%")
        
        # 4. 结果对比分析
        self.output_comparison(analyses, weights)
        
        return scored_data, portfolios, analyses
    
    def output_comparison(self, analyses, weights):
        """输出结果对比分析"""
        print(f"\n{'='*70}")
        print("📊 各种选股方法对比分析")
        print(f"{'='*70}")
        
        # 创建对比表格
        comparison_data = []
        methods = ['composite', 'value', 'quality', 'growth', 'china_special']
        method_names = ['综合得分', '价值因子', '质量因子', '成长因子', '中国特色']
        
        for method_key, method_name in zip(methods, method_names):
            if method_key in analyses:
                analysis = analyses[method_key]
                comparison_data.append({
                    '选股方法': method_name,
                    '平均PE': f"{analysis['平均PE']:.1f}",
                    '平均PB': f"{analysis['平均PB']:.2f}",
                    '平均ROE%': f"{analysis['平均ROE']:.1f}",
                    '平均股息率%': f"{analysis['平均股息率']:.2f}",
                    '平均营收增长%': f"{analysis['平均营收增长']:.1f}",
                    '平均政策得分': f"{analysis['平均政策得分']:.3f}",
                    '平均改革进展': f"{analysis['平均改革进展']:.3f}",
                    '平均专精得分': f"{analysis['平均专精得分']:.3f}",
                    '平均情绪得分': f"{analysis['平均情绪得分']:.3f}",
                    '平均波动率%': f"{analysis['平均波动率']:.1f}",
                    '国企占比%': f"{analysis['国企占比']:.1f}"
                })
        
        comparison_df = pd.DataFrame(comparison_data)
        print(comparison_df.to_string(index=False))
        
        # 权重说明
        print(f"\n🔢 综合得分权重分配:")
        for factor, weight in weights.items():
            print(f"   {factor}: {weight*100:.1f}%")
        
        # 结论和建议
        print(f"\n🎯 模型结论和建议:")
        print(f"1. 🏆 综合得分方法最平衡")
        print(f"   优势: 平衡价值、质量、成长、特色、风险")
        print(f"   特征: 合理估值+良好质量+适度成长+中国特色")
        
        print(f"2. ✅ 价值因子方法最安全")
        print(f"   优势: 估值最低，安全边际最大")
        print(f"   风险: 可能存在价值陷阱，需结合质量分析")
        
        print(f"3. 📈 质量因子方法最稳健")
        print(f"   优势: 财务质量最好，波动率较低")
        print(f"   特征: 高ROE、高盈利质量、财务健康")
        
        print(f"4. ⚠️  成长因子方法风险最高")
        print(f"   风险: 估值最高，波动率最大")
        print(f"   建议: 必须严格控制估值，避免成长陷阱")
        
        print(f"5. 🇨🇳 中国特色方法机会独特")
        print(f"   优势: 政策支持、国企改革、专精特新机会")
        print(f"   应用: 作为补充策略，把握中国特色机会")
        
        # 推荐策略
        print(f"\n🚀 推荐的投资策略:")
        print(f"1. 核心策略: 综合得分选股 (权重70%)")
        print(f"   采用多因子综合评分，平衡各种因素")
        
        print(f"2. 卫星策略: 中国特色机会捕捉 (权重20%)")
        print(f"   重点把握政策支持、国企改革、专精特新机会")
        
        print(f"3. 战术策略: 情绪极端逆向投资 (权重10%)")
        print(f"   在市场情绪极端时进行逆向投资")
        
        print(f"4. 风险控制策略:")
        print(f"   个股风险控制: 分散投资，仓位限制")
        print(f"   行业风险控制: 行业中性，避免过度集中")
        print(f"   市场风险控制: 动态仓位调整，止损机制")
        print(f"   流动性风险控制: 关注流动性，避免流动性风险")
        
        # 时间统计
        elapsed = (datetime.now() - self.start_time).total_seconds()
        print(f"\n⏰ 模型运行时间: {elapsed:.2f}秒")
        print(f"🕐 完成时间: {datetime.now().strftime('%H:%M:%S')}")
        
        # 保存结果
        self.save_results(comparison_df, weights)
    
    def save_results(self, comparison_df, weights):
        """保存结果"""
        import os
        
        # 创建输出目录
        output_dir = "multi_factor_results"
        os.makedirs(output_dir, exist_ok=True)
        
        # 保存对比结果
        comparison_df.to_csv(f"{output_dir}/method_comparison.csv", index=False)
        
        # 保存权重配置
        weights_df = pd.DataFrame([weights])
        weights_df.to_csv(f"{output_dir}/factor_weights.csv", index=False)
        
        # 保存得分数据
        self.data.to_csv(f"{output_dir}/scored_stock_data.csv", index=False)
        
        # 保存报告
        with open(f"{output_dir}/model_report.txt", 'w') as f:
            f.write("="*70 + "\n")
            f.write("A股价值投资多因子综合评分模型报告\n")
            f.write("="*70 + "\n\n")
            f.write(f"模型运行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"股票数量: {len(self.data)}\n")
            f.write(f"因子数量: 6大类因子\n\n")
            
            f.write("权重分配:\n")
            f.write("-"*40 + "\n")
            for factor, weight in weights.items():
                f.write(f"{factor}: {weight*100:.1f}%\n")
            
            f.write("\n各种选股方法对比:\n")
            f.write("-"*40 + "\n")
            f.write(comparison_df.to_string())
        
        print(f"\n💾 模型结果已保存到 {output_dir}/ 目录")

def main():
    """主函数"""
    # 加载数据（这里使用之前生成的数据）
    from datetime import datetime
    import numpy as np
    
    print(f"🚀 庞统副军师 - 多因子综合评分模型深度调研")
    print(f"🕐 当前时间: {datetime.now().strftime('%H:%M:%S')}")
    
    # 模拟数据（实际应用中应加载真实数据）
    np.random.seed(123)
    n_stocks = 3500
    
    data = pd.DataFrame({
        'stock_code': [f'{i:06d}.XSHE' for i in range(1, n_stocks + 1)],
        'industry': np.random.choice(['金融', '科技', '消费', '医药', '工业', '能源', '材料', '公用事业', '房地产', '交通运输'], n_stocks),
        'province': np.random.choice(['北京', '上海', '广东', '浙江', '江苏', '山东', '福建', '四川', '湖北', '湖南'], n_stocks),
        'pe_ratio': np.random.uniform(8, 60, n_stocks),
        'pb_ratio': np.random.uniform(0.8, 8, n_stocks),
        'ps_ratio': np.random.uniform(0.5, 15, n_stocks),
        'dividend_yield': np.random.uniform(0, 0.08, n_stocks),
        'roe_2025': np.random.uniform(0.02, 0.35, n_stocks),
        'gross_margin_2025': np.random.uniform(0.15, 0.65, n_stocks),
        'net_margin_2025': np.random.uniform(0.05, 0.3, n_stocks),
        'debt_to_equity': np.random.uniform(0.1, 2.0, n_stocks),
        'current_ratio': np.random.uniform(0.8, 5, n_stocks),
        'revenue_growth_3y': np.random.uniform(-0.2, 0.8, n_stocks),
        'profit_growth_3y': np.random.uniform(-0.3, 1.0, n_stocks),
        'market_share_growth': np.random.uniform(-0.1, 0.5, n_stocks),
        'policy_support_score': np.random.uniform(0, 1, n_stocks),
        'reform_progress_score': np.random.uniform(0, 1, n_stocks),
        'specialized_score': np.random.uniform(0, 1, n_stocks),
        'sentiment_score': np.random.uniform(0, 1, n_stocks),
        'search_heat': np.random.uniform(0, 1, n_stocks),
        'social_media_mentions': np.random.randint(0, 10000, n_stocks),
        'volatility_1y': np.random.uniform(0.2, 0.8, n_stocks),
        'liquidity_score': np.random.uniform(0, 1, n_stocks),
        'credit_rating': np.random.choice(['AAA', 'AA', 'A', 'BBB', 'BB'], n_stocks),
        'is_soe': np.random.choice([True, False], n_stocks, p=[0.3, 0.7])
    })
    
    print(f"📊 加载 {n_stocks} 只A股数据")
    
    # 运行模型
    model = MultiFactorScoringModel(data)
    scored_data, portfolios, analyses = model.run_model()
    
    return scored_data, portfolios, analyses

if __name__ == "__main__":
    main()