"use client"; import { useState } from "react"; import {Sparkles } from "lucide-react"; import { rebalancePortfolio, runMonteCarlo } from "@/lib/api-v2"; import { PageContainer, Card, Badge } from "@/components/shared/PageContainer"; import { toast } from "sonner"; /** 再平衡结果。 */ interface RebalanceResult { irr_impact?: number; dpi_impact?: number; } /** Monte Carlo 结果。 */ interface MonteCarloResult { percentile_p5?: string; percentile_p50?: string; percentile_p95?: string; } export default function PortfolioPage() { const [rebalanceResult, setRebalanceResult] = useState(null); const [mcResult, setMcResult] = useState(null); const [isLoading, setIsLoading] = useState(false); const handleRebalance = async () => { setIsLoading(true); try { const resp = await rebalancePortfolio([]); setRebalanceResult(resp.data as RebalanceResult); } catch { toast.error("分析失败"); } finally { setIsLoading(false); } }; const handleMonteCarlo = async () => { setIsLoading(true); try { const resp = await runMonteCarlo([0.15, 0.22, 0.08, 0.35, 0.12]); setMcResult(resp.data as MonteCarloResult); } catch { toast.error("模拟失败"); } finally { setIsLoading(false); } }; return (

组合再平衡

AI 分析各企业边际回报率,建议资源再分配

{rebalanceResult && (
{rebalanceResult.irr_impact != null && (

IRR 影响:+{rebalanceResult.irr_impact}%

)} {rebalanceResult.dpi_impact != null && (

DPI 影响:+{rebalanceResult.dpi_impact}

)}
)}

Monte Carlo 模拟

10000 次随机抽样 → IRR/DPI 概率分布

{mcResult && (

P5: {mcResult.percentile_p5}

P50: {mcResult.percentile_p50}

P95: {mcResult.percentile_p95}

)}
); }