pub mod models;
pub mod analytics;
pub mod charts;
pub mod utils;
pub mod data;
pub mod reports;
pub mod prelude {
pub use crate::models::kline::KLINE;
pub use crate::models::ticker::Ticker;
pub use crate::models::tickers::Tickers;
pub use crate::models::portfolio::Portfolio;
pub use crate::models::screener::Screener;
pub use crate::reports::table::DataTable;
pub use crate::utils::date_utils::IntervalDays;
pub use crate::analytics::optimization::Constraints;
pub use crate::analytics::optimization::CategoricalWeights;
pub use crate::data::yahoo::config::Interval;
pub use crate::data::yahoo::config::StatementType;
pub use crate::data::yahoo::config::StatementFrequency;
pub use crate::analytics::technicals::Column;
pub use crate::analytics::optimization::ObjectiveFunction;
pub use crate::reports::table::DataTableFormat;
pub use crate::reports::report::ReportType;
pub use crate::data::ticker::TickerData;
pub use crate::data::tickers::TickersData;
pub use crate::charts::ticker::TickerCharts;
pub use crate::charts::tickers::TickersCharts;
pub use crate::charts::portfolio::PortfolioCharts;
pub use crate::analytics::performance::TickerPerformance;
pub use crate::analytics::stochastics::VolatilitySurface;
pub use crate::analytics::technicals::TechnicalIndicators;
pub use crate::reports::table::DataTableDisplay;
pub use crate::reports::report::Report;
#[cfg(feature = "kaleido")]
pub use crate::utils::chart_utils::PlotImage;
pub use strum::{EnumProperty,
VariantNames,
IntoEnumIterator,
VariantArray,
VariantIterator};
pub use crate::data::yahoo::screeners::{
QuoteType,
ScreenerBuilder,
ScreenerFilter,
ScreenerMetric,
CryptoScreener,
EquityScreener,
EtfScreener,
IndexScreener,
MutualFundScreener,
FutureScreener,
Sector,
Industry,
Region,
Exchange,
PeerGroup,
FundFamily,
FundCategory
};
}
#[cfg(test)]
mod tests {
use crate::prelude::*;
use std::error::Error;
#[ignore]
#[tokio::test]
async fn finalytics_test() -> Result<(), Box<dyn Error>> {
let equity_screener = Screener::builder()
.quote_type(QuoteType::Equity)
.add_filter(ScreenerFilter::EqStr(
ScreenerMetric::Equity(EquityScreener::Exchange),
Exchange::NASDAQ.as_ref()
))
.sort_by(
ScreenerMetric::Equity(EquityScreener::MarketCapIntraday),
true
)
.size(10)
.build()
.await?;
equity_screener.overview().show()?;
equity_screener.metrics().await?.show()?;
let ticker_symbols = equity_screener.symbols.iter()
.map(|x| x.as_str()).collect::<Vec<&str>>();
let tickers = Tickers::builder()
.tickers(ticker_symbols.clone())
.start_date("2023-01-01")
.end_date("2024-12-31")
.interval(Interval::OneDay)
.benchmark_symbol("^GSPC")
.confidence_level(0.95)
.risk_free_rate(0.02)
.build();
let symbol = ticker_symbols.first().unwrap();
let ticker = tickers.clone().get_ticker(symbol).await?;
ticker.report(Some(ReportType::Performance)).await?.show()?;
ticker.report(Some(ReportType::Financials)).await?.show()?;
ticker.report(Some(ReportType::Options)).await?.show()?;
ticker.report(Some(ReportType::News)).await?.show()?;
tickers.report(Some(ReportType::Performance)).await?.show()?;
let portfolio = tickers.optimize(Some(ObjectiveFunction::MaxSharpe), None, None).await?;
portfolio.report(Some(ReportType::Performance)).await?.show()?;
Ok(())
}
}