{"id":13622160,"url":"https://github.com/amv-dev/yata","last_synced_at":"2025-04-15T05:33:51.300Z","repository":{"id":41429265,"uuid":"296436637","full_name":"amv-dev/yata","owner":"amv-dev","description":"Yet Another Technical Analysis library [for Rust]","archived":false,"fork":false,"pushed_at":"2024-09-19T18:02:41.000Z","size":700,"stargazers_count":355,"open_issues_count":9,"forks_count":51,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-14T19:17:11.095Z","etag":null,"topics":["indicators","moving-average","technical-analysis","trading","trading-strategies"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amv-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":"amv-dev","issuehunt":null,"otechie":null,"custom":null}},"created_at":"2020-09-17T20:35:28.000Z","updated_at":"2025-04-02T11:11:07.000Z","dependencies_parsed_at":"2023-11-11T08:29:54.353Z","dependency_job_id":"da4105c7-982f-4e6f-af08-ec55395678d9","html_url":"https://github.com/amv-dev/yata","commit_stats":{"total_commits":354,"total_committers":9,"mean_commits":"39.333333333333336","dds":"0.10451977401129942","last_synced_commit":"5820314782bea8d5acbfbfd238f3d8d15ca4e85b"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amv-dev%2Fyata","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amv-dev%2Fyata/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amv-dev%2Fyata/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amv-dev%2Fyata/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amv-dev","download_url":"https://codeload.github.com/amv-dev/yata/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249015968,"owners_count":21198824,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["indicators","moving-average","technical-analysis","trading","trading-strategies"],"created_at":"2024-08-01T21:01:14.978Z","updated_at":"2025-04-15T05:33:51.001Z","avatar_url":"https://github.com/amv-dev.png","language":"Rust","readme":"# YATA\n\n## Yet Another Technical Analysis library\n\n[![Crates.io](https://img.shields.io/crates/v/yata?style=for-the-badge)](https://crates.io/crates/yata)\n![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/amv-dev/yata/rust.yml?style=for-the-badge)\n[![Read docs](https://img.shields.io/badge/docs.rs-read-brightgreen?style=for-the-badge)](https://docs.rs/yata/latest/yata/)\n[![License Apache 2.0](https://img.shields.io/github/license/amv-dev/yata.svg?style=for-the-badge)](https://github.com/amv-dev/yata/blob/master/LICENSE)\n[![GitHub issues](https://img.shields.io/github/issues/amv-dev/yata?style=for-the-badge)](https://github.com/amv-dev/yata/issues)\n[![Made with Rust](https://forthebadge.com/images/badges/made-with-rust.svg)](https://www.rust-lang.org/)\n\nYaTa implements most common technical analysis [methods](https://docs.rs/yata/latest/yata/methods/index.html#structs)\nand [indicators](https://docs.rs/yata/latest/yata/indicators/index.html#structs).\n\nIt also provides you an interface to create your own indicators.\n\n```toml\n[dependencies]\nyata = \"0.6\"\n```\n\n## Available **moving averages**:\n\n- [Simple moving average (SMA)](https://docs.rs/yata/latest/yata/methods/struct.SMA.html);\n- [Weighted moving average (WMA)](https://docs.rs/yata/latest/yata/methods/struct.WMA.html);\n- Exponential moving average family: [EMA](https://docs.rs/yata/latest/yata/methods/struct.EMA.html),\n  [DMA](https://docs.rs/yata/latest/yata/methods/struct.DMA.html), [TMA](https://docs.rs/yata/latest/yata/methods/struct.TMA.html),\n  [DEMA](https://docs.rs/yata/latest/yata/methods/struct.DEMA.html), [TEMA](https://docs.rs/yata/latest/yata/methods/struct.TEMA.html);\n- [Simple moving median (SMM)](https://docs.rs/yata/latest/yata/methods/struct.SMM.html);\n- [Linear regression moving average (LSMA)](https://docs.rs/yata/latest/yata/methods/struct.LinReg.html);\n- [Volume weighted moving average (VWMA)](https://docs.rs/yata/latest/yata/methods/struct.VWMA.html);\n- [Symmetrically weighted moving average (SWMA)](https://docs.rs/yata/latest/yata/methods/struct.SWMA.html);\n- [Hull moving average (HMA)](https://docs.rs/yata/latest/yata/methods/struct.HMA.html);\n- [Running Moving Average (RMA)](https://docs.rs/yata/latest/yata/methods/struct.RMA.html);\n- [Triangular Moving Average (TRIMA)](https://docs.rs/yata/latest/yata/methods/struct.TRIMA.html);\n- [Wilder’s Smoothing Average (WSMA)](https://docs.rs/yata/latest/yata/methods/struct.WSMA.html);\n- [Kaufman Adaptive Moving Average (KAMA)](https://docs.rs/yata/latest/yata/indicators/struct.Kaufman.html);\n- [Convolution Moving Average](https://docs.rs/yata/latest/yata/methods/struct.Conv.html);\n- [Variable Index Dynamic Average (Vidya)](https://docs.rs/yata/latest/yata/methods/struct.Vidya.html);\n\n[See all](https://docs.rs/yata/latest/yata/methods/index.html#structs)\n\n## Timeseries conversion\n\n- [Timeframe Collapsing](https://docs.rs/yata/latest/yata/methods/struct.CollapseTimeframe.html);\n- [Heikin Ashi](https://docs.rs/yata/latest/yata/methods/struct.HeikinAshi.html);\n- [Renko](https://docs.rs/yata/latest/yata/methods/struct.Renko.html);\n\n## Some commonly used **methods**:\n\n- [Accumulation-distribution index](https://docs.rs/yata/latest/yata/methods/struct.ADI.html);\n- [Commodity channel index](https://docs.rs/yata/latest/yata/methods/struct.CCI.html);\n- [Cross](https://docs.rs/yata/latest/yata/methods/struct.Cross.html) / [CrossAbove](https://docs.rs/yata/latest/yata/methods/struct.CrossAbove.html) / [CrossUnder](https://docs.rs/yata/latest/yata/methods/struct.CrossUnder.html);\n- [Derivative](https://docs.rs/yata/latest/yata/methods/struct.Derivative.html) (differential);\n- [Highest](https://docs.rs/yata/latest/yata/methods/struct.Highest.html) / [Lowest](https://docs.rs/yata/latest/yata/methods/struct.Lowest.html) / [Highest-Lowest Delta](https://docs.rs/yata/latest/yata/methods/struct.HighestLowestDelta.html);\n- [Highest Index](https://docs.rs/yata/latest/yata/methods/struct.HighestIndex.html) / [Lowest Index](https://docs.rs/yata/latest/yata/methods/struct.LowestIndex.html);\n- [Integral](https://docs.rs/yata/latest/yata/methods/struct.Integral.html) (sum);\n- [Mean absolute deviation](https://docs.rs/yata/latest/yata/methods/struct.MeanAbsDev.html);\n- [Median absolute deviation](https://docs.rs/yata/latest/yata/methods/struct.MedianAbsDev.html);\n- [Momentum](https://docs.rs/yata/latest/yata/methods/struct.Momentum.html);\n- [Past](https://docs.rs/yata/latest/yata/methods/struct.Past.html);\n- [Rate Of Change](https://docs.rs/yata/latest/yata/methods/struct.RateOfChange.html) (ROC);\n- [Reversal points](https://docs.rs/yata/latest/yata/methods/struct.ReversalSignal.html);\n- [Standard Deviation](https://docs.rs/yata/latest/yata/methods/struct.StDev.html);\n- [True Range](https://docs.rs/yata/latest/yata/methods/struct.TR.html);\n- [True Strength Index](https://docs.rs/yata/latest/yata/methods/struct.TSI.html);\n- [Volatility](https://docs.rs/yata/latest/yata/methods/struct.LinearVolatility.html);\n\n[See all](https://docs.rs/yata/latest/yata/methods/index.html#structs)\n\n## Some commonly used **indicators**:\n\n- [Average Directional Index](https://docs.rs/yata/latest/yata/indicators/struct.AverageDirectionalIndex.html);\n- [Awesome Oscillator](https://docs.rs/yata/latest/yata/indicators/struct.AwesomeOscillator.html);\n- [Bollinger Bands](https://docs.rs/yata/latest/yata/indicators/struct.BollingerBands.html);\n- [Commodity Channel Index](https://docs.rs/yata/latest/yata/indicators/struct.CommodityChannelIndex.html);\n- [Detrended Price Oscillator](https://docs.rs/yata/latest/yata/indicators/struct.DetrendedPriceOscillator.html);\n- [Ease Of Movement](https://docs.rs/yata/latest/yata/indicators/struct.EaseOfMovement.html);\n- [Elders Force Index](https://docs.rs/yata/latest/yata/indicators/struct.EldersForceIndex.html);\n- [Envelopes](https://docs.rs/yata/latest/yata/indicators/struct.Envelopes.html);\n- [Fisher Transform](https://docs.rs/yata/latest/yata/indicators/struct.FisherTransform.html);\n- [Ichimoku Cloud](https://docs.rs/yata/latest/yata/indicators/struct.IchimokuCloud.html);\n- [Keltner Channels](https://docs.rs/yata/latest/yata/indicators/struct.KeltnerChannel.html);\n- [Moving Average Convergence Divergence (MACD)](https://docs.rs/yata/latest/yata/indicators/struct.MACD.html);\n- [Money Flow Index](https://docs.rs/yata/latest/yata/indicators/struct.MoneyFlowIndex.html);\n- [Price Channel Strategy](https://docs.rs/yata/latest/yata/indicators/struct.PriceChannelStrategy.html);\n- [Relative Strength Index (RSI)](https://docs.rs/yata/latest/yata/indicators/struct.RelativeStrengthIndex.html);\n- [Stochastic Oscillator](https://docs.rs/yata/latest/yata/indicators/struct.StochasticOscillator.html);\n- [Trix](https://docs.rs/yata/latest/yata/indicators/struct.Trix.html);\n- [Woodies CCI](https://docs.rs/yata/latest/yata/indicators/struct.WoodiesCCI.html);\n\nAnd many others. [See all](https://docs.rs/yata/latest/yata/indicators/index.html#structs)\n\n## Method usage example\n\n```rust\nuse yata::prelude::*;\nuse yata::methods::EMA;\n\n// EMA of length=3\nlet mut ema = EMA::new(3, \u00263.0).unwrap();\n\nema.next(\u00263.0);\nema.next(\u00266.0);\n\nassert_eq!(ema.next(\u00269.0), 6.75);\nassert_eq!(ema.next(\u002612.0), 9.375);\n```\n\n## Indicator usage example\n\n```rust\nuse yata::helpers::{RandomCandles, MA};\nuse yata::indicators::MACD;\nuse yata::prelude::*;\n\nlet mut candles = RandomCandles::new();\nlet mut macd = MACD::default();\n\nmacd.method1 = \"sma-4\".parse().unwrap(); // one way of defining methods inside indicators\n\nmacd.signal = MA::TEMA(5); // another way of defining methods inside indicators\n\nlet mut macd = macd.init(\u0026candles.first()).unwrap();\n\nfor candle in candles.take(10) {\n\tlet result = macd.next(\u0026candle);\n\n\tprintln!(\"{:?}\", result);\n}\n```\n\n# Benchmarks\n\n## Methods\n\n- **\\_w10** - method with window `length`=10\n- **\\_w100** - method with window `length`=100\n\n```\ntest bench_adi_w10                   ... bench:           7 ns/iter (+/- 0)\ntest bench_adi_w100                  ... bench:           7 ns/iter (+/- 0)\ntest bench_cci_w10                   ... bench:          16 ns/iter (+/- 0)\ntest bench_cci_w100                  ... bench:         133 ns/iter (+/- 8)\ntest bench_conv_w10                  ... bench:          23 ns/iter (+/- 2)\ntest bench_conv_w100                 ... bench:         197 ns/iter (+/- 0)\ntest bench_cross                     ... bench:           5 ns/iter (+/- 0)\ntest bench_cross_above               ... bench:           3 ns/iter (+/- 0)\ntest bench_cross_under               ... bench:           3 ns/iter (+/- 0)\ntest bench_dema_w10                  ... bench:           7 ns/iter (+/- 0)\ntest bench_dema_w100                 ... bench:           6 ns/iter (+/- 0)\ntest bench_derivative_w10            ... bench:           4 ns/iter (+/- 0)\ntest bench_derivative_w100           ... bench:           3 ns/iter (+/- 0)\ntest bench_dma_w10                   ... bench:           5 ns/iter (+/- 0)\ntest bench_dma_w100                  ... bench:           5 ns/iter (+/- 0)\ntest bench_ema_w10                   ... bench:           5 ns/iter (+/- 0)\ntest bench_ema_w100                  ... bench:           5 ns/iter (+/- 0)\ntest bench_heikin_ashi               ... bench:           4 ns/iter (+/- 0)\ntest bench_highest_index_w10         ... bench:           6 ns/iter (+/- 0)\ntest bench_highest_index_w100        ... bench:           6 ns/iter (+/- 0)\ntest bench_highest_lowest_delta_w10  ... bench:          10 ns/iter (+/- 0)\ntest bench_highest_lowest_delta_w100 ... bench:          10 ns/iter (+/- 0)\ntest bench_highest_w10               ... bench:           6 ns/iter (+/- 0)\ntest bench_highest_w100              ... bench:           7 ns/iter (+/- 0)\ntest bench_hma_w10                   ... bench:          14 ns/iter (+/- 0)\ntest bench_hma_w100                  ... bench:          15 ns/iter (+/- 0)\ntest bench_integral_w10              ... bench:           7 ns/iter (+/- 0)\ntest bench_integral_w100             ... bench:           7 ns/iter (+/- 0)\ntest bench_lin_reg_w10               ... bench:           8 ns/iter (+/- 1)\ntest bench_lin_reg_w100              ... bench:           8 ns/iter (+/- 0)\ntest bench_linear_volatility_w10     ... bench:           4 ns/iter (+/- 0)\ntest bench_linear_volatility_w100    ... bench:           4 ns/iter (+/- 0)\ntest bench_lowest_index_w10          ... bench:           6 ns/iter (+/- 0)\ntest bench_lowest_index_w100         ... bench:           7 ns/iter (+/- 0)\ntest bench_lowest_w10                ... bench:           6 ns/iter (+/- 0)\ntest bench_lowest_w100               ... bench:           6 ns/iter (+/- 0)\ntest bench_mean_abs_dev_w10          ... bench:          11 ns/iter (+/- 0)\ntest bench_mean_abs_dev_w100         ... bench:         123 ns/iter (+/- 4)\ntest bench_median_abs_dev_w10        ... bench:          31 ns/iter (+/- 7)\ntest bench_median_abs_dev_w100       ... bench:         190 ns/iter (+/- 8)\ntest bench_momentum_w10              ... bench:           3 ns/iter (+/- 0)\ntest bench_momentum_w100             ... bench:           3 ns/iter (+/- 0)\ntest bench_past_w10                  ... bench:           3 ns/iter (+/- 0)\ntest bench_past_w100                 ... bench:           3 ns/iter (+/- 0)\ntest bench_rate_of_change_w10        ... bench:           3 ns/iter (+/- 0)\ntest bench_rate_of_change_w100       ... bench:           3 ns/iter (+/- 0)\ntest bench_reverse_high_w10          ... bench:           5 ns/iter (+/- 0)\ntest bench_reverse_high_w100         ... bench:           5 ns/iter (+/- 0)\ntest bench_reverse_low_w10           ... bench:           5 ns/iter (+/- 0)\ntest bench_reverse_low_w100          ... bench:           5 ns/iter (+/- 0)\ntest bench_reverse_signal_w10        ... bench:           9 ns/iter (+/- 0)\ntest bench_reverse_signal_w100       ... bench:           9 ns/iter (+/- 0)\ntest bench_rma_w10                   ... bench:           4 ns/iter (+/- 0)\ntest bench_rma_w100                  ... bench:           4 ns/iter (+/- 0)\ntest bench_sma_w10                   ... bench:           3 ns/iter (+/- 0)\ntest bench_sma_w100                  ... bench:           3 ns/iter (+/- 0)\ntest bench_smm_w10                   ... bench:          17 ns/iter (+/- 1)\ntest bench_smm_w100                  ... bench:          35 ns/iter (+/- 2)\ntest bench_st_dev_w10                ... bench:           7 ns/iter (+/- 0)\ntest bench_st_dev_w100               ... bench:           7 ns/iter (+/- 0)\ntest bench_swma_w10                  ... bench:           8 ns/iter (+/- 0)\ntest bench_swma_w100                 ... bench:           8 ns/iter (+/- 0)\ntest bench_tema_w10                  ... bench:           8 ns/iter (+/- 0)\ntest bench_tema_w100                 ... bench:           7 ns/iter (+/- 0)\ntest bench_tma_w10                   ... bench:           5 ns/iter (+/- 0)\ntest bench_tma_w100                  ... bench:           5 ns/iter (+/- 1)\ntest bench_trima_w10                 ... bench:           5 ns/iter (+/- 0)\ntest bench_trima_w100                ... bench:           5 ns/iter (+/- 1)\ntest bench_tsi_w10                   ... bench:           9 ns/iter (+/- 0)\ntest bench_tsi_w100                  ... bench:          10 ns/iter (+/- 0)\ntest bench_vidya_w10                 ... bench:           8 ns/iter (+/- 1)\ntest bench_vidya_w100                ... bench:           8 ns/iter (+/- 0)\ntest bench_vwma_w10                  ... bench:           5 ns/iter (+/- 0)\ntest bench_vwma_w100                 ... bench:           5 ns/iter (+/- 0)\ntest bench_wma_w10                   ... bench:           6 ns/iter (+/- 1)\ntest bench_wma_w100                  ... bench:           6 ns/iter (+/- 0)\n```\n\n## Indicators\n\n```\ntest bench_awesome_oscillator                  ... bench:          36 ns/iter (+/- 0)\ntest bench_bollinger_bands                     ... bench:          53 ns/iter (+/- 2)\ntest bench_chaikin_money_flow                  ... bench:          22 ns/iter (+/- 0)\ntest bench_chaikin_oscillator                  ... bench:          23 ns/iter (+/- 0)\ntest bench_chande_kroll_stop                   ... bench:          58 ns/iter (+/- 0)\ntest bench_chande_momentum_oscillator          ... bench:          25 ns/iter (+/- 0)\ntest bench_commodity_channel_index             ... bench:          38 ns/iter (+/- 0)\ntest bench_coppock_curve                       ... bench:          38 ns/iter (+/- 2)\ntest bench_detrended_price_oscillator          ... bench:          10 ns/iter (+/- 0)\ntest bench_ease_of_movement                    ... bench:          20 ns/iter (+/- 0)\ntest bench_elders_force_index                  ... bench:          17 ns/iter (+/- 1)\ntest bench_envelopes                           ... bench:          14 ns/iter (+/- 0)\ntest bench_fisher_transform                    ... bench:         125 ns/iter (+/- 13)\ntest bench_hull_moving_average                 ... bench:          28 ns/iter (+/- 0)\ntest bench_ichimoku_cloud                      ... bench:          65 ns/iter (+/- 7)\ntest bench_indicator_aroon                     ... bench:          46 ns/iter (+/- 12)\ntest bench_indicator_average_directional_index ... bench:          49 ns/iter (+/- 1)\ntest bench_kaufman                             ... bench:          34 ns/iter (+/- 3)\ntest bench_keltner_channel                     ... bench:          26 ns/iter (+/- 2)\ntest bench_klinger_volume_oscillator           ... bench:          40 ns/iter (+/- 1)\ntest bench_know_sure_thing                     ... bench:          41 ns/iter (+/- 0)\ntest bench_macd                                ... bench:          23 ns/iter (+/- 0)\ntest bench_momentum_index                      ... bench:          13 ns/iter (+/- 0)\ntest bench_money_flow_index                    ... bench:          59 ns/iter (+/- 12)\ntest bench_parabolic_sar                       ... bench:          17 ns/iter (+/- 2)\ntest bench_pivot_reversal_strategy             ... bench:          30 ns/iter (+/- 4)\ntest bench_relative_strength_index             ... bench:          35 ns/iter (+/- 1)\ntest bench_relative_vigor_index                ... bench:          59 ns/iter (+/- 0)\ntest bench_smi_ergodic_indicator               ... bench:          30 ns/iter (+/- 2)\ntest bench_stochastic_oscillator               ... bench:          48 ns/iter (+/- 4)\ntest bench_trend_strength_index                ... bench:          46 ns/iter (+/- 2)\ntest bench_trix                                ... bench:          32 ns/iter (+/- 10)\ntest bench_true_strength_index                 ... bench:          38 ns/iter (+/- 16)\ntest bench_woodies_cci                         ... bench:          68 ns/iter (+/- 6)\n```\n\n# Current unsafe status\n\nBy default, there is no `unsafe` code in the crate. But you can optionally enable `unsafe_performance` feature throw you `Cargo.toml` or by `--feature` flag in your CLI.\n\n`unsafe_performance` enables some unsafe code blocks, most of them are unsafe access to a vector's elements. For some methods it may increase performance by ~5-10%.\n\n# Features\n\n- `serde` - enables [`serde`](https://crates.io/crates/serde) crate support;\n- `period_type_u16` - sets `PeriodType` to `u16`;\n- `period_type_u32` - sets `PeriodType` to `u32`;\n- `period_type_u64` - sets `PeriodType` to `u64`;\n- `value_type_f32` - sets `ValueType` to `f32`;\n- `unsafe_performance` - enables optional unsafe code blocks, which may increase performance;\n\n# Rust version\n\nYaTa library supports **Rust stable** except that you can't run benchmarks with it.\n\n# Suggestions\n\nYou are welcome to [give any suggestions](https://github.com/amv-dev/yata/issues) about implementing new indicators and methods.\n\n# Say thanks\n\nIf you like this library, and you want to say thanks, you can do it also by donating to bitcoin address `1P3gTnaTK9LKSYx2nETrKe2zjP4HMkdhvK`\n","funding_links":["https://liberapay.com/amv-dev"],"categories":["Libraries","库 Libraries","Rust"],"sub_categories":["Data processing","数据处理 Data processing"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famv-dev%2Fyata","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famv-dev%2Fyata","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famv-dev%2Fyata/lists"}