Files
OpenBB/openbb_terminal/common/technical_analysis/volume_model.py
Colin Delahunty 6dea3a931a Stock Integrated Tests (#3353)
* Fixes

* Added better handling

* Adds more handling

* Adds more handling

* Added screener handling

* Added fixes

* Added fixes
2022-11-09 11:31:24 -05:00

110 lines
2.6 KiB
Python

"""Volume Technical Analysis"""
__docformat__ = "numpy"
import logging
import pandas as pd
import pandas_ta as ta
from openbb_terminal.decorators import log_start_end
from openbb_terminal.common.technical_analysis import ta_helpers
from openbb_terminal.rich_config import console
logger = logging.getLogger(__name__)
@log_start_end(log=logger)
def ad(data: pd.DataFrame, use_open: bool = False) -> pd.DataFrame:
"""Calculate AD technical indicator
Parameters
----------
data : pd.DataFrame
Dataframe of prices with OHLC and Volume
use_open : bool
Whether to use open prices
Returns
-------
pd.DataFrame
Dataframe with technical indicator
"""
kwargs = {}
if use_open:
kwargs["Open"] = data["Open"]
df_ta = ta.ad(
high=data["High"],
low=data["Low"],
close=data["Close"],
volume=data["Volume"],
**kwargs
).dropna()
return pd.DataFrame(df_ta)
@log_start_end(log=logger)
def adosc(
data: pd.DataFrame, use_open: bool = False, fast: int = 3, slow: int = 10
) -> pd.DataFrame:
"""Calculate AD oscillator technical indicator
Parameters
----------
data : pd.DataFrame
Dataframe of OHLC prices
use_open : bool
Whether to use open prices
fast: int
Fast value
slow: int
Slow value
Returns
-------
pd.DataFrame
Dataframe with technical indicator
"""
if use_open:
df_ta = ta.adosc(
high=data["High"],
low=data["Low"],
close=data["Close"],
volume=data["Volume"],
open_=data["Open"],
fast=fast,
slow=slow,
).dropna()
else:
df_ta = ta.adosc(
high=data["High"],
low=data["Low"],
close=data["Close"],
volume=data["Volume"],
fast=fast,
slow=slow,
).dropna()
return pd.DataFrame(df_ta)
@log_start_end(log=logger)
def obv(data: pd.DataFrame) -> pd.DataFrame:
"""On Balance Volume
Parameters
----------
data: pd.DataFrame
Dataframe of OHLC prices
Returns
-------
pd.DataFrame
Dataframe with technical indicator
"""
close_col = ta_helpers.check_columns(data, high=False, low=False)
if close_col is None:
return pd.DataFrame()
if "Volume" not in data.columns:
console.print("[red]Volume column not found[/red]\n")
return pd.DataFrame()
return pd.DataFrame(ta.obv(close=data[close_col], volume=data["Volume"]).dropna())