mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-03 07:51:49 +00:00
104 lines
2.9 KiB
Python
104 lines
2.9 KiB
Python
""" ARK Model """
|
|
__docformat__ = "numpy"
|
|
|
|
from datetime import timedelta
|
|
import json
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
import numpy as np
|
|
import pandas as pd
|
|
from pandas.core.frame import DataFrame
|
|
import yfinance as yf
|
|
|
|
from gamestonk_terminal.helper_funcs import get_user_agent
|
|
|
|
|
|
def get_ark_orders() -> DataFrame:
|
|
"""Returns ARK orders in a Dataframe
|
|
|
|
Returns
|
|
-------
|
|
DataFrame
|
|
ARK orders data frame with the following columns:
|
|
ticker, date, shares, weight, fund, direction
|
|
"""
|
|
|
|
url_orders = "https://cathiesark.com/ark-funds-combined/trades"
|
|
|
|
raw_page = requests.get(url_orders, headers={"User-Agent": get_user_agent()}).text
|
|
|
|
parsed_script = BeautifulSoup(raw_page, "lxml").find(
|
|
"script", {"id": "__NEXT_DATA__"}
|
|
)
|
|
|
|
parsed_json = json.loads(parsed_script.string)
|
|
|
|
df_orders = pd.json_normalize(parsed_json["props"]["pageProps"]["arkTrades"])
|
|
|
|
if df_orders.empty:
|
|
return pd.DataFrame()
|
|
|
|
df_orders.drop(
|
|
[
|
|
"everything",
|
|
"everything.profile.customThumbnail",
|
|
"hidden",
|
|
"images.thumbnail",
|
|
],
|
|
axis=1,
|
|
inplace=True,
|
|
)
|
|
|
|
df_orders["date"] = pd.to_datetime(df_orders["date"], format="%Y-%m-%dZ").dt.date
|
|
|
|
return df_orders
|
|
|
|
|
|
def add_order_total(df_orders: DataFrame) -> DataFrame:
|
|
"""Takes an ARK orders dataframe and pulls data from Yahoo Finance to add
|
|
volume, open, close, high, low, and total columns
|
|
|
|
Parameters
|
|
----------
|
|
df_orders : DataFrame
|
|
ARK orders data frame with the following columns:
|
|
ticker, date, shares, weight, fund, direction
|
|
|
|
Returns
|
|
-------
|
|
DataFrame
|
|
ARK orders data frame with the following columns:
|
|
ticker, date, shares, volume, open, close, high, low, total, weight, fund, direction
|
|
"""
|
|
start_date = df_orders["date"].iloc[-1] - timedelta(days=1)
|
|
|
|
tickers = " ".join(df_orders["ticker"].unique())
|
|
|
|
print("")
|
|
|
|
prices = yf.download(tickers, start=start_date, progress=False)
|
|
|
|
for i, candle in enumerate(["Volume", "Open", "Close", "High", "Low", "Total"]):
|
|
df_orders.insert(i + 3, candle.lower(), 0)
|
|
|
|
for i, _ in df_orders.iterrows():
|
|
if np.isnan(
|
|
prices["Open"][df_orders.loc[i, "ticker"]][
|
|
df_orders.loc[i, "date"].strftime("%Y-%m-%d")
|
|
]
|
|
):
|
|
for candle in ["Volume", "Open", "Close", "High", "Low", "Total"]:
|
|
df_orders.loc[i, candle.lower()] = 0
|
|
continue
|
|
|
|
for candle in ["Volume", "Open", "Close", "High", "Low"]:
|
|
df_orders.loc[i, candle.lower()] = prices[candle][
|
|
df_orders.loc[i, "ticker"]
|
|
][df_orders.loc[i, "date"].strftime("%Y-%m-%d")]
|
|
|
|
df_orders.loc[i, "total"] = (
|
|
df_orders.loc[i, "close"] * df_orders.loc[i, "shares"]
|
|
)
|
|
|
|
return df_orders
|