yfinance-rust ============= yfinance-rust is a simple command line tool that downloads financial data from Yahoo Finance, like the popular package [yfinance](https://github.com/ranaroussi/yfinance) in python but with fewer features to offer. This is not about re-creating wheels but rather a personal project to familiarise with rust programming. It offers me opportunities to learn many aspects of rust, such as - move semantics - lifetimes - functional programming - recursion with boxes - async programming - error and option handling - macro (really like rust-analyzer's macro expanision ---- it is a dream.) - cargo - testing - inline documenting Apart from rust's language features, the community and the ecosystem of rust is fanscinating -- active, strong and full of quality projects and hence I have explored a few as listed in `cargo.toml` too, - chrono: parse and process datetime objects - clap: build cmd tools - hyper: highly performant http server and client - tokio: async programming made easy - log/env_logger: great logging tool - serde: great serialisation/deserialisation tool ## project structure ``` src ├── http.rs: download from yahoo ├── main.rs: program entry + write to csv ├── options.rs: cmd args └── v8chart.rs: data class and conversion to csv ``` ## command line options ``` ✗ target/debug/yfinance-rust yfinance-rust 1.0 Hongze Xia hongzex@gmail.com> USAGE: yfinance-rust FLAGS: -h, --help Prints help information -V, --version Prints version information SUBCOMMANDS: convert Convert yahoo finance v8 json into csv download Download historical data from yahoo finance help Prints this message or the help of the given subcommand(s) ``` ``` ✗ target/debug/yfinance-rust download -h yfinance-rust-download Download historical data from yahoo finance USAGE: yfinance-rust download [FLAGS] [OPTIONS] [symbols]... ARGS: ... List of symbols to download. Required FLAGS: --convert Convert JSON to CSV -h, --help Prints help information --include-pre-post Include pre & post market data -V, --version Prints version information OPTIONS: --end An end date. Default to Now --interval select a proper interval for the data 1m goes back to 4-5 days 5m goes back to ~80 days others goes back to the initial trading date [default: 1d] [possible values: 1m, 5m, 1d, 5d, 1wk, 1mo, 3mo] -o, --output-dir Sets a output directory. The format of the output JSON looks like `SYMBOL_20200202_20200303.json` [default: .] --rate Request rate in terms of ms [default: 100] --start A start date to download from. Default to the initial trading day ``` ``` ✗ target/debug/yfinance-rust convert -h yfinance-rust-convert Convert yahoo finance v8 json into csv USAGE: yfinance-rust convert [FLAGS] ARGS: input_dir where the JSONs live FLAGS: -h, --help Prints help information --recursive whether to walk the input_dir recursively -V, --version Prints version information ``` ## example ``` ✗ RUST_LOG=info target/debug/yfinance-rust download --convert -o target/output AAPL MSFT NVDA TSLA [2021-01-26T05:05:24Z INFO yfinance_rust::options] Opts { subcmd: Download(DownloadOpts { symbols: ["AAPL", "MSFT", "NVDA", "TSLA"], start: None, end: None, include_pre_post: false, output_dir: "target/output", interval: "1d", rate: MyDuration { duration: 100ms }, convert: true }) } [2021-01-26T05:05:27Z INFO yfinance_rust::http] downloaded "target/output/NVDA_init_20210126.json" [2021-01-26T05:05:28Z INFO yfinance_rust::http] downloaded "target/output/TSLA_init_20210126.json" [2021-01-26T05:05:29Z INFO yfinance_rust::http] downloaded "target/output/MSFT_init_20210126.json" [2021-01-26T05:05:29Z INFO yfinance_rust::http] downloaded "target/output/AAPL_init_20210126.json" [2021-01-26T05:05:29Z INFO yfinance_rust::http] have successfully download 4 of 4 [2021-01-26T05:05:30Z INFO yfinance_rust] successfully converted to "target/output/AAPL_init_20210126.csv" [2021-01-26T05:05:30Z INFO yfinance_rust] successfully converted to "target/output/MSFT_init_20210126.csv" [2021-01-26T05:05:31Z INFO yfinance_rust] successfully converted to "target/output/NVDA_init_20210126.csv" [2021-01-26T05:05:31Z INFO yfinance_rust] successfully converted to "target/output/TSLA_init_20210126.csv" ```