Skip to main content

...

Project description

📈 TinyCTA

A Lightweight Python Package for Commodity Trading Advisor Strategies.

PyPI version MIT License Coverage Downloads CodeFactor Rhiza


Quick Links: 📚 Repository📦 PyPI🐛 Issues💬 Discussions


📋 Overview

TinyCTA provides essential tools for quantitative finance and algorithmic trading, particularly for trend-following strategies. The package includes:

  • Polars-based signal processing: oscillators, moving-average crossovers, and volatility-adjusted returns
  • Robust volatility estimation via rolling median absolute deviation
  • Linear algebra utilities that handle matrices with missing values
  • Matrix shrinkage techniques commonly used in portfolio optimization

This package is designed to be the foundation for implementing CTA strategies in just a few lines of code, hence the name "TinyCTA".

🚀 Installation

Using pip

pip install tinycta

From source

Clone the repository and install using the provided Makefile:

git clone https://github.com/tschm/tinycta.git
cd tinycta
make install

This will install uv (a fast Python package installer) and create a virtual environment with all dependencies.

💻 Usage

Oscillator signal (Polars)

import polars as pl
from tinycta.osc import osc

prices = pl.DataFrame({"A": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
result = prices.with_columns(osc(pl.col("A"), fast=2, slow=6, vola=3).alias("osc_A"))

Moving-average crossover (Polars)

import polars as pl
from tinycta.ewma import ma_cross

prices = pl.DataFrame({"A": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
result = prices.with_columns(
    ma_cross(pl.col("A"), fast=2, slow=6).alias("sig_A")
)

Volatility-adjusted returns (Polars)

import polars as pl
from tinycta.util import vol_adj, adj_log_prices

prices = pl.DataFrame({"A": [100, 101, 99, 102, 98, 103]})
result = prices.with_columns(
    vol_adj(pl.col("A"), vola=3, clip=4.2).alias("vol_adj_A"),
    adj_log_prices(pl.col("A"), vola=3, clip=4.2).alias("adj_log_A"),
)

Linear algebra operations

import numpy as np
from tinycta.linalg import solve

matrix = np.array([[1.0, 0.5], [0.5, 1.0]])
rhs = np.array([1.0, 2.0])
solution = solve(matrix, rhs)
print(solution)
[0. 2.]

📚 API Reference

Signal Processing (tinycta.osc, tinycta.ewma, tinycta.util)

  • osc(x, fast, slow, vola, min_samples=1) — EWMA-difference oscillator scaled by EWMA volatility (Polars)
  • ma_cross(prices, fast, slow, min_samples=1) — sign of fast-vs-slow EWM crossover: -1, 0, or +1 (Polars)
  • vol_adj(x, vola, clip, min_samples=1) — clipped, volatility-adjusted log returns (Polars)
  • adj_log_prices(x, vola, clip, min_samples=1) — cumulative sum of volatility-adjusted log returns (Polars)

Signal Utilities (tinycta.signal)

  • moving_absolute_deviation(price, com=32) — robust rolling volatility estimate via median absolute deviation (pandas)
  • shrink2id(matrix, lamb=1.0) — shrink a matrix towards the identity matrix

Linear Algebra (tinycta.linalg)

  • valid(matrix) — extract the finite subset of a matrix by filtering NaN rows/columns
  • a_norm(vector, matrix=None) — matrix-norm of a vector
  • inv_a_norm(vector, matrix=None) — inverse matrix-norm of a vector
  • solve(matrix, rhs) — solve a linear system, handling matrices with NaN values

🛠️ Development

Setting up the development environment

make install

Running tests

make test

Code formatting and linting

make fmt

Cleaning up

make clean

📄 License

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

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

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

tinycta-0.11.0.tar.gz (1.7 MB view details)

Uploaded Source

Built Distribution

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

tinycta-0.11.0-py3-none-any.whl (15.3 kB view details)

Uploaded Python 3

File details

Details for the file tinycta-0.11.0.tar.gz.

File metadata

  • Download URL: tinycta-0.11.0.tar.gz
  • Upload date:
  • Size: 1.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tinycta-0.11.0.tar.gz
Algorithm Hash digest
SHA256 6aed1b04c2060b97575a808b7f631f149b5e8009af22dfc2017505460ff21371
MD5 3ce5a38a9d8b66db59f21e95997f6c31
BLAKE2b-256 8190e7a12f09e41a90555a5f8629cd0a3ed6015f5c6b545f6d170bce053f8ef7

See more details on using hashes here.

Provenance

The following attestation bundles were made for tinycta-0.11.0.tar.gz:

Publisher: rhiza_release.yml on tschm/TinyCTA

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tinycta-0.11.0-py3-none-any.whl.

File metadata

  • Download URL: tinycta-0.11.0-py3-none-any.whl
  • Upload date:
  • Size: 15.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tinycta-0.11.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b6d1e59d418b9f9d8b3f29510db502dceb52290207cf88f8c96fab9bbf24805a
MD5 a0029dcc36785defe1c57b84aabc9a78
BLAKE2b-256 891b913c9fb314659b7a5a7f87ec846c343563ebf9f782ca806b00510a5edb95

See more details on using hashes here.

Provenance

The following attestation bundles were made for tinycta-0.11.0-py3-none-any.whl:

Publisher: rhiza_release.yml on tschm/TinyCTA

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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