Modular YAML based portfolio analytics calculation engine
Project description
Portfolio Analytics Calculation Engine
This project provides a modular YAML based portfolio analytics calculation engine. This engine allows to plug in YAML configurations to compute various portfolio related analytics. Engine adheres to YAML schema and is utilising Polars or Python instructions. This project also hosts a dash app that relies on a local LLM model to create schema compliant YAML files. These YAML files are consumed and interpreted by the calculation engine provided.
Table of Contents
Overview
The analytics calculation engine is designed to process data based on instructions provided in YAML configuration files. It leverages Polars for data manipulation and supports Sphinx for documentation generation.
System Context
graph TD
A[User] -->|Interacts with| B[Dash Web UI]
B -->|Sends JSON data| C[Backend Service]
C -->|Fetches data from| G[Data Service]
G -->|Fetches data from| D[SQL Server]
C -->|Processes YAML files with| E[Calculation Engine]
E -->|Uses| F[Polars]
E -->|Uses| I[YAML Files]
C -->|Interacts with| H[GPT App]
H -->|Generates| I[YAML Files]
C -->|Returns results to| B
B -->|Displays results to| A
Video Demo
Features
- Modular design with separation of data, configuration, and computation.
- Dynamic analytics calculations via YAML configurations.
- Regression testing capabilities with YAML support.
- Sphinx documentation for the codebase.
Getting Started
Prerequisites
- SQL Server database (e.g., SQL Server Docker container) to simulate database access. One can use docker image, e.g. https://github.com/chriseaton/docker-adventureworks, https://hub.docker.com/r/chriseaton/adventureworks
- Python 3.11 or higher.
- For GPT app to work, local installation of ollama with some LLM models is needed. See https://ollama.com
- Packages listed in
requirements.txt.
Installation
-
Clone the Repository
git clone https://github.com/maxicusj/polarparrot.git cd polarparrot
-
Install Dependencies
pip install -r requirements.txt
-
Create Environment Configuration (.env)
Create a.envfile in the root directory with the following content:DB_SERVER=localhost DB_DATABASE=AdventureWorks DB_USERNAME=sa DB_PASSWORD=password
-
Start Backend Services, Web UI and GPT Assistant
Start the services with the provided script:./start_services.sh
Usage
Running Analytics defined in JSON config file
Run the selected YAML metrics against mockup test data:
python metrics_runner.py analytics_list.json
Running Regression Tests
Run regression on YAML metrics against mockup test data in data.py:
python tests/regression_runner.py
Running Unit Tests
Run the selected YAML metrics against mockup test data:
python tests/unit_tests_runner.py
Running Analytics via CURL Command
You can test the backend service with a sample request:
curl -X POST http://localhost:8088/analytics \
-H "Content-Type: application/json" \
-d '{
"positions_json": "[{\"instrument_id\": 1, \"weight_1\": 0.00005, \"weight_2\": 0.00004, \"weight_3\": 0.00003, \"weight_4\": 0.00005, \"is_laggard\": true}, {\"instrument_id\": 2, \"weight_1\": 0.00007, \"weight_2\": 0.00006, \"weight_3\": 0.00007, \"weight_4\": 0.00006, \"is_laggard\": false}, {\"instrument_id\": 3, \"weight_1\": 0.0001, \"weight_2\": 0.00008, \"weight_3\": 0.00002, \"weight_4\": 0.0001, \"is_laggard\": true}, {\"instrument_id\": 4, \"weight_1\": 0.00002, \"weight_2\": 0.00005, \"weight_3\": 0.00009, \"weight_4\": 0.00002, \"is_laggard\": true}, {\"instrument_id\": 5, \"weight_1\": 0.00009, \"weight_2\": 0.00007, \"weight_3\": 0.00005, \"weight_4\": 0.00007, \"is_laggard\": false}]",
"analytics_list_json": "{\"analytics\": [\"yaml/0002.yaml\", \"yaml/0004.yaml\"]}"
}'
Running Analytics via Web UI
http://localhost:8050
Generating YAML config Files with GPT Assistant
http://localhost:8080
Project Structure
-
metrics_runner.py: Executes analytics calculations as per YAML configurations. -
regression_runner.py: Validates metrics using regression tests. -
unit_tests_runner.py: Validates metrics using regression tests. -
start_services.sh: Starts backend services and the web UI. -
requirements.txt: Lists required Python packages. -
.env: Environment variables for database connection. -
calculation_engine.py: The actual analytics engine. -
backend_service.py: Backend service. -
data_service.py: Data service, providing interface to the SQL database. -
app.py: Web UI for running analytics against provided YAML config and portfolio positions. -
gpt/gpt_service.py: Web UI for generating YAMLs with the help of an LLM. -
data/data.sql: Sample SQL table and data population script for instrument_categorization table. Used by analytics engine.
Customization
You can customize this engine by:
- Adding new YAML files to the
yaml/directory to define analytics configurations. - Generating new YAML files by talking to a locally available LLM model(http://localhost:8080) and placing the genrated files to the
yaml/directory to be interrpreted by the engine. - Extending the Polars DataFrame manipulation logic in the
calculaton_engine.pyfile.
License
This project is licensed under MIT License.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file polarparrot-0.0.12.tar.gz.
File metadata
- Download URL: polarparrot-0.0.12.tar.gz
- Upload date:
- Size: 1.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ecd8c1f7b949f2b0d060adbb1d1c34808bfa2fa54a9d76e8a2ac1a7eb02d5c6
|
|
| MD5 |
fd9905336bb42e81339dfef41c72ea74
|
|
| BLAKE2b-256 |
8b99916c955cb1da9fe577f3f1e9374bf107bde5be28bc71fc3a0cade0912272
|
Provenance
The following attestation bundles were made for polarparrot-0.0.12.tar.gz:
Publisher:
publish.yml on maxicusj/polarparrot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
polarparrot-0.0.12.tar.gz -
Subject digest:
2ecd8c1f7b949f2b0d060adbb1d1c34808bfa2fa54a9d76e8a2ac1a7eb02d5c6 - Sigstore transparency entry: 152950235
- Sigstore integration time:
-
Permalink:
maxicusj/polarparrot@bbf7c211bb506ecb187053dfcba3466fb1dff5de -
Branch / Tag:
refs/tags/0.0.12 - Owner: https://github.com/maxicusj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bbf7c211bb506ecb187053dfcba3466fb1dff5de -
Trigger Event:
release
-
Statement type:
File details
Details for the file polarparrot-0.0.12-py3-none-any.whl.
File metadata
- Download URL: polarparrot-0.0.12-py3-none-any.whl
- Upload date:
- Size: 960.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bcb40b5a2b6cc34297072b1885dd47e335ba418aeacc9a723a8fc12a1ada929e
|
|
| MD5 |
4a516a6856b35130014995424a6836ca
|
|
| BLAKE2b-256 |
5b1d275aaf5a7529697f49e3bce4a164d9f34dbd16ed11acf4bf427761670e94
|
Provenance
The following attestation bundles were made for polarparrot-0.0.12-py3-none-any.whl:
Publisher:
publish.yml on maxicusj/polarparrot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
polarparrot-0.0.12-py3-none-any.whl -
Subject digest:
bcb40b5a2b6cc34297072b1885dd47e335ba418aeacc9a723a8fc12a1ada929e - Sigstore transparency entry: 152950239
- Sigstore integration time:
-
Permalink:
maxicusj/polarparrot@bbf7c211bb506ecb187053dfcba3466fb1dff5de -
Branch / Tag:
refs/tags/0.0.12 - Owner: https://github.com/maxicusj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bbf7c211bb506ecb187053dfcba3466fb1dff5de -
Trigger Event:
release
-
Statement type: