global: dca classes

This commit is contained in:
nym21
2025-05-14 11:28:18 +02:00
parent 7562f51e07
commit 92b1dc0afb
5 changed files with 1122 additions and 513 deletions

View File

@@ -1,6 +1,6 @@
use std::{fs, path::Path, thread}; use std::{fs, path::Path, thread};
use brk_core::{Dollars, Sats, StoredF32, StoredUsize}; use brk_core::{Date, DateIndex, Dollars, Sats, StoredF32, StoredUsize};
use brk_exit::Exit; use brk_exit::Exit;
use brk_indexer::Indexer; use brk_indexer::Indexer;
use brk_vec::{AnyCollectableVec, Compressed, Computation, StoredIndex, VecIterator, Version}; use brk_vec::{AnyCollectableVec, Compressed, Computation, StoredIndex, VecIterator, Version};
@@ -13,7 +13,7 @@ use super::{
indexes, transactions, indexes, transactions,
}; };
const VERSION: Version = Version::new(10); const VERSION: Version = Version::new(0);
#[derive(Clone)] #[derive(Clone)]
pub struct Vecs { pub struct Vecs {
@@ -116,6 +116,42 @@ pub struct Vecs {
pub _6y_dca_cagr: ComputedVecsFromDateIndex<StoredF32>, pub _6y_dca_cagr: ComputedVecsFromDateIndex<StoredF32>,
pub _8y_dca_cagr: ComputedVecsFromDateIndex<StoredF32>, pub _8y_dca_cagr: ComputedVecsFromDateIndex<StoredF32>,
pub _10y_dca_cagr: ComputedVecsFromDateIndex<StoredF32>, pub _10y_dca_cagr: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2025_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2024_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2023_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2022_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2021_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2020_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2019_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2018_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2017_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2016_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2015_stack: ComputedVecsFromDateIndex<Sats>,
pub dca_class_2025_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2024_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2023_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2022_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2021_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2020_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2019_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2018_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2017_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2016_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2015_avg_price: ComputedVecsFromDateIndex<Dollars>,
pub dca_class_2025_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2024_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2023_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2022_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2021_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2020_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2019_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2018_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2017_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2016_returns: ComputedVecsFromDateIndex<StoredF32>,
pub dca_class_2015_returns: ComputedVecsFromDateIndex<StoredF32>,
} }
impl Vecs { impl Vecs {
@@ -795,6 +831,240 @@ impl Vecs {
compressed, compressed,
StorableVecGeneatorOptions::default().add_last(), StorableVecGeneatorOptions::default().add_last(),
)?, )?,
dca_class_2025_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2025_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2024_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2024_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2023_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2023_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2022_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2022_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2021_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2021_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2020_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2020_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2019_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2019_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2018_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2018_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2017_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2017_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2016_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2016_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2015_stack: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2015_stack",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2025_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2025_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2024_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2024_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2023_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2023_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2022_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2022_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2021_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2021_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2020_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2020_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2019_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2019_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2018_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2018_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2017_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2017_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2016_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2016_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2015_avg_price: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2015_avg_price",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2025_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2025_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2024_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2024_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2023_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2023_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2022_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2022_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2021_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2021_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2020_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2020_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2019_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2019_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2018_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2018_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2017_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2017_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2016_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2016_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
dca_class_2015_returns: ComputedVecsFromDateIndex::forced_import(
path,
"dca_class_2015_returns",
VERSION + Version::ZERO,
compressed,
StorableVecGeneatorOptions::default().add_last(),
)?,
}) })
} }
@@ -1151,7 +1421,7 @@ impl Vecs {
starting_indexes, starting_indexes,
exit, exit,
|v, _, _, starting_indexes, exit| { |v, _, _, starting_indexes, exit| {
v.compute_dca_stack( v.compute_dca_stack_via_len(
starting_indexes.dateindex, starting_indexes.dateindex,
&fetched.timeindexes_to_close.dateindex, &fetched.timeindexes_to_close.dateindex,
days, days,
@@ -1166,7 +1436,7 @@ impl Vecs {
starting_indexes, starting_indexes,
exit, exit,
|v, _, _, starting_indexes, exit| { |v, _, _, starting_indexes, exit| {
v.compute_dca_avg_price( v.compute_dca_avg_price_via_len(
starting_indexes.dateindex, starting_indexes.dateindex,
&dca_stack.dateindex, &dca_stack.dateindex,
days, days,
@@ -1211,6 +1481,128 @@ impl Vecs {
}, },
)?; )?;
[
(
2015,
&mut self.dca_class_2015_avg_price,
&mut self.dca_class_2015_returns,
&mut self.dca_class_2015_stack,
),
(
2016,
&mut self.dca_class_2016_avg_price,
&mut self.dca_class_2016_returns,
&mut self.dca_class_2016_stack,
),
(
2017,
&mut self.dca_class_2017_avg_price,
&mut self.dca_class_2017_returns,
&mut self.dca_class_2017_stack,
),
(
2018,
&mut self.dca_class_2018_avg_price,
&mut self.dca_class_2018_returns,
&mut self.dca_class_2018_stack,
),
(
2019,
&mut self.dca_class_2019_avg_price,
&mut self.dca_class_2019_returns,
&mut self.dca_class_2019_stack,
),
(
2020,
&mut self.dca_class_2020_avg_price,
&mut self.dca_class_2020_returns,
&mut self.dca_class_2020_stack,
),
(
2021,
&mut self.dca_class_2021_avg_price,
&mut self.dca_class_2021_returns,
&mut self.dca_class_2021_stack,
),
(
2022,
&mut self.dca_class_2022_avg_price,
&mut self.dca_class_2022_returns,
&mut self.dca_class_2022_stack,
),
(
2023,
&mut self.dca_class_2023_avg_price,
&mut self.dca_class_2023_returns,
&mut self.dca_class_2023_stack,
),
(
2024,
&mut self.dca_class_2024_avg_price,
&mut self.dca_class_2024_returns,
&mut self.dca_class_2024_stack,
),
(
2025,
&mut self.dca_class_2025_avg_price,
&mut self.dca_class_2025_returns,
&mut self.dca_class_2025_stack,
),
]
.into_iter()
.try_for_each(
|(year, avg_price, returns, stack)| -> color_eyre::Result<()> {
let dateindex = DateIndex::try_from(Date::new(year, 1, 1)).unwrap();
stack.compute(
indexer,
indexes,
starting_indexes,
exit,
|v, _, _, starting_indexes, exit| {
v.compute_dca_stack_via_from(
starting_indexes.dateindex,
&fetched.timeindexes_to_close.dateindex,
dateindex,
exit,
)
},
)?;
avg_price.compute(
indexer,
indexes,
starting_indexes,
exit,
|v, _, _, starting_indexes, exit| {
v.compute_dca_avg_price_via_from(
starting_indexes.dateindex,
&stack.dateindex,
dateindex,
exit,
)
},
)?;
returns.compute(
indexer,
indexes,
starting_indexes,
exit,
|v, _, _, starting_indexes, exit| {
v.compute_percentage_difference(
starting_indexes.dateindex,
&fetched.timeindexes_to_close.dateindex,
&avg_price.dateindex,
exit,
)
},
)?;
Ok(())
},
)?;
thread::scope(|s| -> color_eyre::Result<()> { thread::scope(|s| -> color_eyre::Result<()> {
[ [
(&mut self.indexes_to_1w_sma, 7), (&mut self.indexes_to_1w_sma, 7),
@@ -1348,6 +1740,39 @@ impl Vecs {
self._6y_dca_stack.vecs(), self._6y_dca_stack.vecs(),
self._8y_dca_stack.vecs(), self._8y_dca_stack.vecs(),
self._10y_dca_stack.vecs(), self._10y_dca_stack.vecs(),
self.dca_class_2025_stack.vecs(),
self.dca_class_2024_stack.vecs(),
self.dca_class_2023_stack.vecs(),
self.dca_class_2022_stack.vecs(),
self.dca_class_2021_stack.vecs(),
self.dca_class_2020_stack.vecs(),
self.dca_class_2019_stack.vecs(),
self.dca_class_2018_stack.vecs(),
self.dca_class_2017_stack.vecs(),
self.dca_class_2016_stack.vecs(),
self.dca_class_2015_stack.vecs(),
self.dca_class_2025_avg_price.vecs(),
self.dca_class_2024_avg_price.vecs(),
self.dca_class_2023_avg_price.vecs(),
self.dca_class_2022_avg_price.vecs(),
self.dca_class_2021_avg_price.vecs(),
self.dca_class_2020_avg_price.vecs(),
self.dca_class_2019_avg_price.vecs(),
self.dca_class_2018_avg_price.vecs(),
self.dca_class_2017_avg_price.vecs(),
self.dca_class_2016_avg_price.vecs(),
self.dca_class_2015_avg_price.vecs(),
self.dca_class_2025_returns.vecs(),
self.dca_class_2024_returns.vecs(),
self.dca_class_2023_returns.vecs(),
self.dca_class_2022_returns.vecs(),
self.dca_class_2021_returns.vecs(),
self.dca_class_2020_returns.vecs(),
self.dca_class_2019_returns.vecs(),
self.dca_class_2018_returns.vecs(),
self.dca_class_2017_returns.vecs(),
self.dca_class_2016_returns.vecs(),
self.dca_class_2015_returns.vecs(),
] ]
.concat() .concat()
} }

View File

@@ -9,7 +9,7 @@ use std::{
}; };
use brk_core::{ use brk_core::{
Bitcoin, CheckedSub, Close, DateIndex, Dollars, Height, Sats, StoredUsize, TxIndex, Bitcoin, CheckedSub, Close, Date, DateIndex, Dollars, Height, Sats, StoredUsize, TxIndex,
}; };
use brk_exit::Exit; use brk_exit::Exit;
use log::info; use log::info;
@@ -668,7 +668,7 @@ where
} }
impl EagerVec<DateIndex, Sats> { impl EagerVec<DateIndex, Sats> {
pub fn compute_dca_stack( pub fn compute_dca_stack_via_len(
&mut self, &mut self,
max_from: DateIndex, max_from: DateIndex,
closes: &impl AnyIterableVec<DateIndex, Close<Dollars>>, closes: &impl AnyIterableVec<DateIndex, Close<Dollars>>,
@@ -676,7 +676,7 @@ impl EagerVec<DateIndex, Sats> {
exit: &Exit, exit: &Exit,
) -> Result<()> { ) -> Result<()> {
self.validate_computed_version_or_reset_file( self.validate_computed_version_or_reset_file(
Version::ZERO + self.inner.version() + closes.version(), Version::new(5) + self.inner.version() + closes.version(),
)?; )?;
let mut other_iter = closes.iter(); let mut other_iter = closes.iter();
@@ -698,6 +698,7 @@ impl EagerVec<DateIndex, Sats> {
if price != Dollars::ZERO { if price != Dollars::ZERO {
stack = prev.unwrap() + Sats::from(Bitcoin::from(DCA_AMOUNT / price)); stack = prev.unwrap() + Sats::from(Bitcoin::from(DCA_AMOUNT / price));
if i_usize >= len { if i_usize >= len {
let prev_price = *other_iter.unwrap_get_inner_(i_usize - len); let prev_price = *other_iter.unwrap_get_inner_(i_usize - len);
if prev_price != Dollars::ZERO { if prev_price != Dollars::ZERO {
@@ -715,10 +716,49 @@ impl EagerVec<DateIndex, Sats> {
self.safe_flush(exit) self.safe_flush(exit)
} }
pub fn compute_dca_stack_via_from(
&mut self,
max_from: DateIndex,
closes: &impl AnyIterableVec<DateIndex, Close<Dollars>>,
from: DateIndex,
exit: &Exit,
) -> Result<()> {
self.validate_computed_version_or_reset_file(
Version::ZERO + self.inner.version() + closes.version(),
)?;
let mut prev = None;
let index = max_from.min(DateIndex::from(self.len()));
closes.iter_at(index).try_for_each(|(i, closes)| {
let price = *closes.into_inner();
let i_usize = i.unwrap_to_usize();
if prev.is_none() {
if i_usize == 0 {
prev.replace(Sats::ZERO);
} else {
prev.replace(self.into_iter().unwrap_get_inner_(i_usize - 1));
}
}
let mut stack = Sats::ZERO;
if price != Dollars::ZERO && i >= from {
stack = prev.unwrap() + Sats::from(Bitcoin::from(DCA_AMOUNT / price));
}
prev.replace(stack);
self.forced_push_at(i, stack, exit)
})?;
self.safe_flush(exit)
}
} }
impl EagerVec<DateIndex, Dollars> { impl EagerVec<DateIndex, Dollars> {
pub fn compute_dca_avg_price( pub fn compute_dca_avg_price_via_len(
&mut self, &mut self,
max_from: DateIndex, max_from: DateIndex,
stacks: &impl AnyIterableVec<DateIndex, Sats>, stacks: &impl AnyIterableVec<DateIndex, Sats>,
@@ -726,14 +766,51 @@ impl EagerVec<DateIndex, Dollars> {
exit: &Exit, exit: &Exit,
) -> Result<()> { ) -> Result<()> {
self.validate_computed_version_or_reset_file( self.validate_computed_version_or_reset_file(
Version::ONE + self.inner.version() + stacks.version(), Version::TWO + self.inner.version() + stacks.version(),
)?; )?;
let index = max_from.min(DateIndex::from(self.len())); let index = max_from.min(DateIndex::from(self.len()));
let first_price_date = DateIndex::try_from(Date::new(2010, 8, 16)).unwrap();
stacks.iter_at(index).try_for_each(|(i, stack)| { stacks.iter_at(index).try_for_each(|(i, stack)| {
let stack = stack.into_inner(); let stack = stack.into_inner();
let avg_price = DCA_AMOUNT * len.min(i.unwrap_to_usize() + 1) / Bitcoin::from(stack); let mut avg_price = Dollars::from(f64::NAN);
if i > first_price_date {
avg_price = DCA_AMOUNT
* len
.min(i.unwrap_to_usize() + 1)
.min(i.checked_sub(first_price_date).unwrap().unwrap_to_usize() + 1)
/ Bitcoin::from(stack);
}
self.forced_push_at(i, avg_price, exit)
})?;
self.safe_flush(exit)
}
pub fn compute_dca_avg_price_via_from(
&mut self,
max_from: DateIndex,
stacks: &impl AnyIterableVec<DateIndex, Sats>,
from: DateIndex,
exit: &Exit,
) -> Result<()> {
self.validate_computed_version_or_reset_file(
Version::ZERO + self.inner.version() + stacks.version(),
)?;
let index = max_from.min(DateIndex::from(self.len()));
let from_usize = from.unwrap_to_usize();
stacks.iter_at(index).try_for_each(|(i, stack)| {
let stack = stack.into_inner();
let mut avg_price = Dollars::from(f64::NAN);
if i >= from {
avg_price =
DCA_AMOUNT * (i.unwrap_to_usize() + 1 - from_usize) / Bitcoin::from(stack);
}
self.forced_push_at(i, avg_price, exit) self.forced_push_at(i, avg_price, exit)
})?; })?;

View File

@@ -1631,6 +1631,23 @@ function createColors(dark, elements) {
_4y: purple, _4y: purple,
_10y: fuchsia, _10y: fuchsia,
2015: pink,
2016: red,
2017: orange,
2018: amber,
2019: yellow,
2020: lime,
2021: green,
2022: emerald,
2023: teal,
2024: cyan,
2025: sky,
2026: blue,
2027: indigo,
2028: violet,
2029: purple,
2030: fuchsia,
// r1d: pink, // r1d: pink,
// r1w: red, // r1w: red,
// r1m: amber, // r1m: amber,

File diff suppressed because it is too large Load Diff

View File

@@ -593,6 +593,39 @@ export function createVecIdToIndexes() {
"dateindex": [DateIndex, Height], "dateindex": [DateIndex, Height],
"dateindex-count": [MonthIndex, WeekIndex], "dateindex-count": [MonthIndex, WeekIndex],
"days-since-ath": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex], "days-since-ath": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2015-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2015-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2015-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2016-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2016-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2016-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2017-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2017-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2017-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2018-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2018-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2018-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2019-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2019-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2019-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2020-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2020-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2020-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2021-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2021-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2021-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2022-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2022-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2022-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2023-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2023-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2023-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2024-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2024-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2024-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2025-avg-price": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2025-returns": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"dca-class-2025-stack": [DateIndex, DecadeIndex, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"decadeindex": [DecadeIndex, YearIndex], "decadeindex": [DecadeIndex, YearIndex],
"difficulty": [DateIndex, DecadeIndex, DifficultyEpoch, Height, MonthIndex, QuarterIndex, WeekIndex, YearIndex], "difficulty": [DateIndex, DecadeIndex, DifficultyEpoch, Height, MonthIndex, QuarterIndex, WeekIndex, YearIndex],
"difficultyepoch": [DateIndex, DecadeIndex, DifficultyEpoch, Height, MonthIndex, QuarterIndex, WeekIndex, YearIndex], "difficultyepoch": [DateIndex, DecadeIndex, DifficultyEpoch, Height, MonthIndex, QuarterIndex, WeekIndex, YearIndex],