https://github.com/bukosabino/ta
Tip revision: 77a0600c10b65b4a3424f30d4faf48f168b43386 authored by Darío López Padial on 20 November 2021, 09:04:46 UTC
Merge pull request #272 from bukosabino/feature/only-vectorized-indicators
Merge pull request #272 from bukosabino/feature/only-vectorized-indicators
Tip revision: 77a0600
others.py
"""
.. module:: others
:synopsis: Others Indicators.
.. moduleauthor:: Dario Lopez Padial (Bukosabino)
"""
import numpy as np
import pandas as pd
from ta.utils import IndicatorMixin
class DailyReturnIndicator(IndicatorMixin):
"""Daily Return (DR)
Args:
close(pandas.Series): dataset 'Close' column.
fillna(bool): if True, fill nan values.
"""
def __init__(self, close: pd.Series, fillna: bool = False):
self._close = close
self._fillna = fillna
self._run()
def _run(self):
self._dr = (
self._close / self._close.shift(1, fill_value=self._close.mean())
) - 1
self._dr *= 100
def daily_return(self) -> pd.Series:
"""Daily Return (DR)
Returns:
pandas.Series: New feature generated.
"""
dr_series = self._check_fillna(self._dr, value=0)
return pd.Series(dr_series, name="d_ret")
class DailyLogReturnIndicator(IndicatorMixin):
"""Daily Log Return (DLR)
https://stackoverflow.com/questions/31287552/logarithmic-returns-in-pandas-dataframe
Args:
close(pandas.Series): dataset 'Close' column.
fillna(bool): if True, fill nan values.
"""
def __init__(self, close: pd.Series, fillna: bool = False):
self._close = close
self._fillna = fillna
self._run()
def _run(self):
self._dr = pd.Series(np.log(self._close)).diff()
self._dr *= 100
def daily_log_return(self) -> pd.Series:
"""Daily Log Return (DLR)
Returns:
pandas.Series: New feature generated.
"""
dr_series = self._check_fillna(self._dr, value=0)
return pd.Series(dr_series, name="d_logret")
class CumulativeReturnIndicator(IndicatorMixin):
"""Cumulative Return (CR)
Args:
close(pandas.Series): dataset 'Close' column.
fillna(bool): if True, fill nan values.
"""
def __init__(self, close: pd.Series, fillna: bool = False):
self._close = close
self._fillna = fillna
self._run()
def _run(self):
self._cr = (self._close / self._close.iloc[0]) - 1
self._cr *= 100
def cumulative_return(self) -> pd.Series:
"""Cumulative Return (CR)
Returns:
pandas.Series: New feature generated.
"""
cum_ret = self._check_fillna(self._cr, value=-1)
return pd.Series(cum_ret, name="cum_ret")
def daily_return(close, fillna=False):
"""Daily Return (DR)
Args:
close(pandas.Series): dataset 'Close' column.
fillna(bool): if True, fill nan values.
Returns:
pandas.Series: New feature generated.
"""
return DailyReturnIndicator(close=close, fillna=fillna).daily_return()
def daily_log_return(close, fillna=False):
"""Daily Log Return (DLR)
https://stackoverflow.com/questions/31287552/logarithmic-returns-in-pandas-dataframe
Args:
close(pandas.Series): dataset 'Close' column.
fillna(bool): if True, fill nan values.
Returns:
pandas.Series: New feature generated.
"""
return DailyLogReturnIndicator(close=close, fillna=fillna).daily_log_return()
def cumulative_return(close, fillna=False):
"""Cumulative Return (CR)
Args:
close(pandas.Series): dataset 'Close' column.
fillna(bool): if True, fill nan values.
Returns:
pandas.Series: New feature generated.
"""
return CumulativeReturnIndicator(close=close, fillna=fillna).cumulative_return()