Skip to main content

A Python library for financial transaction processing and analysis.

Project description

Custodium

Custodium

PyPI Python Versions License

Custodium is a Python package for tracking investment portfolios and calculating adjusted cost basis (ACB) for Canadian capital gain/loss calculations. Primarily designed for educational purposes, so please read the source code and understand the logic before using it for real-world applications and having fun with it!

Table of Contents

Key Features

  • Track investment transactions across multiple currencies with automatic exchange rate handling
  • Calculate and maintain adjusted cost basis (ACB) over time
  • Process special transaction types (e.g., equity vesting)
  • Generate capital gains reports for tax purposes

Installation

pip install custodium

Usage

Processing Transactions

Create a CSV file (e.g. my_transactions.csv) with these columns:

date,description,base_currency,quote_currency,quantity,price,fees,note
2023-01-15,Buy AAPL shares,AAPL,USD,10,150.25,9.95,Initial purchase
2023-03-10,Buy MSFT shares,MSFT,USD,15,280.45,9.95,Portfolio diversification
2023-06-30,Sell AAPL shares,AAPL,USD,-5,175.50,9.95,Partial profit taking
2023-08-15,Convert USD to CAD,CAD,USD,1000,0.73,5.00,Currency repatriation

Then load and process:

from decimal import Decimal
from custodium.portfolio import Asset, Holdings
from custodium.processing import load_transactions, process_transactions
from custodium.reporting import calculate_yearly_gains, plot_holdings_history
from custodium.utils import displayPandas

# Load transactions from CSV
transactions, df_log = load_transactions("my_transactions.csv")

# Create the portfolio
holdings = Holdings()
reporting_currency = "CAD"

# Create initial holdings with funding
holdings = Holdings()
holdings.add(
    Asset(
        date="2023-01-01",
        asset="CAD",
        quantity=Decimal("10000"),
        acb=Decimal("1"), # Must be 1 for the reporting currency
    )
)
holdings.add(
    Asset(
        date="2023-01-01",
        asset="USD",
        quantity=Decimal("10000"),
        acb=Decimal("1.35"),
    )
)

# Process transactions
holdings, gains = process_transactions(transactions, holdings=holdings, reporting_currency=reporting_currency)

# View current holdings with readable formatting
displayPandas(holdings.current, precision=2)

# Calculate and display the yearly gains/losses
yearly_gains = calculate_yearly_gains(gains)
displayPandas(yearly_gains, precision=5)

# Plot the history of holdings (Ploty is required)
fig = plot_holdings_history(holdings)
fig.show()

Code Structure

├── custodium
│   ├── exchange.py     # Currency exchange rate management
│   ├── portfolio.py    # Core data structures (Transaction, Asset, Holdings)
│   ├── processing.py   # Transaction processing logic and CSV loading
│   ├── reporting.py    # Capital gains reporting and visualization tools
│   ├── utils.py        # Utility functions
│   └── __init__.py     # Package version and imports
├── requirements        # Package dependencies
├── tests               # Unit tests for package components
├── .gitignore
├── .pre-commit-config.yaml  # Pre-commit hooks configuration
├── LICENSE
├── Makefile                 # Build and test automation
├── pyproject.toml           # CI/CD configuration
├── README.md
└── setup.py                 # Package installation configuration

Disclaimer

This package is provided for educational purposes only. Users should not rely on this software for financial advice, tax reporting, or investment decisions without independent verification. The authors accept no responsibility for any financial losses, tax implications, or other issues that may arise from the use of this software.

LICENSE

This project is licensed under the MIT License. See the LICENSE file for details.

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

custodium-1.0.0.tar.gz (17.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

custodium-1.0.0-py3-none-any.whl (12.9 kB view details)

Uploaded Python 3

File details

Details for the file custodium-1.0.0.tar.gz.

File metadata

  • Download URL: custodium-1.0.0.tar.gz
  • Upload date:
  • Size: 17.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.10

File hashes

Hashes for custodium-1.0.0.tar.gz
Algorithm Hash digest
SHA256 55f6cc15c883655896c71711c4213af27fabc210e761b19ec6a0e4c3182ab102
MD5 11640dd2af946d76878bca1f436761dd
BLAKE2b-256 395118d3eb86dccfb5294b9a65e3fdc3c5fe9cd5a911eb460b825e0e6343885d

See more details on using hashes here.

File details

Details for the file custodium-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: custodium-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 12.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.10

File hashes

Hashes for custodium-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 98e795e8746331ca8f4b2a05da05bdaddc4648eccd27b784770e47b2960e8950
MD5 a939fc58083dee1293f6065e887b1197
BLAKE2b-256 53ff7547021d22c02d6d0778e316e29f900b48f869b700e84a7ea56e303b729b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page