NET MyRSI (Noise-Eliminated MyRSI)
period = 14 Overview
NET MyRSI enhances John Ehlers' MyRSI oscillator with a Noise Elimination Technique that filters market noise by ranking pairwise comparisons of recent momentum values, producing an exceptionally smooth signal bounded between -1 and 1. The indicator first calculates MyRSI values that measure the balance between upward and downward price changes, then applies the NET filter which examines whether newer MyRSI readings consistently exceed older ones within the lookback window. This dual processing creates a momentum indicator that responds to genuine trend changes while ignoring minor fluctuations that plague traditional RSI variants. Values approaching 1 indicate strong upward momentum with consistent improvement in readings, while values near -1 signal deteriorating momentum across the evaluation period. Traders appreciate NET MyRSI for its ability to maintain smooth signals even in choppy markets, making it particularly effective for identifying trend continuations and avoiding premature exits during minor retracements.
Implementation Examples
Compute NET MyRSI from a price slice or candles:
use vector_ta::indicators::net_myrsi::{net_myrsi, NetMyrsiInput, NetMyrsiParams};
use vector_ta::utilities::data_loader::{Candles, read_candles_from_csv};
// Using with price data slice
let prices = vec![100.0, 101.0, 100.5, 102.0, 103.2, 102.8];
let params = NetMyrsiParams { period: Some(14) }; // default 14
let input = NetMyrsiInput::from_slice(&prices, params);
let out = net_myrsi(&input)?;
// Using with Candles (defaults: source="close", period=14)
let candles: Candles = read_candles_from_csv("data/sample.csv")?;
let input = NetMyrsiInput::with_default_candles(&candles);
let out = net_myrsi(&input)?;
// Access values
for v in out.values { println!("NET MyRSI: {}", v); } API Reference
Input Methods ▼
// From price slice
NetMyrsiInput::from_slice(&[f64], NetMyrsiParams) -> NetMyrsiInput
// From candles with custom source (e.g., "close")
NetMyrsiInput::from_candles(&Candles, &str, NetMyrsiParams) -> NetMyrsiInput
// From candles with default params (close, period=14)
NetMyrsiInput::with_default_candles(&Candles) -> NetMyrsiInput Parameters Structure ▼
pub struct NetMyrsiParams {
pub period: Option<usize>, // Default: 14
} Output Structure ▼
pub struct NetMyrsiOutput {
pub values: Vec<f64>, // NET MyRSI values in [-1, 1]
} Validation, Warmup & NaNs ▼
period > 0andperiod ≤ len(data); otherwiseNetMyrsiError::InvalidPeriod.- Requires at least
period + 1valid points after the first finite value; otherwiseNetMyrsiError::NotEnoughValidData. - Indices before the first finite input are
NaN. Warmup indexwarm = first + period − 1is0.0whenperiod > 1(otherwiseNaN). - Streaming returns
Noneuntil enough samples are buffered (prices:period + 1, MyRSI:period).
Error Handling ▼
use vector_ta::indicators::net_myrsi::{net_myrsi, NetMyrsiError};
match net_myrsi(&input) {
Ok(output) => process(output.values),
Err(NetMyrsiError::EmptyInputData) => eprintln!("Input is empty"),
Err(NetMyrsiError::AllValuesNaN) => eprintln!("All values are NaN"),
Err(NetMyrsiError::InvalidPeriod { period, data_len }) => {
eprintln!("Invalid period: {} (len={})", period, data_len)
}
Err(NetMyrsiError::NotEnoughValidData { needed, valid }) => {
eprintln!("Need {} data points after first valid, only {}", needed, valid)
}
} Python Bindings
Basic Usage ▼
Calculate NET MyRSI using NumPy arrays (default period=14):
import numpy as np
from vector_ta import net_myrsi
prices = np.array([100.0, 101.0, 100.5, 102.0, 103.2, 102.8], dtype=np.float64)
# Defaults
vals = net_myrsi(prices)
# Custom period and kernel selection
vals = net_myrsi(prices, period=14, kernel="auto") # or "avx2", "scalar"
print(vals) Streaming Real-time Updates ▼
Use the streaming helper to process ticks efficiently:
from vector_ta import NetMyrsiStream
stream = NetMyrsiStream(14)
for price in price_feed:
v = stream.update(price)
if v is not None:
print(f"NET MyRSI: {v}") Batch Parameter Optimization ▼
Evaluate multiple period values:
import numpy as np
from vector_ta import net_myrsi_batch
prices = np.array([...], dtype=np.float64)
res = net_myrsi_batch(prices, period_range=(10, 20, 5), kernel="auto")
print(res['values'].shape) # (num_periods, len(prices))
print(res['periods']) # [10, 15, 20]
# Select a specific row
row_idx = list(res['periods']).index(15)
row = res['values'][row_idx] CUDA Acceleration ▼
CUDA helpers are available when the Python package is built with CUDA support. Inputs must be float32; outputs are device arrays (DLPack / __cuda_array_interface__ compatible).
import numpy as np
from vector_ta import net_myrsi_cuda_batch_dev, net_myrsi_cuda_many_series_one_param_dev
# One series (float32)
data_f32 = np.asarray(load_data(), dtype=np.float32)
dev = net_myrsi_cuda_batch_dev(
data_f32=data_f32,
period_range=(5, 30, 5),
device_id=0,
)
# Many series (time-major)
data_tm_f32 = np.asarray(load_data_time_major_matrix(), dtype=np.float32)
dev_tm = net_myrsi_cuda_many_series_one_param_dev(
data_tm_f32=data_tm_f32,
period=14,
device_id=0,
) JavaScript/WASM Bindings
Basic Usage ▼
Calculate NET MyRSI in JavaScript/TypeScript:
import { net_myrsi_js } from 'vectorta-wasm';
const prices = new Float64Array([100.0, 101.0, 100.5, 102.0]);
const result = net_myrsi_js(prices, 14);
console.log('NET MyRSI:', result); Memory-Efficient Operations ▼
Use zero-copy operations for large datasets:
import { net_myrsi_alloc, net_myrsi_free, net_myrsi_into, memory } from 'vectorta-wasm';
const prices = new Float64Array([/* your data */]);
const n = prices.length;
const inPtr = net_myrsi_alloc(n);
const outPtr = net_myrsi_alloc(n);
new Float64Array(memory.buffer, inPtr, n).set(prices);
// Args: in_ptr, out_ptr, len, period
net_myrsi_into(inPtr, outPtr, n, 14);
const values = new Float64Array(memory.buffer, outPtr, n).slice();
net_myrsi_free(inPtr, n);
net_myrsi_free(outPtr, n); Batch Processing ▼
Parameter sweep via unified batch API:
import { net_myrsi_batch } from 'vectorta-wasm';
const prices = new Float64Array([/* historical prices */]);
const config = { period_range: [10, 20, 5] };
// Returns { values: Float64Array, combos: { period }[], rows, cols }
const out = net_myrsi_batch(prices, config);
// Reshape flat values into rows x cols
const rows = out.rows, cols = out.cols;
const matrix: number[][] = [];
for (let r = 0; r < rows; r++) {
const start = r * cols;
matrix.push(Array.from(out.values.slice(start, start + cols)));
}
// Access parameter metadata
const periods = out.combos.map(c => c.period);
console.log(periods); // [10, 15, 20] CUDA Bindings (Rust)
use vector_ta::cuda::CudaNetMyrsi;
use vector_ta::indicators::net_myrsi::NetMyrsiBatchRange;
let cuda = CudaNetMyrsi::new(0)?;
let data_f32: [f32] = /* ... */;
let sweep = NetMyrsiBatchRange::default();
let out = cuda.net_myrsi_batch_dev(&data_f32, &sweep)?;
let _ = out; Performance Analysis
AMD Ryzen 9 9950X (CPU) | NVIDIA RTX 4090 (GPU) | Benchmarks: 2026-02-28
CUDA note
In our benchmark workload, the Rust CPU implementation is faster than CUDA for this indicator. Prefer the Rust/CPU path unless your workload differs.