Skip to main content

Python package for Silver Fund quant team research and trading tools.

Project description

Silver Fund Quant

A quantitative finance library for the BYU Silver Fund quant team. Provides tools for data loading, portfolio optimization, backtesting, performance analysis, and signal research — all built on Polars DataFrames.

Installation

pip install sf-quant

Environment Configuration

sf-quant requires two environment variables to locate data: ROOT and DATABASE.

Option 1: .env file or environment variables

Create a .env file in your project root (automatically loaded via python-dotenv):

ROOT=/path/to/root
DATABASE=your_database

Or export them in your shell:

export ROOT=/path/to/root
export DATABASE=your_database

Option 2: Programmatic configuration

Set values at runtime using sfd.env():

import sf_quant.data as sfd

sfd.env(root="/path/to/root", database="your_database")

This will override any values set via environment variables.

Quick Start

A complete workflow: load asset data, build a momentum alpha signal, construct a covariance matrix, and optimize a portfolio.

import sf_quant.data as sfd
import sf_quant.optimizer as sfo
import datetime as dt
import polars as pl

# 1. Load asset data
df = (
    sfd.load_assets(
        start=dt.date(2024, 1, 1),
        end=dt.date(2024, 12, 31),
        columns=["date", "barrid", "price", "return", "specific_risk", "predicted_beta"],
        in_universe=True,
    )
    .with_columns(pl.col("return", "specific_risk").truediv(100))
    .sort("barrid", "date")
)

# 2. Build a momentum alpha signal
df_clean = (
    df
    .with_columns(
        pl.col("return").log1p().rolling_sum(window_size=230).shift(22).over("barrid").alias("momentum"),
    )
    .with_columns(
        pl.col("momentum").sub(pl.col("momentum").mean()).truediv(pl.col("momentum").std()).over("date").alias("score")
    )
    .with_columns(
        pl.lit(0.05).mul(pl.col("score")).mul(pl.col("specific_risk")).alias("alpha")
    )
    .drop_nulls()
    .sort("barrid")
)

# 3. Construct the covariance matrix
date_ = df_clean["date"].last()
barrids = df_clean["barrid"].to_list()

covariance_matrix = (
    sfd.construct_covariance_matrix(date_=date_, barrids=barrids)
    .drop("barrid").to_numpy()
)

# 4. Optimize the portfolio
weights = sfo.mve_optimizer(
    ids=barrids,
    alphas=df_clean["alpha"].to_list(),
    betas=df_clean["predicted_beta"].to_list(),
    covariance_matrix=covariance_matrix,
    constraints=[sfo.ZeroBeta()],
    gamma=100,
)

Modules

sf_quant.data

Load financial data as Polars DataFrames. Use get_*_columns() to inspect available columns for any dataset.

Function Description
load_assets() Asset prices, returns, risk, and metadata for a date range
load_assets_by_date() Asset data for a single date
load_crsp_daily() / load_crsp_v2_daily() CRSP daily stock data
load_crsp_monthly() / load_crsp_v2_monthly() CRSP monthly stock data
load_exposures() / load_exposures_by_date() Barra factor exposures (77+ factors)
load_covariances_by_date() Factor covariance matrix for a date
construct_covariance_matrix() Build an asset-level covariance matrix from the factor model
load_benchmark() / load_benchmark_returns() Benchmark weights and returns
load_factors() / get_factor_names() Barra factor returns and metadata
load_fama_french() Fama-French 5-factor data

sf_quant.optimizer

Mean-variance efficient (MVE) portfolio optimizer built on CVXPY.

import sf_quant.optimizer as sfo

weights = sfo.mve_optimizer(
    ids=barrids,
    alphas=alphas,
    covariance_matrix=covariance_matrix,
    constraints=[sfo.FullInvestment(), sfo.LongOnly()],
    gamma=2,
)

Available constraints:

Constraint Effect
FullInvestment() Weights sum to 1
ZeroInvestment() Weights sum to 0
LongOnly() No short positions
NoBuyingOnMargin() Weights sum to at most 1
UnitBeta() Portfolio beta equals 1
ZeroBeta() Portfolio beta equals 0

sf_quant.backtester

Run walk-forward backtests that optimize at each rebalance date.

import sf_quant.backtester as sfb

# Sequential (single core)
portfolio = sfb.backtest_sequential(data=df, constraints=constraints, gamma=2)

# Parallel (multi-core via Ray)
portfolio = sfb.backtest_parallel(data=df, constraints=constraints, gamma=2, n_cpus=4)

sf_quant.performance

Compute and visualize portfolio performance metrics.

Function Description
generate_returns_from_weights() Portfolio returns from weight history
generate_multi_returns_from_weights() Total, benchmark, and active returns
generate_leverage_from_weights() Sum of absolute weights over time
generate_drawdown_from_returns() Drawdown from peak
generate_returns_summary_table() Mean return, volatility, Sharpe, total return
generate_alpha_ics() Information coefficients between signals and realized returns
get_turnover_stats() Rolling turnover statistics
generate_returns_chart() Plot cumulative returns
generate_multi_returns_chart() Plot total/benchmark/active returns
generate_leverage_chart() Plot leverage over time
generate_drawdown_chart() Plot drawdowns
generate_ic_chart() Plot information coefficients
plot_turnover() Plot portfolio turnover

sf_quant.research

Tools for signal analysis and factor research.

Function Description
generate_quantile_ports() Sort assets into quantile portfolios with long-short spread
vol_scale_ports() Scale portfolio returns to target volatility
beta_scale_ports() Scale portfolio returns to target beta
run_ff_regression() Fama-French 5-factor regression
run_quantile_ff_regression() FF regressions across quantile portfolios
get_signal_stats() Summary statistics for a signal
get_signal_distribution() Plot signal distribution

Documentation Development

To run a local server of the sphinx documentation run

uv run sphinx-autobuild docs docs/_build/html

Release Process

  1. Create PR
  2. Merge PR(s)
  3. Increment version in pyproject.toml
  4. git tag v*..
  5. git push origin main --tags
  6. Create a release and publish release notes (github)
  7. uv build
  8. uv publish

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

sf_quant-0.2.5.tar.gz (150.2 kB view details)

Uploaded Source

Built Distribution

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

sf_quant-0.2.5-py3-none-any.whl (61.9 kB view details)

Uploaded Python 3

File details

Details for the file sf_quant-0.2.5.tar.gz.

File metadata

  • Download URL: sf_quant-0.2.5.tar.gz
  • Upload date:
  • Size: 150.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for sf_quant-0.2.5.tar.gz
Algorithm Hash digest
SHA256 11ff138fba36e47337c2535989ef8bce2b727e99cae500f3f79ae5ed54e721b1
MD5 c883bc90cb154de506b76ef8fba45543
BLAKE2b-256 66b6eacb6f6287c89ff7a5a589368fcaddf7dcc5668405ecf8d1f77451150c72

See more details on using hashes here.

File details

Details for the file sf_quant-0.2.5-py3-none-any.whl.

File metadata

  • Download URL: sf_quant-0.2.5-py3-none-any.whl
  • Upload date:
  • Size: 61.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for sf_quant-0.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 b2c1d556deff0ad8d87c9bba9844e0bbd062d3d88f9cded2cc6c2c0df1d44ed1
MD5 13e3ec98951a2585993bf296c2f27b73
BLAKE2b-256 8c30e37614b0dcd51bd630acdfc6c7e6bbee7120b06fd738dec7f948b4bc6a02

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