136 lines
3.4 KiB
Python
136 lines
3.4 KiB
Python
"""
|
|
.. 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)) - 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()
|