Composer Tools
A small library of useful tools for Composer
📦 Installation
pip install composer-tools
🚀 Quick Example
from composer_tools.converters.short_codes import generate_symphony_code
# When SPY's RSI drops below 30, switch to GLD, otherwise stay in BIL
code = generate_symphony_code("RSI_14_SPY_LT_30 GLD,BIL")
This generates:
(defsymphony
"RSI_14_SPY_LT_30"
{:asset-class "EQUITIES", :rebalance-frequency :daily}
(weight-equal
[(if
(< (rsi "SPY" {:window 14}) 30.0)
[(asset "GLD")]
[(asset "BIL")])])
)
⚙️ How It Works
The format is simple: CONDITION ASSET1,ASSET2
- CONDITION: When to switch assets
- ASSET1: What to buy when condition is true
- ASSET2: What to buy when condition is false
📊 Condition Types
Absolute Conditions
Compare a metric to a fixed value:
generate_symphony_code("RSI_14_SPY_LT_30 GLD,BIL") # RSI below 30
generate_symphony_code("STD_20_XLU_GT_0.02 TLT,SPY") # Volatility above 2%
generate_symphony_code("CUMRET_10_SPY_LT_0 CASH,SPY") # Negative returns
Relative Conditions
Compare metrics between assets:
generate_symphony_code("MA_50_SPY_LT_MA_20_SPY CASH,SPY") # Death cross
generate_symphony_code("CUMRET_30_XLK_GT_CUMRET_30_XLU XLK,XLU") # Sector rotation
Nested Conditions
Chain conditions with __ (all must be true):
generate_symphony_code("RSI_14_SPY_LT_30__STD_20_SPY_GT_0.02__CUMRET_5_SPY_LT_0 GLD,SPY")
📈 Supported Metrics
-
RSI- Relative Strength Index -
STD- Standard deviation of returns -
CUMRET- Cumulative return -
MA- Moving average - there are more from Composer which need to be added!
💡Real Examples
# Momentum strategy
generate_symphony_code("RSI_14_QQQ_GT_70 QQQ,TLT")
# Volatility protection
generate_symphony_code("STD_20_SPY_GT_0.025 TLT,SPY")
# Trend following
generate_symphony_code("MA_20_SPY_GT_MA_50_SPY SPY,CASH")
# Nested statement
generate_symphony_code("RSI_14_SPY_LT_30__STD_20_VIX_GT_25__CUMRET_10_SPY_LT_-0.05 GLD,SPY")
🔧 API
generate_symphony_code(input_str: str) -> str
# Converts short notation to Composer code.
parse_condition(condition_str: str) -> dict
# Parses condition strings into structured data (useful for debugging).
parse_condition("RSI_14_SPY_LT_30")
# Returns: {'type': 'absolute', 'metric': 'RSI', 'window': '14', 'ticker': 'SPY', 'operator': 'LT', 'value': '30'}
🤝 Contributing
This project is new and contributors are welcome. Please submit a PR!
There's a lot of interesting work to do:
- More metrics and functions: The rest of the Composer functions
- Better conditions: OR logic, more complex nesting
- Performance: Optimization and caching
- Documentation: More examples and tutorials
Development Setup 🛠️
git clone https://github.com/your-repo/composer-tools
cd composer-tools
uv sync
uv run pytest
All contributions welcome, from typo fixes to major features. The codebase is clean and the tests are comprehensive, so it's easy to jump in.
📄 License
MIT License - use this code however you want.
Metadata
Release files for composer-tools 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| composer_tools-0.1.1.tar.gz | 8.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| composer_tools-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.6 kB
Release files / composer_tools-0.1.1.tar.gz
| Download URL | composer_tools-0.1.1.tar.gz |
|---|---|
| Size | 8.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c07044d985fe9f9484b2ed959c7dc9ee9d09c30a5a77605d825604f1f244a8a8
|
|
BLAKE2b-256 checksum How to use checksums |
e91a5bd9599401953528b2e1183e471fbd89a7b182044d9748cd75efe2793f1c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.4
|
Release files / composer_tools-0.1.1-py3-none-any.whl
| Download URL | composer_tools-0.1.1-py3-none-any.whl |
|---|---|
| Size | 8.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a9bfc3b7f8107b87ba0d3e1835a185dd243602d33746e5915366f1d3b7562278
|
|
BLAKE2b-256 checksum How to use checksums |
60ce4887a52ddcab407e4c9a255937552ba384a02fdc0fc59a1130f6bd03e15f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.4
|