mirror of
https://github.com/NexVeridian/ark-invest-api-rust-data.git
synced 2025-09-02 09:59:12 +00:00
21shares
This commit is contained in:
parent
acf6858c6c
commit
925760b614
4 changed files with 53 additions and 17 deletions
|
@ -20,7 +20,7 @@ glob = { version = "0.3" }
|
||||||
clokwerk = "0.4"
|
clokwerk = "0.4"
|
||||||
strum_macros = "0.25"
|
strum_macros = "0.25"
|
||||||
strum = "0.25"
|
strum = "0.25"
|
||||||
tokio = { version = "1.26", features = ["full"] }
|
tokio = { version = "1.34", features = ["full"] }
|
||||||
openssl = { version = "0.10", features = ["vendored"] }
|
openssl = { version = "0.10", features = ["vendored"] }
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
|
|
@ -67,7 +67,7 @@ async fn spawn_ark_plan(ticker: Ticker) -> Result<(), Error> {
|
||||||
|
|
||||||
async fn ark_etf() {
|
async fn ark_etf() {
|
||||||
let futures = Ticker::iter()
|
let futures = Ticker::iter()
|
||||||
.filter(|&x| x != Ticker::ARKVC)
|
.filter(|&x| x != Ticker::ARKVX)
|
||||||
.map(spawn_ark_plan)
|
.map(spawn_ark_plan)
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ async fn main() {
|
||||||
scheduler
|
scheduler
|
||||||
.every(5.day())
|
.every(5.day())
|
||||||
.at("11:30 pm")
|
.at("11:30 pm")
|
||||||
.run(|| async { if spawn_ark_plan(Ticker::ARKVC).await.is_ok() {} });
|
.run(|| async { if spawn_ark_plan(Ticker::ARKVX).await.is_ok() {} });
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
scheduler.run_pending().await;
|
scheduler.run_pending().await;
|
||||||
|
|
38
src/util.rs
38
src/util.rs
|
@ -15,7 +15,7 @@ use strum_macros::{EnumIter, EnumString};
|
||||||
|
|
||||||
#[derive(Debug, Default, strum_macros::Display, EnumIter, Clone, Copy, PartialEq)]
|
#[derive(Debug, Default, strum_macros::Display, EnumIter, Clone, Copy, PartialEq)]
|
||||||
pub enum Ticker {
|
pub enum Ticker {
|
||||||
ARKVC,
|
ARKVX,
|
||||||
ARKF,
|
ARKF,
|
||||||
ARKG,
|
ARKG,
|
||||||
#[default]
|
#[default]
|
||||||
|
@ -23,17 +23,27 @@ pub enum Ticker {
|
||||||
ARKQ,
|
ARKQ,
|
||||||
ARKW,
|
ARKW,
|
||||||
ARKX,
|
ARKX,
|
||||||
|
// ARKA,
|
||||||
|
// ARKZ,
|
||||||
|
ARKC,
|
||||||
|
ARKD,
|
||||||
|
ARKY,
|
||||||
}
|
}
|
||||||
impl Ticker {
|
impl Ticker {
|
||||||
pub fn value(&self) -> &str {
|
pub fn value(&self) -> &str {
|
||||||
match *self {
|
match *self {
|
||||||
Ticker::ARKVC => "ARKVC",
|
Ticker::ARKVX => "ARKVX",
|
||||||
Ticker::ARKF => "FINTECH_INNOVATION",
|
Ticker::ARKF => "FINTECH_INNOVATION",
|
||||||
Ticker::ARKG => "GENOMIC_REVOLUTION",
|
Ticker::ARKG => "GENOMIC_REVOLUTION",
|
||||||
Ticker::ARKK => "INNOVATION",
|
Ticker::ARKK => "INNOVATION",
|
||||||
Ticker::ARKQ => "AUTONOMOUS_TECH._&_ROBOTICS",
|
Ticker::ARKQ => "AUTONOMOUS_TECH._&_ROBOTICS",
|
||||||
Ticker::ARKW => "NEXT_GENERATION_INTERNET",
|
Ticker::ARKW => "NEXT_GENERATION_INTERNET",
|
||||||
Ticker::ARKX => "SPACE_EXPLORATION_&_INNOVATION",
|
Ticker::ARKX => "SPACE_EXPLORATION_&_INNOVATION",
|
||||||
|
// Ticker::ARKA => "ARKA",
|
||||||
|
// Ticker::ARKZ => "ARKZ",
|
||||||
|
Ticker::ARKC => "ARKC",
|
||||||
|
Ticker::ARKD => "ARKD",
|
||||||
|
Ticker::ARKY => "ARKY",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,7 +352,7 @@ impl Ark {
|
||||||
expressions.push(
|
expressions.push(
|
||||||
col("ticker")
|
col("ticker")
|
||||||
.str()
|
.str()
|
||||||
.replace_all(lit("(?i) fp| uq| un| uw"), lit(""), true)
|
.replace_all(lit("(?i) fp| uq| un| uw | cn"), lit(""), true)
|
||||||
.str()
|
.str()
|
||||||
.replace(lit("DKNN"), lit("DKNG"), true)
|
.replace(lit("DKNN"), lit("DKNG"), true)
|
||||||
.str()
|
.str()
|
||||||
|
@ -402,6 +412,18 @@ impl Ark {
|
||||||
df = df.select(["date", "ticker", "cusip", "company", "weight"])?;
|
df = df.select(["date", "ticker", "cusip", "company", "weight"])?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ARKVX
|
||||||
|
if !df.get_column_names().contains(&"market_value") {
|
||||||
|
df = df
|
||||||
|
.lazy()
|
||||||
|
.with_columns([
|
||||||
|
Series::new("market_value", [None::<i64>]).lit(),
|
||||||
|
Series::new("shares", [None::<i64>]).lit(),
|
||||||
|
Series::new("share_price", [None::<i64>]).lit(),
|
||||||
|
])
|
||||||
|
.collect()?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(df.into())
|
Ok(df.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,8 +433,8 @@ impl Ark {
|
||||||
source: Option<&Source>,
|
source: Option<&Source>,
|
||||||
) -> Result<DataFrame, Error> {
|
) -> Result<DataFrame, Error> {
|
||||||
let url = match (&self.ticker, last_day) {
|
let url = match (&self.ticker, last_day) {
|
||||||
(self::Ticker::ARKVC, Some(last_day)) => format!(
|
(self::Ticker::ARKVX, Some(last_day)) => format!(
|
||||||
"https://api.nexveridian.com/arkvc_holdings?start={}",
|
"https://api.nexveridian.com/ARKVX_holdings?start={}",
|
||||||
last_day
|
last_day
|
||||||
),
|
),
|
||||||
(tic, Some(last_day)) => match source {
|
(tic, Some(last_day)) => match source {
|
||||||
|
@ -425,7 +447,7 @@ impl Ark {
|
||||||
tic, last_day
|
tic, last_day
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
(self::Ticker::ARKVC, None) => "https://api.nexveridian.com/arkvc_holdings".to_owned(),
|
(self::Ticker::ARKVX, None) => "https://api.nexveridian.com/ARKVX_holdings".to_owned(),
|
||||||
(tic, None) => match source {
|
(tic, None) => match source {
|
||||||
Some(Source::ArkFundsIoFull) => {
|
Some(Source::ArkFundsIoFull) => {
|
||||||
format!("https://arkfunds.io/api/v2/etf/holdings?symbol={}", tic)
|
format!("https://arkfunds.io/api/v2/etf/holdings?symbol={}", tic)
|
||||||
|
@ -455,7 +477,9 @@ impl Ark {
|
||||||
|
|
||||||
pub fn get_csv_ark(&self) -> Result<DataFrame, Error> {
|
pub fn get_csv_ark(&self) -> Result<DataFrame, Error> {
|
||||||
let url = match self.ticker {
|
let url = match self.ticker {
|
||||||
self::Ticker::ARKVC => "https://ark-ventures.com/wp-content/uploads/funds-etf-csv/ARK_VENTURE_FUND_HOLDINGS.csv".to_owned(),
|
self::Ticker::ARKVX => "https://ark-ventures.com/wp-content/uploads/funds-etf-csv/ARK_VENTURE_FUND_HOLDINGS.csv".to_owned(),
|
||||||
|
// self::Ticker::ARKA | self::Ticker::ARKZ |
|
||||||
|
self::Ticker::ARKC | self::Ticker::ARKD | self::Ticker::ARKY => format!("https://cdn.21shares-funds.com/uploads/fund-documents/us-bank/holdings/product/current/{}-Export.csv", self.ticker.value()),
|
||||||
_ => format!("https://ark-funds.com/wp-content/uploads/funds-etf-csv/ARK_{}_ETF_{}_HOLDINGS.csv", self.ticker.value(), self.ticker),
|
_ => format!("https://ark-funds.com/wp-content/uploads/funds-etf-csv/ARK_{}_ETF_{}_HOLDINGS.csv", self.ticker.value(), self.ticker),
|
||||||
};
|
};
|
||||||
Reader::Csv.get_data_url(url)
|
Reader::Csv.get_data_url(url)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
|
use anyhow::{Error, Result};
|
||||||
use ark_invest_api_rust_data::util::*;
|
use ark_invest_api_rust_data::util::*;
|
||||||
use chrono::NaiveDate;
|
use chrono::NaiveDate;
|
||||||
use polars::datatypes::DataType;
|
use polars::datatypes::DataType;
|
||||||
use serial_test::serial;
|
use serial_test::serial;
|
||||||
use std::error::Error;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[serial]
|
#[serial]
|
||||||
fn get_api_arkk() -> Result<(), Box<dyn Error>> {
|
fn get_api_arkk() -> Result<(), Error> {
|
||||||
let df = Ark::new(
|
let df = Ark::new(
|
||||||
Source::ApiIncremental,
|
Source::ApiIncremental,
|
||||||
Ticker::ARKK,
|
Ticker::ARKK,
|
||||||
|
@ -36,7 +36,7 @@ fn get_api_arkk() -> Result<(), Box<dyn Error>> {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[serial]
|
#[serial]
|
||||||
fn get_api_format_arkk() -> Result<(), Box<dyn Error>> {
|
fn get_api_format_arkk() -> Result<(), Error> {
|
||||||
let dfl = Ark::new(
|
let dfl = Ark::new(
|
||||||
Source::ApiIncremental,
|
Source::ApiIncremental,
|
||||||
Ticker::ARKK,
|
Ticker::ARKK,
|
||||||
|
@ -76,10 +76,10 @@ fn get_api_format_arkk() -> Result<(), Box<dyn Error>> {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[serial]
|
#[serial]
|
||||||
fn get_api_format_arkvc() -> Result<(), Box<dyn Error>> {
|
fn get_api_format_arkvx() -> Result<(), Error> {
|
||||||
let dfl = Ark::new(
|
let dfl = Ark::new(
|
||||||
Source::ApiIncremental,
|
Source::ApiIncremental,
|
||||||
Ticker::ARKVC,
|
Ticker::ARKVX,
|
||||||
Some("data/test".to_owned()),
|
Some("data/test".to_owned()),
|
||||||
)?
|
)?
|
||||||
.get_api(NaiveDate::from_ymd_opt(2023, 1, 1), None)?;
|
.get_api(NaiveDate::from_ymd_opt(2023, 1, 1), None)?;
|
||||||
|
@ -88,13 +88,25 @@ fn get_api_format_arkvc() -> Result<(), Box<dyn Error>> {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
(df.get_column_names(), df.dtypes(), df.shape().1 > 1),
|
(df.get_column_names(), df.dtypes(), df.shape().1 > 1),
|
||||||
(
|
(
|
||||||
vec!["date", "ticker", "cusip", "company", "weight"],
|
vec![
|
||||||
|
"date",
|
||||||
|
"ticker",
|
||||||
|
"cusip",
|
||||||
|
"company",
|
||||||
|
"market_value",
|
||||||
|
"shares",
|
||||||
|
"share_price",
|
||||||
|
"weight",
|
||||||
|
],
|
||||||
vec![
|
vec![
|
||||||
DataType::Date,
|
DataType::Date,
|
||||||
DataType::Utf8,
|
DataType::Utf8,
|
||||||
DataType::Utf8,
|
DataType::Utf8,
|
||||||
DataType::Utf8,
|
DataType::Utf8,
|
||||||
DataType::Float64
|
DataType::Int64,
|
||||||
|
DataType::Int64,
|
||||||
|
DataType::Float64,
|
||||||
|
DataType::Float64,
|
||||||
],
|
],
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue