@wentorai/research-plugins 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -22
- package/curated/analysis/README.md +82 -56
- package/curated/domains/README.md +225 -69
- package/curated/literature/README.md +115 -46
- package/curated/research/README.md +106 -58
- package/curated/tools/README.md +107 -87
- package/curated/writing/README.md +92 -45
- package/mcp-configs/academic-db/alphafold-mcp.json +20 -0
- package/mcp-configs/academic-db/brightspace-mcp.json +21 -0
- package/mcp-configs/academic-db/climatiq-mcp.json +20 -0
- package/mcp-configs/academic-db/gibs-mcp.json +20 -0
- package/mcp-configs/academic-db/gis-mcp-server.json +22 -0
- package/mcp-configs/academic-db/google-earth-engine-mcp.json +21 -0
- package/mcp-configs/academic-db/m4-clinical-mcp.json +21 -0
- package/mcp-configs/academic-db/medical-mcp.json +21 -0
- package/mcp-configs/academic-db/nexonco-mcp.json +20 -0
- package/mcp-configs/academic-db/omop-mcp.json +20 -0
- package/mcp-configs/academic-db/onekgpd-mcp.json +20 -0
- package/mcp-configs/academic-db/openedu-mcp.json +20 -0
- package/mcp-configs/academic-db/opengenes-mcp.json +20 -0
- package/mcp-configs/academic-db/openstax-mcp.json +21 -0
- package/mcp-configs/academic-db/openstreetmap-mcp.json +21 -0
- package/mcp-configs/academic-db/opentargets-mcp.json +21 -0
- package/mcp-configs/academic-db/pdb-mcp.json +21 -0
- package/mcp-configs/academic-db/smithsonian-mcp.json +20 -0
- package/mcp-configs/ai-platform/magi-researchers.json +21 -0
- package/mcp-configs/ai-platform/mcp-academic-researcher.json +22 -0
- package/mcp-configs/ai-platform/open-paper-machine.json +21 -0
- package/mcp-configs/ai-platform/paper-intelligence.json +21 -0
- package/mcp-configs/ai-platform/paper-reader.json +21 -0
- package/mcp-configs/ai-platform/paperdebugger.json +21 -0
- package/mcp-configs/browser/exa-mcp.json +20 -0
- package/mcp-configs/browser/mcp-searxng.json +21 -0
- package/mcp-configs/browser/mcp-webresearch.json +20 -0
- package/mcp-configs/cloud-docs/confluence-mcp.json +37 -0
- package/mcp-configs/cloud-docs/google-drive-mcp.json +35 -0
- package/mcp-configs/cloud-docs/notion-mcp.json +29 -0
- package/mcp-configs/communication/discord-mcp.json +29 -0
- package/mcp-configs/communication/discourse-mcp.json +21 -0
- package/mcp-configs/communication/slack-mcp.json +29 -0
- package/mcp-configs/communication/telegram-mcp.json +28 -0
- package/mcp-configs/data-platform/automl-stat-mcp.json +21 -0
- package/mcp-configs/data-platform/jefferson-stats-mcp.json +22 -0
- package/mcp-configs/data-platform/mcp-excel-server.json +21 -0
- package/mcp-configs/data-platform/mcp-stata.json +21 -0
- package/mcp-configs/data-platform/mcpstack-jupyter.json +21 -0
- package/mcp-configs/data-platform/ml-mcp.json +21 -0
- package/mcp-configs/data-platform/nasdaq-data-link-mcp.json +20 -0
- package/mcp-configs/data-platform/numpy-mcp.json +21 -0
- package/mcp-configs/database/neo4j-mcp.json +37 -0
- package/mcp-configs/database/postgres-mcp.json +28 -0
- package/mcp-configs/database/sqlite-mcp.json +29 -0
- package/mcp-configs/dev-platform/geogebra-mcp.json +21 -0
- package/mcp-configs/dev-platform/github-mcp.json +31 -0
- package/mcp-configs/dev-platform/gitlab-mcp.json +34 -0
- package/mcp-configs/dev-platform/latex-mcp-server.json +21 -0
- package/mcp-configs/dev-platform/manim-mcp.json +20 -0
- package/mcp-configs/dev-platform/mcp-echarts.json +20 -0
- package/mcp-configs/dev-platform/panel-viz-mcp.json +20 -0
- package/mcp-configs/dev-platform/paperbanana.json +20 -0
- package/mcp-configs/dev-platform/texflow-mcp.json +20 -0
- package/mcp-configs/dev-platform/texmcp.json +20 -0
- package/mcp-configs/dev-platform/typst-mcp.json +21 -0
- package/mcp-configs/dev-platform/vizro-mcp.json +20 -0
- package/mcp-configs/email/email-mcp.json +40 -0
- package/mcp-configs/email/gmail-mcp.json +37 -0
- package/mcp-configs/note-knowledge/local-faiss-mcp.json +21 -0
- package/mcp-configs/note-knowledge/mcp-memory-service.json +21 -0
- package/mcp-configs/note-knowledge/mcp-obsidian.json +23 -0
- package/mcp-configs/note-knowledge/mcp-ragdocs.json +20 -0
- package/mcp-configs/note-knowledge/mcp-summarizer.json +21 -0
- package/mcp-configs/note-knowledge/mediawiki-mcp.json +21 -0
- package/mcp-configs/note-knowledge/openzim-mcp.json +20 -0
- package/mcp-configs/note-knowledge/zettelkasten-mcp.json +21 -0
- package/mcp-configs/reference-mgr/academic-paper-mcp-http.json +20 -0
- package/mcp-configs/reference-mgr/academix.json +20 -0
- package/mcp-configs/reference-mgr/arxiv-research-mcp.json +21 -0
- package/mcp-configs/reference-mgr/google-scholar-abstract-mcp.json +19 -0
- package/mcp-configs/reference-mgr/google-scholar-mcp.json +20 -0
- package/mcp-configs/reference-mgr/mcp-paperswithcode.json +21 -0
- package/mcp-configs/reference-mgr/mcp-scholarly.json +20 -0
- package/mcp-configs/reference-mgr/mcp-simple-arxiv.json +20 -0
- package/mcp-configs/reference-mgr/mcp-simple-pubmed.json +20 -0
- package/mcp-configs/reference-mgr/mcp-zotero.json +21 -0
- package/mcp-configs/reference-mgr/mendeley-mcp.json +20 -0
- package/mcp-configs/reference-mgr/ncbi-mcp-server.json +22 -0
- package/mcp-configs/reference-mgr/onecite.json +21 -0
- package/mcp-configs/reference-mgr/paper-search-mcp.json +21 -0
- package/mcp-configs/reference-mgr/pubmed-search-mcp.json +21 -0
- package/mcp-configs/reference-mgr/scholar-mcp.json +21 -0
- package/mcp-configs/reference-mgr/scholar-multi-mcp.json +21 -0
- package/mcp-configs/reference-mgr/seerai.json +21 -0
- package/mcp-configs/reference-mgr/semantic-scholar-fastmcp.json +21 -0
- package/mcp-configs/reference-mgr/sourcelibrary.json +20 -0
- package/mcp-configs/registry.json +178 -149
- package/mcp-configs/repository/dataverse-mcp.json +33 -0
- package/mcp-configs/repository/huggingface-mcp.json +29 -0
- package/openclaw.plugin.json +2 -2
- package/package.json +2 -2
- package/skills/analysis/dataviz/algorithm-visualizer-guide/SKILL.md +259 -0
- package/skills/analysis/dataviz/bokeh-visualization-guide/SKILL.md +270 -0
- package/skills/analysis/dataviz/chart-image-generator/SKILL.md +229 -0
- package/skills/analysis/dataviz/citation-map-guide/SKILL.md +184 -0
- package/skills/analysis/dataviz/d3-visualization-guide/SKILL.md +281 -0
- package/skills/analysis/dataviz/data-visualization-principles/SKILL.md +171 -0
- package/skills/analysis/dataviz/echarts-visualization-guide/SKILL.md +250 -0
- package/skills/analysis/dataviz/metabase-analytics-guide/SKILL.md +242 -0
- package/skills/analysis/dataviz/plotly-interactive-guide/SKILL.md +266 -0
- package/skills/analysis/dataviz/redash-analytics-guide/SKILL.md +284 -0
- package/skills/analysis/econometrics/econml-causal-guide/SKILL.md +163 -0
- package/skills/analysis/econometrics/empirical-paper-analysis/SKILL.md +192 -0
- package/skills/analysis/econometrics/mostly-harmless-guide/SKILL.md +139 -0
- package/skills/analysis/econometrics/panel-data-analyst/SKILL.md +259 -0
- package/skills/analysis/econometrics/panel-data-regression-workflow/SKILL.md +267 -0
- package/skills/analysis/econometrics/python-causality-guide/SKILL.md +134 -0
- package/skills/analysis/econometrics/stata-accounting-guide/SKILL.md +269 -0
- package/skills/analysis/econometrics/stata-analyst-guide/SKILL.md +245 -0
- package/skills/analysis/econometrics/stata-reference-guide/SKILL.md +293 -0
- package/skills/analysis/statistics/data-anomaly-detection/SKILL.md +157 -0
- package/skills/analysis/statistics/general-statistics-guide/SKILL.md +226 -0
- package/skills/analysis/statistics/infiagent-benchmark-guide/SKILL.md +106 -0
- package/skills/analysis/statistics/ml-experiment-tracker/SKILL.md +212 -0
- package/skills/analysis/statistics/pywayne-statistics-guide/SKILL.md +192 -0
- package/skills/analysis/statistics/quantitative-methods-guide/SKILL.md +193 -0
- package/skills/analysis/statistics/senior-data-scientist-guide/SKILL.md +223 -0
- package/skills/analysis/wrangling/claude-data-analysis-guide/SKILL.md +100 -0
- package/skills/analysis/wrangling/csv-data-analyzer/SKILL.md +170 -0
- package/skills/analysis/wrangling/data-cleaning-pipeline/SKILL.md +266 -0
- package/skills/analysis/wrangling/data-cog-guide/SKILL.md +178 -0
- package/skills/analysis/wrangling/open-data-scientist-guide/SKILL.md +197 -0
- package/skills/analysis/wrangling/stata-data-cleaning/SKILL.md +276 -0
- package/skills/analysis/wrangling/streamline-analyst-guide/SKILL.md +119 -0
- package/skills/analysis/wrangling/survey-data-processing/SKILL.md +298 -0
- package/skills/domains/ai-ml/ai-agent-papers-guide/SKILL.md +146 -0
- package/skills/domains/ai-ml/ai-model-benchmarking/SKILL.md +209 -0
- package/skills/domains/ai-ml/annotated-dl-papers-guide/SKILL.md +159 -0
- package/skills/domains/ai-ml/anomaly-detection-papers-guide/SKILL.md +167 -0
- package/skills/domains/ai-ml/autonomous-agents-papers-guide/SKILL.md +178 -0
- package/skills/domains/ai-ml/dl-transformer-finetune/SKILL.md +239 -0
- package/skills/domains/ai-ml/domain-adaptation-papers-guide/SKILL.md +173 -0
- package/skills/domains/ai-ml/generative-ai-guide/SKILL.md +146 -0
- package/skills/domains/ai-ml/graph-learning-papers-guide/SKILL.md +125 -0
- package/skills/domains/ai-ml/huggingface-inference-guide/SKILL.md +196 -0
- package/skills/domains/ai-ml/keras-deep-learning/SKILL.md +210 -0
- package/skills/domains/ai-ml/kolmogorov-arnold-networks-guide/SKILL.md +185 -0
- package/skills/domains/ai-ml/llm-from-scratch-guide/SKILL.md +124 -0
- package/skills/domains/ai-ml/ml-pipeline-guide/SKILL.md +295 -0
- package/skills/domains/ai-ml/nlp-toolkit-guide/SKILL.md +247 -0
- package/skills/domains/ai-ml/npcpy-research-guide/SKILL.md +137 -0
- package/skills/domains/ai-ml/pytorch-guide/SKILL.md +281 -0
- package/skills/domains/ai-ml/pytorch-lightning-guide/SKILL.md +244 -0
- package/skills/domains/ai-ml/responsible-ai-guide/SKILL.md +126 -0
- package/skills/domains/ai-ml/tensorflow-guide/SKILL.md +241 -0
- package/skills/domains/ai-ml/vmas-simulator-guide/SKILL.md +129 -0
- package/skills/domains/biomedical/bioagents-guide/SKILL.md +308 -0
- package/skills/domains/biomedical/clawbio-guide/SKILL.md +167 -0
- package/skills/domains/biomedical/clinical-dialogue-agents-guide/SKILL.md +145 -0
- package/skills/domains/biomedical/ena-sequence-api/SKILL.md +175 -0
- package/skills/domains/biomedical/genomas-guide/SKILL.md +126 -0
- package/skills/domains/biomedical/genotex-benchmark-guide/SKILL.md +125 -0
- package/skills/domains/biomedical/med-researcher-guide/SKILL.md +161 -0
- package/skills/domains/biomedical/med-researcher-r1-guide/SKILL.md +146 -0
- package/skills/domains/biomedical/medgeclaw-guide/SKILL.md +345 -0
- package/skills/domains/biomedical/medical-imaging-guide/SKILL.md +305 -0
- package/skills/domains/biomedical/ncbi-blast-api/SKILL.md +195 -0
- package/skills/domains/biomedical/ncbi-datasets-api/SKILL.md +220 -0
- package/skills/domains/biomedical/quickgo-api/SKILL.md +181 -0
- package/skills/domains/business/architecture-design-guide/SKILL.md +279 -0
- package/skills/domains/business/innovation-management-guide/SKILL.md +257 -0
- package/skills/domains/business/operations-research-guide/SKILL.md +258 -0
- package/skills/domains/business/xpert-bi-guide/SKILL.md +84 -0
- package/skills/domains/chemistry/cactus-cheminformatics-guide/SKILL.md +89 -0
- package/skills/domains/chemistry/chemeagle-guide/SKILL.md +147 -0
- package/skills/domains/chemistry/chemgraph-agent-guide/SKILL.md +120 -0
- package/skills/domains/chemistry/molecular-dynamics-guide/SKILL.md +237 -0
- package/skills/domains/chemistry/pubchem-api-guide/SKILL.md +180 -0
- package/skills/domains/chemistry/spectroscopy-analysis-guide/SKILL.md +290 -0
- package/skills/domains/cs/ai-security-papers-guide/SKILL.md +103 -0
- package/skills/domains/cs/code-llm-papers-guide/SKILL.md +131 -0
- package/skills/domains/cs/distributed-systems-guide/SKILL.md +268 -0
- package/skills/domains/cs/formal-verification-guide/SKILL.md +298 -0
- package/skills/domains/cs/gaussian-splatting-papers-guide/SKILL.md +158 -0
- package/skills/domains/cs/llm-aiops-guide/SKILL.md +70 -0
- package/skills/domains/cs/software-heritage-api/SKILL.md +200 -0
- package/skills/domains/ecology/species-distribution-guide/SKILL.md +343 -0
- package/skills/domains/economics/imf-data-api-guide/SKILL.md +174 -0
- package/skills/domains/economics/nber-working-papers-api/SKILL.md +177 -0
- package/skills/domains/economics/post-labor-economics/SKILL.md +254 -0
- package/skills/domains/economics/pricing-psychology-guide/SKILL.md +273 -0
- package/skills/domains/economics/repec-economics-api/SKILL.md +188 -0
- package/skills/domains/economics/world-bank-data-guide/SKILL.md +179 -0
- package/skills/domains/education/academic-study-methods/SKILL.md +228 -0
- package/skills/domains/education/assessment-design-guide/SKILL.md +213 -0
- package/skills/domains/education/educational-research-methods/SKILL.md +179 -0
- package/skills/domains/education/edumcp-guide/SKILL.md +74 -0
- package/skills/domains/education/mooc-analytics-guide/SKILL.md +206 -0
- package/skills/domains/education/open-syllabus-api/SKILL.md +171 -0
- package/skills/domains/finance/akshare-finance-data/SKILL.md +207 -0
- package/skills/domains/finance/finsight-research-guide/SKILL.md +113 -0
- package/skills/domains/finance/options-analytics-agent-guide/SKILL.md +117 -0
- package/skills/domains/finance/portfolio-optimization-guide/SKILL.md +279 -0
- package/skills/domains/finance/risk-modeling-guide/SKILL.md +260 -0
- package/skills/domains/finance/stata-accounting-research/SKILL.md +372 -0
- package/skills/domains/geoscience/climate-modeling-guide/SKILL.md +215 -0
- package/skills/domains/geoscience/pangaea-data-api/SKILL.md +197 -0
- package/skills/domains/geoscience/satellite-remote-sensing/SKILL.md +193 -0
- package/skills/domains/geoscience/seismology-data-guide/SKILL.md +208 -0
- package/skills/domains/humanities/digital-humanities-methods/SKILL.md +232 -0
- package/skills/domains/humanities/ethical-philosophy-guide/SKILL.md +244 -0
- package/skills/domains/humanities/history-research-guide/SKILL.md +260 -0
- package/skills/domains/humanities/political-history-guide/SKILL.md +241 -0
- package/skills/domains/law/caselaw-access-api/SKILL.md +149 -0
- package/skills/domains/law/legal-agent-skills-guide/SKILL.md +132 -0
- package/skills/domains/law/legal-nlp-guide/SKILL.md +236 -0
- package/skills/domains/law/legal-research-methods/SKILL.md +190 -0
- package/skills/domains/law/opencontracts-guide/SKILL.md +168 -0
- package/skills/domains/law/patent-analysis-guide/SKILL.md +257 -0
- package/skills/domains/law/regulatory-compliance-guide/SKILL.md +267 -0
- package/skills/domains/math/lean-theorem-proving-guide/SKILL.md +140 -0
- package/skills/domains/math/symbolic-computation-guide/SKILL.md +263 -0
- package/skills/domains/math/topology-data-analysis/SKILL.md +305 -0
- package/skills/domains/pharma/clinical-trial-design-guide/SKILL.md +271 -0
- package/skills/domains/pharma/drug-target-interaction/SKILL.md +242 -0
- package/skills/domains/pharma/madd-drug-discovery-guide/SKILL.md +153 -0
- package/skills/domains/pharma/pharmacovigilance-guide/SKILL.md +216 -0
- package/skills/domains/physics/astrophysics-data-guide/SKILL.md +305 -0
- package/skills/domains/physics/particle-physics-guide/SKILL.md +287 -0
- package/skills/domains/social-science/ipums-microdata-api/SKILL.md +211 -0
- package/skills/domains/social-science/network-analysis-guide/SKILL.md +310 -0
- package/skills/domains/social-science/psychology-research-guide/SKILL.md +270 -0
- package/skills/domains/social-science/sociology-research-guide/SKILL.md +238 -0
- package/skills/domains/social-science/sociology-research-methods/SKILL.md +181 -0
- package/skills/literature/discovery/arxiv-paper-monitoring/SKILL.md +233 -0
- package/skills/literature/discovery/paper-recommendation-guide/SKILL.md +120 -0
- package/skills/literature/discovery/papers-we-love-guide/SKILL.md +169 -0
- package/skills/literature/discovery/semantic-paper-radar/SKILL.md +144 -0
- package/skills/literature/discovery/zotero-arxiv-daily-guide/SKILL.md +94 -0
- package/skills/literature/fulltext/bioc-pmc-api/SKILL.md +146 -0
- package/skills/literature/fulltext/core-api-guide/SKILL.md +144 -0
- package/skills/literature/fulltext/dataverse-api/SKILL.md +215 -0
- package/skills/literature/fulltext/hal-archive-api/SKILL.md +218 -0
- package/skills/literature/fulltext/institutional-repository-guide/SKILL.md +212 -0
- package/skills/literature/fulltext/open-access-mining-guide/SKILL.md +341 -0
- package/skills/literature/fulltext/osf-api/SKILL.md +212 -0
- package/skills/literature/fulltext/pmc-ftp-bulk-download/SKILL.md +182 -0
- package/skills/literature/fulltext/zotero-ai-butler-guide/SKILL.md +166 -0
- package/skills/literature/fulltext/zotero-scihub-guide/SKILL.md +168 -0
- package/skills/literature/metadata/academic-paper-summarizer/SKILL.md +101 -0
- package/skills/literature/metadata/bibliometrix-guide/SKILL.md +164 -0
- package/skills/literature/metadata/crossref-event-data-api/SKILL.md +183 -0
- package/skills/literature/metadata/doi-content-negotiation/SKILL.md +202 -0
- package/skills/literature/metadata/orkg-api/SKILL.md +153 -0
- package/skills/literature/metadata/plumx-metrics-api/SKILL.md +188 -0
- package/skills/literature/metadata/ror-organization-api/SKILL.md +208 -0
- package/skills/literature/metadata/sophosia-reference-guide/SKILL.md +110 -0
- package/skills/literature/metadata/viaf-authority-api/SKILL.md +209 -0
- package/skills/literature/metadata/wikidata-api-guide/SKILL.md +156 -0
- package/skills/literature/metadata/zoplicate-dedup-guide/SKILL.md +147 -0
- package/skills/literature/metadata/zotero-actions-tags-guide/SKILL.md +212 -0
- package/skills/literature/metadata/zotmoov-guide/SKILL.md +120 -0
- package/skills/literature/metadata/zutilo-guide/SKILL.md +140 -0
- package/skills/literature/search/arxiv-batch-reporting/SKILL.md +133 -0
- package/skills/literature/search/arxiv-cli-tools/SKILL.md +172 -0
- package/skills/literature/search/arxiv-osiris/SKILL.md +199 -0
- package/skills/literature/search/arxiv-paper-processor/SKILL.md +141 -0
- package/skills/literature/search/baidu-scholar-guide/SKILL.md +110 -0
- package/skills/literature/search/base-academic-search/SKILL.md +196 -0
- package/skills/literature/search/chatpaper-guide/SKILL.md +122 -0
- package/skills/literature/search/citeseerx-api/SKILL.md +183 -0
- package/skills/literature/search/deep-literature-search/SKILL.md +149 -0
- package/skills/literature/search/deepgit-search-guide/SKILL.md +147 -0
- package/skills/literature/search/eric-education-api/SKILL.md +199 -0
- package/skills/literature/search/findpapers-guide/SKILL.md +177 -0
- package/skills/literature/search/ieee-xplore-api/SKILL.md +177 -0
- package/skills/literature/search/lens-scholarly-api/SKILL.md +211 -0
- package/skills/literature/search/multi-database-literature-search/SKILL.md +198 -0
- package/skills/literature/search/open-library-api/SKILL.md +196 -0
- package/skills/literature/search/open-semantic-search-guide/SKILL.md +190 -0
- package/skills/literature/search/openaire-api/SKILL.md +141 -0
- package/skills/literature/search/paper-search-mcp-guide/SKILL.md +107 -0
- package/skills/literature/search/papers-chat-guide/SKILL.md +194 -0
- package/skills/literature/search/pasa-paper-search-guide/SKILL.md +138 -0
- package/skills/literature/search/plos-open-access-api/SKILL.md +203 -0
- package/skills/literature/search/scielo-api/SKILL.md +182 -0
- package/skills/literature/search/share-research-api/SKILL.md +129 -0
- package/skills/literature/search/worldcat-search-api/SKILL.md +224 -0
- package/skills/research/automation/ai-scientist-v2-guide/SKILL.md +284 -0
- package/skills/research/automation/aim-experiment-guide/SKILL.md +234 -0
- package/skills/research/automation/claude-academic-workflow-guide/SKILL.md +202 -0
- package/skills/research/automation/coexist-ai-guide/SKILL.md +149 -0
- package/skills/research/automation/datagen-research-guide/SKILL.md +131 -0
- package/skills/research/automation/foam-agent-guide/SKILL.md +203 -0
- package/skills/research/automation/kedro-pipeline-guide/SKILL.md +216 -0
- package/skills/research/automation/mle-agent-guide/SKILL.md +139 -0
- package/skills/research/automation/paper-to-agent-guide/SKILL.md +116 -0
- package/skills/research/automation/rd-agent-guide/SKILL.md +246 -0
- package/skills/research/automation/research-paper-orchestrator/SKILL.md +254 -0
- package/skills/research/deep-research/academic-deep-research/SKILL.md +190 -0
- package/skills/research/deep-research/auto-deep-research-guide/SKILL.md +141 -0
- package/skills/research/deep-research/cognitive-kernel-guide/SKILL.md +200 -0
- package/skills/research/deep-research/corvus-research-guide/SKILL.md +132 -0
- package/skills/research/deep-research/deep-research-pro/SKILL.md +213 -0
- package/skills/research/deep-research/deep-research-work/SKILL.md +204 -0
- package/skills/research/deep-research/deep-searcher-guide/SKILL.md +253 -0
- package/skills/research/deep-research/gpt-researcher-guide/SKILL.md +191 -0
- package/skills/research/deep-research/in-depth-research-guide/SKILL.md +205 -0
- package/skills/research/deep-research/khoj-research-guide/SKILL.md +200 -0
- package/skills/research/deep-research/kosmos-scientist-guide/SKILL.md +185 -0
- package/skills/research/deep-research/llm-scientific-discovery-guide/SKILL.md +178 -0
- package/skills/research/deep-research/local-deep-research-guide/SKILL.md +253 -0
- package/skills/research/deep-research/open-researcher-guide/SKILL.md +138 -0
- package/skills/research/deep-research/tongyi-deep-research-guide/SKILL.md +217 -0
- package/skills/research/funding/eu-horizon-guide/SKILL.md +244 -0
- package/skills/research/funding/grant-budget-guide/SKILL.md +284 -0
- package/skills/research/funding/nih-reporter-api-guide/SKILL.md +166 -0
- package/skills/research/funding/nsf-award-api-guide/SKILL.md +133 -0
- package/skills/research/methodology/academic-mentor-guide/SKILL.md +169 -0
- package/skills/research/methodology/claude-scientific-guide/SKILL.md +122 -0
- package/skills/research/methodology/deep-innovator-guide/SKILL.md +242 -0
- package/skills/research/methodology/osf-api-guide/SKILL.md +165 -0
- package/skills/research/methodology/parsifal-slr-guide/SKILL.md +154 -0
- package/skills/research/methodology/research-paper-kb/SKILL.md +263 -0
- package/skills/research/methodology/research-pipeline-units-guide/SKILL.md +169 -0
- package/skills/research/methodology/research-town-guide/SKILL.md +263 -0
- package/skills/research/methodology/slr-automation-guide/SKILL.md +235 -0
- package/skills/research/paper-review/automated-review-guide/SKILL.md +281 -0
- package/skills/research/paper-review/latte-review-guide/SKILL.md +175 -0
- package/skills/research/paper-review/paper-compare-guide/SKILL.md +238 -0
- package/skills/research/paper-review/paper-critique-framework/SKILL.md +181 -0
- package/skills/research/paper-review/paper-digest-guide/SKILL.md +240 -0
- package/skills/research/paper-review/paper-research-assistant/SKILL.md +231 -0
- package/skills/research/paper-review/research-quality-filter/SKILL.md +261 -0
- package/skills/research/paper-review/review-response-guide/SKILL.md +275 -0
- package/skills/tools/code-exec/contextplus-mcp-guide/SKILL.md +110 -0
- package/skills/tools/code-exec/google-colab-guide/SKILL.md +276 -0
- package/skills/tools/code-exec/kaggle-api-guide/SKILL.md +216 -0
- package/skills/tools/code-exec/overleaf-cli-guide/SKILL.md +279 -0
- package/skills/tools/diagram/clawphd-guide/SKILL.md +149 -0
- package/skills/tools/diagram/code-flow-visualizer/SKILL.md +197 -0
- package/skills/tools/diagram/excalidraw-diagram-guide/SKILL.md +170 -0
- package/skills/tools/diagram/json-data-visualizer/SKILL.md +270 -0
- package/skills/tools/diagram/kroki-diagram-api/SKILL.md +198 -0
- package/skills/tools/diagram/mermaid-architect-guide/SKILL.md +219 -0
- package/skills/tools/diagram/scientific-graphical-abstract/SKILL.md +201 -0
- package/skills/tools/diagram/tldraw-whiteboard-guide/SKILL.md +397 -0
- package/skills/tools/document/docsgpt-guide/SKILL.md +130 -0
- package/skills/tools/document/large-document-reader/SKILL.md +202 -0
- package/skills/tools/document/md2pdf-xelatex/SKILL.md +212 -0
- package/skills/tools/document/openpaper-guide/SKILL.md +232 -0
- package/skills/tools/document/paper-parse-guide/SKILL.md +243 -0
- package/skills/tools/document/weknora-guide/SKILL.md +216 -0
- package/skills/tools/document/zotero-addon-market-guide/SKILL.md +108 -0
- package/skills/tools/document/zotero-night-theme-guide/SKILL.md +142 -0
- package/skills/tools/document/zotero-style-guide/SKILL.md +217 -0
- package/skills/tools/knowledge-graph/citation-network-builder/SKILL.md +244 -0
- package/skills/tools/knowledge-graph/concept-map-generator/SKILL.md +284 -0
- package/skills/tools/knowledge-graph/graphiti-guide/SKILL.md +219 -0
- package/skills/tools/knowledge-graph/mimir-memory-guide/SKILL.md +135 -0
- package/skills/tools/knowledge-graph/notero-zotero-notion-guide/SKILL.md +187 -0
- package/skills/tools/knowledge-graph/open-webui-tools-guide/SKILL.md +156 -0
- package/skills/tools/knowledge-graph/openspg-guide/SKILL.md +210 -0
- package/skills/tools/knowledge-graph/paperpile-notion-guide/SKILL.md +84 -0
- package/skills/tools/knowledge-graph/zotero-markdb-connect-guide/SKILL.md +162 -0
- package/skills/tools/ocr-translate/latex-translation-guide/SKILL.md +176 -0
- package/skills/tools/ocr-translate/math-equation-renderer/SKILL.md +198 -0
- package/skills/tools/ocr-translate/pdf-math-translate-guide/SKILL.md +141 -0
- package/skills/tools/ocr-translate/zotero-pdf-translate-guide/SKILL.md +95 -0
- package/skills/tools/ocr-translate/zotero-pdf2zh-guide/SKILL.md +143 -0
- package/skills/tools/scraping/dataset-finder-guide/SKILL.md +253 -0
- package/skills/tools/scraping/easy-spider-guide/SKILL.md +250 -0
- package/skills/tools/scraping/google-scholar-scraper/SKILL.md +255 -0
- package/skills/tools/scraping/repository-harvesting-guide/SKILL.md +310 -0
- package/skills/writing/citation/academic-citation-manager/SKILL.md +314 -0
- package/skills/writing/citation/academic-citation-manager-guide/SKILL.md +182 -0
- package/skills/writing/citation/citation-assistant-skill/SKILL.md +192 -0
- package/skills/writing/citation/jabref-reference-guide/SKILL.md +127 -0
- package/skills/writing/citation/jasminum-zotero-guide/SKILL.md +103 -0
- package/skills/writing/citation/mendeley-api/SKILL.md +231 -0
- package/skills/writing/citation/obsidian-citation-guide/SKILL.md +164 -0
- package/skills/writing/citation/obsidian-zotero-guide/SKILL.md +137 -0
- package/skills/writing/citation/onecite-reference-guide/SKILL.md +168 -0
- package/skills/writing/citation/papersgpt-zotero-guide/SKILL.md +132 -0
- package/skills/writing/citation/papis-cli-guide/SKILL.md +213 -0
- package/skills/writing/citation/zotero-better-bibtex-guide/SKILL.md +107 -0
- package/skills/writing/citation/zotero-better-notes-guide/SKILL.md +121 -0
- package/skills/writing/citation/zotero-gpt-guide/SKILL.md +111 -0
- package/skills/writing/citation/zotero-mcp-guide/SKILL.md +164 -0
- package/skills/writing/citation/zotero-mdnotes-guide/SKILL.md +162 -0
- package/skills/writing/citation/zotero-reference-guide/SKILL.md +139 -0
- package/skills/writing/citation/zotero-scholar-guide/SKILL.md +294 -0
- package/skills/writing/citation/zotfile-attachment-guide/SKILL.md +140 -0
- package/skills/writing/composition/ml-paper-writing/SKILL.md +163 -0
- package/skills/writing/composition/opendraft-thesis-guide/SKILL.md +200 -0
- package/skills/writing/composition/paper-debugger-guide/SKILL.md +143 -0
- package/skills/writing/composition/paperforge-guide/SKILL.md +205 -0
- package/skills/writing/composition/research-paper-writer/SKILL.md +226 -0
- package/skills/writing/composition/scientific-writing-resources/SKILL.md +151 -0
- package/skills/writing/composition/scientific-writing-wrapper/SKILL.md +153 -0
- package/skills/writing/latex/academic-writing-latex/SKILL.md +285 -0
- package/skills/writing/latex/latex-drawing-collection/SKILL.md +154 -0
- package/skills/writing/latex/latex-templates-collection/SKILL.md +159 -0
- package/skills/writing/latex/md-to-pdf-academic/SKILL.md +230 -0
- package/skills/writing/latex/tex-render-guide/SKILL.md +243 -0
- package/skills/writing/polish/academic-tone-guide/SKILL.md +209 -0
- package/skills/writing/polish/chinese-text-humanizer/SKILL.md +140 -0
- package/skills/writing/polish/conciseness-editing-guide/SKILL.md +225 -0
- package/skills/writing/polish/paper-polish-guide/SKILL.md +160 -0
- package/skills/writing/templates/arxiv-preprint-template/SKILL.md +184 -0
- package/skills/writing/templates/elegant-paper-template/SKILL.md +141 -0
- package/skills/writing/templates/graphical-abstract-guide/SKILL.md +183 -0
- package/skills/writing/templates/novathesis-guide/SKILL.md +152 -0
- package/skills/writing/templates/scientific-article-pdf/SKILL.md +261 -0
- package/skills/writing/templates/sjtuthesis-guide/SKILL.md +197 -0
- package/skills/writing/templates/thuthesis-guide/SKILL.md +181 -0
- package/skills/literature/fulltext/repository-harvesting-guide/SKILL.md +0 -207
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: portfolio-optimization-guide
|
|
3
|
+
description: "Portfolio theory, optimization algorithms, and asset allocation methods"
|
|
4
|
+
metadata:
|
|
5
|
+
openclaw:
|
|
6
|
+
emoji: "briefcase"
|
|
7
|
+
category: "domains"
|
|
8
|
+
subcategory: "finance"
|
|
9
|
+
keywords: ["portfolio", "optimization", "markowitz", "asset-allocation", "mean-variance", "black-litterman"]
|
|
10
|
+
source: "wentor"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Portfolio Optimization Guide
|
|
14
|
+
|
|
15
|
+
A skill for implementing and researching portfolio optimization methods, from classical mean-variance optimization to modern robust and factor-based approaches. Covers Markowitz theory, Black-Litterman, risk parity, and machine learning-enhanced portfolio construction.
|
|
16
|
+
|
|
17
|
+
## Mean-Variance Optimization
|
|
18
|
+
|
|
19
|
+
### Classical Markowitz Portfolio
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
import numpy as np
|
|
23
|
+
from scipy.optimize import minimize
|
|
24
|
+
|
|
25
|
+
def mean_variance_optimize(expected_returns: np.ndarray,
|
|
26
|
+
cov_matrix: np.ndarray,
|
|
27
|
+
target_return: float = None,
|
|
28
|
+
risk_free_rate: float = 0.02) -> dict:
|
|
29
|
+
"""
|
|
30
|
+
Markowitz mean-variance optimization.
|
|
31
|
+
expected_returns: array of expected returns for each asset
|
|
32
|
+
cov_matrix: covariance matrix of asset returns
|
|
33
|
+
target_return: target portfolio return (None for max Sharpe)
|
|
34
|
+
"""
|
|
35
|
+
n_assets = len(expected_returns)
|
|
36
|
+
|
|
37
|
+
def portfolio_volatility(weights):
|
|
38
|
+
return np.sqrt(weights @ cov_matrix @ weights)
|
|
39
|
+
|
|
40
|
+
def neg_sharpe(weights):
|
|
41
|
+
ret = weights @ expected_returns
|
|
42
|
+
vol = portfolio_volatility(weights)
|
|
43
|
+
return -(ret - risk_free_rate) / vol
|
|
44
|
+
|
|
45
|
+
# Constraints
|
|
46
|
+
constraints = [
|
|
47
|
+
{"type": "eq", "fun": lambda w: np.sum(w) - 1}, # weights sum to 1
|
|
48
|
+
]
|
|
49
|
+
if target_return is not None:
|
|
50
|
+
constraints.append(
|
|
51
|
+
{"type": "eq", "fun": lambda w: w @ expected_returns - target_return}
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Bounds: no short selling (0 to 1 per asset)
|
|
55
|
+
bounds = [(0, 1) for _ in range(n_assets)]
|
|
56
|
+
|
|
57
|
+
# Initial guess: equal weight
|
|
58
|
+
w0 = np.ones(n_assets) / n_assets
|
|
59
|
+
|
|
60
|
+
if target_return is not None:
|
|
61
|
+
# Minimize volatility for given return
|
|
62
|
+
result = minimize(portfolio_volatility, w0,
|
|
63
|
+
bounds=bounds, constraints=constraints)
|
|
64
|
+
else:
|
|
65
|
+
# Maximize Sharpe ratio
|
|
66
|
+
result = minimize(neg_sharpe, w0,
|
|
67
|
+
bounds=bounds, constraints=constraints)
|
|
68
|
+
|
|
69
|
+
weights = result.x
|
|
70
|
+
ret = weights @ expected_returns
|
|
71
|
+
vol = portfolio_volatility(weights)
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
"weights": {f"asset_{i}": round(w, 4) for i, w in enumerate(weights)},
|
|
75
|
+
"expected_return": round(ret, 4),
|
|
76
|
+
"volatility": round(vol, 4),
|
|
77
|
+
"sharpe_ratio": round((ret - risk_free_rate) / vol, 4),
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Efficient Frontier
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
def compute_efficient_frontier(expected_returns: np.ndarray,
|
|
85
|
+
cov_matrix: np.ndarray,
|
|
86
|
+
n_points: int = 50) -> list[dict]:
|
|
87
|
+
"""
|
|
88
|
+
Compute the efficient frontier by solving for minimum variance
|
|
89
|
+
portfolios at each target return level.
|
|
90
|
+
"""
|
|
91
|
+
min_ret = expected_returns.min() * 0.8
|
|
92
|
+
max_ret = expected_returns.max() * 1.1
|
|
93
|
+
target_returns = np.linspace(min_ret, max_ret, n_points)
|
|
94
|
+
|
|
95
|
+
frontier = []
|
|
96
|
+
for target in target_returns:
|
|
97
|
+
try:
|
|
98
|
+
result = mean_variance_optimize(
|
|
99
|
+
expected_returns, cov_matrix, target_return=target
|
|
100
|
+
)
|
|
101
|
+
frontier.append({
|
|
102
|
+
"return": result["expected_return"],
|
|
103
|
+
"volatility": result["volatility"],
|
|
104
|
+
"sharpe": result["sharpe_ratio"],
|
|
105
|
+
})
|
|
106
|
+
except Exception:
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
return frontier
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Black-Litterman Model
|
|
113
|
+
|
|
114
|
+
### Incorporating Investor Views
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
def black_litterman(market_cap_weights: np.ndarray,
|
|
118
|
+
cov_matrix: np.ndarray,
|
|
119
|
+
P: np.ndarray,
|
|
120
|
+
Q: np.ndarray,
|
|
121
|
+
omega: np.ndarray = None,
|
|
122
|
+
risk_aversion: float = 2.5,
|
|
123
|
+
tau: float = 0.05) -> dict:
|
|
124
|
+
"""
|
|
125
|
+
Black-Litterman model for combining market equilibrium with
|
|
126
|
+
investor views.
|
|
127
|
+
market_cap_weights: market-cap weighted portfolio
|
|
128
|
+
cov_matrix: covariance matrix
|
|
129
|
+
P: pick matrix (k views x n assets), identifies assets in each view
|
|
130
|
+
Q: view returns (k x 1), expected returns for each view
|
|
131
|
+
omega: view uncertainty (k x k), diagonal matrix
|
|
132
|
+
"""
|
|
133
|
+
# Step 1: Implied equilibrium returns (reverse optimization)
|
|
134
|
+
pi = risk_aversion * cov_matrix @ market_cap_weights
|
|
135
|
+
|
|
136
|
+
# Step 2: View uncertainty (if not provided, use He-Litterman)
|
|
137
|
+
if omega is None:
|
|
138
|
+
omega = np.diag(np.diag(tau * P @ cov_matrix @ P.T))
|
|
139
|
+
|
|
140
|
+
# Step 3: Posterior expected returns
|
|
141
|
+
tau_sigma = tau * cov_matrix
|
|
142
|
+
inv_tau_sigma = np.linalg.inv(tau_sigma)
|
|
143
|
+
inv_omega = np.linalg.inv(omega)
|
|
144
|
+
|
|
145
|
+
posterior_precision = inv_tau_sigma + P.T @ inv_omega @ P
|
|
146
|
+
posterior_cov = np.linalg.inv(posterior_precision)
|
|
147
|
+
posterior_mean = posterior_cov @ (inv_tau_sigma @ pi + P.T @ inv_omega @ Q)
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
"equilibrium_returns": pi.round(4).tolist(),
|
|
151
|
+
"posterior_returns": posterior_mean.round(4).tolist(),
|
|
152
|
+
"posterior_covariance": posterior_cov.round(6).tolist(),
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Risk Parity
|
|
157
|
+
|
|
158
|
+
### Equal Risk Contribution Portfolio
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
def risk_parity(cov_matrix: np.ndarray, budget: np.ndarray = None) -> dict:
|
|
162
|
+
"""
|
|
163
|
+
Risk parity: each asset contributes equally to total portfolio risk.
|
|
164
|
+
budget: risk budget (default: equal, 1/n each)
|
|
165
|
+
"""
|
|
166
|
+
n = cov_matrix.shape[0]
|
|
167
|
+
if budget is None:
|
|
168
|
+
budget = np.ones(n) / n
|
|
169
|
+
|
|
170
|
+
def objective(weights):
|
|
171
|
+
portfolio_vol = np.sqrt(weights @ cov_matrix @ weights)
|
|
172
|
+
marginal_risk = cov_matrix @ weights
|
|
173
|
+
risk_contribution = weights * marginal_risk / portfolio_vol
|
|
174
|
+
target_risk = budget * portfolio_vol
|
|
175
|
+
return np.sum((risk_contribution - target_risk) ** 2)
|
|
176
|
+
|
|
177
|
+
constraints = [{"type": "eq", "fun": lambda w: np.sum(w) - 1}]
|
|
178
|
+
bounds = [(0.01, 1) for _ in range(n)]
|
|
179
|
+
w0 = np.ones(n) / n
|
|
180
|
+
|
|
181
|
+
result = minimize(objective, w0, bounds=bounds, constraints=constraints)
|
|
182
|
+
weights = result.x
|
|
183
|
+
|
|
184
|
+
# Verify risk contributions
|
|
185
|
+
portfolio_vol = np.sqrt(weights @ cov_matrix @ weights)
|
|
186
|
+
marginal_risk = cov_matrix @ weights
|
|
187
|
+
risk_contrib = weights * marginal_risk / portfolio_vol
|
|
188
|
+
risk_pct = risk_contrib / risk_contrib.sum()
|
|
189
|
+
|
|
190
|
+
return {
|
|
191
|
+
"weights": weights.round(4).tolist(),
|
|
192
|
+
"portfolio_volatility": round(portfolio_vol, 4),
|
|
193
|
+
"risk_contributions": risk_pct.round(4).tolist(),
|
|
194
|
+
"max_risk_deviation": round(np.max(np.abs(risk_pct - budget)), 4),
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Factor-Based Portfolio Construction
|
|
199
|
+
|
|
200
|
+
### Fama-French Factor Exposures
|
|
201
|
+
|
|
202
|
+
```python
|
|
203
|
+
import statsmodels.api as sm
|
|
204
|
+
|
|
205
|
+
def estimate_factor_exposures(asset_returns: pd.DataFrame,
|
|
206
|
+
factor_returns: pd.DataFrame) -> pd.DataFrame:
|
|
207
|
+
"""
|
|
208
|
+
Estimate asset exposures to Fama-French factors using regression.
|
|
209
|
+
factor_returns columns: Mkt-RF, SMB, HML, RMW, CMA (5-factor model)
|
|
210
|
+
"""
|
|
211
|
+
results = []
|
|
212
|
+
for asset in asset_returns.columns:
|
|
213
|
+
y = asset_returns[asset] - factor_returns.get("RF", 0)
|
|
214
|
+
X = sm.add_constant(factor_returns[["Mkt-RF", "SMB", "HML", "RMW", "CMA"]])
|
|
215
|
+
model = sm.OLS(y, X).fit()
|
|
216
|
+
|
|
217
|
+
results.append({
|
|
218
|
+
"asset": asset,
|
|
219
|
+
"alpha": round(model.params["const"], 6),
|
|
220
|
+
"beta_market": round(model.params["Mkt-RF"], 4),
|
|
221
|
+
"beta_size": round(model.params["SMB"], 4),
|
|
222
|
+
"beta_value": round(model.params["HML"], 4),
|
|
223
|
+
"beta_profit": round(model.params["RMW"], 4),
|
|
224
|
+
"beta_invest": round(model.params["CMA"], 4),
|
|
225
|
+
"r_squared": round(model.rsquared, 4),
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
return pd.DataFrame(results)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Rebalancing and Transaction Costs
|
|
232
|
+
|
|
233
|
+
### Optimal Rebalancing with Costs
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
def rebalance_with_costs(current_weights: np.ndarray,
|
|
237
|
+
target_weights: np.ndarray,
|
|
238
|
+
portfolio_value: float,
|
|
239
|
+
cost_per_trade: float = 0.001,
|
|
240
|
+
threshold: float = 0.02) -> dict:
|
|
241
|
+
"""
|
|
242
|
+
Determine rebalancing trades considering transaction costs.
|
|
243
|
+
threshold: minimum deviation to trigger rebalancing (2% default)
|
|
244
|
+
cost_per_trade: proportional transaction cost (10 bps)
|
|
245
|
+
"""
|
|
246
|
+
deviations = np.abs(current_weights - target_weights)
|
|
247
|
+
needs_rebalance = np.any(deviations > threshold)
|
|
248
|
+
|
|
249
|
+
if not needs_rebalance:
|
|
250
|
+
return {"action": "hold", "reason": "within threshold"}
|
|
251
|
+
|
|
252
|
+
trades = target_weights - current_weights
|
|
253
|
+
trade_value = np.abs(trades) * portfolio_value
|
|
254
|
+
total_cost = trade_value.sum() * cost_per_trade
|
|
255
|
+
|
|
256
|
+
return {
|
|
257
|
+
"action": "rebalance",
|
|
258
|
+
"trades": trades.round(4).tolist(),
|
|
259
|
+
"turnover": np.abs(trades).sum() / 2,
|
|
260
|
+
"transaction_cost": round(total_cost, 2),
|
|
261
|
+
"cost_as_pct": round(total_cost / portfolio_value * 100, 4),
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Key Academic References
|
|
266
|
+
|
|
267
|
+
- Markowitz, H. (1952). Portfolio Selection. *Journal of Finance*.
|
|
268
|
+
- Black, F. and Litterman, R. (1992). Global Portfolio Optimization. *Financial Analysts Journal*.
|
|
269
|
+
- Maillard, S., Roncalli, T., and Teiletche, J. (2010). The Properties of Equally Weighted Risk Contribution Portfolios. *Journal of Portfolio Management*.
|
|
270
|
+
- Fama, E. and French, K. (2015). A Five-Factor Asset Pricing Model. *Journal of Financial Economics*.
|
|
271
|
+
|
|
272
|
+
## Tools and Libraries
|
|
273
|
+
|
|
274
|
+
- **PyPortfolioOpt**: Portfolio optimization in Python (mean-variance, Black-Litterman, HRP)
|
|
275
|
+
- **riskfolio-lib**: Advanced portfolio optimization with risk measures
|
|
276
|
+
- **cvxpy**: Convex optimization for custom portfolio problems
|
|
277
|
+
- **QuantLib**: Fixed income and derivatives analytics
|
|
278
|
+
- **Kenneth French Data Library**: Factor returns data (free)
|
|
279
|
+
- **zipline / backtrader**: Backtesting frameworks for strategy evaluation
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: risk-modeling-guide
|
|
3
|
+
description: "Financial risk modeling including VaR, stress testing, and credit risk"
|
|
4
|
+
metadata:
|
|
5
|
+
openclaw:
|
|
6
|
+
emoji: "chart-decreasing"
|
|
7
|
+
category: "domains"
|
|
8
|
+
subcategory: "finance"
|
|
9
|
+
keywords: ["risk-modeling", "var", "stress-testing", "credit-risk", "monte-carlo", "basel"]
|
|
10
|
+
source: "wentor"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Risk Modeling Guide
|
|
14
|
+
|
|
15
|
+
A skill for quantitative financial risk modeling, covering Value at Risk, Expected Shortfall, credit risk, stress testing, and Monte Carlo simulation methods. Essential for financial engineering research and regulatory risk analysis.
|
|
16
|
+
|
|
17
|
+
## Market Risk: Value at Risk
|
|
18
|
+
|
|
19
|
+
### VaR Methodologies
|
|
20
|
+
|
|
21
|
+
| Method | Description | Pros | Cons |
|
|
22
|
+
|--------|-------------|------|------|
|
|
23
|
+
| Historical simulation | Replay past returns | No distributional assumption | Assumes past repeats |
|
|
24
|
+
| Variance-covariance | Assume normal returns | Fast, analytical | Underestimates tail risk |
|
|
25
|
+
| Monte Carlo simulation | Simulate from fitted model | Flexible distributions | Computationally expensive |
|
|
26
|
+
| Filtered historical simulation | GARCH + historical innovations | Captures volatility clustering | More complex |
|
|
27
|
+
|
|
28
|
+
### Implementation
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
import numpy as np
|
|
32
|
+
import pandas as pd
|
|
33
|
+
from scipy.stats import norm, t as t_dist
|
|
34
|
+
|
|
35
|
+
def historical_var(returns: np.ndarray, confidence: float = 0.99,
|
|
36
|
+
horizon_days: int = 1) -> dict:
|
|
37
|
+
"""
|
|
38
|
+
Compute Value at Risk using historical simulation.
|
|
39
|
+
returns: array of daily log returns
|
|
40
|
+
confidence: confidence level (e.g., 0.99 for 99% VaR)
|
|
41
|
+
horizon_days: risk horizon in days
|
|
42
|
+
"""
|
|
43
|
+
# Scale returns to horizon
|
|
44
|
+
if horizon_days > 1:
|
|
45
|
+
# Rolling sum for overlapping returns
|
|
46
|
+
scaled_returns = pd.Series(returns).rolling(horizon_days).sum().dropna().values
|
|
47
|
+
else:
|
|
48
|
+
scaled_returns = returns
|
|
49
|
+
|
|
50
|
+
alpha = 1 - confidence
|
|
51
|
+
var = -np.percentile(scaled_returns, alpha * 100)
|
|
52
|
+
es = -np.mean(scaled_returns[scaled_returns <= -var])
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
"VaR": round(var, 6),
|
|
56
|
+
"Expected_Shortfall": round(es, 6),
|
|
57
|
+
"confidence": confidence,
|
|
58
|
+
"horizon_days": horizon_days,
|
|
59
|
+
"n_observations": len(scaled_returns),
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
def parametric_var(returns: np.ndarray, confidence: float = 0.99,
|
|
63
|
+
distribution: str = "normal") -> dict:
|
|
64
|
+
"""
|
|
65
|
+
Parametric VaR assuming normal or Student-t distribution.
|
|
66
|
+
"""
|
|
67
|
+
mu = np.mean(returns)
|
|
68
|
+
sigma = np.std(returns, ddof=1)
|
|
69
|
+
|
|
70
|
+
if distribution == "normal":
|
|
71
|
+
z = norm.ppf(1 - confidence)
|
|
72
|
+
var = -(mu + sigma * z)
|
|
73
|
+
# Analytical ES for normal
|
|
74
|
+
es = -mu + sigma * norm.pdf(norm.ppf(1 - confidence)) / (1 - confidence)
|
|
75
|
+
elif distribution == "student-t":
|
|
76
|
+
# Fit Student-t
|
|
77
|
+
df, loc, scale = t_dist.fit(returns)
|
|
78
|
+
z = t_dist.ppf(1 - confidence, df)
|
|
79
|
+
var = -(loc + scale * z)
|
|
80
|
+
# ES for Student-t
|
|
81
|
+
t_pdf = t_dist.pdf(t_dist.ppf(1 - confidence, df), df)
|
|
82
|
+
es = -loc + scale * (t_pdf / (1 - confidence)) * ((df + z**2) / (df - 1))
|
|
83
|
+
else:
|
|
84
|
+
raise ValueError(f"Unknown distribution: {distribution}")
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
"VaR": round(var, 6),
|
|
88
|
+
"Expected_Shortfall": round(es, 6),
|
|
89
|
+
"distribution": distribution,
|
|
90
|
+
"mean": round(mu, 6),
|
|
91
|
+
"std": round(sigma, 6),
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Monte Carlo VaR
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
def monte_carlo_var(returns: np.ndarray, n_simulations: int = 100000,
|
|
99
|
+
confidence: float = 0.99,
|
|
100
|
+
horizon_days: int = 10) -> dict:
|
|
101
|
+
"""
|
|
102
|
+
Monte Carlo VaR using GBM (Geometric Brownian Motion).
|
|
103
|
+
"""
|
|
104
|
+
mu = np.mean(returns)
|
|
105
|
+
sigma = np.std(returns, ddof=1)
|
|
106
|
+
|
|
107
|
+
# Simulate daily returns for the horizon
|
|
108
|
+
rng = np.random.default_rng(42)
|
|
109
|
+
simulated = rng.normal(
|
|
110
|
+
mu * horizon_days,
|
|
111
|
+
sigma * np.sqrt(horizon_days),
|
|
112
|
+
size=n_simulations,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
alpha = 1 - confidence
|
|
116
|
+
var = -np.percentile(simulated, alpha * 100)
|
|
117
|
+
es = -np.mean(simulated[simulated <= -var])
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
"VaR": round(var, 6),
|
|
121
|
+
"Expected_Shortfall": round(es, 6),
|
|
122
|
+
"n_simulations": n_simulations,
|
|
123
|
+
"confidence": confidence,
|
|
124
|
+
"horizon_days": horizon_days,
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Credit Risk Modeling
|
|
129
|
+
|
|
130
|
+
### Probability of Default Estimation
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
from sklearn.linear_model import LogisticRegression
|
|
134
|
+
|
|
135
|
+
def build_pd_model(features: pd.DataFrame,
|
|
136
|
+
default_flag: pd.Series) -> dict:
|
|
137
|
+
"""
|
|
138
|
+
Build a Probability of Default (PD) model using logistic regression.
|
|
139
|
+
Common features: debt-to-income, credit utilization, payment history,
|
|
140
|
+
employment length, loan amount.
|
|
141
|
+
"""
|
|
142
|
+
model = LogisticRegression(max_iter=1000, class_weight="balanced")
|
|
143
|
+
model.fit(features, default_flag)
|
|
144
|
+
|
|
145
|
+
# Coefficient interpretation
|
|
146
|
+
coef_df = pd.DataFrame({
|
|
147
|
+
"feature": features.columns,
|
|
148
|
+
"coefficient": model.coef_[0],
|
|
149
|
+
"odds_ratio": np.exp(model.coef_[0]),
|
|
150
|
+
}).sort_values("coefficient", ascending=False)
|
|
151
|
+
|
|
152
|
+
# Model discrimination
|
|
153
|
+
from sklearn.metrics import roc_auc_score
|
|
154
|
+
pred_proba = model.predict_proba(features)[:, 1]
|
|
155
|
+
auc = roc_auc_score(default_flag, pred_proba)
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
"auc": round(auc, 4),
|
|
159
|
+
"coefficients": coef_df.to_dict("records"),
|
|
160
|
+
"intercept": round(model.intercept_[0], 4),
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Loss Given Default and EAD
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
def compute_expected_loss(pd_score: float, lgd: float,
|
|
168
|
+
ead: float) -> dict:
|
|
169
|
+
"""
|
|
170
|
+
Compute Expected Loss = PD x LGD x EAD.
|
|
171
|
+
pd_score: probability of default (0-1)
|
|
172
|
+
lgd: loss given default (0-1, fraction of exposure lost)
|
|
173
|
+
ead: exposure at default (dollar amount)
|
|
174
|
+
"""
|
|
175
|
+
el = pd_score * lgd * ead
|
|
176
|
+
return {
|
|
177
|
+
"PD": pd_score,
|
|
178
|
+
"LGD": lgd,
|
|
179
|
+
"EAD": ead,
|
|
180
|
+
"Expected_Loss": round(el, 2),
|
|
181
|
+
"Unexpected_Loss_99": round(el * 2.33 * np.sqrt(pd_score * (1 - pd_score)), 2),
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Stress Testing
|
|
186
|
+
|
|
187
|
+
### Scenario-Based Stress Tests
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
def run_stress_test(portfolio_returns: pd.DataFrame,
|
|
191
|
+
scenarios: dict[str, dict]) -> pd.DataFrame:
|
|
192
|
+
"""
|
|
193
|
+
Apply macroeconomic stress scenarios to a portfolio.
|
|
194
|
+
scenarios: {name: {factor: shock_value}} where factors are
|
|
195
|
+
macroeconomic variables (interest_rate, gdp_growth, unemployment, etc.)
|
|
196
|
+
"""
|
|
197
|
+
# Factor sensitivities (betas from regression)
|
|
198
|
+
# In practice, estimated via historical regression
|
|
199
|
+
factor_betas = {
|
|
200
|
+
"interest_rate": -0.15, # portfolio loses 15bp per 1% rate increase
|
|
201
|
+
"gdp_growth": 0.08, # gains 8bp per 1% GDP growth
|
|
202
|
+
"unemployment": -0.12, # loses 12bp per 1% unemployment increase
|
|
203
|
+
"equity_market": 0.45, # 45bp per 1% equity market move
|
|
204
|
+
"credit_spread": -0.25, # loses 25bp per 1% spread widening
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
results = []
|
|
208
|
+
for name, shocks in scenarios.items():
|
|
209
|
+
portfolio_impact = 0
|
|
210
|
+
for factor, shock in shocks.items():
|
|
211
|
+
beta = factor_betas.get(factor, 0)
|
|
212
|
+
portfolio_impact += beta * shock
|
|
213
|
+
|
|
214
|
+
results.append({
|
|
215
|
+
"scenario": name,
|
|
216
|
+
"portfolio_impact_pct": round(portfolio_impact * 100, 2),
|
|
217
|
+
"shocks": shocks,
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
return pd.DataFrame(results)
|
|
221
|
+
|
|
222
|
+
# Example scenarios
|
|
223
|
+
scenarios = {
|
|
224
|
+
"Mild Recession": {
|
|
225
|
+
"interest_rate": -0.5, "gdp_growth": -2.0,
|
|
226
|
+
"unemployment": 2.0, "equity_market": -15.0,
|
|
227
|
+
"credit_spread": 1.5,
|
|
228
|
+
},
|
|
229
|
+
"Severe Recession": {
|
|
230
|
+
"interest_rate": -1.0, "gdp_growth": -5.0,
|
|
231
|
+
"unemployment": 5.0, "equity_market": -40.0,
|
|
232
|
+
"credit_spread": 4.0,
|
|
233
|
+
},
|
|
234
|
+
"Rate Shock": {
|
|
235
|
+
"interest_rate": 3.0, "gdp_growth": -1.0,
|
|
236
|
+
"unemployment": 1.0, "equity_market": -10.0,
|
|
237
|
+
"credit_spread": 1.0,
|
|
238
|
+
},
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Regulatory Framework
|
|
243
|
+
|
|
244
|
+
### Basel III Capital Requirements
|
|
245
|
+
|
|
246
|
+
| Risk Type | Measurement | Capital Charge |
|
|
247
|
+
|-----------|-------------|---------------|
|
|
248
|
+
| Market risk | FRTB (Fundamental Review of the Trading Book) | ES at 97.5%, stressed calibration |
|
|
249
|
+
| Credit risk | SA or IRB approach | PD, LGD, EAD based risk weights |
|
|
250
|
+
| Operational risk | Basic Indicator / Standardized | Business indicator x ILM |
|
|
251
|
+
| Liquidity risk | LCR and NSFR ratios | High-quality liquid assets buffer |
|
|
252
|
+
|
|
253
|
+
## Tools and Libraries
|
|
254
|
+
|
|
255
|
+
- **QuantLib (Python/C++)**: Derivatives pricing and risk analytics
|
|
256
|
+
- **riskfolio-lib**: Portfolio risk and optimization in Python
|
|
257
|
+
- **arch (Python)**: GARCH models for volatility estimation
|
|
258
|
+
- **pyfolio**: Portfolio performance and risk analysis
|
|
259
|
+
- **OpenGamma Strata**: Open-source market risk analytics (Java)
|
|
260
|
+
- **Moody's Analytics / Bloomberg PORT**: Commercial risk platforms
|