mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-16 09:38:05 +00:00
215 lines
6.0 KiB
Markdown
215 lines
6.0 KiB
Markdown
# LINEARTRANS: Linear Scaling Transformer
|
||||
|
|
|
|||
|
|
> "The simplest transformations are often the most powerful—linear scaling is the mathematical equivalent of adjusting the volume and tuning the dial."
|
|||
|
|
|
|||
|
|
The Linear transformer applies an affine transformation $y = \text{slope} \cdot x + \text{intercept}$ to each value in a time series. This fundamental operation enables scaling, offsetting, unit conversion, and normalization—the building blocks for preparing data for analysis or combining signals from different sources.
|
|||
|
|
|
|||
|
|
## Mathematical Foundation
|
|||
|
|
|
|||
|
|
### Core Formula
|
|||
|
|
|
|||
|
|
$$
|
|||
|
|
\text{Linear}_t = m \cdot x_t + b
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
where:
|
|||
|
|
- $m$ is the slope (multiplicative factor)
|
|||
|
|
- $b$ is the intercept (additive constant)
|
|||
|
|
- $x_t$ is the input value at time $t$
|
|||
|
|
|
|||
|
|
### Key Properties
|
|||
|
|
|
|||
|
|
| Property | Formula | Description |
|
|||
|
|
|:---------|:--------|:------------|
|
|||
|
|
| **Identity** | $1 \cdot x + 0 = x$ | Default parameters preserve input |
|
|||
|
|
| **Composition** | $c(ax+b)+d = (ac)x + (bc+d)$ | Sequential transforms combine linearly |
|
|||
|
|
| **Inverse** | $\frac{1}{m}(y - b) = x$ | Recoverable when $m \neq 0$ |
|
|||
|
|
| **Difference Preservation** | $y_2 - y_1 = m(x_2 - x_1)$ | Relative differences scaled by slope |
|
|||
|
|
| **Zero Crossing** | $y = 0$ when $x = -b/m$ | Predictable intercept with x-axis |
|
|||
|
|
|
|||
|
|
### Domain and Range
|
|||
|
|
|
|||
|
|
| | Value |
|
|||
|
|
|:--|:--|
|
|||
|
|
| **Domain** | $(-\infty, +\infty)$ |
|
|||
|
|
| **Range** | $(-\infty, +\infty)$ when $m \neq 0$; $\{b\}$ when $m = 0$ |
|
|||
|
|
|
|||
|
|
## Financial Applications
|
|||
|
|
|
|||
|
|
### Unit Conversion
|
|||
|
|
|
|||
|
|
Convert between price units or currencies:
|
|||
|
|
|
|||
|
|
$$
|
|||
|
|
P_{\text{USD}} = \text{rate} \cdot P_{\text{EUR}}
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
### Percentage to Decimal
|
|||
|
|
|
|||
|
|
Convert percentage values to decimal form:
|
|||
|
|
|
|||
|
|
$$
|
|||
|
|
r_{\text{decimal}} = 0.01 \cdot r_{\text{percent}}
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
### Basis Point Scaling
|
|||
|
|
|
|||
|
|
Convert decimal rates to basis points:
|
|||
|
|
|
|||
|
|
$$
|
|||
|
|
r_{\text{bps}} = 10000 \cdot r_{\text{decimal}}
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
### Price Normalization
|
|||
|
|
|
|||
|
|
Normalize prices to a baseline:
|
|||
|
|
|
|||
|
|
$$
|
|||
|
|
P_{\text{norm}} = \frac{P_t - P_0}{P_0} = \frac{1}{P_0} \cdot P_t - 1
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
This is `Linear(1/P₀, -1)`.
|
|||
|
|
|
|||
|
|
### Signal Combination
|
|||
|
|
|
|||
|
|
Scale and combine multiple indicators:
|
|||
|
|
|
|||
|
|
$$
|
|||
|
|
\text{Combo} = w_1 \cdot \text{RSI} + w_2 \cdot \text{MACD}_{\text{scaled}}
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
## Implementation Details
|
|||
|
|
|
|||
|
|
### Fused Multiply-Add (FMA)
|
|||
|
|
|
|||
|
|
The implementation uses `Math.FusedMultiplyAdd(slope, value, intercept)` which computes $m \cdot x + b$ with a single rounding operation, providing:
|
|||
|
|
- Better numerical precision
|
|||
|
|
- Potential hardware acceleration
|
|||
|
|
- Reduced floating-point error accumulation
|
|||
|
|
|
|||
|
|
### Special Cases
|
|||
|
|
|
|||
|
|
| slope | intercept | Effect |
|
|||
|
|
|:------|:----------|:-------|
|
|||
|
|
| 1.0 | 0.0 | Identity (passthrough) |
|
|||
|
|
| 0.0 | b | Constant output |
|
|||
|
|
| -1.0 | 0.0 | Negation |
|
|||
|
|
| m | 0.0 | Pure scaling |
|
|||
|
|
| 1.0 | b | Pure offset |
|
|||
|
|
|
|||
|
|
### Streaming Characteristics
|
|||
|
|
|
|||
|
|
| Metric | Value |
|
|||
|
|
|:-------|:------|
|
|||
|
|
| **Warmup Period** | 0 |
|
|||
|
|
| **Memory** | O(1) |
|
|||
|
|
| **Complexity** | O(1) per update |
|
|||
|
|
|
|||
|
|
## Performance Profile
|
|||
|
|
|
|||
|
|
### Operation Count (Scalar)
|
|||
|
|
|
|||
|
|
| Operation | Count | Notes |
|
|||
|
|
|:----------|:-----:|:------|
|
|||
|
|
| FMA | 1 | Single fused operation |
|
|||
|
|
| **Total** | ~4 cycles | Near-instantaneous |
|
|||
|
|
|
|||
|
|
### SIMD Optimization
|
|||
|
|
|
|||
|
|
The span-based `Calculate` method uses AVX2/FMA intrinsics:
|
|||
|
|
- Processes 4 doubles per iteration
|
|||
|
|
- Hardware FMA when available
|
|||
|
|
- ~8× throughput improvement for large datasets
|
|||
|
|
|
|||
|
|
### Quality Metrics
|
|||
|
|
|
|||
|
|
| Metric | Score | Notes |
|
|||
|
|
|:-------|:-----:|:------|
|
|||
|
|
| **Accuracy** | 10/10 | FMA provides optimal precision |
|
|||
|
|
| **Timeliness** | 10/10 | Zero lag |
|
|||
|
|
| **Smoothness** | N/A | Transform preserves input characteristics |
|
|||
|
|
|
|||
|
|
## Usage Examples
|
|||
|
|
|
|||
|
|
### Basic Usage
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// Scale values by 2x and add 10
|
|||
|
|
var linear = new Lineartrans(slope: 2.0, intercept: 10.0);
|
|||
|
|
|
|||
|
|
var input = new TValue(DateTime.UtcNow, 50.0);
|
|||
|
|
var result = linear.Update(input); // 110.0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Converting Percentage to Decimal
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
var toDecimal = new Lineartrans(slope: 0.01, intercept: 0.0);
|
|||
|
|
|
|||
|
|
var percent = new TValue(DateTime.UtcNow, 5.5); // 5.5%
|
|||
|
|
var decimalRate = toDecimal.Update(percent); // 0.055
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Normalizing to Baseline
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
double baseline = 100.0;
|
|||
|
|
var normalizer = new Lineartrans(slope: 1.0 / baseline, intercept: -1.0);
|
|||
|
|
|
|||
|
|
// Converts prices to percentage change from baseline
|
|||
|
|
var price = new TValue(DateTime.UtcNow, 105.0);
|
|||
|
|
var pctChange = normalizer.Update(price); // 0.05 (5% above baseline)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Inverting a Transform
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
double m = 2.0, b = 10.0;
|
|||
|
|
|
|||
|
|
var transform = new Lineartrans(m, b);
|
|||
|
|
var inverse = new Lineartrans(1.0 / m, -b / m);
|
|||
|
|
|
|||
|
|
// Round-trip: value → transformed → original
|
|||
|
|
var original = new TValue(DateTime.UtcNow, 50.0);
|
|||
|
|
var transformed = transform.Update(original); // 110.0
|
|||
|
|
var recovered = inverse.Update(transformed); // 50.0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Chaining Transforms
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
var scale = new Lineartrans(2.0, 0.0);
|
|||
|
|
var offset = new Lineartrans(scale, 1.0, 10.0); // Chain: scale then add 10
|
|||
|
|
|
|||
|
|
// Equivalent to: Linear(2.0, 10.0)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Common Pitfalls
|
|||
|
|
|
|||
|
|
1. **Zero Slope Trap**: Setting `slope=0` produces constant output regardless of input. This is valid but often unintentional.
|
|||
|
|
|
|||
|
|
2. **Division by Zero in Inverse**: When computing inverse transforms, ensure the original slope is non-zero.
|
|||
|
|
|
|||
|
|
3. **Overflow Risk**: Large slopes combined with large inputs can overflow. For slope=1e100 and x=1e100, the result exceeds double precision.
|
|||
|
|
|
|||
|
|
4. **Precision Accumulation**: While single transforms are precise, many chained transforms accumulate error. Use composition formula to combine into single transform when possible.
|
|||
|
|
|
|||
|
|
5. **Parameter Validation**: Constructor rejects NaN/Infinity for slope and intercept to fail fast rather than propagate invalid results.
|
|||
|
|
|
|||
|
|
## Validation
|
|||
|
|
|
|||
|
|
| Test | Status |
|
|||
|
|
|:-----|:------:|
|
|||
|
|
| **Mathematical Formula Parity** | ✅ |
|
|||
|
|
| **Identity Transform** | ✅ |
|
|||
|
|
| **Composition Property** | ✅ |
|
|||
|
|
| **Inverse Recovery** | ✅ |
|
|||
|
|
| **Difference Preservation** | ✅ |
|
|||
|
|
| **FMA Accuracy** | ✅ |
|
|||
|
|
|
|||
|
|
## References
|
|||
|
|
|
|||
|
|
- Strang, G. (2016). *Introduction to Linear Algebra*. Wellesley-Cambridge Press.
|
|||
|
|
- Goldberg, D. (1991). "What Every Computer Scientist Should Know About Floating-Point Arithmetic." *ACM Computing Surveys*.
|
|||
|
|
- Intel Corporation. (2023). *Intel 64 and IA-32 Architectures Optimization Reference Manual*. (FMA instruction details)
|