LensIQ / README.md
Tulitula's picture
Update README.md
d7f3d6c verified
metadata
title: LensIQ
emoji: 🏢
colorFrom: gray
colorTo: pink
sdk: docker
app_port: 7860
pinned: false
short_description: CAPM + CML portfolio advisor w/ embeddings
models:
  - FinLang/finance-embeddings-investopedia
datasets:
  - Tulitula/LensIQ-Synthetic-Portfolio-1000

LensIQ

  • Plot: x = historical σ (annualized, from monthly covariances), y = CAPM E[r] = rf + β·ERP.
  • Efficient mixes: market/bills with (i) same σ, (ii) same E[r] as your portfolio (weights shown).
  • Suggestions: one Low/Medium/High, from 1,000 long-only mixes built from your tickers (+ VOO), ranked with CAPM + embeddings (MMR).
  • Export: every run writes a CSV of all 1,000 candidates in data/.

Include VOO in your portfolio before computing.

Run Locally

docker build -t lensiq .
docker run -p 7860:7860 -e GRADIO_SERVER_NAME=0.0.0.0 lensiq
# open http://localhost:7860
Create & Upload the Dataset
In the app, add tickers, set amounts, horizon, lookback → Compute.

Download the generated CSV from the UI (saved under data/).

Create a dataset repo on Hugging Face named Tulitula/LensIQ-Synthetic-Portfolio-1000 and upload:

the CSV you downloaded

the dataset README from below 


**B) Dataset README (for `Tulitula/LensIQ-Synthetic-Portfolio-1000`)**
```markdown
# LensIQ Synthetic Portfolio 1000

Synthetic portfolio dataset generated by the LensIQ app for CAPM/CML-based analysis and ranking.

- **Size:** 1,000 rows (per export)
- **Modality:** Tabular (text fields for lists)
- **License:** CC BY 4.0
- **Intended use:** Research/teaching on portfolio construction, risk/return modeling, ranking/retrieval. *Not financial advice.*

## Generation Process

Given a user universe **U** (their tickers + `VOO` as market):

1. Sample `k ~ U{2…min(8, |U|)}` tickers from **U** (no replacement).  
2. Draw long-only weights `w ~ Dirichlet(1,…,1)`.  
3. Compute:
   - Prices: Yahoo Finance monthly (auto-adjusted), last *N* years (lookback).
   - Risk-free `rf`: FRED tenor chosen by horizon (e.g., DGS10).
   - Market `m`: `VOO`.
   - Market ERP `= E[m] − rf` (from monthly returns, annualized).
   - Asset betas vs. market (excess returns).
   - **mu_capm** `= rf + β_p·ERP`, where `β_p = Σ_i w_i β_i`.
   - **sigma_hist**: annualized portfolio σ from monthly covariance.
   - **sigma_capm**: `|β_p| · σ_market` (for reference to CML).
4. Rank candidates with CAPM metrics + finance embeddings (MMR) to surface Low/Medium/High picks in the app.

## Columns

| column       | type   | description                                            |
|--------------|--------|--------------------------------------------------------|
| `tickers`    | string | comma-separated tickers in the candidate mix          |
| `weights`    | string | comma-separated floats summing to 1 (long-only)       |
| `beta`       | float  | portfolio beta (weighted by `weights`)                |
| `mu_capm`    | float  | CAPM expected annual return                           |
| `sigma_hist` | float  | annualized historical σ from covariance               |
| `sigma_capm` | float  | CAPM σ on the CML for equivalent return               |

**Example row**
tickers: "VOO,QQQ,IBIT"
weights: "0.53,0.41,0.06"
beta: 1.18
mu_capm: 0.153
sigma_hist: 0.209
sigma_capm: 0.191


## Files

- `investor_profiles_<timestamp>.csv` — 1,000 synthetic candidates.