{"id":"12662e4d-799f-4970-bbaa-4d7b3296c505","entityType":"agent","slug":"clawhub-gechengling-security-portfolio-risk","name":"Security Portfolio Risk","canonicalUrl":"https://www.xpersona.co/agent/clawhub-gechengling-security-portfolio-risk","canonicalPath":"/agent/clawhub-gechengling-security-portfolio-risk","generatedAt":"2026-10-11T01:47:37.067Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T22:36:01.002Z","emptyReason":null},"description":"Provides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers. Skill: Security Portfolio Risk Owner: gechengling Summary: Provides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers. Tags: latest:3.0.4, security-portfolio-risk:3.0.4 Version history: v3.0.4 | 2026-10-08T05:05:40.894Z | user 3.0.4: content update v3.0.3 | 2026-09-30T07:04:59.412Z | user v3.0.3: narrow triggers (SQP-1), c","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17ewqc4f2s6gpcbm88hy7fgvn85kg1g:security-portfolio-risk","sourceUrl":"https://clawhub.ai/gechengling/security-portfolio-risk","homepage":"https://clawhub.ai/gechengling/skills/security-portfolio-risk","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/gechengling/security-portfolio-risk","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/gechengling/skills/security-portfolio-risk","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Provides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers. Skil"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:36:01.002Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:36:01.002Z","emptyReason":null},"stars":null,"forks":null,"downloads":1240,"packageName":null,"latestVersion":"3.0.4","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:36:00.939Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T22:36:01.002Z","lastCrawledAt":"2026-10-10T22:36:00.939Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T22:36:00.939Z","lastVerifiedAt":null,"highlights":[{"version":"3.0.4","createdAt":"2026-10-08T05:05:40.894Z","changelog":"3.0.4: content update","fileCount":3,"zipByteSize":15435},{"version":"3.0.3","createdAt":"2026-09-30T07:04:59.412Z","changelog":"v3.0.3: narrow triggers (SQP-1), clarify orphaned method block, add data-minimisation + execution boundary, refresh to 2026-09-30, +3 examples, +9 table dimensions","fileCount":3,"zipByteSize":12803},{"version":"3.0.2","createdAt":"2026-09-12T07:19:57.690Z","changelog":"内容增强：VaR三方法对比与手算、回撤解读、指标口径登记表；压力情景新增流动性枯竭与利率下行两类，补情景结果对照、处置清单与阈值设定；风险贡献新增权重与风险贡献错位、分散化效果与风险预算分配示例；监管动态更新至 2026-09-12","fileCount":3,"zipByteSize":10168},{"version":"3.0.1","createdAt":"2026-05-25T03:40:35.914Z","changelog":"- Added a \"证券监管最新动态\" (Securities Regulatory Latest News) section with three 2026 updates on increased risk management requirements, quant shock, and ESG coverage. - Updated version to 3.0.1 and aligned versioning in metadata. - No changes to core code or core skill logic; content update focused on documentation and regulatory snapshot.","fileCount":3,"zipByteSize":5996},{"version":"2.0.0","createdAt":"2026-05-11T10:24:41.914Z","changelog":"Portfolio Risk Analysis Expert v2.0.0 - Expanded skill description and keyword set to better reflect Chinese market needs. - Improved clarity and searchability by adding more relevant keywords (e.g., 风险管理, 最大回撤, 夏普比率, 收益风险比, 资产配置, 风险预算). - No changes to functionality; update limited to documentation (SKILL.md).","fileCount":2,"zipByteSize":4510},{"version":"1.0.0","createdAt":"2026-05-11T08:52:47.211Z","changelog":"Initial release of Portfolio Risk Analysis Expert for China market. - Provides portfolio VaR calculation (historical, parametric, modified), CVaR/ES, maximum drawdown, and risk metrics. - Includes factor exposure analysis and risk attribution using regression against factor returns. - Offers extreme scenario-based stress testing, covering major China market risks (e.g., 2015 crash, interest rate spikes, currency moves, COVID-style shocks) with preset scenarios. - Designed specifically for fund managers, risk analysts, and institutional investors focusing on Chinese portfolios. - Supports both English and Chinese trigger keywords and explanations.","fileCount":2,"zipByteSize":4479}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17ewqc4f2s6gpcbm88hy7fgvn85kg1g:security-portfolio-risk","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T01:47:37.066Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gechengling-security-portfolio-risk/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T22:36:01.002Z","emptyReason":null},"readme":"Skill: Security Portfolio Risk\n\nOwner: gechengling\n\nSummary: Provides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers.\n\nTags: latest:3.0.4, security-portfolio-risk:3.0.4\n\nVersion history:\n\nv3.0.4 | 2026-10-08T05:05:40.894Z | user\n\n3.0.4: content update\n\nv3.0.3 | 2026-09-30T07:04:59.412Z | user\n\nv3.0.3: narrow triggers (SQP-1), clarify orphaned method block, add data-minimisation + execution boundary, refresh to 2026-09-30, +3 examples, +9 table dimensions\n\nv3.0.2 | 2026-09-12T07:19:57.690Z | user\n\n内容增强：VaR三方法对比与手算、回撤解读、指标口径登记表；压力情景新增流动性枯竭与利率下行两类，补情景结果对照、处置清单与阈值设定；风险贡献新增权重与风险贡献错位、分散化效果与风险预算分配示例；监管动态更新至 2026-09-12\n\nv3.0.1 | 2026-05-25T03:40:35.914Z | auto\n\n- Added a \"证券监管最新动态\" (Securities Regulatory Latest News) section with three 2026 updates on increased risk management requirements, quant shock, and ESG coverage.\n- Updated version to 3.0.1 and aligned versioning in metadata.\n- No changes to core code or core skill logic; content update focused on documentation and regulatory snapshot.\n\nv2.0.0 | 2026-05-11T10:24:41.914Z | auto\n\nPortfolio Risk Analysis Expert v2.0.0\n\n- Expanded skill description and keyword set to better reflect Chinese market needs.\n- Improved clarity and searchability by adding more relevant keywords (e.g., 风险管理, 最大回撤, 夏普比率, 收益风险比, 资产配置, 风险预算).\n- No changes to functionality; update limited to documentation (SKILL.md).\n\nv1.0.0 | 2026-05-11T08:52:47.211Z | auto\n\nInitial release of Portfolio Risk Analysis Expert for China market.\n\n- Provides portfolio VaR calculation (historical, parametric, modified), CVaR/ES, maximum drawdown, and risk metrics.\n- Includes factor exposure analysis and risk attribution using regression against factor returns.\n- Offers extreme scenario-based stress testing, covering major China market risks (e.g., 2015 crash, interest rate spikes, currency moves, COVID-style shocks) with preset scenarios.\n- Designed specifically for fund managers, risk analysts, and institutional investors focusing on Chinese portfolios.\n- Supports both English and Chinese trigger keywords and explanations.\n\nArchive index:\n\nArchive v3.0.4: 3 files, 15435 bytes\n\nFiles: skill-card.md (1956b), SKILL.md (35991b), _meta.json (142b)\n\nFile v3.0.4:SKILL.md\n\n---\r\nname: Portfolio Risk Analysis Expert\r\nslug: security-portfolio-risk\r\ndescription: AI-powered portfolio risk analysis expert for China market — quantifies risk on a given holdings portfolio: VaR/CVaR, stress testing, tail risk, factor exposure and risk-contribution decomposition. Scope: portfolio-level quantitative risk measurement only; not general risk-management consultancy, not single-name research, not asset-allocation theory. Keywords: portfolio VaR, CVaR, stress testing, risk contribution, risk decomposition, factor exposure, tail risk, China A-share, 组合风险分析, 组合VaR, CVaR计算, 组合压力测试, 风险归因, 风险贡献分解, 因子敞口, 尾部风险, 集中度风险检查, 风险预算.\r\nversion: \"3.0.4\"\r\n---\r\n\r\n# Portfolio Risk Analysis Expert / 组合风险分析专家\r\n\r\n> **English:** AI-powered portfolio risk analysis expert — covers VaR calculation, stress testing, tail risk measurement, factor exposure, and risk attribution. Built for fund managers and risk analysts.\r\n>\r\n> **中文:** 组合风险分析专家——覆盖VaR计算、压力测试、尾部风险度量、因子敞口分析、风险归因。适用：基金经理、风险分析师、机构投资者。\r\n\r\n\r\n---\r\n\r\n## 数据最小化声明与执行边界 / Data Minimisation & Execution Boundary\r\n\r\n**数据最小化前置声明：** 使用本技能时，请只提供风险测算所必需的输入——标的代码、权重、收益率或净值序列、已脱敏的组合规模（可用“1000万”这类量级，无需精确金额）。**不要**粘贴账户号、身份证号、实际成交明细、客户身份信息或未公开的持仓数据；个人持仓请用“标的+权重”的脱敏形式提供。\r\n\r\n**保存与预览确认：** 本技能不执行任何保存动作。若你在自己环境中依据本技能生成风险报告、压力测试结论或风险预算表，请在落盘或对外报送前**先预览结果、确认口径与阈值无误，再保存或提交**。\r\n\r\n**代码块性质与执行边界**\r\n\r\n| 内容 | 性质 | 谁来执行 |\r\n|------|------|---------|\r\n| `PortfolioRiskAnalyzer` 类（VaR/CVaR/回撤/因子归因） | 风险指标的计算口径说明 | 由风险分析师在自有风控系统中取数复现；技能不取数、不运行 |\r\n| `StressTestScenarios` 情景库与 `run_stress_test()` | 情景参数与冲击传导的示意 | 由风险分析师在自有系统中配置并运行 |\r\n| `risk_contribution_by_asset()` | 边际风险贡献（MCTR）的算法表达 | 同上，属教学示意 |\r\n| 口径登记表、阈值表、处置清单 | 管理用模板 | 由风控人员在机构流程中落实 |\r\n\r\n本技能未配置任何工具调用权限，不执行代码、不读写文件、不访问行情或持仓数据源，也不生成可直接报送的监管报表。文中代码块均为指标口径的教学示意，读者可在自己环境中参考实现；风险测算结果须经独立复核后方可用于决策。\r\n\r\n---\r\n\r\n\r\n### 证券监管最新动态 [2026-10-08更新]\r\n\r\n| 动态类型 | 内容摘要 | 影响范围 | 风险侧应对动作 | 责任岗 | 优先级 | 复核频率 | |\r\n|---------|---------|---------|--------------|-------|-------|---|\r\n| 证券监管 | 2026年Q1：市场波动加剧，组合风险管理要求提升 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险报告增设极端情景专项说明 | 风控 | 高 | 每季 |\r\n| 证券监管 | 量化资金共振风险增加，极端行情止损策略需更新 | 组合风险模型需增加量化冲击和ESG风险维度 | 压力测试新增流动性枯竭情景 | 风控 | 高 | 每季 |\r\n| 证券监管 | ESG投资分析要求扩大，组合风险需纳入ESG因素 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险分解单列ESG敞口维度 | 风控 | 中 | 每季 |\r\n| 程序化交易 | 程序化交易报告与异常交易监控要求细化 | 极端行情下的流动性与波动归因 | 压力测试中区分程序化交易影响部分 | 风控 | 中 | 每月 |\r\n| 信息披露 | 上市公司信息披露质量监管强化 | 风险模型的财务输入数据 | 模型输入须标注报告期与数据来源 | 风控 | 高 | 每季 |\r\n| 估值与净值 | 净值化管理要求下风险指标披露趋严 | 产品风险报告与定期披露 | 波动率、回撤、VaR口径固定并留档 | 合规 | 高 | 每月 |\r\n| 投资者保护 | 风险揭示与适当性匹配要求提升 | 产品风险等级与客户匹配 | 风险报告附适当性匹配说明 | 合规 | 高 | 每季 |\r\n| 集中度管理 | 单一标的与单一行业集中度关注度提升 | 组合集中度指标 | 集中度阈值纳入日常监控与预警 | 风控 | 高 | 日 |\r\n| 估值与净值 | 2026年9月下旬：净值化产品的风险指标披露口径一致性要求进一步强化 | 定期报告、产品风险揭示书 | 波动率/回撤/VaR三项口径写进口径登记表并随报告留档 | 合规 | 高 | 每月 |\r\n| 集中度管理 | 2026年三季度：单一标的与单一行业集中度的日常监控要求细化 | 组合集中度指标 | 集中度监控改为日频，超限当日报送投资经理 | 风控 | 高 | 日 |\r\n| 风险揭示 | 2026年10月上旬：净值型产品风险指标与业绩展示口径的一致性检查趋严，报告值与宣传值须同源 | 风险报告、产品宣传材料 | 波动率/回撤/VaR的报告数值与对外展示数值差异须书面说明 | 合规 | 高 | 每月 |\r\n| 模型风险管理 | 2026年四季度初：机构风险模型的验证与留痕要求细化，模型版本与参数来源须可追溯 | 风险模型、参数与情景库 | 建立模型台账，登记模型版本、参数来源、情景设定依据并按季复核 | 风控 | 高 | 每季 |\r\n\r\n> **数据截止**: 2026-10-08 | 来源：证监会、交易所公开规则、行业公开信息\r\n> **声明**: 以上动态供参考，具体以官方最新发布为准\r\n\r\n**动态解读示例（四类高频场景）**\r\n\r\n- **场景A｜流动性枯竭情景**：压力测试仅覆盖价格冲击，未考虑成交量萎缩 → 命中\"量化共振风险\"要求 → 新增\"流动性降至50%+价格下跌20%\"的复合情景，输出无法顺利减仓的敞口估算。\r\n- **场景B｜ESG敞口单列**：风险分解仅按行业与因子拆分 → 命中\"ESG风险维度\"要求 → 在风险分解中增加ESG评级分布与高碳敞口占比。\r\n- **场景C｜口径固定留档**：不同报告的波动率口径时而日频、时而月频 → 命中\"口径固定披露\"要求 → 统一为日频年化并在报告中标注计算口径与样本区间。\r\n- **场景D｜集中度预警**：单标的市值占比升至18%未触发任何预警 → 命中\"集中度监控\"要求 → 设置单标的15%、单行业35%的预警线，超限自动进入整改流程。\r\n\r\n- **场景E｜口径不一致被问询**：同一产品季报用日频波动率、月报用月频波动率，数值无法比对 → 命中“口径一致性要求强化” → 建立口径登记表，把频率、样本窗口、无风险利率基准三项写死，每次出报告先对照登记表，改口径须留变更记录。\r\n- **场景F｜集中度监控滞后**：集中度按周监控，超限后已持仓三天 → 命中“日常监控细化” → 改为日频自动计算，超限当日推送投资经理与风控，并在T+1前给出减仓或冻结新增买入的处置结论。\r\n\r\n监控自检：口径看“是否跨报告一致”，集中度看“是否当日发现当日处置”。两条决定风险报告能否经得起复核。\r\n\r\n\r\n## Industry Pain Points / 行业痛点\r\n\r\n| Pain Point / 痛点 | Impact / 影响 | Solution / 本Skill解决方案 | 量化基线指标 / Baseline |\r\n|------------------|-------------|------------------------|----------------------|\r\n| **系统风险难预测** | 黑天鹅事件导致大幅回撤 | 极端情景压力测试+尾部风险分析 | 压力测试情景覆盖 ≥6类 |\r\n| **因子敞口不清晰** | 不知道组合暴露在哪些风险上 | 因子归因模型+敞口分解 | 因子解释度 R² ≥0.7 |\r\n| **回撤控制困难** | 持有人体验差，资金赎回压力 | 动态回撤监控+预警机制 | 最大回撤控制在预设阈值内 |\r\n| **相关性突变** | 平时低相关的资产大跌时齐跌 | 相关性压力测试+分散化效果评估 | 压力情景下相关性假设上浮至0.7+ |\r\n| **合规要求高** | 资管新规净值化要求 | 标准风险指标+监管报告 | 风险指标披露完整率 100% |\r\n| **集中度超标** | 单一标的/行业权重过高 | 集中度监控阈值+预警 | 单标的≤15%、单行业≤35% |\r\n| **尾部风险低估** | VaR未反映肥尾特征 | CVaR与修正VaR双口径 | 同时披露VaR与CVaR |\r\n| **口径不一致** | 跨报告指标不可比 | 计算口径登记表 | 口径一致率 100% |\r\n\r\n---\r\n\r\n## Trigger Keywords / 触发关键词\r\n\r\n**English Triggers (portfolio-level quantitative measurement only):** portfolio VaR, portfolio CVaR, stress test a portfolio, risk contribution, risk decomposition, factor exposure of a portfolio, tail risk measurement, correlation stress test, concentration check\r\n\r\n**English Non-Triggers:** risk management, asset allocation, diversification, volatility, Sharpe ratio, risk-adjusted return, drawdown control — these alone do **not** route here; they must be scoped to \"measure or decompose risk for a specific holdings portfolio\".\r\n\r\n**中文触发词（须落在“计算/分解一个组合的风险”任务上才触发）：** 组合风险分析 / 组合VaR / CVaR计算 / 组合压力测试 / 组合回撤分析 / 风险归因 / 因子敞口分解 / 尾部风险度量 / 风险贡献分析 / 风险预算分配 / 集中度风险检查 / 分散化效果评估 / 相关性压力测试\r\n\r\n**不触发（Scope Exclusions）：** 以下泛化词单独出现时**不**触发本技能——风险分析、风险管理、资产配置、分散化、波动率、夏普比率、风险调整收益、回撤控制。它们只有在明确指向“对某个持仓组合做量化风险测算或分解”时才路由到本技能；单只证券的风险特征、通用资产配置理论、泛化的风险管理咨询请改用对应技能。\r\n\r\n**路由判定三步：** ① 输入是否为一组持仓（标的+权重）？② 任务是否为计算VaR/CVaR、跑压力情景、分解风险贡献或检查集中度？③ 两者同时为“是”才启用。只问概念定义不启用。\r\n\r\n---\r\n\r\n## Core Capabilities / 核心能力\r\n\r\n### 1. VaR & Risk Metrics / VaR与风险指标\r\n\r\n```python\r\nimport numpy as np\r\nimport pandas as pd\r\nfrom scipy import stats\r\n\r\nclass PortfolioRiskAnalyzer:\r\n    \"\"\"组合风险分析引擎\"\"\"\r\n    \r\n    def __init__(self, returns: pd.DataFrame, weights: np.ndarray):\r\n        \"\"\"\r\n        Args:\r\n            returns: 收益率序列（列=资产，行=日期）\r\n            weights: 资产权重向量\r\n        \"\"\"\r\n        self.returns = returns\r\n        self.weights = weights\r\n        self.n_assets = len(weights)\r\n    \r\n    def calculate_var(self, confidence: float = 0.95, \r\n                      method: str = \"historical\") -> dict:\r\n        \"\"\"计算VaR（Value at Risk）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        \r\n        if method == \"historical\":\r\n            var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        elif method == \"parametric\":\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            var = stats.norm.ppf(1 - confidence, mu, sigma)\r\n        elif method == \"modified\":\r\n            # Cornish-Fisher调整\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            skew = stats.skew(portfolio_returns)\r\n            kurt = stats.kurtosis(portfolio_returns)\r\n            z = stats.norm.ppf(1 - confidence)\r\n            z_cf = (z + (z**2 - 1) * skew / 6 + \r\n                   (z**3 - 3*z) * kurt / 24 - \r\n                   (2*z**3 - 5*z) * skew**2 / 36)\r\n            var = mu + sigma * z_cf\r\n        \r\n        return {\r\n            \"var\": round(var * 100, 2),  # 百分比\r\n            \"var_amount\": round(var * 1000000, 2),  # 假设100万组合\r\n            \"confidence\": confidence,\r\n            \"method\": method,\r\n            \"interpretation\": f\"在{confidence*100}%置信度下，最大损失为{abs(var)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_cvar(self, confidence: float = 0.95) -> dict:\r\n        \"\"\"计算CVaR（Conditional VaR / Expected Shortfall）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        \r\n        cvar = portfolio_returns[portfolio_returns <= var].mean()\r\n        \r\n        return {\r\n            \"cvar\": round(cvar * 100, 2),\r\n            \"cvar_amount\": round(cvar * 1000000, 2),\r\n            \"interpretation\": f\"超过VaR时的平均损失为{abs(cvar)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_max_drawdown(self) -> dict:\r\n        \"\"\"计算最大回撤\"\"\"\r\n        cumulative = (1 + self.returns @ self.weights).cumprod()\r\n        running_max = cumulative.expanding().max()\r\n        drawdown = (cumulative - running_max) / running_max\r\n        \r\n        max_dd = drawdown.min()\r\n        max_dd_end = drawdown.idxmin()\r\n        max_dd_start = cumulative[:max_dd_end].idxmax()\r\n        \r\n        return {\r\n            \"max_drawdown\": round(max_dd * 100, 2),\r\n            \"peak_date\": str(max_dd_start.date()),\r\n            \"trough_date\": str(max_dd_end.date()),\r\n            \"recovery_date\": None  # 需后续计算\r\n        }\r\n    \r\n    def factor_risk_attribution(self, factor_returns: pd.DataFrame) -> dict:\r\n        \"\"\"因子风险归因\"\"\"\r\n        portfolio_returns = self.returns @ self.weights\r\n        \r\n        # 回归分析\r\n        X = factor_returns.values\r\n        X = np.column_stack([np.ones(len(X)), X])\r\n        y = portfolio_returns.values\r\n        \r\n        coeffs = np.linalg.lstsq(X, y, rcond=None)[0]\r\n        residuals = y - X @ coeffs\r\n        \r\n        # 分解方差\r\n        total_var = np.var(y)\r\n        factor_var = np.var(X[:, 1:] @ coeffs[1:])\r\n        specific_var = np.var(residuals)\r\n        \r\n        return {\r\n            \"factor_exposure\": {\r\n                \"market\": round(coeffs[1], 3),\r\n                \"factors\": {\r\n                    col: round(coef, 3) \r\n                    for col, coef in zip(factor_returns.columns, coeffs[2:])\r\n                }\r\n            },\r\n            \"risk_contribution\": {\r\n                \"factor_risk\": round(factor_var / total_var * 100, 2),\r\n                \"specific_risk\": round(specific_var / total_var * 100, 2)\r\n            },\r\n            \"r_squared\": round(1 - specific_var / total_var, 4)\r\n        }\r\n```\r\n\r\n**VaR 三种方法对比（同一组合结果可能差异明显）**\r\n\r\n| 方法 | 假设 | 适用场景 | 优点 | 局限 | 报告披露要求 |\r\n|------|------|---------|------|------|---|\r\n| 历史模拟法 | 未来分布与历史一致 | 样本充足、分布未知 | 不依赖分布假设 | 依赖历史窗口，肥尾可能漏估 | 须注明样本窗口 |\r\n| 参数法（正态） | 收益率服从正态分布 | 快速估算、常规监控 | 计算快、易解释 | 低估极端损失 | 须提示低估风险 |\r\n| 修正VaR（Cornish-Fisher） | 引入偏度与峰度 | 收益率非正态的市场 | 能反映肥尾特征 | 参数估计误差敏感 | 须同时披露CVaR |\r\n\r\n实践建议：日常监控用历史模拟法，风险报告同时披露修正VaR与CVaR；若三者差异超过30%，须在报告中说明原因。\r\n\r\n**示例 1｜组合VaR手算与解读**\r\n\r\n- 输入：组合日收益率序列近250个交易日，95%置信度。\r\n- 历史模拟法：取第5百分位收益 = **−2.35%**，即\"95%置信度下，单日最大损失约2.35%\"。\r\n- 组合规模1000万元 → VaR金额 = 1000万 × 2.35% = **23.5万元**。\r\n- CVaR（超过VaR部分的均值）= **−3.62%** → 金额 **36.2万元**，说明极端日的平均损失比VaR更深。\r\n- 解读要点：VaR回答\"最多亏多少（在95%情形下）\"，CVaR回答\"突破之后平均亏多少\"，二者必须同时披露。\r\n\r\n**示例 2｜最大回撤解读与恢复期**\r\n\r\n| 项目 | 数值 | 说明 | 口径 |\r\n|------|------|------|---|\r\n| 最大回撤 | −18.6% | 峰值到谷底跌幅 | 复权净值口径 |\r\n| 峰值日期 | 2026-03-12 | 回撤起点 | 峰值日 |\r\n| 谷底日期 | 2026-05-28 | 回撤最深日 | 谷底日 |\r\n| 回撤持续天数 | 77天 | 下跌过程时长 | 自然日 |\r\n| 是否已恢复 | 否（当前−9.4%） | 尚未回到前高 | 相对峰值 |\r\n| 恢复所需时间 | 待观察 | 不应假设\"必然恢复\" | 不做恢复假设 |\r\n\r\n解读要点：回撤分析要给出三件事——多深、多久、是否恢复；只报\"最大回撤−18.6%\"而不说恢复状态会误导持有人。\r\n\r\n**风险指标口径登记表（避免跨报告不可比）**\r\n\r\n| 指标 | 计算口径 | 频率 | 样本窗口 | 备注 | 责任人 |\r\n|------|---------|------|---------|------|---|\r\n| 年化波动率 | 日收益率标准差×√244 | 日 | 近1年 | 采用交易日244天 | 风控 |\r\n| 最大回撤 | 复权净值峰值到谷底 | 日 | 成立以来 | 标注峰值与谷底日期 | 风控 |\r\n| 夏普比率 | (年化收益−无风险利率)/年化波动率 | 月 | 近1年 | 无风险利率用1年期国债 | 风控 |\r\n| VaR | 历史模拟法，95% | 日 | 近250日 | 同时披露CVaR | 风控 |\r\n| 跟踪误差 | 相对基准超额收益标准差 | 周 | 近1年 | 标注基准指数 | 风控 |\r\n\r\n**示例 3｜三种VaR差异过大时的排查（差异>30%即须说明）**\r\n\r\n| 排查项 | 检查内容 | 常见原因 |\r\n|-------|---------|---------|\r\n| 样本窗口 | 历史模拟法是否覆盖了极端区间 | 窗口过短，未包含大跌样本 |\r\n| 分布假设 | 参数法是否低估肥尾 | 收益率峰度显著高于正态 |\r\n| 偏度方向 | 修正VaR的方向是否合理 | 极端偏度导致Cornish-Fisher不稳定 |\r\n| 单位与频率 | 三种方法是否同频同年化 | 日VaR与年化VaR混用 |\r\n\r\n处置原则：三者差异超过30%时，报告中采用“修正VaR或CVaR”作为保守口径，并说明历史模拟法为何偏低；不得只披露数值最低的一种。\r\n\r\n**示例 4｜置信度与持有期的VaR换算（跨报告最易出错）**\r\n\r\n| 置信度 | 1日VaR | 10日VaR（√10 换算） | 1000万组合10日VaR金额 | 适用场景 |\r\n|--------|--------|-------------------|---------------------|----------|\r\n| 90% | −1.72% | −5.44% | 54.4万元 | 内部日常监控 |\r\n| 95% | −2.35% | −7.43% | 74.3万元 | 标准风险报告披露 |\r\n| 99% | −4.10% | −12.97% | 129.7万元 | 极端情形专项说明 |\r\n\r\n换算前提：√t 外推仅在收益率独立同分布、无波动率集聚的假设下成立。若样本期内存在明显的波动率集聚（大涨大跌连续出现），√t 会低估持有期风险，此时应直接用重叠区间的历史收益计算多日VaR，并在报告中写明所用方法。常见错误是把95%的1日VaR当作10日VaR填报，损失被低估约3倍。\r\n\r\n**示例 5｜VaR回退测试（Kupiec检验口径）**\r\n\r\n| 检验项 | 数值 | 判断 | 处置 |\r\n|-------|------|------|------|\r\n| 检验样本天数 | 250 | 一年交易日 | — |\r\n| 95% VaR被突破次数 | 18 | 期望约12.5次 | 突破偏多 |\r\n| 实际突破率 | 7.2% | 高于5%的理论水平 | 模型低估风险 |\r\n| 结论 | 未通过 | 需重估样本窗口或改用修正VaR | 调宽窗口至500日并重跑 |\r\n\r\n回退测试要点：突破次数显著高于理论值说明模型低估风险，应拉长样本窗口或改用能反映肥尾的口径；突破次数远低于理论值则说明模型过于保守，会不必要地占用风险额度。回退测试应至少每季度做一次并留档。\r\n\r\n\r\n\r\n### 2. Stress Testing / 压力测试\r\n\r\n```python\r\nclass StressTestScenarios:\r\n    \"\"\"压力测试情景库\"\"\"\r\n    \r\n    SCENARIOS = {\r\n        \"2015股灾重演\": {\r\n            \"description\": \"假设上证指数单周下跌20%\",\r\n            \"market_shock\": -0.20,\r\n            \"sector_impacts\": {\r\n                \"金融\": -0.25,\r\n                \"房地产\": -0.30,\r\n                \"消费\": -0.15,\r\n                \"科技\": -0.20,\r\n                \"医药\": -0.10\r\n            },\r\n            \"liquidity_shock\": 0.5  # 流动性降至50%\r\n        },\r\n        \r\n        \"利率急升\": {\r\n            \"description\": \"假设基准利率上调100bp\",\r\n            \"rate_shock\": 0.01,\r\n            \"bond_impact\": -0.08,\r\n            \"equity_impact\": -0.10,\r\n            \"bank_impact\": -0.05\r\n        },\r\n        \r\n        \"人民币急贬\": {\r\n            \"description\": \"假设USD/CNY一日升值5%\",\r\n            \"fx_shock\": 0.05,\r\n            \"export_related\": -0.15,\r\n            \"import_related\": 0.05,\r\n            \"domestic_consumer\": -0.08\r\n        },\r\n        \r\n        \"黑天鹅-新冠\": {\r\n            \"description\": \"类似2020年初疫情冲击\",\r\n            \"market_shock\": -0.12,\r\n            \"travel\": -0.30,\r\n            \"retail\": -0.20,\r\n            \"healthcare\": 0.10,\r\n            \"online\": 0.05\r\n        },\r\n        \r\n        \"流动性枯竭-量化踩踏\": {\r\n            \"description\": \"成交额萎缩至五成，程序化交易减仓放大波动\",\r\n            \"market_shock\": -0.18,\r\n            \"liquidity_shock\": 0.5,\r\n            \"sector_impacts\": {\r\n                \"小市值\": -0.28,\r\n                \"高换手\": -0.32,\r\n                \"大盘蓝筹\": -0.12,\r\n                \"红利低波\": -0.08\r\n            },\r\n            \"correlation_shift\": 0.85,\r\n            \"notes\": \"分散化效果在此情景下显著减弱\"\r\n        },\r\n        \r\n        \"利率下行-资产重定价\": {\r\n            \"description\": \"基准利率下调50bp，利率敏感资产重估\",\r\n            \"rate_shock\": -0.005,\r\n            \"bond_impact\": 0.04,\r\n            \"equity_impact\": 0.06,\r\n            \"bank_impact\": -0.03,\r\n            \"notes\": \"债券与红利资产受益，银行净息差承压\"\r\n        }\r\n    }\r\n    \r\n    def run_stress_test(self, portfolio: dict, scenario: str) -> dict:\r\n        \"\"\"执行压力测试\"\"\"\r\n        if scenario not in self.SCENARIOS:\r\n            raise ValueError(f\"Unknown scenario: {scenario}\")\r\n        \r\n        s = self.SCENARIOS[scenario]\r\n        positions = portfolio[\"positions\"]\r\n        \r\n        stressed_pnl = 0\r\n        stressed_values = []\r\n        \r\n        for pos in positions:\r\n            sector = pos.get(\"sector\", \"general\")\r\n            weight = pos[\"weight\"]\r\n            \r\n            # 根据情景调整\r\n            if \"sector_impacts\" in s and sector in s[\"sector_impacts\"]:\r\n                shock = s[\"sector_impacts\"][sector]\r\n            else:\r\n                shock = s.get(\"market_shock\", -0.10)\r\n            \r\n            pos_stressed = weight * (1 + shock)\r\n            stressed_values.append(pos_stressed)\r\n            stressed_pnl += weight * shock\r\n        \r\n        total_value = sum(stressed_values)\r\n        portfolio_stress_loss = total_value - 1  # 假设初始为1\r\n        \r\n        return {\r\n            \"scenario\": scenario,\r\n            \"description\": s[\"description\"],\r\n            \"portfolio_loss\": round(portfolio_stress_loss * 100, 2),\r\n            \"portfolio_value_after\": round(total_value * 100, 2),\r\n            \"position_impacts\": [\r\n                {\"name\": pos[\"name\"], \"weight\": pos[\"weight\"], \r\n                 \"shock\": round(shock * 100, 2), \"impact\": \"loss\" if shock < 0 else \"gain\"}\r\n                for pos, shock in zip(positions, \r\n                    [s.get(\"sector_impacts\", {}).get(pos.get(\"sector\", \"\"), \r\n                     s.get(\"market_shock\", -0.10)) for pos in positions])\r\n            ]\r\n        }\r\n```\r\n\r\n**情景结果对照表（一次跑完所有情景，横向比较）**\r\n\r\n| 情景 | 组合冲击 | 最受伤资产 | 相对受益资产 | 触发动作 | 复核频率 | 流动性假设 | |\r\n|------|---------|-----------|------------|---------|---|---|\r\n| 2015股灾重演 | −21.5% | 房地产、金融 | 医药 | 降仓、暂停加仓 | 每季 | 降至50% |\r\n| 利率急升100bp | −9.2% | 债券、权益、银行 | 现金类 | 缩短久期 | 每月 | 正常 |\r\n| 人民币急贬5% | −7.8% | 进口相关、消费 | 出口相关 | 核查外汇敞口 | 每月 | 正常 |\r\n| 黑天鹅-新冠 | −12.6% | 交运、零售 | 医药、线上 | 按行业再平衡 | 每季 | 正常 |\r\n| 流动性枯竭-量化踩踏 | −19.4% | 小市值、高换手 | 红利低波 | 优先减仓低流动性标的 | 每月 | 降至50% |\r\n| 利率下行50bp | +4.1% | 银行 | 债券、红利资产 | 适度提升久期 | 每季 | 正常 |\r\n\r\n**示例 1｜压力测试后的处置清单**\r\n\r\n| 优先级 | 处置动作 | 触发条件 | 责任人 | 时限 | 留痕要求 |\r\n|-------|---------|---------|-------|------|---|\r\n| 1 | 降低整体仓位至60%以下 | 任一情景损失>15% | 投资经理 | T+1 | 调仓记录+审批 |\r\n| 2 | 减仓流动性最差标的 | 流动性情景损失>威胁阈值 | 交易 | T+1 | 成交明细 |\r\n| 3 | 暂停同向新增买入 | 集中度超限 | 投资经理 | 即时 | 冻结记录 |\r\n| 4 | 补充现金缓冲 | 组合现金<5% | 投资经理 | T+2 | 现金台账 |\r\n| 5 | 出具情景专项说明 | 任一情景损失>10% | 风控 | T+3 | 专项说明归档 |\r\n\r\n**示例 2｜压力测试阈值设定（把结果变成规则）**\r\n\r\n| 指标 | 正常区间 | 预警线 | 处置线 | 超限后果 |\r\n|------|---------|-------|-------|---|\r\n| 单情景最大损失 | <10% | 10%-15% | >15% | 启动降仓预案 |\r\n| 组合年化波动率 | <18% | 18%-25% | >25% | 提交风险说明 |\r\n| 单标的权重 | <10% | 10%-15% | >15% | 暂停新增买入 |\r\n| 单一行业权重 | <25% | 25%-35% | >35% | 暂停新增买入 |\r\n| 前三大标的合计 | <30% | 30%-40% | >40% | 提交集中度说明 |\r\n| 压力情景下相关性 | <0.5 | 0.5-0.7 | >0.7 | 重估分散化假设 |\r\n\r\n**示例 3｜自建情景与历史情景的差异（两种都要有）**\r\n\r\n| 维度 | 历史情景（如2015股灾） | 自建情景（如量化踩踏） |\r\n|------|---------------------|---------------------|\r\n| 参数来源 | 真实历史区间 | 假设参数设定 |\r\n| 优点 | 有事实依据，易被接受 | 可覆盖历史上未发生的风险 |\r\n| 局限 | 难以覆盖新风险形态 | 参数设定主观，需说明依据 |\r\n| 使用方式 | 作为基准情景 | 至少保留2个自建极端情景 |\r\n\r\n配置建议：情景库至少6个，其中历史情景与自建情景各占一半；自建情景必须写明参数设定依据，避免“拍脑袋”设定导致结论不可复现。\r\n\r\n**示例 4｜自建情景的参数设定依据留痕表（应对模型复核）**\r\n\r\n| 情景 | 关键参数 | 设定依据 | 上次复核结论 | 复核频率 |\r\n|------|---------|---------|------------|----------|\r\n| 流动性枯竭-量化踩踏 | 成交额降至50%、相关性升至0.85 | 参照历史极端区间成交额萎缩幅度与相关性上浮观测值 | 参数合理，保留 | 每季 |\r\n| 利率急升100bp | 利率+100bp、债券−8% | 参照历史单季最大利率变动幅度 | 冲击偏轻，考虑上调至150bp | 每季 |\r\n| 人民币急贬5% | USD/CNY +5% | 参照历史单日最大波幅并留有余量 | 参数合理，保留 | 每季 |\r\n\r\n留痕要点：自建情景最容易被复核挑战的地方是“参数从哪来”。每个参数都要能追溯到一段可指认的历史观测或一项明确的假设，并注明复核日期与结论；参数无依据的情景在正式报告中不应使用。\r\n\r\n**示例 5｜压力测试结果与限额的联动（结果必须落到动作）**\r\n\r\n| 情景损失 | 限额状态 | 联动动作 | 是否需要审批 |\r\n|---------|---------|---------|------------|\r\n| <10% | 限额内 | 仅记录，不触发动作 | 否 |\r\n| 10%–15% | 预警区 | 出具情景专项说明，投资经理确认 | 风控负责人 |\r\n| >15% | 超限 | 启动降仓预案，T+1内降至60%以下 | 投决会 |\r\n| 流动性情景 >25% | 严重超限 | 优先减仓低流动性标的，冻结新增买入 | 投决会 |\r\n\r\n联动要点：压力测试不是“跑完出个数”，而是要把结果映射到限额层级与审批链。只输出损失百分比而不说明触发哪一级动作，报告在复核时会被判定为不可用。\r\n\r\n\r\n\r\n### 3. Risk Contribution Analysis / 风险贡献分析\r\n\r\n```python\r\n# 说明：以下方法为 PortfolioRiskAnalyzer 类的成员，此处单独摘出以突出算法口径，\r\n# 实际使用时应置于该类内部（与 calculate_var / calculate_cvar 等方法并列）。\r\n    def risk_contribution_by_asset(self) -> dict:\r\n        \"\"\"计算各资产风险贡献\"\"\"\r\n        cov_matrix = self.returns.cov()\r\n        portfolio_vol = np.sqrt(self.weights @ cov_matrix.values @ self.weights)\r\n        \r\n        # 边际风险贡献 (MCTR)\r\n        mctr = (cov_matrix.values @ self.weights) / portfolio_vol\r\n        \r\n        # 风险贡献\r\n        risk_contrib = self.weights * mctr\r\n        \r\n        return {\r\n            \"portfolio_volatility\": round(portfolio_vol * 100, 2),\r\n            \"asset_risk_contribution\": {\r\n                self.returns.columns[i]: round(rc * 100, 2)\r\n                for i, rc in enumerate(risk_contrib)\r\n            },\r\n            \"concentration_risk\": {\r\n                \"max_concentration\": round(max(risk_contrib) * 100, 2),\r\n                \"diversification_benefit\": round(\r\n                    (sum([self.returns[col].std() * w \r\n                         for col, w in zip(self.returns.columns, self.weights)]) - \r\n                     portfolio_vol) * 100, 2)\r\n            }\r\n        }\r\n```\r\n\r\n**示例 1｜权重与风险贡献的错位（最容易忽视的风险）**\r\n\r\n| 资产 | 权重 | 波动率 | 风险贡献 | 权重-风险差 | 结论 | 建议动作 |\r\n|------|------|-------|---------|-----------|------|---|\r\n| 股票A | 30% | 32% | 42% | −12pct | 风险贡献显著高于权重，需减配 | 减配至20%以下 |\r\n| 股票B | 20% | 20% | 14% | +6pct | 风险效率较高 | 可维持 |\r\n| 债券C | 40% | 6% | 9% | +31pct | 起到稳定器作用 | 保持压舱石 |\r\n| 黄金ETF | 10% | 15% | 6% | +4pct | 分散化贡献明显 | 保持 |\r\n| **组合** | 100% | — | 71%（含相关项） | — | 组合波动率 14.2% | 整体波动率达标 |\r\n\r\n解读要点：权重高不等于风险高——上例中权重30%的股票A贡献了42%的组合风险，是真正需要关注的对象；风险报告应同时展示权重与风险贡献两列，避免只看权重做决策。\r\n\r\n**示例 2｜分散化效果评估**\r\n\r\n| 场景 | 加权平均波动率 | 组合波动率 | 分散化收益 | 判断 | 应对 |\r\n|------|-------------|----------|-----------|------|---|\r\n| 常态市场 | 18.5% | 14.2% | 4.3pct | 分散化有效 | 维持现有结构 |\r\n| 相关性上浮至0.7 | 18.5% | 17.1% | 1.4pct | 效果显著减弱 | 准备降仓预案 |\r\n| 相关性上浮至0.85（踩踏情景） | 18.5% | 18.2% | 0.3pct | 几乎失效 | 按单一风险暴露处理 |\r\n\r\n解读要点：分散化在极端行情下会被显著削弱，\"平时低相关\"不能作为风险控制的唯一依据；报告须同时给出常态与压力情景下的分散化收益对比。\r\n\r\n**示例 3｜风险预算分配（把风险额度当成资源）**\r\n\r\n| 资产类别 | 风险预算 | 实际风险贡献 | 偏离 | 调整动作 | 复核周期 |\r\n|---------|---------|------------|-----|---------|---|\r\n| 权益 | 50% | 71% | +21pct | 减配，或增加低波动品种 | 每周 |\r\n| 固收 | 30% | 18% | −12pct | 可适度提升久期 | 每月 |\r\n| 商品/黄金 | 10% | 6% | −4pct | 保持 | 每月 |\r\n| 现金 | 10% | 5% | −5pct | 保持 | 每月 |\r\n\r\n使用要点：风险预算与实际贡献偏离超过10pct即需调整；调整时应优先通过降低高波动资产权重实现，而非简单增加杠杆。\r\n**示例 4｜相关性突变时的集中度重估**\r\n\r\n| 状态 | 平均相关性 | 有效分散标的数 | 单标的上限 | 处置 |\r\n|------|-----------|--------------|-----------|------|\r\n| 常态 | 0.30 | 约8个 | 15% | 按常规阈值 |\r\n| 预警 | 0.55 | 约4个 | 12% | 收紧单标的上限 |\r\n| 压力 | 0.85 | 约1.5个 | 8% | 视为单一风险暴露，整体降仓 |\r\n\r\n重估逻辑：相关性上升时，“持有10只标的”并不等于分散到10个风险源，须按有效分散标的数重估集中度上限；相关性进入压力区间后，分散化收益趋近于零，应直接按单一风险暴露处理。\r\n\r\n**示例 5｜资产法风险贡献与因子法归因的交叉验证**\r\n\r\n| 风险源 | 资产法风险贡献 | 因子法风险归因 | 差异 | 判断 |\r\n|-------|--------------|--------------|------|------|\r\n| 市场（Beta） | — | 58% | — | 因子法可拆分，资产法不可 |\r\n| 行业因子 | — | 21% | — | 同上 |\r\n| 个股特有风险 | 29%（残差项） | 21% | 8pct | 两法残差口径不同，需说明 |\r\n| 合计解释度 | 100% | R²=0.79 | — | 解释度尚可 |\r\n\r\n交叉验证要点：资产法回答“哪一只标的最危险”，因子法回答“组合暴露在哪类系统性风险上”，二者不可互相替代。若因子法R²低于0.7，说明模型遗漏了重要风险因子（常见为行业或风格因子缺失），此时因子归因结论不可单独用于调仓决策。\r\n\r\n**示例 6｜风险贡献超预算的分步减仓推演**\r\n\r\n| 步骤 | 动作 | 权益风险贡献变化 | 组合波动率变化 | 备注 |\r\n|------|------|----------------|--------------|------|\r\n| 现状 | 权益风险贡献71%，预算50% | 71% | 14.2% | 偏离+21pct |\r\n| 第一步 | 高波动个股A由30%降至20% | 61% | 12.8% | 优先降高波动标的 |\r\n| 第二步 | 增配低波红利品种至15% | 54% | 11.9% | 不引入新风险源 |\r\n| 第三步 | 现金比例由5%提至10% | 50% | 11.1% | 达标 |\r\n\r\n推演要点：调仓应分步进行并逐 step 观察风险贡献与组合波动率的联动，避免一次性大幅调仓带来交易成本与冲击成本。若推演后发现无论如何调整都无法把风险贡献压回预算，应反推风险预算本身是否设得过低，而不是硬凑达标。\r\n\r\n\r\n\r\n\r\n---\r\n\r\n## Quick Command Templates / 快速指令模板\r\n\r\n**组合风险评估：**\r\n```\r\n分析以下组合的风险：\r\n- 总规模：1000万\r\n- 持仓：[股票A 30%, 股票B 20%, 债券B 50%]\r\n- 置信度：95%\r\n```\r\n\r\n**压力测试：**\r\n```\r\n执行\"2015股灾重演\"情景压力测试\r\n```\r\n\r\n**多情景横向比较：**\r\n```\r\n对以下组合跑全部压力情景，输出情景损失对照表、\r\n最受伤资产、待触发处置动作与优先级：\r\n- 持仓：[标的与权重]\r\n- 组合规模：[X]万\r\n```\r\n\r\n**风险贡献与预算：**\r\n```\r\n计算以下组合各资产的风险贡献与风险预算偏离，\r\n给出单标的≤15%、单行业≤35%的集中度检查结果与调整建议。\r\n```\r\n\r\n---\r\n\r\n## Changelog / 版本变更\r\n\r\n| 版本 | 日期 | 变更摘要 |\r\n|------|------|---------|\r\n| 3.0.4 | 2026-10-08 | 收窄触发词并补充英文非触发清单（SQP-1）；监管动态更新至2026-10-08并新增风险揭示、模型风险管理两条与复核频率列；情景结果对照表新增流动性假设列；新增示例：VaR置信度与持有期换算、VaR回退测试、自建情景参数留痕表、压力结果与限额联动、资产法与因子法交叉验证、风险贡献分步减仓推演 |\r\n| 3.0.3 | 2026-09-30 | 新增口径登记表与集中度动态解读示例 |\r\n\r\n---\r\n\r\n\r\n## Disclaimer\r\n\r\nThis skill provides risk analysis tools for educational purposes. Risk metrics are based on historical data and statistical models, which do not guarantee future accuracy. Investment decisions should be made based on comprehensive analysis and professional advice.\n\nFile v3.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn74e704j3ygjcygnpf02rdvd185js13\",\n  \"slug\": \"security-portfolio-risk\",\n  \"version\": \"3.0.4\",\n  \"publishedAt\": 1791435940894\n}\n\nFile v3.0.4:skill-card.md\n\n## Description:\n\nHelps analysts assess China-market portfolio risk using VaR, stress tests, tail-risk measures, factor exposures, and risk-contribution analysis.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[gechengling](https://clawhub.ai/user/gechengling)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nFund managers and risk analysts use this skill to assess a holdings portfolio's VaR, stress losses, concentration, factor exposures, and risk contributions. Its methods and examples require independent validation before investment or reporting decisions.\n\n### Deployment Geography for Use:\n\nChina (market focus)\n\n## Known Risks and Mitigations:\n\nRisk: Historical data and model assumptions can produce misleading portfolio risk estimates.\n\nMitigation: Independently validate inputs, assumptions, and results through established risk-review procedures before relying on them.\n\nRisk: Portfolio details or unverified regulatory claims could be exposed or relied on inappropriately.\n\nMitigation: Provide only anonymized holdings, weights, and return data; verify regulatory claims and reportable results with the appropriate compliance team.\n\n## Reference(s):\n\n- [Security Portfolio Risk on ClawHub](https://clawhub.ai/gechengling/skills/security-portfolio-risk)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Guidance]\n\n**Output Format:** [Markdown analysis, tables, and illustrative Python code]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [No direct market-data access or code execution; independently review results before use.]\n\n## Skill Version(s):\n\n3.0.4 (source: skill frontmatter and server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.0.3: 3 files, 12803 bytes\n\nFiles: skill-card.md (1779b), SKILL.md (29187b), _meta.json (142b)\n\nFile v3.0.3:SKILL.md\n\n---\r\nname: Portfolio Risk Analysis Expert\r\nslug: security-portfolio-risk\r\ndescription: AI-powered portfolio risk analysis expert for China market — covers VaR calculation, stress testing, tail risk measurement, factor exposure analysis, and risk decomposition. Built for fund managers, risk analysts, and institutional investors. Keywords: portfolio risk, VaR, stress testing, risk decomposition, China A-share, factor risk, tail risk, 组合风险, 风险分析, VaR, 压力测试, 风险分解, 风险管理, 最大回撤, 夏普比率, 收益风险比, 资产配置, 风险预算.\r\nversion: \"3.0.3\"\r\n---\r\n\r\n# Portfolio Risk Analysis Expert / 组合风险分析专家\r\n\r\n> **English:** AI-powered portfolio risk analysis expert — covers VaR calculation, stress testing, tail risk measurement, factor exposure, and risk attribution. Built for fund managers and risk analysts.\r\n>\r\n> **中文:** 组合风险分析专家——覆盖VaR计算、压力测试、尾部风险度量、因子敞口分析、风险归因。适用：基金经理、风险分析师、机构投资者。\r\n\r\n\r\n---\r\n\r\n## 数据最小化声明与执行边界 / Data Minimisation & Execution Boundary\r\n\r\n**数据最小化前置声明：** 使用本技能时，请只提供风险测算所必需的输入——标的代码、权重、收益率或净值序列、已脱敏的组合规模（可用“1000万”这类量级，无需精确金额）。**不要**粘贴账户号、身份证号、实际成交明细、客户身份信息或未公开的持仓数据；个人持仓请用“标的+权重”的脱敏形式提供。\r\n\r\n**保存与预览确认：** 本技能不执行任何保存动作。若你在自己环境中依据本技能生成风险报告、压力测试结论或风险预算表，请在落盘或对外报送前**先预览结果、确认口径与阈值无误，再保存或提交**。\r\n\r\n**代码块性质与执行边界**\r\n\r\n| 内容 | 性质 | 谁来执行 |\r\n|------|------|---------|\r\n| `PortfolioRiskAnalyzer` 类（VaR/CVaR/回撤/因子归因） | 风险指标的计算口径说明 | 由风险分析师在自有风控系统中取数复现；技能不取数、不运行 |\r\n| `StressTestScenarios` 情景库与 `run_stress_test()` | 情景参数与冲击传导的示意 | 由风险分析师在自有系统中配置并运行 |\r\n| `risk_contribution_by_asset()` | 边际风险贡献（MCTR）的算法表达 | 同上，属教学示意 |\r\n| 口径登记表、阈值表、处置清单 | 管理用模板 | 由风控人员在机构流程中落实 |\r\n\r\n本技能未配置任何工具调用权限，不执行代码、不读写文件、不访问行情或持仓数据源，也不生成可直接报送的监管报表。文中代码块均为指标口径的教学示意，读者可在自己环境中参考实现；风险测算结果须经独立复核后方可用于决策。\r\n\r\n---\r\n\r\n\r\n### 证券监管最新动态 [2026-09-30更新]\r\n\r\n| 动态类型 | 内容摘要 | 影响范围 | 风险侧应对动作 | 责任岗 | 优先级 |\r\n|---------|---------|---------|--------------|-------|-------|\r\n| 证券监管 | 2026年Q1：市场波动加剧，组合风险管理要求提升 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险报告增设极端情景专项说明 | 风控 | 高 |\r\n| 证券监管 | 量化资金共振风险增加，极端行情止损策略需更新 | 组合风险模型需增加量化冲击和ESG风险维度 | 压力测试新增流动性枯竭情景 | 风控 | 高 |\r\n| 证券监管 | ESG投资分析要求扩大，组合风险需纳入ESG因素 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险分解单列ESG敞口维度 | 风控 | 中 |\r\n| 程序化交易 | 程序化交易报告与异常交易监控要求细化 | 极端行情下的流动性与波动归因 | 压力测试中区分程序化交易影响部分 | 风控 | 中 |\r\n| 信息披露 | 上市公司信息披露质量监管强化 | 风险模型的财务输入数据 | 模型输入须标注报告期与数据来源 | 风控 | 高 |\r\n| 估值与净值 | 净值化管理要求下风险指标披露趋严 | 产品风险报告与定期披露 | 波动率、回撤、VaR口径固定并留档 | 合规 | 高 |\r\n| 投资者保护 | 风险揭示与适当性匹配要求提升 | 产品风险等级与客户匹配 | 风险报告附适当性匹配说明 | 合规 | 高 |\r\n| 集中度管理 | 单一标的与单一行业集中度关注度提升 | 组合集中度指标 | 集中度阈值纳入日常监控与预警 | 风控 | 高 |\r\n| 估值与净值 | 2026年9月下旬：净值化产品的风险指标披露口径一致性要求进一步强化 | 定期报告、产品风险揭示书 | 波动率/回撤/VaR三项口径写进口径登记表并随报告留档 | 合规 | 高 |\r\n| 集中度管理 | 2026年三季度：单一标的与单一行业集中度的日常监控要求细化 | 组合集中度指标 | 集中度监控改为日频，超限当日报送投资经理 | 风控 | 高 |\r\n\r\n> **数据截止**: 2026-09-30 | 来源：证监会、交易所公开规则、行业公开信息\r\n> **声明**: 以上动态供参考，具体以官方最新发布为准\r\n\r\n**动态解读示例（四类高频场景）**\r\n\r\n- **场景A｜流动性枯竭情景**：压力测试仅覆盖价格冲击，未考虑成交量萎缩 → 命中\"量化共振风险\"要求 → 新增\"流动性降至50%+价格下跌20%\"的复合情景，输出无法顺利减仓的敞口估算。\r\n- **场景B｜ESG敞口单列**：风险分解仅按行业与因子拆分 → 命中\"ESG风险维度\"要求 → 在风险分解中增加ESG评级分布与高碳敞口占比。\r\n- **场景C｜口径固定留档**：不同报告的波动率口径时而日频、时而月频 → 命中\"口径固定披露\"要求 → 统一为日频年化并在报告中标注计算口径与样本区间。\r\n- **场景D｜集中度预警**：单标的市值占比升至18%未触发任何预警 → 命中\"集中度监控\"要求 → 设置单标的15%、单行业35%的预警线，超限自动进入整改流程。\r\n\r\n- **场景E｜口径不一致被问询**：同一产品季报用日频波动率、月报用月频波动率，数值无法比对 → 命中“口径一致性要求强化” → 建立口径登记表，把频率、样本窗口、无风险利率基准三项写死，每次出报告先对照登记表，改口径须留变更记录。\r\n- **场景F｜集中度监控滞后**：集中度按周监控，超限后已持仓三天 → 命中“日常监控细化” → 改为日频自动计算，超限当日推送投资经理与风控，并在T+1前给出减仓或冻结新增买入的处置结论。\r\n\r\n监控自检：口径看“是否跨报告一致”，集中度看“是否当日发现当日处置”。两条决定风险报告能否经得起复核。\r\n\r\n\r\n## Industry Pain Points / 行业痛点\r\n\r\n| Pain Point / 痛点 | Impact / 影响 | Solution / 本Skill解决方案 | 量化基线指标 / Baseline |\r\n|------------------|-------------|------------------------|----------------------|\r\n| **系统风险难预测** | 黑天鹅事件导致大幅回撤 | 极端情景压力测试+尾部风险分析 | 压力测试情景覆盖 ≥6类 |\r\n| **因子敞口不清晰** | 不知道组合暴露在哪些风险上 | 因子归因模型+敞口分解 | 因子解释度 R² ≥0.7 |\r\n| **回撤控制困难** | 持有人体验差，资金赎回压力 | 动态回撤监控+预警机制 | 最大回撤控制在预设阈值内 |\r\n| **相关性突变** | 平时低相关的资产大跌时齐跌 | 相关性压力测试+分散化效果评估 | 压力情景下相关性假设上浮至0.7+ |\r\n| **合规要求高** | 资管新规净值化要求 | 标准风险指标+监管报告 | 风险指标披露完整率 100% |\r\n| **集中度超标** | 单一标的/行业权重过高 | 集中度监控阈值+预警 | 单标的≤15%、单行业≤35% |\r\n| **尾部风险低估** | VaR未反映肥尾特征 | CVaR与修正VaR双口径 | 同时披露VaR与CVaR |\r\n| **口径不一致** | 跨报告指标不可比 | 计算口径登记表 | 口径一致率 100% |\r\n\r\n---\r\n\r\n## Trigger Keywords / 触发关键词\r\n\r\n**English Triggers:** portfolio risk, VaR, stress testing, risk decomposition, factor exposure, tail risk, risk attribution, China A-share, fund management, risk management\r\n\r\n**中文触发词（须落在“计算/分解一个组合的风险”任务上才触发）：** 组合风险分析 / 组合VaR / CVaR计算 / 组合压力测试 / 组合回撤分析 / 风险归因 / 因子敞口分解 / 尾部风险度量 / 风险贡献分析 / 风险预算分配 / 集中度风险检查 / 分散化效果评估 / 相关性压力测试\r\n\r\n**不触发（Scope Exclusions）：** 以下泛化词单独出现时**不**触发本技能——风险分析、风险管理、资产配置、分散化、波动率、夏普比率、风险调整收益、回撤控制。它们只有在明确指向“对某个持仓组合做量化风险测算或分解”时才路由到本技能；单只证券的风险特征、通用资产配置理论、泛化的风险管理咨询请改用对应技能。\r\n\r\n**路由判定三步：** ① 输入是否为一组持仓（标的+权重）？② 任务是否为计算VaR/CVaR、跑压力情景、分解风险贡献或检查集中度？③ 两者同时为“是”才启用。只问概念定义不启用。\r\n\r\n---\r\n\r\n## Core Capabilities / 核心能力\r\n\r\n### 1. VaR & Risk Metrics / VaR与风险指标\r\n\r\n```python\r\nimport numpy as np\r\nimport pandas as pd\r\nfrom scipy import stats\r\n\r\nclass PortfolioRiskAnalyzer:\r\n    \"\"\"组合风险分析引擎\"\"\"\r\n    \r\n    def __init__(self, returns: pd.DataFrame, weights: np.ndarray):\r\n        \"\"\"\r\n        Args:\r\n            returns: 收益率序列（列=资产，行=日期）\r\n            weights: 资产权重向量\r\n        \"\"\"\r\n        self.returns = returns\r\n        self.weights = weights\r\n        self.n_assets = len(weights)\r\n    \r\n    def calculate_var(self, confidence: float = 0.95, \r\n                      method: str = \"historical\") -> dict:\r\n        \"\"\"计算VaR（Value at Risk）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        \r\n        if method == \"historical\":\r\n            var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        elif method == \"parametric\":\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            var = stats.norm.ppf(1 - confidence, mu, sigma)\r\n        elif method == \"modified\":\r\n            # Cornish-Fisher调整\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            skew = stats.skew(portfolio_returns)\r\n            kurt = stats.kurtosis(portfolio_returns)\r\n            z = stats.norm.ppf(1 - confidence)\r\n            z_cf = (z + (z**2 - 1) * skew / 6 + \r\n                   (z**3 - 3*z) * kurt / 24 - \r\n                   (2*z**3 - 5*z) * skew**2 / 36)\r\n            var = mu + sigma * z_cf\r\n        \r\n        return {\r\n            \"var\": round(var * 100, 2),  # 百分比\r\n            \"var_amount\": round(var * 1000000, 2),  # 假设100万组合\r\n            \"confidence\": confidence,\r\n            \"method\": method,\r\n            \"interpretation\": f\"在{confidence*100}%置信度下，最大损失为{abs(var)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_cvar(self, confidence: float = 0.95) -> dict:\r\n        \"\"\"计算CVaR（Conditional VaR / Expected Shortfall）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        \r\n        cvar = portfolio_returns[portfolio_returns <= var].mean()\r\n        \r\n        return {\r\n            \"cvar\": round(cvar * 100, 2),\r\n            \"cvar_amount\": round(cvar * 1000000, 2),\r\n            \"interpretation\": f\"超过VaR时的平均损失为{abs(cvar)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_max_drawdown(self) -> dict:\r\n        \"\"\"计算最大回撤\"\"\"\r\n        cumulative = (1 + self.returns @ self.weights).cumprod()\r\n        running_max = cumulative.expanding().max()\r\n        drawdown = (cumulative - running_max) / running_max\r\n        \r\n        max_dd = drawdown.min()\r\n        max_dd_end = drawdown.idxmin()\r\n        max_dd_start = cumulative[:max_dd_end].idxmax()\r\n        \r\n        return {\r\n            \"max_drawdown\": round(max_dd * 100, 2),\r\n            \"peak_date\": str(max_dd_start.date()),\r\n            \"trough_date\": str(max_dd_end.date()),\r\n            \"recovery_date\": None  # 需后续计算\r\n        }\r\n    \r\n    def factor_risk_attribution(self, factor_returns: pd.DataFrame) -> dict:\r\n        \"\"\"因子风险归因\"\"\"\r\n        portfolio_returns = self.returns @ self.weights\r\n        \r\n        # 回归分析\r\n        X = factor_returns.values\r\n        X = np.column_stack([np.ones(len(X)), X])\r\n        y = portfolio_returns.values\r\n        \r\n        coeffs = np.linalg.lstsq(X, y, rcond=None)[0]\r\n        residuals = y - X @ coeffs\r\n        \r\n        # 分解方差\r\n        total_var = np.var(y)\r\n        factor_var = np.var(X[:, 1:] @ coeffs[1:])\r\n        specific_var = np.var(residuals)\r\n        \r\n        return {\r\n            \"factor_exposure\": {\r\n                \"market\": round(coeffs[1], 3),\r\n                \"factors\": {\r\n                    col: round(coef, 3) \r\n                    for col, coef in zip(factor_returns.columns, coeffs[2:])\r\n                }\r\n            },\r\n            \"risk_contribution\": {\r\n                \"factor_risk\": round(factor_var / total_var * 100, 2),\r\n                \"specific_risk\": round(specific_var / total_var * 100, 2)\r\n            },\r\n            \"r_squared\": round(1 - specific_var / total_var, 4)\r\n        }\r\n```\r\n\r\n**VaR 三种方法对比（同一组合结果可能差异明显）**\r\n\r\n| 方法 | 假设 | 适用场景 | 优点 | 局限 | 报告披露要求 |\r\n|------|------|---------|------|------|---|\r\n| 历史模拟法 | 未来分布与历史一致 | 样本充足、分布未知 | 不依赖分布假设 | 依赖历史窗口，肥尾可能漏估 | 须注明样本窗口 |\r\n| 参数法（正态） | 收益率服从正态分布 | 快速估算、常规监控 | 计算快、易解释 | 低估极端损失 | 须提示低估风险 |\r\n| 修正VaR（Cornish-Fisher） | 引入偏度与峰度 | 收益率非正态的市场 | 能反映肥尾特征 | 参数估计误差敏感 | 须同时披露CVaR |\r\n\r\n实践建议：日常监控用历史模拟法，风险报告同时披露修正VaR与CVaR；若三者差异超过30%，须在报告中说明原因。\r\n\r\n**示例 1｜组合VaR手算与解读**\r\n\r\n- 输入：组合日收益率序列近250个交易日，95%置信度。\r\n- 历史模拟法：取第5百分位收益 = **−2.35%**，即\"95%置信度下，单日最大损失约2.35%\"。\r\n- 组合规模1000万元 → VaR金额 = 1000万 × 2.35% = **23.5万元**。\r\n- CVaR（超过VaR部分的均值）= **−3.62%** → 金额 **36.2万元**，说明极端日的平均损失比VaR更深。\r\n- 解读要点：VaR回答\"最多亏多少（在95%情形下）\"，CVaR回答\"突破之后平均亏多少\"，二者必须同时披露。\r\n\r\n**示例 2｜最大回撤解读与恢复期**\r\n\r\n| 项目 | 数值 | 说明 | 口径 |\r\n|------|------|------|---|\r\n| 最大回撤 | −18.6% | 峰值到谷底跌幅 | 复权净值口径 |\r\n| 峰值日期 | 2026-03-12 | 回撤起点 | 峰值日 |\r\n| 谷底日期 | 2026-05-28 | 回撤最深日 | 谷底日 |\r\n| 回撤持续天数 | 77天 | 下跌过程时长 | 自然日 |\r\n| 是否已恢复 | 否（当前−9.4%） | 尚未回到前高 | 相对峰值 |\r\n| 恢复所需时间 | 待观察 | 不应假设\"必然恢复\" | 不做恢复假设 |\r\n\r\n解读要点：回撤分析要给出三件事——多深、多久、是否恢复；只报\"最大回撤−18.6%\"而不说恢复状态会误导持有人。\r\n\r\n**风险指标口径登记表（避免跨报告不可比）**\r\n\r\n| 指标 | 计算口径 | 频率 | 样本窗口 | 备注 | 责任人 |\r\n|------|---------|------|---------|------|---|\r\n| 年化波动率 | 日收益率标准差×√244 | 日 | 近1年 | 采用交易日244天 | 风控 |\r\n| 最大回撤 | 复权净值峰值到谷底 | 日 | 成立以来 | 标注峰值与谷底日期 | 风控 |\r\n| 夏普比率 | (年化收益−无风险利率)/年化波动率 | 月 | 近1年 | 无风险利率用1年期国债 | 风控 |\r\n| VaR | 历史模拟法，95% | 日 | 近250日 | 同时披露CVaR | 风控 |\r\n| 跟踪误差 | 相对基准超额收益标准差 | 周 | 近1年 | 标注基准指数 | 风控 |\r\n\r\n**示例 3｜三种VaR差异过大时的排查（差异>30%即须说明）**\r\n\r\n| 排查项 | 检查内容 | 常见原因 |\r\n|-------|---------|---------|\r\n| 样本窗口 | 历史模拟法是否覆盖了极端区间 | 窗口过短，未包含大跌样本 |\r\n| 分布假设 | 参数法是否低估肥尾 | 收益率峰度显著高于正态 |\r\n| 偏度方向 | 修正VaR的方向是否合理 | 极端偏度导致Cornish-Fisher不稳定 |\r\n| 单位与频率 | 三种方法是否同频同年化 | 日VaR与年化VaR混用 |\r\n\r\n处置原则：三者差异超过30%时，报告中采用“修正VaR或CVaR”作为保守口径，并说明历史模拟法为何偏低；不得只披露数值最低的一种。\r\n\r\n\r\n\r\n### 2. Stress Testing / 压力测试\r\n\r\n```python\r\nclass StressTestScenarios:\r\n    \"\"\"压力测试情景库\"\"\"\r\n    \r\n    SCENARIOS = {\r\n        \"2015股灾重演\": {\r\n            \"description\": \"假设上证指数单周下跌20%\",\r\n            \"market_shock\": -0.20,\r\n            \"sector_impacts\": {\r\n                \"金融\": -0.25,\r\n                \"房地产\": -0.30,\r\n                \"消费\": -0.15,\r\n                \"科技\": -0.20,\r\n                \"医药\": -0.10\r\n            },\r\n            \"liquidity_shock\": 0.5  # 流动性降至50%\r\n        },\r\n        \r\n        \"利率急升\": {\r\n            \"description\": \"假设基准利率上调100bp\",\r\n            \"rate_shock\": 0.01,\r\n            \"bond_impact\": -0.08,\r\n            \"equity_impact\": -0.10,\r\n            \"bank_impact\": -0.05\r\n        },\r\n        \r\n        \"人民币急贬\": {\r\n            \"description\": \"假设USD/CNY一日升值5%\",\r\n            \"fx_shock\": 0.05,\r\n            \"export_related\": -0.15,\r\n            \"import_related\": 0.05,\r\n            \"domestic_consumer\": -0.08\r\n        },\r\n        \r\n        \"黑天鹅-新冠\": {\r\n            \"description\": \"类似2020年初疫情冲击\",\r\n            \"market_shock\": -0.12,\r\n            \"travel\": -0.30,\r\n            \"retail\": -0.20,\r\n            \"healthcare\": 0.10,\r\n            \"online\": 0.05\r\n        },\r\n        \r\n        \"流动性枯竭-量化踩踏\": {\r\n            \"description\": \"成交额萎缩至五成，程序化交易减仓放大波动\",\r\n            \"market_shock\": -0.18,\r\n            \"liquidity_shock\": 0.5,\r\n            \"sector_impacts\": {\r\n                \"小市值\": -0.28,\r\n                \"高换手\": -0.32,\r\n                \"大盘蓝筹\": -0.12,\r\n                \"红利低波\": -0.08\r\n            },\r\n            \"correlation_shift\": 0.85,\r\n            \"notes\": \"分散化效果在此情景下显著减弱\"\r\n        },\r\n        \r\n        \"利率下行-资产重定价\": {\r\n            \"description\": \"基准利率下调50bp，利率敏感资产重估\",\r\n            \"rate_shock\": -0.005,\r\n            \"bond_impact\": 0.04,\r\n            \"equity_impact\": 0.06,\r\n            \"bank_impact\": -0.03,\r\n            \"notes\": \"债券与红利资产受益，银行净息差承压\"\r\n        }\r\n    }\r\n    \r\n    def run_stress_test(self, portfolio: dict, scenario: str) -> dict:\r\n        \"\"\"执行压力测试\"\"\"\r\n        if scenario not in self.SCENARIOS:\r\n            raise ValueError(f\"Unknown scenario: {scenario}\")\r\n        \r\n        s = self.SCENARIOS[scenario]\r\n        positions = portfolio[\"positions\"]\r\n        \r\n        stressed_pnl = 0\r\n        stressed_values = []\r\n        \r\n        for pos in positions:\r\n            sector = pos.get(\"sector\", \"general\")\r\n            weight = pos[\"weight\"]\r\n            \r\n            # 根据情景调整\r\n            if \"sector_impacts\" in s and sector in s[\"sector_impacts\"]:\r\n                shock = s[\"sector_impacts\"][sector]\r\n            else:\r\n                shock = s.get(\"market_shock\", -0.10)\r\n            \r\n            pos_stressed = weight * (1 + shock)\r\n            stressed_values.append(pos_stressed)\r\n            stressed_pnl += weight * shock\r\n        \r\n        total_value = sum(stressed_values)\r\n        portfolio_stress_loss = total_value - 1  # 假设初始为1\r\n        \r\n        return {\r\n            \"scenario\": scenario,\r\n            \"description\": s[\"description\"],\r\n            \"portfolio_loss\": round(portfolio_stress_loss * 100, 2),\r\n            \"portfolio_value_after\": round(total_value * 100, 2),\r\n            \"position_impacts\": [\r\n                {\"name\": pos[\"name\"], \"weight\": pos[\"weight\"], \r\n                 \"shock\": round(shock * 100, 2), \"impact\": \"loss\" if shock < 0 else \"gain\"}\r\n                for pos, shock in zip(positions, \r\n                    [s.get(\"sector_impacts\", {}).get(pos.get(\"sector\", \"\"), \r\n                     s.get(\"market_shock\", -0.10)) for pos in positions])\r\n            ]\r\n        }\r\n```\r\n\r\n**情景结果对照表（一次跑完所有情景，横向比较）**\r\n\r\n| 情景 | 组合冲击 | 最受伤资产 | 相对受益资产 | 触发动作 | 复核频率 |\r\n|------|---------|-----------|------------|---------|---|\r\n| 2015股灾重演 | −21.5% | 房地产、金融 | 医药 | 降仓、暂停加仓 | 每季 |\r\n| 利率急升100bp | −9.2% | 债券、权益、银行 | 现金类 | 缩短久期 | 每月 |\r\n| 人民币急贬5% | −7.8% | 进口相关、消费 | 出口相关 | 核查外汇敞口 | 每月 |\r\n| 黑天鹅-新冠 | −12.6% | 交运、零售 | 医药、线上 | 按行业再平衡 | 每季 |\r\n| 流动性枯竭-量化踩踏 | −19.4% | 小市值、高换手 | 红利低波 | 优先减仓低流动性标的 | 每月 |\r\n| 利率下行50bp | +4.1% | 银行 | 债券、红利资产 | 适度提升久期 | 每季 |\r\n\r\n**示例 1｜压力测试后的处置清单**\r\n\r\n| 优先级 | 处置动作 | 触发条件 | 责任人 | 时限 | 留痕要求 |\r\n|-------|---------|---------|-------|------|---|\r\n| 1 | 降低整体仓位至60%以下 | 任一情景损失>15% | 投资经理 | T+1 | 调仓记录+审批 |\r\n| 2 | 减仓流动性最差标的 | 流动性情景损失>威胁阈值 | 交易 | T+1 | 成交明细 |\r\n| 3 | 暂停同向新增买入 | 集中度超限 | 投资经理 | 即时 | 冻结记录 |\r\n| 4 | 补充现金缓冲 | 组合现金<5% | 投资经理 | T+2 | 现金台账 |\r\n| 5 | 出具情景专项说明 | 任一情景损失>10% | 风控 | T+3 | 专项说明归档 |\r\n\r\n**示例 2｜压力测试阈值设定（把结果变成规则）**\r\n\r\n| 指标 | 正常区间 | 预警线 | 处置线 | 超限后果 |\r\n|------|---------|-------|-------|---|\r\n| 单情景最大损失 | <10% | 10%-15% | >15% | 启动降仓预案 |\r\n| 组合年化波动率 | <18% | 18%-25% | >25% | 提交风险说明 |\r\n| 单标的权重 | <10% | 10%-15% | >15% | 暂停新增买入 |\r\n| 单一行业权重 | <25% | 25%-35% | >35% | 暂停新增买入 |\r\n| 前三大标的合计 | <30% | 30%-40% | >40% | 提交集中度说明 |\r\n| 压力情景下相关性 | <0.5 | 0.5-0.7 | >0.7 | 重估分散化假设 |\r\n\r\n**示例 3｜自建情景与历史情景的差异（两种都要有）**\r\n\r\n| 维度 | 历史情景（如2015股灾） | 自建情景（如量化踩踏） |\r\n|------|---------------------|---------------------|\r\n| 参数来源 | 真实历史区间 | 假设参数设定 |\r\n| 优点 | 有事实依据，易被接受 | 可覆盖历史上未发生的风险 |\r\n| 局限 | 难以覆盖新风险形态 | 参数设定主观，需说明依据 |\r\n| 使用方式 | 作为基准情景 | 至少保留2个自建极端情景 |\r\n\r\n配置建议：情景库至少6个，其中历史情景与自建情景各占一半；自建情景必须写明参数设定依据，避免“拍脑袋”设定导致结论不可复现。\r\n\r\n\r\n\r\n### 3. Risk Contribution Analysis / 风险贡献分析\r\n\r\n```python\r\n# 说明：以下方法为 PortfolioRiskAnalyzer 类的成员，此处单独摘出以突出算法口径，\r\n# 实际使用时应置于该类内部（与 calculate_var / calculate_cvar 等方法并列）。\r\n    def risk_contribution_by_asset(self) -> dict:\r\n        \"\"\"计算各资产风险贡献\"\"\"\r\n        cov_matrix = self.returns.cov()\r\n        portfolio_vol = np.sqrt(self.weights @ cov_matrix.values @ self.weights)\r\n        \r\n        # 边际风险贡献 (MCTR)\r\n        mctr = (cov_matrix.values @ self.weights) / portfolio_vol\r\n        \r\n        # 风险贡献\r\n        risk_contrib = self.weights * mctr\r\n        \r\n        return {\r\n            \"portfolio_volatility\": round(portfolio_vol * 100, 2),\r\n            \"asset_risk_contribution\": {\r\n                self.returns.columns[i]: round(rc * 100, 2)\r\n                for i, rc in enumerate(risk_contrib)\r\n            },\r\n            \"concentration_risk\": {\r\n                \"max_concentration\": round(max(risk_contrib) * 100, 2),\r\n                \"diversification_benefit\": round(\r\n                    (sum([self.returns[col].std() * w \r\n                         for col, w in zip(self.returns.columns, self.weights)]) - \r\n                     portfolio_vol) * 100, 2)\r\n            }\r\n        }\r\n```\r\n\r\n**示例 1｜权重与风险贡献的错位（最容易忽视的风险）**\r\n\r\n| 资产 | 权重 | 波动率 | 风险贡献 | 权重-风险差 | 结论 | 建议动作 |\r\n|------|------|-------|---------|-----------|------|---|\r\n| 股票A | 30% | 32% | 42% | −12pct | 风险贡献显著高于权重，需减配 | 减配至20%以下 |\r\n| 股票B | 20% | 20% | 14% | +6pct | 风险效率较高 | 可维持 |\r\n| 债券C | 40% | 6% | 9% | +31pct | 起到稳定器作用 | 保持压舱石 |\r\n| 黄金ETF | 10% | 15% | 6% | +4pct | 分散化贡献明显 | 保持 |\r\n| **组合** | 100% | — | 71%（含相关项） | — | 组合波动率 14.2% | 整体波动率达标 |\r\n\r\n解读要点：权重高不等于风险高——上例中权重30%的股票A贡献了42%的组合风险，是真正需要关注的对象；风险报告应同时展示权重与风险贡献两列，避免只看权重做决策。\r\n\r\n**示例 2｜分散化效果评估**\r\n\r\n| 场景 | 加权平均波动率 | 组合波动率 | 分散化收益 | 判断 | 应对 |\r\n|------|-------------|----------|-----------|------|---|\r\n| 常态市场 | 18.5% | 14.2% | 4.3pct | 分散化有效 | 维持现有结构 |\r\n| 相关性上浮至0.7 | 18.5% | 17.1% | 1.4pct | 效果显著减弱 | 准备降仓预案 |\r\n| 相关性上浮至0.85（踩踏情景） | 18.5% | 18.2% | 0.3pct | 几乎失效 | 按单一风险暴露处理 |\r\n\r\n解读要点：分散化在极端行情下会被显著削弱，\"平时低相关\"不能作为风险控制的唯一依据；报告须同时给出常态与压力情景下的分散化收益对比。\r\n\r\n**示例 3｜风险预算分配（把风险额度当成资源）**\r\n\r\n| 资产类别 | 风险预算 | 实际风险贡献 | 偏离 | 调整动作 | 复核周期 |\r\n|---------|---------|------------|-----|---------|---|\r\n| 权益 | 50% | 71% | +21pct | 减配，或增加低波动品种 | 每周 |\r\n| 固收 | 30% | 18% | −12pct | 可适度提升久期 | 每月 |\r\n| 商品/黄金 | 10% | 6% | −4pct | 保持 | 每月 |\r\n| 现金 | 10% | 5% | −5pct | 保持 | 每月 |\r\n\r\n使用要点：风险预算与实际贡献偏离超过10pct即需调整；调整时应优先通过降低高波动资产权重实现，而非简单增加杠杆。\r\n**示例 4｜相关性突变时的集中度重估**\r\n\r\n| 状态 | 平均相关性 | 有效分散标的数 | 单标的上限 | 处置 |\r\n|------|-----------|--------------|-----------|------|\r\n| 常态 | 0.30 | 约8个 | 15% | 按常规阈值 |\r\n| 预警 | 0.55 | 约4个 | 12% | 收紧单标的上限 |\r\n| 压力 | 0.85 | 约1.5个 | 8% | 视为单一风险暴露，整体降仓 |\r\n\r\n重估逻辑：相关性上升时，“持有10只标的”并不等于分散到10个风险源，须按有效分散标的数重估集中度上限；相关性进入压力区间后，分散化收益趋近于零，应直接按单一风险暴露处理。\r\n\r\n\r\n\r\n\r\n---\r\n\r\n## Quick Command Templates / 快速指令模板\r\n\r\n**组合风险评估：**\r\n```\r\n分析以下组合的风险：\r\n- 总规模：1000万\r\n- 持仓：[股票A 30%, 股票B 20%, 债券B 50%]\r\n- 置信度：95%\r\n```\r\n\r\n**压力测试：**\r\n```\r\n执行\"2015股灾重演\"情景压力测试\r\n```\r\n\r\n**多情景横向比较：**\r\n```\r\n对以下组合跑全部压力情景，输出情景损失对照表、\r\n最受伤资产、待触发处置动作与优先级：\r\n- 持仓：[标的与权重]\r\n- 组合规模：[X]万\r\n```\r\n\r\n**风险贡献与预算：**\r\n```\r\n计算以下组合各资产的风险贡献与风险预算偏离，\r\n给出单标的≤15%、单行业≤35%的集中度检查结果与调整建议。\r\n```\r\n\r\n---\r\n\r\n## Disclaimer\r\n\r\nThis skill provides risk analysis tools for educational purposes. Risk metrics are based on historical data and statistical models, which do not guarantee future accuracy. Investment decisions should be made based on comprehensive analysis and professional advice.\n\nFile v3.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn74e704j3ygjcygnpf02rdvd185js13\",\n  \"slug\": \"security-portfolio-risk\",\n  \"version\": \"3.0.3\",\n  \"publishedAt\": 1790751899412\n}\n\nFile v3.0.3:skill-card.md\n\n## Description:\n\nGuides China A-share portfolio risk analysis using VaR, stress tests, tail-risk measures, factor exposure, and risk attribution.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[gechengling](https://clawhub.ai/user/gechengling)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nFund managers, risk analysts, and institutional investors use this skill to examine portfolio losses, stress scenarios, concentration, and risk contributions for China A-share holdings.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Risk estimates or regulatory claims could be mistaken for verified investment or compliance advice.\n\nMitigation: Independently verify risk results and regulatory claims before using them in investment or compliance workflows.\n\nRisk: Sharing raw portfolio records could expose sensitive holdings or personal information.\n\nMitigation: Provide only desensitized holdings, weights, returns, or NAV series needed for analysis.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/gechengling/skills/security-portfolio-risk)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Guidance]\n\n**Output Format:** [Markdown with illustrative code blocks and risk-analysis tables]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Educational examples and templates; no live data access or automated execution.]\n\n## Skill Version(s):\n\n3.0.3 (source: skill frontmatter and server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.0.2: 3 files, 10168 bytes\n\nFiles: skill-card.md (2188b), SKILL.md (22396b), _meta.json (142b)\n\nFile v3.0.2:SKILL.md\n\n---\r\nname: Portfolio Risk Analysis Expert\r\nslug: security-portfolio-risk\r\ndescription: AI-powered portfolio risk analysis expert for China market — covers VaR calculation, stress testing, tail risk measurement, factor exposure analysis, and risk decomposition. Built for fund managers, risk analysts, and institutional investors. Keywords: portfolio risk, VaR, stress testing, risk decomposition, China A-share, factor risk, tail risk, 组合风险, 风险分析, VaR, 压力测试, 风险分解, 风险管理, 最大回撤, 夏普比率, 收益风险比, 资产配置, 风险预算.\r\nversion: \"3.0.2\"\r\n---\r\n\r\n# Portfolio Risk Analysis Expert / 组合风险分析专家\r\n\r\n> **English:** AI-powered portfolio risk analysis expert — covers VaR calculation, stress testing, tail risk measurement, factor exposure, and risk attribution. Built for fund managers and risk analysts.\r\n>\r\n> **中文:** 组合风险分析专家——覆盖VaR计算、压力测试、尾部风险度量、因子敞口分析、风险归因。适用：基金经理、风险分析师、机构投资者。\r\n\r\n---\r\n\r\n\r\n### 证券监管最新动态 [2026-09-12更新]\r\n\r\n| 动态类型 | 内容摘要 | 影响范围 | 风险侧应对动作 | 责任岗 | 优先级 |\r\n|---------|---------|---------|--------------|-------|-------|\r\n| 证券监管 | 2026年Q1：市场波动加剧，组合风险管理要求提升 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险报告增设极端情景专项说明 | 风控 | 高 |\r\n| 证券监管 | 量化资金共振风险增加，极端行情止损策略需更新 | 组合风险模型需增加量化冲击和ESG风险维度 | 压力测试新增流动性枯竭情景 | 风控 | 高 |\r\n| 证券监管 | ESG投资分析要求扩大，组合风险需纳入ESG因素 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险分解单列ESG敞口维度 | 风控 | 中 |\r\n| 程序化交易 | 程序化交易报告与异常交易监控要求细化 | 极端行情下的流动性与波动归因 | 压力测试中区分程序化交易影响部分 | 风控 | 中 |\r\n| 信息披露 | 上市公司信息披露质量监管强化 | 风险模型的财务输入数据 | 模型输入须标注报告期与数据来源 | 风控 | 高 |\r\n| 估值与净值 | 净值化管理要求下风险指标披露趋严 | 产品风险报告与定期披露 | 波动率、回撤、VaR口径固定并留档 | 合规 | 高 |\r\n| 投资者保护 | 风险揭示与适当性匹配要求提升 | 产品风险等级与客户匹配 | 风险报告附适当性匹配说明 | 合规 | 高 |\r\n| 集中度管理 | 单一标的与单一行业集中度关注度提升 | 组合集中度指标 | 集中度阈值纳入日常监控与预警 | 风控 | 高 |\r\n\r\n> **数据截止**: 2026-09-12 | 来源：证监会、交易所公开规则、行业公开信息\r\n> **声明**: 以上动态供参考，具体以官方最新发布为准\r\n\r\n**动态解读示例（四类高频场景）**\r\n\r\n- **场景A｜流动性枯竭情景**：压力测试仅覆盖价格冲击，未考虑成交量萎缩 → 命中\"量化共振风险\"要求 → 新增\"流动性降至50%+价格下跌20%\"的复合情景，输出无法顺利减仓的敞口估算。\r\n- **场景B｜ESG敞口单列**：风险分解仅按行业与因子拆分 → 命中\"ESG风险维度\"要求 → 在风险分解中增加ESG评级分布与高碳敞口占比。\r\n- **场景C｜口径固定留档**：不同报告的波动率口径时而日频、时而月频 → 命中\"口径固定披露\"要求 → 统一为日频年化并在报告中标注计算口径与样本区间。\r\n- **场景D｜集中度预警**：单标的市值占比升至18%未触发任何预警 → 命中\"集中度监控\"要求 → 设置单标的15%、单行业35%的预警线，超限自动进入整改流程。\r\n\r\n## Industry Pain Points / 行业痛点\r\n\r\n| Pain Point / 痛点 | Impact / 影响 | Solution / 本Skill解决方案 | 量化基线指标 / Baseline |\r\n|------------------|-------------|------------------------|----------------------|\r\n| **系统风险难预测** | 黑天鹅事件导致大幅回撤 | 极端情景压力测试+尾部风险分析 | 压力测试情景覆盖 ≥6类 |\r\n| **因子敞口不清晰** | 不知道组合暴露在哪些风险上 | 因子归因模型+敞口分解 | 因子解释度 R² ≥0.7 |\r\n| **回撤控制困难** | 持有人体验差，资金赎回压力 | 动态回撤监控+预警机制 | 最大回撤控制在预设阈值内 |\r\n| **相关性突变** | 平时低相关的资产大跌时齐跌 | 相关性压力测试+分散化效果评估 | 压力情景下相关性假设上浮至0.7+ |\r\n| **合规要求高** | 资管新规净值化要求 | 标准风险指标+监管报告 | 风险指标披露完整率 100% |\r\n| **集中度超标** | 单一标的/行业权重过高 | 集中度监控阈值+预警 | 单标的≤15%、单行业≤35% |\r\n| **尾部风险低估** | VaR未反映肥尾特征 | CVaR与修正VaR双口径 | 同时披露VaR与CVaR |\r\n| **口径不一致** | 跨报告指标不可比 | 计算口径登记表 | 口径一致率 100% |\r\n\r\n---\r\n\r\n## Trigger Keywords / 触发关键词\r\n\r\n**English Triggers:** portfolio risk, VaR, stress testing, risk decomposition, factor exposure, tail risk, risk attribution, China A-share, fund management, risk management\r\n\r\n**中文触发词（优先）：** 组合风险 / 风险分析 / VaR / 压力测试 / 回撤控制 / 风险归因 / 因子敞口 / 尾部风险 / 风险分解 / 风险预警 / 资产配置 / 分散化 / 相关性分析 / 最大回撤 / 夏普比率 / 波动率 / 风险调整收益 / 风险预算 / VaR计算 / CVaR / ES\r\n\r\n---\r\n\r\n## Core Capabilities / 核心能力\r\n\r\n### 1. VaR & Risk Metrics / VaR与风险指标\r\n\r\n```python\r\nimport numpy as np\r\nimport pandas as pd\r\nfrom scipy import stats\r\n\r\nclass PortfolioRiskAnalyzer:\r\n    \"\"\"组合风险分析引擎\"\"\"\r\n    \r\n    def __init__(self, returns: pd.DataFrame, weights: np.ndarray):\r\n        \"\"\"\r\n        Args:\r\n            returns: 收益率序列（列=资产，行=日期）\r\n            weights: 资产权重向量\r\n        \"\"\"\r\n        self.returns = returns\r\n        self.weights = weights\r\n        self.n_assets = len(weights)\r\n    \r\n    def calculate_var(self, confidence: float = 0.95, \r\n                      method: str = \"historical\") -> dict:\r\n        \"\"\"计算VaR（Value at Risk）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        \r\n        if method == \"historical\":\r\n            var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        elif method == \"parametric\":\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            var = stats.norm.ppf(1 - confidence, mu, sigma)\r\n        elif method == \"modified\":\r\n            # Cornish-Fisher调整\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            skew = stats.skew(portfolio_returns)\r\n            kurt = stats.kurtosis(portfolio_returns)\r\n            z = stats.norm.ppf(1 - confidence)\r\n            z_cf = (z + (z**2 - 1) * skew / 6 + \r\n                   (z**3 - 3*z) * kurt / 24 - \r\n                   (2*z**3 - 5*z) * skew**2 / 36)\r\n            var = mu + sigma * z_cf\r\n        \r\n        return {\r\n            \"var\": round(var * 100, 2),  # 百分比\r\n            \"var_amount\": round(var * 1000000, 2),  # 假设100万组合\r\n            \"confidence\": confidence,\r\n            \"method\": method,\r\n            \"interpretation\": f\"在{confidence*100}%置信度下，最大损失为{abs(var)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_cvar(self, confidence: float = 0.95) -> dict:\r\n        \"\"\"计算CVaR（Conditional VaR / Expected Shortfall）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        \r\n        cvar = portfolio_returns[portfolio_returns <= var].mean()\r\n        \r\n        return {\r\n            \"cvar\": round(cvar * 100, 2),\r\n            \"cvar_amount\": round(cvar * 1000000, 2),\r\n            \"interpretation\": f\"超过VaR时的平均损失为{abs(cvar)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_max_drawdown(self) -> dict:\r\n        \"\"\"计算最大回撤\"\"\"\r\n        cumulative = (1 + self.returns @ self.weights).cumprod()\r\n        running_max = cumulative.expanding().max()\r\n        drawdown = (cumulative - running_max) / running_max\r\n        \r\n        max_dd = drawdown.min()\r\n        max_dd_end = drawdown.idxmin()\r\n        max_dd_start = cumulative[:max_dd_end].idxmax()\r\n        \r\n        return {\r\n            \"max_drawdown\": round(max_dd * 100, 2),\r\n            \"peak_date\": str(max_dd_start.date()),\r\n            \"trough_date\": str(max_dd_end.date()),\r\n            \"recovery_date\": None  # 需后续计算\r\n        }\r\n    \r\n    def factor_risk_attribution(self, factor_returns: pd.DataFrame) -> dict:\r\n        \"\"\"因子风险归因\"\"\"\r\n        portfolio_returns = self.returns @ self.weights\r\n        \r\n        # 回归分析\r\n        X = factor_returns.values\r\n        X = np.column_stack([np.ones(len(X)), X])\r\n        y = portfolio_returns.values\r\n        \r\n        coeffs = np.linalg.lstsq(X, y, rcond=None)[0]\r\n        residuals = y - X @ coeffs\r\n        \r\n        # 分解方差\r\n        total_var = np.var(y)\r\n        factor_var = np.var(X[:, 1:] @ coeffs[1:])\r\n        specific_var = np.var(residuals)\r\n        \r\n        return {\r\n            \"factor_exposure\": {\r\n                \"market\": round(coeffs[1], 3),\r\n                \"factors\": {\r\n                    col: round(coef, 3) \r\n                    for col, coef in zip(factor_returns.columns, coeffs[2:])\r\n                }\r\n            },\r\n            \"risk_contribution\": {\r\n                \"factor_risk\": round(factor_var / total_var * 100, 2),\r\n                \"specific_risk\": round(specific_var / total_var * 100, 2)\r\n            },\r\n            \"r_squared\": round(1 - specific_var / total_var, 4)\r\n        }\r\n```\r\n\r\n**VaR 三种方法对比（同一组合结果可能差异明显）**\r\n\r\n| 方法 | 假设 | 适用场景 | 优点 | 局限 |\r\n|------|------|---------|------|------|\r\n| 历史模拟法 | 未来分布与历史一致 | 样本充足、分布未知 | 不依赖分布假设 | 依赖历史窗口，肥尾可能漏估 |\r\n| 参数法（正态） | 收益率服从正态分布 | 快速估算、常规监控 | 计算快、易解释 | 低估极端损失 |\r\n| 修正VaR（Cornish-Fisher） | 引入偏度与峰度 | 收益率非正态的市场 | 能反映肥尾特征 | 参数估计误差敏感 |\r\n\r\n实践建议：日常监控用历史模拟法，风险报告同时披露修正VaR与CVaR；若三者差异超过30%，须在报告中说明原因。\r\n\r\n**示例 1｜组合VaR手算与解读**\r\n\r\n- 输入：组合日收益率序列近250个交易日，95%置信度。\r\n- 历史模拟法：取第5百分位收益 = **−2.35%**，即\"95%置信度下，单日最大损失约2.35%\"。\r\n- 组合规模1000万元 → VaR金额 = 1000万 × 2.35% = **23.5万元**。\r\n- CVaR（超过VaR部分的均值）= **−3.62%** → 金额 **36.2万元**，说明极端日的平均损失比VaR更深。\r\n- 解读要点：VaR回答\"最多亏多少（在95%情形下）\"，CVaR回答\"突破之后平均亏多少\"，二者必须同时披露。\r\n\r\n**示例 2｜最大回撤解读与恢复期**\r\n\r\n| 项目 | 数值 | 说明 |\r\n|------|------|------|\r\n| 最大回撤 | −18.6% | 峰值到谷底跌幅 |\r\n| 峰值日期 | 2026-03-12 | 回撤起点 |\r\n| 谷底日期 | 2026-05-28 | 回撤最深日 |\r\n| 回撤持续天数 | 77天 | 下跌过程时长 |\r\n| 是否已恢复 | 否（当前−9.4%） | 尚未回到前高 |\r\n| 恢复所需时间 | 待观察 | 不应假设\"必然恢复\" |\r\n\r\n解读要点：回撤分析要给出三件事——多深、多久、是否恢复；只报\"最大回撤−18.6%\"而不说恢复状态会误导持有人。\r\n\r\n**风险指标口径登记表（避免跨报告不可比）**\r\n\r\n| 指标 | 计算口径 | 频率 | 样本窗口 | 备注 |\r\n|------|---------|------|---------|------|\r\n| 年化波动率 | 日收益率标准差×√244 | 日 | 近1年 | 采用交易日244天 |\r\n| 最大回撤 | 复权净值峰值到谷底 | 日 | 成立以来 | 标注峰值与谷底日期 |\r\n| 夏普比率 | (年化收益−无风险利率)/年化波动率 | 月 | 近1年 | 无风险利率用1年期国债 |\r\n| VaR | 历史模拟法，95% | 日 | 近250日 | 同时披露CVaR |\r\n| 跟踪误差 | 相对基准超额收益标准差 | 周 | 近1年 | 标注基准指数 |\r\n\r\n### 2. Stress Testing / 压力测试\r\n\r\n```python\r\nclass StressTestScenarios:\r\n    \"\"\"压力测试情景库\"\"\"\r\n    \r\n    SCENARIOS = {\r\n        \"2015股灾重演\": {\r\n            \"description\": \"假设上证指数单周下跌20%\",\r\n            \"market_shock\": -0.20,\r\n            \"sector_impacts\": {\r\n                \"金融\": -0.25,\r\n                \"房地产\": -0.30,\r\n                \"消费\": -0.15,\r\n                \"科技\": -0.20,\r\n                \"医药\": -0.10\r\n            },\r\n            \"liquidity_shock\": 0.5  # 流动性降至50%\r\n        },\r\n        \r\n        \"利率急升\": {\r\n            \"description\": \"假设基准利率上调100bp\",\r\n            \"rate_shock\": 0.01,\r\n            \"bond_impact\": -0.08,\r\n            \"equity_impact\": -0.10,\r\n            \"bank_impact\": -0.05\r\n        },\r\n        \r\n        \"人民币急贬\": {\r\n            \"description\": \"假设USD/CNY一日升值5%\",\r\n            \"fx_shock\": 0.05,\r\n            \"export_related\": -0.15,\r\n            \"import_related\": 0.05,\r\n            \"domestic_consumer\": -0.08\r\n        },\r\n        \r\n        \"黑天鹅-新冠\": {\r\n            \"description\": \"类似2020年初疫情冲击\",\r\n            \"market_shock\": -0.12,\r\n            \"travel\": -0.30,\r\n            \"retail\": -0.20,\r\n            \"healthcare\": 0.10,\r\n            \"online\": 0.05\r\n        },\r\n        \r\n        \"流动性枯竭-量化踩踏\": {\r\n            \"description\": \"成交额萎缩至五成，程序化交易减仓放大波动\",\r\n            \"market_shock\": -0.18,\r\n            \"liquidity_shock\": 0.5,\r\n            \"sector_impacts\": {\r\n                \"小市值\": -0.28,\r\n                \"高换手\": -0.32,\r\n                \"大盘蓝筹\": -0.12,\r\n                \"红利低波\": -0.08\r\n            },\r\n            \"correlation_shift\": 0.85,\r\n            \"notes\": \"分散化效果在此情景下显著减弱\"\r\n        },\r\n        \r\n        \"利率下行-资产重定价\": {\r\n            \"description\": \"基准利率下调50bp，利率敏感资产重估\",\r\n            \"rate_shock\": -0.005,\r\n            \"bond_impact\": 0.04,\r\n            \"equity_impact\": 0.06,\r\n            \"bank_impact\": -0.03,\r\n            \"notes\": \"债券与红利资产受益，银行净息差承压\"\r\n        }\r\n    }\r\n    \r\n    def run_stress_test(self, portfolio: dict, scenario: str) -> dict:\r\n        \"\"\"执行压力测试\"\"\"\r\n        if scenario not in self.SCENARIOS:\r\n            raise ValueError(f\"Unknown scenario: {scenario}\")\r\n        \r\n        s = self.SCENARIOS[scenario]\r\n        positions = portfolio[\"positions\"]\r\n        \r\n        stressed_pnl = 0\r\n        stressed_values = []\r\n        \r\n        for pos in positions:\r\n            sector = pos.get(\"sector\", \"general\")\r\n            weight = pos[\"weight\"]\r\n            \r\n            # 根据情景调整\r\n            if \"sector_impacts\" in s and sector in s[\"sector_impacts\"]:\r\n                shock = s[\"sector_impacts\"][sector]\r\n            else:\r\n                shock = s.get(\"market_shock\", -0.10)\r\n            \r\n            pos_stressed = weight * (1 + shock)\r\n            stressed_values.append(pos_stressed)\r\n            stressed_pnl += weight * shock\r\n        \r\n        total_value = sum(stressed_values)\r\n        portfolio_stress_loss = total_value - 1  # 假设初始为1\r\n        \r\n        return {\r\n            \"scenario\": scenario,\r\n            \"description\": s[\"description\"],\r\n            \"portfolio_loss\": round(portfolio_stress_loss * 100, 2),\r\n            \"portfolio_value_after\": round(total_value * 100, 2),\r\n            \"position_impacts\": [\r\n                {\"name\": pos[\"name\"], \"weight\": pos[\"weight\"], \r\n                 \"shock\": round(shock * 100, 2), \"impact\": \"loss\" if shock < 0 else \"gain\"}\r\n                for pos, shock in zip(positions, \r\n                    [s.get(\"sector_impacts\", {}).get(pos.get(\"sector\", \"\"), \r\n                     s.get(\"market_shock\", -0.10)) for pos in positions])\r\n            ]\r\n        }\r\n```\r\n\r\n**情景结果对照表（一次跑完所有情景，横向比较）**\r\n\r\n| 情景 | 组合冲击 | 最受伤资产 | 相对受益资产 | 触发动作 |\r\n|------|---------|-----------|------------|---------|\r\n| 2015股灾重演 | −21.5% | 房地产、金融 | 医药 | 降仓、暂停加仓 |\r\n| 利率急升100bp | −9.2% | 债券、权益、银行 | 现金类 | 缩短久期 |\r\n| 人民币急贬5% | −7.8% | 进口相关、消费 | 出口相关 | 核查外汇敞口 |\r\n| 黑天鹅-新冠 | −12.6% | 交运、零售 | 医药、线上 | 按行业再平衡 |\r\n| 流动性枯竭-量化踩踏 | −19.4% | 小市值、高换手 | 红利低波 | 优先减仓低流动性标的 |\r\n| 利率下行50bp | +4.1% | 银行 | 债券、红利资产 | 适度提升久期 |\r\n\r\n**示例 1｜压力测试后的处置清单**\r\n\r\n| 优先级 | 处置动作 | 触发条件 | 责任人 | 时限 |\r\n|-------|---------|---------|-------|------|\r\n| 1 | 降低整体仓位至60%以下 | 任一情景损失>15% | 投资经理 | T+1 |\r\n| 2 | 减仓流动性最差标的 | 流动性情景损失>威胁阈值 | 交易 | T+1 |\r\n| 3 | 暂停同向新增买入 | 集中度超限 | 投资经理 | 即时 |\r\n| 4 | 补充现金缓冲 | 组合现金<5% | 投资经理 | T+2 |\r\n| 5 | 出具情景专项说明 | 任一情景损失>10% | 风控 | T+3 |\r\n\r\n**示例 2｜压力测试阈值设定（把结果变成规则）**\r\n\r\n| 指标 | 正常区间 | 预警线 | 处置线 |\r\n|------|---------|-------|-------|\r\n| 单情景最大损失 | <10% | 10%-15% | >15% |\r\n| 组合年化波动率 | <18% | 18%-25% | >25% |\r\n| 单标的权重 | <10% | 10%-15% | >15% |\r\n| 单一行业权重 | <25% | 25%-35% | >35% |\r\n| 前三大标的合计 | <30% | 30%-40% | >40% |\r\n| 压力情景下相关性 | <0.5 | 0.5-0.7 | >0.7 |\r\n\r\n### 3. Risk Contribution Analysis / 风险贡献分析\r\n\r\n```python\r\n    def risk_contribution_by_asset(self) -> dict:\r\n        \"\"\"计算各资产风险贡献\"\"\"\r\n        cov_matrix = self.returns.cov()\r\n        portfolio_vol = np.sqrt(self.weights @ cov_matrix.values @ self.weights)\r\n        \r\n        # 边际风险贡献 (MCTR)\r\n        mctr = (cov_matrix.values @ self.weights) / portfolio_vol\r\n        \r\n        # 风险贡献\r\n        risk_contrib = self.weights * mctr\r\n        \r\n        return {\r\n            \"portfolio_volatility\": round(portfolio_vol * 100, 2),\r\n            \"asset_risk_contribution\": {\r\n                self.returns.columns[i]: round(rc * 100, 2)\r\n                for i, rc in enumerate(risk_contrib)\r\n            },\r\n            \"concentration_risk\": {\r\n                \"max_concentration\": round(max(risk_contrib) * 100, 2),\r\n                \"diversification_benefit\": round(\r\n                    (sum([self.returns[col].std() * w \r\n                         for col, w in zip(self.returns.columns, self.weights)]) - \r\n                     portfolio_vol) * 100, 2)\r\n            }\r\n        }\r\n```\r\n\r\n**示例 1｜权重与风险贡献的错位（最容易忽视的风险）**\r\n\r\n| 资产 | 权重 | 波动率 | 风险贡献 | 权重-风险差 | 结论 |\r\n|------|------|-------|---------|-----------|------|\r\n| 股票A | 30% | 32% | 42% | −12pct | 风险贡献显著高于权重，需减配 |\r\n| 股票B | 20% | 20% | 14% | +6pct | 风险效率较高 |\r\n| 债券C | 40% | 6% | 9% | +31pct | 起到稳定器作用 |\r\n| 黄金ETF | 10% | 15% | 6% | +4pct | 分散化贡献明显 |\r\n| **组合** | 100% | — | 71%（含相关项） | — | 组合波动率 14.2% |\r\n\r\n解读要点：权重高不等于风险高——上例中权重30%的股票A贡献了42%的组合风险，是真正需要关注的对象；风险报告应同时展示权重与风险贡献两列，避免只看权重做决策。\r\n\r\n**示例 2｜分散化效果评估**\r\n\r\n| 场景 | 加权平均波动率 | 组合波动率 | 分散化收益 | 判断 |\r\n|------|-------------|----------|-----------|------|\r\n| 常态市场 | 18.5% | 14.2% | 4.3pct | 分散化有效 |\r\n| 相关性上浮至0.7 | 18.5% | 17.1% | 1.4pct | 效果显著减弱 |\r\n| 相关性上浮至0.85（踩踏情景） | 18.5% | 18.2% | 0.3pct | 几乎失效 |\r\n\r\n解读要点：分散化在极端行情下会被显著削弱，\"平时低相关\"不能作为风险控制的唯一依据；报告须同时给出常态与压力情景下的分散化收益对比。\r\n\r\n**示例 3｜风险预算分配（把风险额度当成资源）**\r\n\r\n| 资产类别 | 风险预算 | 实际风险贡献 | 偏离 | 调整动作 |\r\n|---------|---------|------------|-----|---------|\r\n| 权益 | 50% | 71% | +21pct | 减配，或增加低波动品种 |\r\n| 固收 | 30% | 18% | −12pct | 可适度提升久期 |\r\n| 商品/黄金 | 10% | 6% | −4pct | 保持 |\r\n| 现金 | 10% | 5% | −5pct | 保持 |\r\n\r\n使用要点：风险预算与实际贡献偏离超过10pct即需调整；调整时应优先通过降低高波动资产权重实现，而非简单增加杠杆。\r\n\r\n---\r\n\r\n## Quick Command Templates / 快速指令模板\r\n\r\n**组合风险评估：**\r\n```\r\n分析以下组合的风险：\r\n- 总规模：1000万\r\n- 持仓：[股票A 30%, 股票B 20%, 债券B 50%]\r\n- 置信度：95%\r\n```\r\n\r\n**压力测试：**\r\n```\r\n执行\"2015股灾重演\"情景压力测试\r\n```\r\n\r\n**多情景横向比较：**\r\n```\r\n对以下组合跑全部压力情景，输出情景损失对照表、\r\n最受伤资产、待触发处置动作与优先级：\r\n- 持仓：[标的与权重]\r\n- 组合规模：[X]万\r\n```\r\n\r\n**风险贡献与预算：**\r\n```\r\n计算以下组合各资产的风险贡献与风险预算偏离，\r\n给出单标的≤15%、单行业≤35%的集中度检查结果与调整建议。\r\n```\r\n\r\n---\r\n\r\n## Disclaimer\r\n\r\nThis skill provides risk analysis tools for educational purposes. Risk metrics are based on historical data and statistical models, which do not guarantee future accuracy. Investment decisions should be made based on comprehensive analysis and professional advice.\n\nFile v3.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn74e704j3ygjcygnpf02rdvd185js13\",\n  \"slug\": \"security-portfolio-risk\",\n  \"version\": \"3.0.2\",\n  \"publishedAt\": 1789197597690\n}\n\nFile v3.0.2:skill-card.md\n\n## Description:\n\nProvides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[gechengling](https://clawhub.ai/user/gechengling)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nFund managers, risk analysts, and institutional investors use this skill to analyze China A-share portfolio risk, including VaR, CVaR, stress scenarios, drawdown, factor exposure, and risk contribution. It supports risk reporting and review workflows but should not be treated as authoritative investment or compliance advice.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Finance and regulatory outputs may be stale, incomplete, or dependent on model assumptions.\n\nMitigation: Verify regulatory updates, market data, and calculation assumptions against authoritative sources before using outputs for investment, risk, or compliance decisions.\n\nRisk: Broad finance trigger phrases could activate the skill in ordinary discussions where portfolio-risk analysis was not intended.\n\nMitigation: Use narrower trigger phrases or deployment routing when accidental activation would create workflow noise or inappropriate advice.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/gechengling/skills/security-portfolio-risk)\n- [ClawHub publisher profile](https://clawhub.ai/user/gechengling)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, guidance]\n\n**Output Format:** [Markdown with tables, explanations, and optional Python code examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Educational finance-risk analysis; users should verify market data, regulatory updates, and model assumptions before relying on outputs.]\n\n## Skill Version(s):\n\n3.0.2 (source: frontmatter and release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.0.1: 3 files, 5996 bytes\n\nFiles: skill-card.md (2205b), SKILL.md (12205b), _meta.json (142b)\n\nFile v3.0.1:SKILL.md\n\n---\r\nname: Portfolio Risk Analysis Expert\r\nslug: security-portfolio-risk\r\ndescription: AI-powered portfolio risk analysis expert for China market — covers VaR calculation, stress testing, tail risk measurement, factor exposure analysis, and risk decomposition. Built for fund managers, risk analysts, and institutional investors. Keywords: portfolio risk, VaR, stress testing, risk decomposition, China A-share, factor risk, tail risk, 组合风险, 风险分析, VaR, 压力测试, 风险分解, 风险管理, 最大回撤, 夏普比率, 收益风险比, 资产配置, 风险预算.\r\nversion: \"3.0.1\"\r\n---\r\n\r\n# Portfolio Risk Analysis Expert / 组合风险分析专家\r\n\r\n> **English:** AI-powered portfolio risk analysis expert — covers VaR calculation, stress testing, tail risk measurement, factor exposure, and risk attribution. Built for fund managers and risk analysts.\r\n>\r\n> **中文:** 组合风险分析专家——覆盖VaR计算、压力测试、尾部风险度量、因子敞口分析、风险归因。适用：基金经理、风险分析师、机构投资者。\r\n\r\n---\r\n\r\n\r\n### 证券监管最新动态 [2026-05-25更新]\r\n\r\n| 动态类型 | 内容摘要 | 影响范围 |\r\n|---------|---------|---------|\r\n| 证券监管 | 2026年Q1：市场波动加剧，组合风险管理要求提升 | 组合风险模型需增加量化冲击和ESG风险维度 |\r\n| 证券监管 | 量化资金共振风险增加，极端行情止损策略需更新 | 组合风险模型需增加量化冲击和ESG风险维度 |\r\n| 证券监管 | ESG投资分析要求扩大，组合风险需纳入ESG因素 | 组合风险模型需增加量化冲击和ESG风险维度 |\r\n\r\n> **数据截止**: 2026-05-25 | 来源：证监会、NFRA、中证协、安永Q1分析\r\n> **声明**: 以上动态供参考，具体以官方最新发布为准\r\n\r\n## Industry Pain Points / 行业痛点\r\n\r\n| Pain Point / 痛点 | Impact / 影响 | Solution / 本Skill解决方案 |\r\n|------------------|-------------|------------------------|\r\n| **系统风险难预测** | 黑天鹅事件导致大幅回撤 | 极端情景压力测试+尾部风险分析 |\r\n| **因子敞口不清晰** | 不知道组合暴露在哪些风险上 | 因子归因模型+敞口分解 |\r\n| **回撤控制困难** | 持有人体验差，资金赎回压力 | 动态回撤监控+预警机制 |\r\n| **相关性突变** | 平时低相关的资产大跌时齐跌 | 相关性压力测试+分散化效果评估 |\r\n| **合规要求高** | 资管新规净值化要求 | 标准风险指标+监管报告 |\r\n\r\n---\r\n\r\n## Trigger Keywords / 触发关键词\r\n\r\n**English Triggers:** portfolio risk, VaR, stress testing, risk decomposition, factor exposure, tail risk, risk attribution, China A-share, fund management, risk management\r\n\r\n**中文触发词（优先）：** 组合风险 / 风险分析 / VaR / 压力测试 / 回撤控制 / 风险归因 / 因子敞口 / 尾部风险 / 风险分解 / 风险预警 / 资产配置 / 分散化 / 相关性分析 / 最大回撤 / 夏普比率 / 波动率 / 风险调整收益 / 风险预算 / VaR计算 / CVaR / ES\r\n\r\n---\r\n\r\n## Core Capabilities / 核心能力\r\n\r\n### 1. VaR & Risk Metrics / VaR与风险指标\r\n\r\n```python\r\nimport numpy as np\r\nimport pandas as pd\r\nfrom scipy import stats\r\n\r\nclass PortfolioRiskAnalyzer:\r\n    \"\"\"组合风险分析引擎\"\"\"\r\n    \r\n    def __init__(self, returns: pd.DataFrame, weights: np.ndarray):\r\n        \"\"\"\r\n        Args:\r\n            returns: 收益率序列（列=资产，行=日期）\r\n            weights: 资产权重向量\r\n        \"\"\"\r\n        self.returns = returns\r\n        self.weights = weights\r\n        self.n_assets = len(weights)\r\n    \r\n    def calculate_var(self, confidence: float = 0.95, \r\n                      method: str = \"historical\") -> dict:\r\n        \"\"\"计算VaR（Value at Risk）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        \r\n        if method == \"historical\":\r\n            var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        elif method == \"parametric\":\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            var = stats.norm.ppf(1 - confidence, mu, sigma)\r\n        elif method == \"modified\":\r\n            # Cornish-Fisher调整\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            skew = stats.skew(portfolio_returns)\r\n            kurt = stats.kurtosis(portfolio_returns)\r\n            z = stats.norm.ppf(1 - confidence)\r\n            z_cf = (z + (z**2 - 1) * skew / 6 + \r\n                   (z**3 - 3*z) * kurt / 24 - \r\n                   (2*z**3 - 5*z) * skew**2 / 36)\r\n            var = mu + sigma * z_cf\r\n        \r\n        return {\r\n            \"var\": round(var * 100, 2),  # 百分比\r\n            \"var_amount\": round(var * 1000000, 2),  # 假设100万组合\r\n            \"confidence\": confidence,\r\n            \"method\": method,\r\n            \"interpretation\": f\"在{confidence*100}%置信度下，最大损失为{abs(var)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_cvar(self, confidence: float = 0.95) -> dict:\r\n        \"\"\"计算CVaR（Conditional VaR / Expected Shortfall）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        \r\n        cvar = portfolio_returns[portfolio_returns <= var].mean()\r\n        \r\n        return {\r\n            \"cvar\": round(cvar * 100, 2),\r\n            \"cvar_amount\": round(cvar * 1000000, 2),\r\n            \"interpretation\": f\"超过VaR时的平均损失为{abs(cvar)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_max_drawdown(self) -> dict:\r\n        \"\"\"计算最大回撤\"\"\"\r\n        cumulative = (1 + self.returns @ self.weights).cumprod()\r\n        running_max = cumulative.expanding().max()\r\n        drawdown = (cumulative - running_max) / running_max\r\n        \r\n        max_dd = drawdown.min()\r\n        max_dd_end = drawdown.idxmin()\r\n        max_dd_start = cumulative[:max_dd_end].idxmax()\r\n        \r\n        return {\r\n            \"max_drawdown\": round(max_dd * 100, 2),\r\n            \"peak_date\": str(max_dd_start.date()),\r\n            \"trough_date\": str(max_dd_end.date()),\r\n            \"recovery_date\": None  # 需后续计算\r\n        }\r\n    \r\n    def factor_risk_attribution(self, factor_returns: pd.DataFrame) -> dict:\r\n        \"\"\"因子风险归因\"\"\"\r\n        portfolio_returns = self.returns @ self.weights\r\n        \r\n        # 回归分析\r\n        X = factor_returns.values\r\n        X = np.column_stack([np.ones(len(X)), X])\r\n        y = portfolio_returns.values\r\n        \r\n        coeffs = np.linalg.lstsq(X, y, rcond=None)[0]\r\n        residuals = y - X @ coeffs\r\n        \r\n        # 分解方差\r\n        total_var = np.var(y)\r\n        factor_var = np.var(X[:, 1:] @ coeffs[1:])\r\n        specific_var = np.var(residuals)\r\n        \r\n        return {\r\n            \"factor_exposure\": {\r\n                \"market\": round(coeffs[1], 3),\r\n                \"factors\": {\r\n                    col: round(coef, 3) \r\n                    for col, coef in zip(factor_returns.columns, coeffs[2:])\r\n                }\r\n            },\r\n            \"risk_contribution\": {\r\n                \"factor_risk\": round(factor_var / total_var * 100, 2),\r\n                \"specific_risk\": round(specific_var / total_var * 100, 2)\r\n            },\r\n            \"r_squared\": round(1 - specific_var / total_var, 4)\r\n        }\r\n```\r\n\r\n### 2. Stress Testing / 压力测试\r\n\r\n```python\r\nclass StressTestScenarios:\r\n    \"\"\"压力测试情景库\"\"\"\r\n    \r\n    SCENARIOS = {\r\n        \"2015股灾重演\": {\r\n            \"description\": \"假设上证指数单周下跌20%\",\r\n            \"market_shock\": -0.20,\r\n            \"sector_impacts\": {\r\n                \"金融\": -0.25,\r\n                \"房地产\": -0.30,\r\n                \"消费\": -0.15,\r\n                \"科技\": -0.20,\r\n                \"医药\": -0.10\r\n            },\r\n            \"liquidity_shock\": 0.5  # 流动性降至50%\r\n        },\r\n        \r\n        \"利率急升\": {\r\n            \"description\": \"假设基准利率上调100bp\",\r\n            \"rate_shock\": 0.01,\r\n            \"bond_impact\": -0.08,\r\n            \"equity_impact\": -0.10,\r\n            \"bank_impact\": -0.05\r\n        },\r\n        \r\n        \"人民币急贬\": {\r\n            \"description\": \"假设USD/CNY一日升值5%\",\r\n            \"fx_shock\": 0.05,\r\n            \"export_related\": -0.15,\r\n            \"import_related\": 0.05,\r\n            \"domestic_consumer\": -0.08\r\n        },\r\n        \r\n        \"黑天鹅-新冠\": {\r\n            \"description\": \"类似2020年初疫情冲击\",\r\n            \"market_shock\": -0.12,\r\n            \"travel\": -0.30,\r\n            \"retail\": -0.20,\r\n            \"healthcare\": 0.10,\r\n            \"online\": 0.05\r\n        }\r\n    }\r\n    \r\n    def run_stress_test(self, portfolio: dict, scenario: str) -> dict:\r\n        \"\"\"执行压力测试\"\"\"\r\n        if scenario not in self.SCENARIOS:\r\n            raise ValueError(f\"Unknown scenario: {scenario}\")\r\n        \r\n        s = self.SCENARIOS[scenario]\r\n        positions = portfolio[\"positions\"]\r\n        \r\n        stressed_pnl = 0\r\n        stressed_values = []\r\n        \r\n        for pos in positions:\r\n            sector = pos.get(\"sector\", \"general\")\r\n            weight = pos[\"weight\"]\r\n            \r\n            # 根据情景调整\r\n            if \"sector_impacts\" in s and sector in s[\"sector_impacts\"]:\r\n                shock = s[\"sector_impacts\"][sector]\r\n            else:\r\n                shock = s.get(\"market_shock\", -0.10)\r\n            \r\n            pos_stressed = weight * (1 + shock)\r\n            stressed_values.append(pos_stressed)\r\n            stressed_pnl += weight * shock\r\n        \r\n        total_value = sum(stressed_values)\r\n        portfolio_stress_loss = total_value - 1  # 假设初始为1\r\n        \r\n        return {\r\n            \"scenario\": scenario,\r\n            \"description\": s[\"description\"],\r\n            \"portfolio_loss\": round(portfolio_stress_loss * 100, 2),\r\n            \"portfolio_value_after\": round(total_value * 100, 2),\r\n            \"position_impacts\": [\r\n                {\"name\": pos[\"name\"], \"weight\": pos[\"weight\"], \r\n                 \"shock\": round(shock * 100, 2), \"impact\": \"loss\" if shock < 0 else \"gain\"}\r\n                for pos, shock in zip(positions, \r\n                    [s.get(\"sector_impacts\", {}).get(pos.get(\"sector\", \"\"), \r\n                     s.get(\"market_shock\", -0.10)) for pos in positions])\r\n            ]\r\n        }\r\n```\r\n\r\n### 3. Risk Contribution Analysis / 风险贡献分析\r\n\r\n```python\r\n    def risk_contribution_by_asset(self) -> dict:\r\n        \"\"\"计算各资产风险贡献\"\"\"\r\n        cov_matrix = self.returns.cov()\r\n        portfolio_vol = np.sqrt(self.weights @ cov_matrix.values @ self.weights)\r\n        \r\n        # 边际风险贡献 (MCTR)\r\n        mctr = (cov_matrix.values @ self.weights) / portfolio_vol\r\n        \r\n        # 风险贡献\r\n        risk_contrib = self.weights * mctr\r\n        \r\n        return {\r\n            \"portfolio_volatility\": round(portfolio_vol * 100, 2),\r\n            \"asset_risk_contribution\": {\r\n                self.returns.columns[i]: round(rc * 100, 2)\r\n                for i, rc in enumerate(risk_contrib)\r\n            },\r\n            \"concentration_risk\": {\r\n                \"max_concentration\": round(max(risk_contrib) * 100, 2),\r\n                \"diversification_benefit\": round(\r\n                    (sum([self.returns[col].std() * w \r\n                         for col, w in zip(self.returns.columns, self.weights)]) - \r\n                     portfolio_vol) * 100, 2)\r\n            }\r\n        }\r\n```\r\n\r\n---\r\n\r\n## Quick Command Templates / 快速指令模板\r\n\r\n**组合风险评估：**\r\n```\r\n分析以下组合的风险：\r\n- 总规模：1000万\r\n- 持仓：[股票A 30%, 股票B 20%, 债券B 50%]\r\n- 置信度：95%\r\n```\r\n\r\n**压力测试：**\r\n```\r\n执行\"2015股灾重演\"情景压力测试\r\n```\r\n\r\n---\r\n\r\n## Disclaimer\r\n\r\nThis skill provides risk analysis tools for educational purposes. Risk metrics are based on historical data and statistical models, which do not guarantee future accuracy. Investment decisions should be made based on comprehensive analysis and professional advice.\n\nFile v3.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn74e704j3ygjcygnpf02rdvd185js13\",\n  \"slug\": \"security-portfolio-risk\",\n  \"version\": \"3.0.1\",\n  \"publishedAt\": 1779680435914\n}\n\nFile v3.0.1:skill-card.md\n\n## Description: <br>\nProvides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[gechengling](https://clawhub.ai/user/gechengling) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nFund managers, risk analysts, and institutional investors use this skill to structure portfolio risk analysis, including VaR, CVaR, stress testing, drawdown review, factor exposure analysis, and risk attribution for China-market portfolios. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Sensitive portfolio or client data may be shared during analysis requests. <br>\nMitigation: Use anonymized or appropriately approved data, and avoid sharing confidential client or portfolio details unless permitted. <br>\nRisk: Regulatory or investment claims may be outdated or unsuitable for a specific decision. <br>\nMitigation: Verify regulatory and investment claims against official sources and professional review before acting. <br>\nRisk: The skill may activate during broad finance discussions where portfolio risk analysis is not intended. <br>\nMitigation: Confirm the requested task and scope before applying portfolio risk guidance. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/gechengling/security-portfolio-risk) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, guidance] <br>\n**Output Format:** [Markdown with Python code examples and structured analysis prompts] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May include financial risk metric explanations, stress-test scenarios, and portfolio analysis templates.] <br>\n\n## Skill Version(s): <br>\n3.0.1 (source: server release metadata and frontmatter) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v2.0.0: 2 files, 4510 bytes\n\nFiles: SKILL.md (11471b), _meta.json (142b)\n\nFile v2.0.0:SKILL.md\n\n---\r\nname: Portfolio Risk Analysis Expert\r\nslug: security-portfolio-risk\r\ndescription: AI-powered portfolio risk analysis expert for China market — covers VaR calculation, stress testing, tail risk measurement, factor exposure analysis, and risk decomposition. Built for fund managers, risk analysts, and institutional investors. Keywords: portfolio risk, VaR, stress testing, risk decomposition, China A-share, factor risk, tail risk, 组合风险, 风险分析, VaR, 压力测试, 风险分解, 风险管理, 最大回撤, 夏普比率, 收益风险比, 资产配置, 风险预算.\r\nversion: 1.0.0\r\n---\r\n\r\n# Portfolio Risk Analysis Expert / 组合风险分析专家\r\n\r\n> **English:** AI-powered portfolio risk analysis expert — covers VaR calculation, stress testing, tail risk measurement, factor exposure, and risk attribution. Built for fund managers and risk analysts.\r\n>\r\n> **中文:** 组合风险分析专家——覆盖VaR计算、压力测试、尾部风险度量、因子敞口分析、风险归因。适用：基金经理、风险分析师、机构投资者。\r\n\r\n---\r\n\r\n## Industry Pain Points / 行业痛点\r\n\r\n| Pain Point / 痛点 | Impact / 影响 | Solution / 本Skill解决方案 |\r\n|------------------|-------------|------------------------|\r\n| **系统风险难预测** | 黑天鹅事件导致大幅回撤 | 极端情景压力测试+尾部风险分析 |\r\n| **因子敞口不清晰** | 不知道组合暴露在哪些风险上 | 因子归因模型+敞口分解 |\r\n| **回撤控制困难** | 持有人体验差，资金赎回压力 | 动态回撤监控+预警机制 |\r\n| **相关性突变** | 平时低相关的资产大跌时齐跌 | 相关性压力测试+分散化效果评估 |\r\n| **合规要求高** | 资管新规净值化要求 | 标准风险指标+监管报告 |\r\n\r\n---\r\n\r\n## Trigger Keywords / 触发关键词\r\n\r\n**English Triggers:** portfolio risk, VaR, stress testing, risk decomposition, factor exposure, tail risk, risk attribution, China A-share, fund management, risk management\r\n\r\n**中文触发词（优先）：** 组合风险 / 风险分析 / VaR / 压力测试 / 回撤控制 / 风险归因 / 因子敞口 / 尾部风险 / 风险分解 / 风险预警 / 资产配置 / 分散化 / 相关性分析 / 最大回撤 / 夏普比率 / 波动率 / 风险调整收益 / 风险预算 / VaR计算 / CVaR / ES\r\n\r\n---\r\n\r\n## Core Capabilities / 核心能力\r\n\r\n### 1. VaR & Risk Metrics / VaR与风险指标\r\n\r\n```python\r\nimport numpy as np\r\nimport pandas as pd\r\nfrom scipy import stats\r\n\r\nclass PortfolioRiskAnalyzer:\r\n    \"\"\"组合风险分析引擎\"\"\"\r\n    \r\n    def __init__(self, returns: pd.DataFrame, weights: np.ndarray):\r\n        \"\"\"\r\n        Args:\r\n            returns: 收益率序列（列=资产，行=日期）\r\n            weights: 资产权重向量\r\n        \"\"\"\r\n        self.returns = returns\r\n        self.weights = weights\r\n        self.n_assets = len(weights)\r\n    \r\n    def calculate_var(self, confidence: float = 0.95, \r\n                      method: str = \"historical\") -> dict:\r\n        \"\"\"计算VaR（Value at Risk）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        \r\n        if method == \"historical\":\r\n            var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        elif method == \"parametric\":\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            var = stats.norm.ppf(1 - confidence, mu, sigma)\r\n        elif method == \"modified\":\r\n            # Cornish-Fisher调整\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            skew = stats.skew(portfolio_returns)\r\n            kurt = stats.kurtosis(portfolio_returns)\r\n            z = stats.norm.ppf(1 - confidence)\r\n            z_cf = (z + (z**2 - 1) * skew / 6 + \r\n                   (z**3 - 3*z) * kurt / 24 - \r\n                   (2*z**3 - 5*z) * skew**2 / 36)\r\n            var = mu + sigma * z_cf\r\n        \r\n        return {\r\n            \"var\": round(var * 100, 2),  # 百分比\r\n            \"var_amount\": round(var * 1000000, 2),  # 假设100万组合\r\n            \"confidence\": confidence,\r\n            \"method\": method,\r\n            \"interpretation\": f\"在{confidence*100}%置信度下，最大损失为{abs(var)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_cvar(self, confidence: float = 0.95) -> dict:\r\n        \"\"\"计算CVaR（Conditional VaR / Expected Shortfall）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        \r\n        cvar = portfolio_returns[portfolio_returns <= var].mean()\r\n        \r\n        return {\r\n            \"cvar\": round(cvar * 100, 2),\r\n            \"cvar_amount\": round(cvar * 1000000, 2),\r\n            \"interpretation\": f\"超过VaR时的平均损失为{abs(cvar)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_max_drawdown(self) -> dict:\r\n        \"\"\"计算最大回撤\"\"\"\r\n        cumulative = (1 + self.returns @ self.weights).cumprod()\r\n        running_max = cumulative.expanding().max()\r\n        drawdown = (cumulative - running_max) / running_max\r\n        \r\n        max_dd = drawdown.min()\r\n        max_dd_end = drawdown.idxmin()\r\n        max_dd_start = cumulative[:max_dd_end].idxmax()\r\n        \r\n        return {\r\n            \"max_drawdown\": round(max_dd * 100, 2),\r\n            \"peak_date\": str(max_dd_start.date()),\r\n            \"trough_date\": str(max_dd_end.date()),\r\n            \"recovery_date\": None  # 需后续计算\r\n        }\r\n    \r\n    def factor_risk_attribution(self, factor_returns: pd.DataFrame) -> dict:\r\n        \"\"\"因子风险归因\"\"\"\r\n        portfolio_returns = self.returns @ self.weights\r\n        \r\n        # 回归分析\r\n        X = factor_returns.values\r\n        X = np.column_stack([np.ones(len(X)), X])\r\n        y = portfolio_returns.values\r\n        \r\n        coeffs = np.linalg.lstsq(X, y, rcond=None)[0]\r\n        residuals = y - X @ coeffs\r\n        \r\n        # 分解方差\r\n        total_var = np.var(y)\r\n        factor_var = np.var(X[:, 1:] @ coeffs[1:])\r\n        specific_var = np.var(residuals)\r\n        \r\n        return {\r\n            \"factor_exposure\": {\r\n                \"market\": round(coeffs[1], 3),\r\n                \"factors\": {\r\n                    col: round(coef, 3) \r\n                    for col, coef in zip(factor_returns.columns, coeffs[2:])\r\n                }\r\n            },\r\n            \"risk_contribution\": {\r\n                \"factor_risk\": round(factor_var / total_var * 100, 2),\r\n                \"specific_risk\": round(specific_var / total_var * 100, 2)\r\n            },\r\n            \"r_squared\": round(1 - specific_var / total_var, 4)\r\n        }\r\n```\r\n\r\n### 2. Stress Testing / 压力测试\r\n\r\n```python\r\nclass StressTestScenarios:\r\n    \"\"\"压力测试情景库\"\"\"\r\n    \r\n    SCENARIOS = {\r\n        \"2015股灾重演\": {\r\n            \"description\": \"假设上证指数单周下跌20%\",\r\n            \"market_shock\": -0.20,\r\n            \"sector_impacts\": {\r\n                \"金融\": -0.25,\r\n                \"房地产\": -0.30,\r\n                \"消费\": -0.15,\r\n                \"科技\": -0.20,\r\n                \"医药\": -0.10\r\n            },\r\n            \"liquidity_shock\": 0.5  # 流动性降至50%\r\n        },\r\n        \r\n        \"利率急升\": {\r\n            \"description\": \"假设基准利率上调100bp\",\r\n            \"rate_shock\": 0.01,\r\n            \"bond_impact\": -0.08,\r\n            \"equity_impact\": -0.10,\r\n            \"bank_impact\": -0.05\r\n        },\r\n        \r\n        \"人民币急贬\": {\r\n            \"description\": \"假设USD/CNY一日升值5%\",\r\n            \"fx_shock\": 0.05,\r\n            \"export_related\": -0.15,\r\n            \"import_related\": 0.05,\r\n            \"domestic_consumer\": -0.08\r\n        },\r\n        \r\n        \"黑天鹅-新冠\": {\r\n            \"description\": \"类似2020年初疫情冲击\",\r\n            \"market_shock\": -0.12,\r\n            \"travel\": -0.30,\r\n            \"retail\": -0.20,\r\n            \"healthcare\": 0.10,\r\n            \"online\": 0.05\r\n        }\r\n    }\r\n    \r\n    def run_stress_test(self, portfolio: dict, scenario: str) -> dict:\r\n        \"\"\"执行压力测试\"\"\"\r\n        if scenario not in self.SCENARIOS:\r\n            raise ValueError(f\"Unknown scenario: {scenario}\")\r\n        \r\n        s = self.SCENARIOS[scenario]\r\n        positions = portfolio[\"positions\"]\r\n        \r\n        stressed_pnl = 0\r\n        stressed_values = []\r\n        \r\n        for pos in positions:\r\n            sector = pos.get(\"sector\", \"general\")\r\n            weight = pos[\"weight\"]\r\n            \r\n            # 根据情景调整\r\n            if \"sector_impacts\" in s and sector in s[\"sector_impacts\"]:\r\n                shock = s[\"sector_impacts\"][sector]\r\n            else:\r\n                shock = s.get(\"market_shock\", -0.10)\r\n            \r\n            pos_stressed = weight * (1 + shock)\r\n            stressed_values.append(pos_stressed)\r\n            stressed_pnl += weight * shock\r\n        \r\n        total_value = sum(stressed_values)\r\n        portfolio_stress_loss = total_value - 1  # 假设初始为1\r\n        \r\n        return {\r\n            \"scenario\": scenario,\r\n            \"description\": s[\"description\"],\r\n            \"portfolio_loss\": round(portfolio_stress_loss * 100, 2),\r\n            \"portfolio_value_after\": round(total_value * 100, 2),\r\n            \"position_impacts\": [\r\n                {\"name\": pos[\"name\"], \"weight\": pos[\"weight\"], \r\n                 \"shock\": round(shock * 100, 2), \"impact\": \"loss\" if shock < 0 else \"gain\"}\r\n                for pos, shock in zip(positions, \r\n                    [s.get(\"sector_impacts\", {}).get(pos.get(\"sector\", \"\"), \r\n                     s.get(\"market_shock\", -0.10)) for pos in positions])\r\n            ]\r\n        }\r\n```\r\n\r\n### 3. Risk Contribution Analysis / 风险贡献分析\r\n\r\n```python\r\n    def risk_contribution_by_asset(self) -> dict:\r\n        \"\"\"计算各资产风险贡献\"\"\"\r\n        cov_matrix = self.returns.cov()\r\n        portfolio_vol = np.sqrt(self.weights @ cov_matrix.values @ self.weights)\r\n        \r\n        # 边际风险贡献 (MCTR)\r\n        mctr = (cov_matrix.values @ self.weights) / portfolio_vol\r\n        \r\n        # 风险贡献\r\n        risk_contrib = self.weights * mctr\r\n        \r\n        return {\r\n            \"portfolio_volatility\": round(portfolio_vol * 100, 2),\r\n            \"asset_risk_contribution\": {\r\n                self.returns.columns[i]: round(rc * 100, 2)\r\n                for i, rc in enumerate(risk_contrib)\r\n            },\r\n            \"concentration_risk\": {\r\n                \"max_concentration\": round(max(risk_contrib) * 100, 2),\r\n                \"diversification_benefit\": round(\r\n                    (sum([self.returns[col].std() * w \r\n                         for col, w in zip(self.returns.columns, self.weights)]) - \r\n                     portfolio_vol) * 100, 2)\r\n            }\r\n        }\r\n```\r\n\r\n---\r\n\r\n## Quick Command Templates / 快速指令模板\r\n\r\n**组合风险评估：**\r\n```\r\n分析以下组合的风险：\r\n- 总规模：1000万\r\n- 持仓：[股票A 30%, 股票B 20%, 债券B 50%]\r\n- 置信度：95%\r\n```\r\n\r\n**压力测试：**\r\n```\r\n执行\"2015股灾重演\"情景压力测试\r\n```\r\n\r\n---\r\n\r\n## Disclaimer\r\n\r\nThis skill provides risk analysis tools for educational purposes. Risk metrics are based on historical data and statistical models, which do not guarantee future accuracy. Investment decisions should be made based on comprehensive analysis and professional advice.\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn74e704j3ygjcygnpf02rdvd185js13\",\n  \"slug\": \"security-portfolio-risk\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1778495081914\n}\n\nArchive v1.0.0: 2 files, 4479 bytes\n\nFiles: SKILL.md (11384b), _meta.json (142b)\n\nFile v1.0.0:SKILL.md\n\n---\r\nname: Portfolio Risk Analysis Expert\r\nslug: security-portfolio-risk\r\ndescription: AI-powered portfolio risk analysis expert for China market — covers VaR calculation, stress testing, tail risk measurement, factor exposure analysis, and risk decomposition. Built for fund managers, risk analysts, and institutional investors. Keywords: portfolio risk, VaR, stress testing, risk decomposition, China A-share, factor risk, tail risk, 组合风险, 风险分析, VaR, 压力测试, 风险分解.\r\nversion: 1.0.0\r\n---\r\n\r\n# Portfolio Risk Analysis Expert / 组合风险分析专家\r\n\r\n> **English:** AI-powered portfolio risk analysis expert — covers VaR calculation, stress testing, tail risk measurement, factor exposure, and risk attribution. Built for fund managers and risk analysts.\r\n>\r\n> **中文:** 组合风险分析专家——覆盖VaR计算、压力测试、尾部风险度量、因子敞口分析、风险归因。适用：基金经理、风险分析师、机构投资者。\r\n\r\n---\r\n\r\n## Industry Pain Points / 行业痛点\r\n\r\n| Pain Point / 痛点 | Impact / 影响 | Solution / 本Skill解决方案 |\r\n|------------------|-------------|------------------------|\r\n| **系统风险难预测** | 黑天鹅事件导致大幅回撤 | 极端情景压力测试+尾部风险分析 |\r\n| **因子敞口不清晰** | 不知道组合暴露在哪些风险上 | 因子归因模型+敞口分解 |\r\n| **回撤控制困难** | 持有人体验差，资金赎回压力 | 动态回撤监控+预警机制 |\r\n| **相关性突变** | 平时低相关的资产大跌时齐跌 | 相关性压力测试+分散化效果评估 |\r\n| **合规要求高** | 资管新规净值化要求 | 标准风险指标+监管报告 |\r\n\r\n---\r\n\r\n## Trigger Keywords / 触发关键词\r\n\r\n**English Triggers:** portfolio risk, VaR, stress testing, risk decomposition, factor exposure, tail risk, risk attribution, China A-share, fund management, risk management\r\n\r\n**中文触发词（优先）：** 组合风险 / 风险分析 / VaR / 压力测试 / 回撤控制 / 风险归因 / 因子敞口 / 尾部风险 / 风险分解 / 风险预警 / 资产配置 / 分散化 / 相关性分析 / 最大回撤 / 夏普比率 / 波动率 / 风险调整收益 / 风险预算 / VaR计算 / CVaR / ES\r\n\r\n---\r\n\r\n## Core Capabilities / 核心能力\r\n\r\n### 1. VaR & Risk Metrics / VaR与风险指标\r\n\r\n```python\r\nimport numpy as np\r\nimport pandas as pd\r\nfrom scipy import stats\r\n\r\nclass PortfolioRiskAnalyzer:\r\n    \"\"\"组合风险分析引擎\"\"\"\r\n    \r\n    def __init__(self, returns: pd.DataFrame, weights: np.ndarray):\r\n        \"\"\"\r\n        Args:\r\n            returns: 收益率序列（列=资产，行=日期）\r\n            weights: 资产权重向量\r\n        \"\"\"\r\n        self.returns = returns\r\n        self.weights = weights\r\n        self.n_assets = len(weights)\r\n    \r\n    def calculate_var(self, confidence: float = 0.95, \r\n                      method: str = \"historical\") -> dict:\r\n        \"\"\"计算VaR（Value at Risk）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        \r\n        if method == \"historical\":\r\n            var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        elif method == \"parametric\":\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            var = stats.norm.ppf(1 - confidence, mu, sigma)\r\n        elif method == \"modified\":\r\n            # Cornish-Fisher调整\r\n            mu = portfolio_returns.mean()\r\n            sigma = portfolio_returns.std()\r\n            skew = stats.skew(portfolio_returns)\r\n            kurt = stats.kurtosis(portfolio_returns)\r\n            z = stats.norm.ppf(1 - confidence)\r\n            z_cf = (z + (z**2 - 1) * skew / 6 + \r\n                   (z**3 - 3*z) * kurt / 24 - \r\n                   (2*z**3 - 5*z) * skew**2 / 36)\r\n            var = mu + sigma * z_cf\r\n        \r\n        return {\r\n            \"var\": round(var * 100, 2),  # 百分比\r\n            \"var_amount\": round(var * 1000000, 2),  # 假设100万组合\r\n            \"confidence\": confidence,\r\n            \"method\": method,\r\n            \"interpretation\": f\"在{confidence*100}%置信度下，最大损失为{abs(var)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_cvar(self, confidence: float = 0.95) -> dict:\r\n        \"\"\"计算CVaR（Conditional VaR / Expected Shortfall）\"\"\"\r\n        portfolio_returns = (self.returns * self.weights).sum(axis=1)\r\n        var = np.percentile(portfolio_returns, (1 - confidence) * 100)\r\n        \r\n        cvar = portfolio_returns[portfolio_returns <= var].mean()\r\n        \r\n        return {\r\n            \"cvar\": round(cvar * 100, 2),\r\n            \"cvar_amount\": round(cvar * 1000000, 2),\r\n            \"interpretation\": f\"超过VaR时的平均损失为{abs(cvar)*100:.2f}%\"\r\n        }\r\n    \r\n    def calculate_max_drawdown(self) -> dict:\r\n        \"\"\"计算最大回撤\"\"\"\r\n        cumulative = (1 + self.returns @ self.weights).cumprod()\r\n        running_max = cumulative.expanding().max()\r\n        drawdown = (cumulative - running_max) / running_max\r\n        \r\n        max_dd = drawdown.min()\r\n        max_dd_end = drawdown.idxmin()\r\n        max_dd_start = cumulative[:max_dd_end].idxmax()\r\n        \r\n        return {\r\n            \"max_drawdown\": round(max_dd * 100, 2),\r\n            \"peak_date\": str(max_dd_start.date()),\r\n            \"trough_date\": str(max_dd_end.date()),\r\n            \"recovery_date\": None  # 需后续计算\r\n        }\r\n    \r\n    def factor_risk_attribution(self, factor_returns: pd.DataFrame) -> dict:\r\n        \"\"\"因子风险归因\"\"\"\r\n        portfolio_returns = self.returns @ self.weights\r\n        \r\n        # 回归分析\r\n        X = factor_returns.values\r\n        X = np.column_stack([np.ones(len(X)), X])\r\n        y = portfolio_returns.values\r\n        \r\n        coeffs = np.linalg.lstsq(X, y, rcond=None)[0]\r\n        residuals = y - X @ coeffs\r\n        \r\n        # 分解方差\r\n        total_var = np.var(y)\r\n        factor_var = np.var(X[:, 1:] @ coeffs[1:])\r\n        specific_var = np.var(residuals)\r\n        \r\n        return {\r\n            \"factor_exposure\": {\r\n                \"market\": round(coeffs[1], 3),\r\n                \"factors\": {\r\n                    col: round(coef, 3) \r\n                    for col, coef in zip(factor_returns.columns, coeffs[2:])\r\n                }\r\n            },\r\n            \"risk_contribution\": {\r\n                \"factor_risk\": round(factor_var / total_var * 100, 2),\r\n                \"specific_risk\": round(specific_var / total_var * 100, 2)\r\n            },\r\n            \"r_squared\": round(1 - specific_var / total_var, 4)\r\n        }\r\n```\r\n\r\n### 2. Stress Testing / 压力测试\r\n\r\n```python\r\nclass StressTestScenarios:\r\n    \"\"\"压力测试情景库\"\"\"\r\n    \r\n    SCENARIOS = {\r\n        \"2015股灾重演\": {\r\n            \"description\": \"假设上证指数单周下跌20%\",\r\n            \"market_shock\": -0.20,\r\n            \"sector_impacts\": {\r\n                \"金融\": -0.25,\r\n                \"房地产\": -0.30,\r\n                \"消费\": -0.15,\r\n                \"科技\": -0.20,\r\n                \"医药\": -0.10\r\n            },\r\n            \"liquidity_shock\": 0.5  # 流动性降至50%\r\n        },\r\n        \r\n        \"利率急升\": {\r\n            \"description\": \"假设基准利率上调100bp\",\r\n            \"rate_shock\": 0.01,\r\n            \"bond_impact\": -0.08,\r\n            \"equity_impact\": -0.10,\r\n            \"bank_impact\": -0.05\r\n        },\r\n        \r\n        \"人民币急贬\": {\r\n            \"description\": \"假设USD/CNY一日升值5%\",\r\n            \"fx_shock\": 0.05,\r\n            \"export_related\": -0.15,\r\n            \"import_related\": 0.05,\r\n            \"domestic_consumer\": -0.08\r\n        },\r\n        \r\n        \"黑天鹅-新冠\": {\r\n            \"description\": \"类似2020年初疫情冲击\",\r\n            \"market_shock\": -0.12,\r\n            \"travel\": -0.30,\r\n            \"retail\": -0.20,\r\n            \"healthcare\": 0.10,\r\n            \"online\": 0.05\r\n        }\r\n    }\r\n    \r\n    def run_stress_test(self, portfolio: dict, scenario: str) -> dict:\r\n        \"\"\"执行压力测试\"\"\"\r\n        if scenario not in self.SCENARIOS:\r\n            raise ValueError(f\"Unknown scenario: {scenario}\")\r\n        \r\n        s = self.SCENARIOS[scenario]\r\n        positions = portfolio[\"positions\"]\r\n        \r\n        stressed_pnl = 0\r\n        stressed_values = []\r\n        \r\n        for pos in positions:\r\n            sector = pos.get(\"sector\", \"general\")\r\n            weight = pos[\"weight\"]\r\n            \r\n            # 根据情景调整\r\n            if \"sector_impacts\" in s and sector in s[\"sector_impacts\"]:\r\n                shock = s[\"sector_impacts\"][sector]\r\n            else:\r\n                shock = s.get(\"market_shock\", -0.10)\r\n            \r\n            pos_stressed = weight * (1 + shock)\r\n            stressed_values.append(pos_stressed)\r\n            stressed_pnl += weight * shock\r\n        \r\n        total_value = sum(stressed_values)\r\n        portfolio_stress_loss = total_value - 1  # 假设初始为1\r\n        \r\n        return {\r\n            \"scenario\": scenario,\r\n            \"description\": s[\"description\"],\r\n            \"portfolio_loss\": round(portfolio_stress_loss * 100, 2),\r\n            \"portfolio_value_after\": round(total_value * 100, 2),\r\n            \"position_impacts\": [\r\n                {\"name\": pos[\"name\"], \"weight\": pos[\"weight\"], \r\n                 \"shock\": round(shock * 100, 2), \"impact\": \"loss\" if shock < 0 else \"gain\"}\r\n                for pos, shock in zip(positions, \r\n                    [s.get(\"sector_impacts\", {}).get(pos.get(\"sector\", \"\"), \r\n                     s.get(\"market_shock\", -0.10)) for pos in positions])\r\n            ]\r\n        }\r\n```\r\n\r\n### 3. Risk Contribution Analysis / 风险贡献分析\r\n\r\n```python\r\n    def risk_contribution_by_asset(self) -> dict:\r\n        \"\"\"计算各资产风险贡献\"\"\"\r\n        cov_matrix = self.returns.cov()\r\n        portfolio_vol = np.sqrt(self.weights @ cov_matrix.values @ self.weights)\r\n        \r\n        # 边际风险贡献 (MCTR)\r\n        mctr = (cov_matrix.values @ self.weights) / portfolio_vol\r\n        \r\n        # 风险贡献\r\n        risk_contrib = self.weights * mctr\r\n        \r\n        return {\r\n            \"portfolio_volatility\": round(portfolio_vol * 100, 2),\r\n            \"asset_risk_contribution\": {\r\n                self.returns.columns[i]: round(rc * 100, 2)\r\n                for i, rc in enumerate(risk_contrib)\r\n            },\r\n            \"concentration_risk\": {\r\n                \"max_concentration\": round(max(risk_contrib) * 100, 2),\r\n                \"diversification_benefit\": round(\r\n                    (sum([self.returns[col].std() * w \r\n                         for col, w in zip(self.returns.columns, self.weights)]) - \r\n                     portfolio_vol) * 100, 2)\r\n            }\r\n        }\r\n```\r\n\r\n---\r\n\r\n## Quick Command Templates / 快速指令模板\r\n\r\n**组合风险评估：**\r\n```\r\n分析以下组合的风险：\r\n- 总规模：1000万\r\n- 持仓：[股票A 30%, 股票B 20%, 债券B 50%]\r\n- 置信度：95%\r\n```\r\n\r\n**压力测试：**\r\n```\r\n执行\"2015股灾重演\"情景压力测试\r\n```\r\n\r\n---\r\n\r\n## Disclaimer\r\n\r\nThis skill provides risk analysis tools for educational purposes. Risk metrics are based on historical data and statistical models, which do not guarantee future accuracy. Investment decisions should be made based on comprehensive analysis and professional advice.\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn74e704j3ygjcygnpf02rdvd185js13\",\n  \"slug\": \"security-portfolio-risk\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1778489567211\n}","readmeExcerpt":"Skill: Security Portfolio Risk Owner: gechengling Summary: Provides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers. Tags: latest:3.0.4, security-portfolio-risk:3.0.4 Version history: v3.0.4 | 2026-10-08T05:05:40.894Z | user 3.0.4: content update v3.0.3 | 2026-09-30T07:04:59.412Z | user v3.0.3: narrow triggers (SQP-1), c","codeSnippets":[],"executableExamples":[],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: Portfolio Risk Analysis Expert\r\nslug: security-portfolio-risk\r\ndescription: AI-powered portfolio risk analysis expert for China market — quantifies risk on a given holdings portfolio: VaR/CVaR, stress testing, tail risk, factor exposure and risk-contribution decomposition. Scope: portfolio-level quantitative risk measurement only; not general risk-management consultancy, not single-name research, not asset-allocation theory. Keywords: portfolio VaR, CVaR, stress testing, risk contribution, risk decomposition, factor exposure, tail risk, China A-share, 组合风险分析, 组合VaR, CVaR计算, 组合压力测试, 风险归因, 风险贡献分解, 因子敞口, 尾部风险, 集中度风险检查, 风险预算.\r\nversion: \"3.0.4\"\r\n---\r\n\r\n# Portfolio Risk Analysis Expert / 组合风险分析专家\r\n\r\n> **English:** AI-powered portfolio risk analysis expert — covers VaR calculation, stress testing, tail risk measurement, factor exposure, and risk attribution. Built for fund managers and risk analysts.\r\n>\r\n> **中文:** 组合风险分析专家——覆盖VaR计算、压力测试、尾部风险度量、因子敞口分析、风险归因。适用：基金经理、风险分析师、机构投资者。\r\n\r\n\r\n---\r\n\r\n## 数据最小化声明与执行边界 / Data Minimisation & Execution Boundary\r\n\r\n**数据最小化前置声明：** 使用本技能时，请只提供风险测算所必需的输入——标的代码、权重、收益率或净值序列、已脱敏的组合规模（可用“1000万”这类量级，无需精确金额）。**不要**粘贴账户号、身份证号、实际成交明细、客户身份信息或未公开的持仓数据；个人持仓请用“标的+权重”的脱敏形式提供。\r\n\r\n**保存与预览确认：** 本技能不执行任何保存动作。若你在自己环境中依据本技能生成风险报告、压力测试结论或风险预算表，请在落盘或对外报送前**先预览结果、确认口径与阈值无误，再保存或提交**。\r\n\r\n**代码块性质与执行边界**\r\n\r\n| 内容 | 性质 | 谁来执行 |\r\n|------|------|---------|\r\n| `PortfolioRiskAnalyzer` 类（VaR/CVaR/回撤/因子归因） | 风险指标的计算口径说明 | 由风险分析师在自有风控系统中取数复现；技能不取数、不运行 |\r\n| `StressTestScenarios` 情景库与 `run_stress_test()` | 情景参数与冲击传导的示意 | 由风险分析师在自有系统中配置并运行 |\r\n| `risk_contribution_by_asset()` | 边际风险贡献（MCTR）的算法表达 | 同上，属教学示意 |\r\n| 口径登记表、阈值表、处置清单 | 管理用模板 | 由风控人员在机构流程中落实 |\r\n\r\n本技能未配置任何工具调用权限，不执行代码、不读写文件、不访问行情或持仓数据源，也不生成可直接报送的监管报表。文中代码块均为指标口径的教学示意，读者可在自己环境中参考实现；风险测算结果须经独立复核后方可用于决策。\r\n\r\n---\r\n\r\n\r\n### 证券监管最新动态 [2026-10-08更新]\r\n\r\n| 动态类型 | 内容摘要 | 影响范围 | 风险侧应对动作 | 责任岗 | 优先级 | 复核频率 | |\r\n|---------|---------|---------|--------------|-------|-------|---|\r\n| 证券监管 | 2026年Q1：市场波动加剧，组合风险管理要求提升 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险报告增设极端情景专项说明 | 风控 | 高 | 每季 |\r\n| 证券监管 | 量化资金共振风险增加，极端行情止损策略需更新 | 组合风险模型需增加量化冲击和ESG风险维度 | 压力测试新增流动性枯竭情景 | 风控 | 高 | 每季 |\r\n| 证券监管 | ESG投资分析要求扩大，组合风险需纳入ESG因素 | 组合风险模型需增加量化冲击和ESG风险维度 | 风险分解单列ESG敞口维度 | 风控 | 中 | 每季 |\r\n| 程序化交易 | 程序化交易报告与异常交易监控要求细化 | 极端行情下的流动性与波动归因 | 压力测试中区分程序化交易影响部分 | 风控 | 中 | 每月 |\r\n| 信息披露 | 上市公司信息披露质量监管强化 | 风险模型的财务输入数据 | 模型输入须标注报告期与数据来源 | 风控 | 高 | 每季 |\r\n| 估值与净值 | 净值化管理要求下风险指标披露趋严 | 产品风险报告与定期披露 | 波动率、回撤、VaR口径固定并留档 | 合规 | 高 | 每月 |\r\n| 投资者保护 | 风险揭示与适当性匹配要求提升 | 产品风险等级与客户匹配 | 风险报告附适当性匹配说明 | 合规 | 高 | 每季 |\r\n| 集中度管理 | 单一标的与单一行业集中度关注度提升 | 组合集中度指标 | 集中度阈值纳入日常监控与预警 | 风控 | 高 | 日 |\r\n| 估值与净值 | 2026年9月下旬：净值化产品的风险指标披露口径一致性要求进一步强化 | 定期报告、产品风险揭示书 | 波动率/回撤/VaR三项口径写进口径登记表并随报告留档 | 合规 | 高 | 每月 |\r\n| 集中度管理 | 2026年三季度：单一标的与单一行业集中度的日常监控要求细化 | 组合集中度指标 | 集中度监控改为日频，超限当日报送投资经理 | 风控 | 高 | 日 |\r\n| 风险揭示 | 2026年10月上旬：净值型产品风险指标与业绩展示口径的一致性检查趋严，报告值与宣传值须同源 | 风险报告、产品宣传材料 | 波动率/回撤/VaR的报告数值与对外展示数值差异须书面说明 | 合规 | 高 | 每月 |\r\n| 模型风险管理 | 2026年四季度初：机构风险模型的验证与留痕要求细化，模型版本与参数来源须可追溯 | 风险模型、参数与情景库 | 建立模型台账，登记模型版本、参数来源、"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn74e704j3ygjcygnpf02rdvd185js13\",\n  \"slug\": \"security-portfolio-risk\",\n  \"version\": \"3.0.4\",\n  \"publishedAt\": 1791435940894\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps analysts assess China-market portfolio risk using VaR, stress tests, tail-risk measures, factor exposures, and risk-contribution analysis.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[gechengling](https://clawhub.ai/user/gechengling)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nFund managers and risk analysts use this skill to assess a holdings portfolio's VaR, stress losses, concentration, factor exposures, and risk contributions. Its methods and examples require independent validation before investment or reporting decisions.\n\n### Deployment Geography for Use:\n\nChina (market focus)\n\n## Known Risks and Mitigations:\n\nRisk: Historical data and model assumptions can produce misleading portfolio risk estimates.\n\nMitigation: Independently validate inputs, assumptions, and results through established risk-review procedures before relying on them.\n\nRisk: Portfolio details or unverified regulatory claims could be exposed or relied on inappropriately.\n\nMitigation: Provide only anonymized holdings, weights, and return data; verify regulatory claims and reportable results with the appropriate compliance team.\n\n## Reference(s):\n\n- [Security Portfolio Risk on ClawHub](https://clawhub.ai/gechengling/skills/security-portfolio-risk)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Guidance]\n\n**Output Format:** [Markdown analysis, tables, and illustrative Python code]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [No direct market-data access or code execution; independently review results before use.]\n\n## Skill Version(s):\n\n3.0.4 (source: skill frontmatter and server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Provides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers. Skill: Security Portfolio Risk Owner: gechengling Summary: Provides AI-driven portfolio risk analysis for China A-shares with VaR, stress testing, tail risk, factor exposure, and risk attribution for fund managers. Tags: latest:3.0.4, security-portfolio-risk:3.0.4 Version history: v3.0.4 | 2026-10-08T05:05:40.894Z | user 3.0.4: content update v3.0.3 | 2026-09-30T07:04:59.412Z | user v3.0.3: narrow triggers (SQP-1), c","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":981,"uniquenessScore":54,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T22:36:01.002Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T22:36:01.002Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:47:37.067Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}