diff --git a/Cargo.toml b/Cargo.toml index fb46a9c..2ef7261 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ta-lib-in-rust" +name = "rusttalib" version = "1.0.6" edition = "2021" description = "A library of technical indicators for financial analysis, similar to TA-Lib" @@ -8,7 +8,7 @@ license = "MIT" repository = "https://github.com/rustic-ml/RusTaLib" # Add homepage, often same as repository if no separate project page homepage = "https://github.com/rustic-ml/RusTaLib" -documentation = "https://docs.rs/ta-lib-in-rust" +documentation = "https://docs.rs/rusttalib" readme = "README.md" keywords = ["finance", "technical-analysis", "trading", "indicators", "stocks"] # Add relevant categories for discoverability diff --git a/README.md b/README.md index 4a875ff..6332f5d 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ # RusTalib, the Crustacean Financial Analyst 🦀 -Meet **Rustalib**, your steadfast crustacean companion for navigating the currents of financial markets! This comprehensive Rust library, `ta-lib-in-rust`, provides a powerful toolkit for calculating technical indicators, all powered by the high-performance [Polars](https://pola.rs/) DataFrame library. +Meet **Rustalib**, your steadfast crustacean companion for navigating the currents of financial markets! This comprehensive Rust library, `rusttalib`, provides a powerful toolkit for calculating technical indicators, all powered by the high-performance [Polars](https://pola.rs/) DataFrame library. Whether you're charting, backtesting, or building live trading systems, Rustalib is here to help you process market data with speed and precision. -![Technical Indicators Library Icon](images_processed.png) [![crates.io](https://img.shields.io/crates/v/ta-lib-in-rust.svg)](https://crates.io/crates/ta-lib-in-rust) -[![docs.rs](https://docs.rs/ta-lib-in-rust/badge.svg)](https://docs.rs/ta-lib-in-rust) +![Technical Indicators Library Icon](images_processed.png) [![crates.io](https://img.shields.io/crates/v/rusttalib.svg)](https://crates.io/crates/rusttalib) +[![docs.rs](https://docs.rs/rusttalib/badge.svg)](https://docs.rs/rusttalib) --- ## Project Overview -**ta-lib-in-rust** provides a robust, extensible, and efficient toolkit for quantitative finance, algorithmic trading, and data science in Rust. The library is designed for: +**rusttalib** provides a robust, extensible, and efficient toolkit for quantitative finance, algorithmic trading, and data science in Rust. The library is designed for: - **Fast, vectorized computation** using Polars DataFrames - **Easy integration** with modern Rust data workflows - **Modular design**: Use only the indicators you need @@ -44,7 +44,7 @@ Add to your `Cargo.toml`: ```toml [dependencies] -ta-lib-in-rust = "*" # Or specify a version +rusttalib = "*" # Or specify a version polars = { version = "0.46", features = ["lazy", "dtype-full"] } ``` @@ -143,9 +143,9 @@ Contributions are welcome! Please: --- ## Links -- [Crates.io](https://crates.io/crates/ta-lib-in-rust) -- [Documentation (docs.rs)](https://docs.rs/ta-lib-in-rust) -- [GitHub Repository](https://github.com/rustic-ml/ta-lib-in-rust) +- [Crates.io](https://crates.io/crates/rusttalib) +- [Documentation (docs.rs)](https://docs.rs/rusttalib) +- [GitHub Repository](https://github.com/rustic-ml/rusttalib) ## License diff --git a/docs/csv_guide.md b/docs/csv_guide.md index 3bc7707..ab3605a 100644 --- a/docs/csv_guide.md +++ b/docs/csv_guide.md @@ -1,6 +1,6 @@ -# Working with CSV Data in ta-lib-in-rust +# Working with CSV Data in rusttalib -This guide explains how to effectively work with CSV data when using the ta-lib-in-rust library. +This guide explains how to effectively work with CSV data when using the rusttalib library. ## CSV Format Requirements diff --git a/examples/bollinger_bands_basic.rs b/examples/bollinger_bands_basic.rs index 6c08f3f..08f7078 100644 --- a/examples/bollinger_bands_basic.rs +++ b/examples/bollinger_bands_basic.rs @@ -1,5 +1,5 @@ use polars::prelude::*; -use ta_lib_in_rust::indicators::volatility::calculate_bollinger_bands; +use rusttalib::indicators::volatility::calculate_bollinger_bands; fn main() -> Result<(), PolarsError> { // Create a simple price series with some movement diff --git a/examples/file_reading_example.rs b/examples/file_reading_example.rs index 8d8aecc..60e5417 100644 --- a/examples/file_reading_example.rs +++ b/examples/file_reading_example.rs @@ -1,8 +1,6 @@ use polars::prelude::*; +use rusttalib::util::file_utils::{read_csv, read_csv_default, read_financial_data, read_parquet}; use std::error::Error; -use ta_lib_in_rust::util::file_utils::{ - read_csv, read_csv_default, read_financial_data, read_parquet, -}; fn main() -> Result<(), Box> { println!("======= Reading Financial Data Files Example =======\n"); diff --git a/examples/general/basic_indicators.rs b/examples/general/basic_indicators.rs index d4a7feb..9c98526 100644 --- a/examples/general/basic_indicators.rs +++ b/examples/general/basic_indicators.rs @@ -1,5 +1,5 @@ use polars::prelude::*; -use ta_lib_in_rust::indicators::{ +use rusttalib::indicators::{ moving_averages::{calculate_ema, calculate_sma, calculate_wma}, oscillators::{calculate_macd, calculate_rsi}, volatility::calculate_bollinger_bands, diff --git a/examples/macd_basic.rs b/examples/macd_basic.rs index 35c375f..24bbecd 100644 --- a/examples/macd_basic.rs +++ b/examples/macd_basic.rs @@ -1,5 +1,5 @@ use polars::prelude::*; -use ta_lib_in_rust::indicators::oscillators::calculate_macd; +use rusttalib::indicators::oscillators::calculate_macd; fn main() -> Result<(), PolarsError> { // Create a simple price series with some movement diff --git a/examples/moving_averages_basic.rs b/examples/moving_averages_basic.rs index d336432..b60de03 100644 --- a/examples/moving_averages_basic.rs +++ b/examples/moving_averages_basic.rs @@ -1,5 +1,5 @@ use polars::prelude::*; -use ta_lib_in_rust::indicators::moving_averages::{calculate_ema, calculate_sma, calculate_wma}; +use rusttalib::indicators::moving_averages::{calculate_ema, calculate_sma, calculate_wma}; fn main() -> Result<(), PolarsError> { // Create a simple price series with trend followed by sideways movement diff --git a/examples/rsi_basic.rs b/examples/rsi_basic.rs index cb184bf..7dd8c94 100644 --- a/examples/rsi_basic.rs +++ b/examples/rsi_basic.rs @@ -1,5 +1,5 @@ use polars::prelude::*; -use ta_lib_in_rust::indicators::oscillators::calculate_rsi; +use rusttalib::indicators::oscillators::calculate_rsi; fn main() -> Result<(), PolarsError> { // Create a simple price series with some movement diff --git a/examples/stock/mean_reversion.rs b/examples/stock/mean_reversion.rs index 56e2c22..5496df9 100644 --- a/examples/stock/mean_reversion.rs +++ b/examples/stock/mean_reversion.rs @@ -2,9 +2,9 @@ // This example demonstrates a simple mean reversion strategy using technical indicators use polars::prelude::*; -use ta_lib_in_rust::indicators::moving_averages::calculate_sma; -use ta_lib_in_rust::indicators::oscillators::calculate_rsi; -use ta_lib_in_rust::indicators::volatility::calculate_bollinger_bands; +use rusttalib::indicators::moving_averages::calculate_sma; +use rusttalib::indicators::oscillators::calculate_rsi; +use rusttalib::indicators::volatility::calculate_bollinger_bands; fn main() -> Result<(), PolarsError> { println!("Mean Reversion Strategy Example"); diff --git a/examples/stock/trend_following.rs b/examples/stock/trend_following.rs index 5d5a0ce..f901ba1 100644 --- a/examples/stock/trend_following.rs +++ b/examples/stock/trend_following.rs @@ -2,9 +2,9 @@ // This example demonstrates a simple trend following strategy using technical indicators use polars::prelude::*; -use ta_lib_in_rust::indicators::moving_averages::calculate_sma; -use ta_lib_in_rust::indicators::oscillators::{calculate_macd, calculate_rsi}; -use ta_lib_in_rust::indicators::trend::calculate_adx; +use rusttalib::indicators::moving_averages::calculate_sma; +use rusttalib::indicators::oscillators::{calculate_macd, calculate_rsi}; +use rusttalib::indicators::trend::calculate_adx; fn main() -> Result<(), PolarsError> { println!("Trend Following Strategy Example"); diff --git a/examples/vwap_basic.rs b/examples/vwap_basic.rs index 3fe7fb4..0e616e6 100644 --- a/examples/vwap_basic.rs +++ b/examples/vwap_basic.rs @@ -2,7 +2,7 @@ // This example demonstrates how to calculate and visualize VWAP use polars::prelude::*; -use ta_lib_in_rust::indicators::moving_averages::calculate_vwap; +use rusttalib::indicators::moving_averages::calculate_vwap; fn main() -> Result<(), PolarsError> { println!("VWAP (Volume Weighted Average Price) Example"); diff --git a/examples/working_with_multi_stock_data.rs b/examples/working_with_multi_stock_data.rs index 70dee80..a528298 100644 --- a/examples/working_with_multi_stock_data.rs +++ b/examples/working_with_multi_stock_data.rs @@ -1,11 +1,11 @@ use polars::prelude::*; -use std::convert::TryInto; -use ta_lib_in_rust::indicators::{ +use rusttalib::indicators::{ moving_averages::{calculate_ema, calculate_sma}, oscillators::{calculate_macd, calculate_rsi}, volatility::{calculate_atr, calculate_bollinger_bands}, volume::calculate_obv, }; +use std::convert::TryInto; /// This example demonstrates how to load and process data from multiple stock CSV files /// that may have different column formats, and perform cross-stock comparisons. diff --git a/src/indicators/oscillators/dpo.rs b/src/indicators/oscillators/dpo.rs index fdb4090..c40cd96 100644 --- a/src/indicators/oscillators/dpo.rs +++ b/src/indicators/oscillators/dpo.rs @@ -8,7 +8,7 @@ pub fn calculate_dpo(df: &DataFrame, close_col: &str, period: usize) -> PolarsRe let len = df.height(); let mut dpo = vec![f64::NAN; len]; let shift = period / 2 + 1; - + for (i, _) in (0..len).enumerate() { if i + 1 >= period { let sma: f64 = close diff --git a/src/indicators/volume/cmf.rs b/src/indicators/volume/cmf.rs index be1af62..b9167ce 100644 --- a/src/indicators/volume/cmf.rs +++ b/src/indicators/volume/cmf.rs @@ -100,7 +100,12 @@ pub fn calculate_cmf(df: &DataFrame, window: usize) -> PolarsResult { // Use an iterator-based approach as suggested by Clippy let window_start = i - (window - 1); - for (idx, money_flow_vol) in money_flow_volumes.iter().enumerate().skip(window_start).take(window) { + for (idx, money_flow_vol) in money_flow_volumes + .iter() + .enumerate() + .skip(window_start) + .take(window) + { let vol = volume.get(idx).unwrap_or(f64::NAN); if !money_flow_vol.is_nan() && !vol.is_nan() {