The Rust library finviz-rs
is a crate for fetching financial data and stock charts from Finviz website asynchronously.
The library offers access to various types of financial data, including:
- Stock charts: retrieve visually appealing and informative stock charts.
- Stock news: access the latest news and updates related to stocks.
- Stock fundamental data: retrieve comprehensive fundamental information about stocks.
- Screener: utilize a screener tool to filter and find stocks based on specific criteria.
- Insider information: get insights into insider trading activities and transactions.
- Forex performance: access information about the performance of various forex currency pairs.
- Crypto performance: retrieve data on the performance of different cryptocurrencies.
- Group: explore data related to stock groups or sectors.
- Retrieve multiple tables: retrieve all possible combinations of enum variants by iterator
- Output to a table: easily format and display the fetched data in a table format for convenient viewing and analysis.
- Output to
csv
file orjson
format: export the data tocsv
&json
, allowing for seamless integration with other tools and workflows. - Save stock chart image: capture and save stock chart images to local file system
cargo add finviz_rs
cargo run --example tickers
// output json to table
let fundament_info = Tickers::new("AAPL").scrape().await?;
println!("{}", from_dict_to_table(&fundament_info, 4).to_table(None, None));
ââââââââââââââââââŹâââââââââââââŹââââââââââââââââŹâââââââââââââââââââââŹââââââââââââââââŹââââââââââââââââââŹââââââââââââââââââââââŹâââââââââââââââ
â 52W High â -2.03% â 52W Low â 38.98% â 52W Range â 124.17 - 176.15 â ATR â 2.97 â
ââââââââââââââââââźâââââââââââââźââââââââââââââââźâââââââââââââââââââââźââââââââââââââââźââââââââââââââââââźââââââââââââââââââââââźâââââââââââââââ¤
â Avg Volume â 59.16M â Beta â 1.29 â Book/sh â 3.94 â Cash/sh â 3.53 â
ââââââââââââââââââźâââââââââââââźââââââââââââââââźâââââââââââââââââââââźââââââââââââââââźââââââââââââââââââźââââââââââââââââââââââźâââââââââââââââ¤
â Change â -0.68% â Current Ratio â 0.90 â Debt/Eq â 1.76 â Dividend â 0.96 â
ââââââââââââââââââźâââââââââââââźââââââââââââââââźâââââââââââââââââââââźââââââââââââââââźââââââââââââââââââźââââââââââââââââââââââźâââââââââââââââ¤
â Dividend % â 0.56% â EPS (ttm) â 5.89 â EPS Q/Q â 0.00% â EPS next 5Y â 8.02% â
ââââââââââââââââââźâââââââââââââźââââââââââââââââźâââââââââââââââââââââźââââââââââââââââźââââââââââââââââââźââââââââââââââââââââââźâââââââââââââââ¤
... skip below rows
To save the chart of a ticker
// save a ticker's chart image to a file
let tickers = Tickers::new("AAPL");
tickers.ticker_charts(TimeFrameType::Daily, ChartType::ADVANCED, ".")?;
cargo run --example news
let r = News::default()
.scrape().await?;
println!("{}", r.news.to_table(Some(News::default_header()), Some(5)));
âââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââŹââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Time â Title â Source â Link â
âââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 10:36AM â Dip Buyers Scorched by Cratering Bank Stocks Ru... â www.bloomberg.com â https://www.bloomberg.com/news/articles/2023-05... â
âââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 10:00AM â Abortion Bans Can Help Make This Cheap, Accessi... â www.wsj.com â https://www.wsj.com/articles/abortion-bans-can-... â
âââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 09:00AM â RIP, Lumber-Futures Contract That Jumped During... â www.wsj.com â https://www.wsj.com/articles/rip-lumber-futures... â
âââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 08:09AM â Credit crunch targeting manufacturing as intere... â foxbusiness.com â https://foxbusiness.com/markets/credit-crunch-t... â
âââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 08:00AM â Who Would Want to Be a C.E.O.? â www.nytimes.com â https://www.nytimes.com/2023/05/14/business/dea... â
âââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââ´ââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââ
cargo run --example screener
println!("--- Performance ---");
let table_str = Screener::new(ScreenerType::Performance)
.set_signal(SignalType::TopLosers)
.set_order(OrderType::EPS)
.scrape().await?
.to_table(None, Some(2));
println!("{}", table_str);
println!("--- Financial ---");
let table_str= Screener::new(ScreenerType::Financial)
.set_signal(SignalType::NewHigh)
.set_order(OrderType::MarketCap)
.scrape().await?
.to_table(None, Some(3));
println!("{}", table_str);
--- Performance ---
ââââââââââŹââââââââââââŹâââââââââââââŹâââââââââââââŹââââââââââââŹââââââââââââŹâââââââââââŹâââââââââââââââŹâââââââââââââââŹââââââââŹâââââââââââââŹâââââââââââââŹââââââââŹââââââââââŹââââââââââ
â Ticker â Perf Week â Perf Month â Perf Quart â Perf Half â Perf Year â Perf YTD â Volatility W â Volatility M â Recom â Avg Volume â Rel Volume â Price â Change â Volume â
ââââââââââźââââââââââââźâââââââââââââźâââââââââââââźââââââââââââźââââââââââââźâââââââââââźâââââââââââââââźâââââââââââââââźââââââââźâââââââââââââźâââââââââââââźââââââââźââââââââââźââââââââââ¤
â AYTU â 20.26% â -18.58% â -42.86% â -40.61% â -80.00% â -51.32% â 16.14% â 10.41% â 2.00 â 84.14K â 1.22 â 1.84 â -13.21% â 102,664 â
ââââââââââ´ââââââââââââ´âââââââââââââ´âââââââââââââ´ââââââââââââ´ââââââââââââ´âââââââââââ´âââââââââââââââ´âââââââââââââââ´ââââââââ´âââââââââââââ´âââââââââââââ´ââââââââ´ââââââââââ´ââââââââââ
--- Financial ---
ââââââââââŹâââââââââââââŹâââââââââââŹââââââââââŹââââââââââŹââââââââââŹâââââââââŹââââââââââŹââââââââââââŹââââââââââŹââââââââââŹââââââââââŹâââââââââââŹâââââââââââŹââââââââŹââââââââââŹââââââââââââââ
â Ticker â â Dividend â ROA â ROE â ROI â Curr R â Quick R â LTDebt/Eq â Debt/Eq â Gross M â Oper M â Profit M â Earnings â Price â Change â Volume â
â â â â â â â â â â â â â â â â â â
â â Market Cap â â â â â â â â â â â â â â â â
ââââââââââźâââââââââââââźâââââââââââźââââââââââźââââââââââźââââââââââźâââââââââźââââââââââźââââââââââââźââââââââââźââââââââââźââââââââââźâââââââââââźâââââââââââźââââââââźââââââââââźââââââââââââââ¤
â LPCN â 25.21M â - â 9.80% â 10.50% â -33.30% â 20.30 â 20.30 â 0.00 â 0.00 â - â - â - â Mar 10/b â 4.31 â -11.04% â 191,855 â
ââââââââââźâââââââââââââźâââââââââââźââââââââââźââââââââââźââââââââââźâââââââââźââââââââââźââââââââââââźââââââââââźââââââââââźââââââââââźâââââââââââźâââââââââââźââââââââźââââââââââźââââââââââââââ¤
â GSIT â 40.52M â - â -21.40% â -25.10% â -25.30% â 6.50 â 5.60 â 0.00 â 0.00 â 59.90% â -45.20% â -45.50% â May 16/a â 5.09 â 210.37% â 104,612,024 â
ââââââââââ´âââââââââââââ´âââââââââââ´ââââââââââ´ââââââââââ´ââââââââââ´âââââââââ´ââââââââââ´ââââââââââââ´ââââââââââ´ââââââââââ´ââââââââââ´âââââââââââ´âââââââââââ´ââââââââ´ââââââââââ´ââââââââââââââ
cargo run --example screener
let table_str = Insider::default()
.scrape().await?
.to_table(Some(Insider::default_header()), Some(3));
println!("{}", table_str);
ââââââââââŹââââââââââââââââââââââââŹââââââââââââââââââââââââââŹâââââââââŹââââââââââââââŹââââââââŹââââââââââââŹââââââââââââŹââââââââââââââââŹââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Ticker â Owner â Relationship â Date â Transaction â Cost â #Shares â Value ($) â #Shares Total â SEC Form 4 â SEC Form 4 Link â
ââââââââââźââââââââââââââââââââââââźââââââââââââââââââââââââââźâââââââââźââââââââââââââźââââââââźââââââââââââźââââââââââââźââââââââââââââââźââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â SKLZ â Paradise Andrew â Chief Executive Officer â May 12 â Buy â 0.52 â 1,342,656 â 698,181 â 10,299,303 â May 15 09:35 PM â http://www.sec.gov/Archives/edgar/data/1801661/... â
ââââââââââźââââââââââââââââââââââââźââââââââââââââââââââââââââźâââââââââźââââââââââââââźââââââââźââââââââââââźââââââââââââźââââââââââââââââźââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â SKLZ â Paradise Andrew â Chief Executive Officer â May 15 â Buy â 0.55 â 157,344 â 86,539 â 10,456,647 â May 15 09:35 PM â http://www.sec.gov/Archives/edgar/data/1801661/... â
ââââââââââźââââââââââââââââââââââââźââââââââââââââââââââââââââźâââââââââźââââââââââââââźââââââââźââââââââââââźââââââââââââźââââââââââââââââźââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â LINC â Harbour Ronald Edward â Director â May 12 â Sale â 6.50 â 9,009 â 58,558 â 44,555 â May 15 09:30 PM â http://www.sec.gov/Archives/edgar/data/1286613/... â
ââââââââââ´ââââââââââââââââââââââââ´ââââââââââââââââââââââââââ´âââââââââ´ââââââââââââââ´ââââââââ´ââââââââââââ´ââââââââââââ´ââââââââââââââââ´ââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââ
cargo run --example forex
let table_str = Forex::default()
.scrape().await?
.to_table(Some(Forex::default_header()), Some(3));
println!("{}", table_str);
ââââââââââŹâââââââââŹââââââââââââŹââââââââââââŹâââââââââââŹââââââââââââŹâââââââââââââŹâââââââââââââŹââââââââââââŹââââââââââââŹâââââââââââ
â Ticker â Price â Perf 5Min â Perf Hour â Perf Day â Perf Week â Perf Month â Perf Quart â Perf Half â Perf Year â Perf YTD â
ââââââââââźâââââââââźââââââââââââźââââââââââââźâââââââââââźââââââââââââźâââââââââââââźâââââââââââââźââââââââââââźââââââââââââźâââââââââââ¤
â EURGBP â 0.8704 â 0.00% â 0.00% â 0.28% â -0.09% â -1.67% â -2.16% â -0.21% â 2.78% â -1.56% â
ââââââââââźâââââââââźââââââââââââźââââââââââââźâââââââââââźââââââââââââźâââââââââââââźâââââââââââââźââââââââââââźââââââââââââźâââââââââââ¤
â USDJPY â 136.30 â 0.00% â -0.02% â 0.14% â 0.41% â 1.92% â 1.76% â -2.28% â 5.56% â 3.96% â
ââââââââââźâââââââââźââââââââââââźââââââââââââźâââââââââââźââââââââââââźâââââââââââââźâââââââââââââźââââââââââââźââââââââââââźâââââââââââ¤
â USDCHF â 0.8960 â 0.00% â 0.01% â 0.04% â -0.25% â 0.27% â -3.17% â -5.07% â -10.56% â -3.05% â
ââââââââââ´âââââââââ´ââââââââââââ´ââââââââââââ´âââââââââââ´ââââââââââââ´âââââââââââââ´âââââââââââââ´ââââââââââââ´ââââââââââââ´âââââââââââ
cargo run --example crypto
let table_str = Crypto::default()
.scrape().await?
.to_table(Some(Crypto::default_header()), Some(3));
println!("{}", table_str);
ââââââââââŹââââââââââŹââââââââââââŹââââââââââââŹâââââââââââŹââââââââââââŹâââââââââââââŹâââââââââââââŹââââââââââââŹââââââââââââŹâââââââââââ
â Ticker â Price â Perf 5Min â Perf Hour â Perf Day â Perf Week â Perf Month â Perf Quart â Perf Half â Perf Year â Perf YTD â
ââââââââââźââââââââââźââââââââââââźââââââââââââźâââââââââââźââââââââââââźâââââââââââââźâââââââââââââźââââââââââââźââââââââââââźâââââââââââ¤
â LTCEUR â 82.5000 â -0.07% â -0.36% â 2.75% â 10.92% â -5.67% â -13.32% â 43.58% â 25.63% â 27.55% â
ââââââââââźââââââââââźââââââââââââźââââââââââââźâââââââââââźââââââââââââźâââââââââââââźâââââââââââââźââââââââââââźââââââââââââźâââââââââââ¤
â LTCBTC â 0.0033 â 0.00% â -0.30% â 2.71% â 10.15% â 4.38% â -19.80% â -5.83% â 46.85% â -21.23% â
ââââââââââźââââââââââźââââââââââââźââââââââââââźâââââââââââźââââââââââââźâââââââââââââźâââââââââââââźââââââââââââźââââââââââââźâââââââââââ¤
â LTCUSD â 89.6300 â 0.11% â -0.11% â 2.63% â 10.98% â -6.69% â -12.05% â 50.97% â 31.38% â 29.49% â
ââââââââââ´ââââââââââ´ââââââââââââ´ââââââââââââ´âââââââââââ´ââââââââââââ´âââââââââââââ´âââââââââââââ´ââââââââââââ´ââââââââââââ´âââââââââââ
cargo run --example future
let table_str = Future::default()
.scrape().await?
.to_table(Some(Future::default_header()), Some(3));
println!("{}", table_str);
ââââââââââŹâââââââââââââââŹââââââââââŹââââââââ
â ticker â label â group â perf â
ââââââââââźâââââââââââââââźââââââââââźââââââââ¤
â VX â VIX â INDICES â 12.13 â
ââââââââââźâââââââââââââââźââââââââââźââââââââ¤
â JO â Orange Juice â SOFTS â 1.61 â
ââââââââââźâââââââââââââââźââââââââââźââââââââ¤
â LH â Lean Hogs â MEATS â 1.25 â
ââââââââââ´âââââââââââââââ´ââââââââââ´ââââââââ
cargo run --example future
let table_str = Group::new(GroupBy::Industry, GroupType::Valuation, OrderBy::PerformanceWeek, Ordering::Ascending)
.scrape().await?
.to_table(None, Some(5));
println!("{}", table_str);
ââââââââââââââââââââââââââŹâââââââââââââŹââââââââŹââââââââââŹâââââââŹâââââââŹâââââââŹââââââââŹââââââââŹââââââââââââââŹââââââââââââââŹââââââââââââââââŹâââââââââŹâââââââââ
â Name â Market Cap â P/E â Fwd P/E â PEG â P/S â P/B â P/C â P/FCF â EPS past 5Y â EPS next 5Y â Sales past 5Y â Change â Volume â
ââââââââââââââââââââââââââźâââââââââââââźââââââââźââââââââââźâââââââźâââââââźâââââââźââââââââźââââââââźââââââââââââââźââââââââââââââźââââââââââââââââźâââââââââźâââââââââ¤
â Footwear & Accessories â 218.49B â 29.00 â 23.54 â 2.93 â 2.75 â 8.79 â 15.87 â 63.31 â 21.32% â 9.89% â 7.52% â -3.85% â 24.19M â
ââââââââââââââââââââââââââźâââââââââââââźââââââââźââââââââââźâââââââźâââââââźâââââââźââââââââźââââââââźââââââââââââââźââââââââââââââźââââââââââââââââźâââââââââźâââââââââ¤
â Solar â 83.25B â 28.69 â 16.35 â 1.19 â 1.89 â 2.65 â 6.27 â 88.49 â 24.73% â 24.07% â 31.63% â -1.87% â 40.45M â
ââââââââââââââââââââââââââźâââââââââââââźââââââââźââââââââââźâââââââźâââââââźâââââââźââââââââźââââââââźââââââââââââââźââââââââââââââźââââââââââââââââźâââââââââźâââââââââ¤
â Coking Coal â 7.46B â 2.33 â 5.72 â 0.36 â 0.61 â 1.32 â 5.17 â 3.31 â 36.66% â 6.53% â 14.94% â -1.48% â 1.14M â
ââââââââââââââââââââââââââźâââââââââââââźââââââââźââââââââââźâââââââźâââââââźâââââââźââââââââźââââââââźââââââââââââââźââââââââââââââźââââââââââââââââźâââââââââźâââââââââ¤
â Gold â 247.00B â 30.11 â 24.68 â 5.10 â 3.75 â 1.38 â 13.56 â 91.32 â 12.76% â 5.91% â 10.42% â 0.39% â 70.35M â
ââââââââââââââââââââââââââ´âââââââââââââ´ââââââââ´ââââââââââ´âââââââ´âââââââ´âââââââ´ââââââââ´ââââââââ´ââââââââââââââ´ââââââââââââââ´ââââââââââââââââ´âââââââââ´âââââââââ
cargo run --example output_csv
Screener::new(ScreenerType::Performance)
.scrape().await?
.to_csv_file("output.csv")?;
cargo run --example output_json
let json_data = Forex::default()
.scrape().await?
.into_iter()
.take(2)
.collect::<TableData>()
.to_json(Some(Forex::default_header()))?;
println!("{}", serde_json::to_string_pretty(&json_data)?);
Powered by the crate strum, we're able to iterate all enum types as following example:
cargo run --example iter_all_enum_variants
use strum::IntoEnumIterator;
// fetch all types of insider trading data by iterating the enum of InsiderType
for insider_type in InsiderType::iter() {
let table_str = Insider::new(insider_type)
.scrape().await?
.to_table(Some(Insider::default_header()), Some(3));
println!("{}", table_str);
}