def generate_macd_signal(fund: pd.DataFrame, **kwargs) -> dict: """Generate MACD Signal macd = ema(12) - ema(26) 'signal' = macd(ema(9)) Arguments: fund {pd.DataFrame} -- fund dataset Keyword Arguments: plotting {bool} -- (default: {True}) name {str} -- (default: {''}) view {str} -- directory of plots (default: {''}) Returns: dict -- macd data object """ plotting = kwargs.get('plot_output', True) name = kwargs.get('name', '') view = kwargs.get('view') macd = dict() emaTw = exponential_moving_avg(fund, interval=12) emaTs = exponential_moving_avg(fund, interval=26) macd_val = [] for i in range(len(emaTw)): if i < 26: macd_val.append(0.0) else: macd_val.append(emaTw[i] - emaTs[i]) macd_sig = exponential_moving_avg(macd_val, interval=9, data_type='list') # Actual MACD vs. its signal line m_bar = [] for i, sig in enumerate(macd_sig): m_bar.append(macd_val[i] - sig) macd['tabular'] = {'macd': macd_val, 'signal_line': macd_sig, 'bar': m_bar} x = dates_extractor_list(fund) name3 = INDEXES.get(name, name) name2 = name3 + ' - MACD' if plotting: bar_chart(m_bar, position=fund, x=x, title=name2) else: filename = os.path.join(name, view, f"macd_bar_{name}.png") bar_chart(m_bar, position=fund, x=x, title=name2, saveFig=True, filename=filename) return macd
def generate_bear_bull_signal(position: pd.DataFrame, **kwargs) -> dict: """Generate Bear Bull Signal Arguments: position {pd.DataFrame} -- dataset Optional Args: interval {int} -- size of exponential moving average window (default: {13}) plot_output {bool} -- (default: {True}) name {str} -- (default: {''}) p_bar {ProgressBar} -- (default: {None}) Returns: dict -- [description] """ interval = kwargs.get('interval', 13) plot_output = kwargs.get('plot_output', True) name = kwargs.get('name', '') p_bar = kwargs.get('p_bar') bb_signal = {'bulls': [], 'bears': []} ema = exponential_moving_avg(position, interval) for i, high in enumerate(position['High']): bb_signal['bulls'].append(high - ema[i]) if p_bar is not None: p_bar.uptick(increment=0.1) for i, low in enumerate(position['Low']): bb_signal['bears'].append(low - ema[i]) if p_bar is not None: p_bar.uptick(increment=0.1) x = dates_extractor_list(position) if plot_output: name3 = INDEXES.get(name, name) name2 = name3 + ' - Bull Power' bar_chart(bb_signal['bulls'], position=position, title=name2, x=x) name2 = name3 + ' - Bear Power' bar_chart(bb_signal['bears'], position=position, title=name2, x=x) return bb_signal
def generate_obv_content(fund: pd.DataFrame, **kwargs) -> dict: """Generate On Balance Signal Content Arguments: fund {pd.DataFrame} Optional Args: plot_output {bool} -- (default: {True}) filter_factor {float} -- threshold divisor (x/filter_factor) for "significant" OBVs (default: {2.5}) sma_interval {int} -- interval for simple moving average (default: {20}) name {str} -- (default: {''}) progress_bar {ProgressBar} -- (default: {None}) view {'str'} -- period (default: {None}) Returns: dict -- obv data object """ plot_output = kwargs.get('plot_output', True) filter_factor = kwargs.get('filter_factor', 2.5) sma_interval = kwargs.get('sma_interval', 20) name = kwargs.get('name', '') progress_bar = kwargs.get('progress_bar') view = kwargs.get('view') obv_dict = dict() obv = generate_obv_signal(fund) obv_dict['obv'] = obv if progress_bar is not None: progress_bar.uptick(increment=0.125) ofilter, features = obv_feature_detection(obv, fund, sma_interval=sma_interval, filter_factor=filter_factor, progress_bar=progress_bar, plot_output=plot_output) obv_dict['tabular'] = ofilter obv_dict['signals'] = features if progress_bar is not None: progress_bar.uptick(increment=0.125) volume = [] volume.append(fund['Volume'][0]) for i in range(1, len(fund['Volume'])): if fund['Close'][i] - fund['Close'][i - 1] < 0: volume.append(-1.0 * fund['Volume'][i]) else: volume.append(fund['Volume'][i]) x = dates_extractor_list(fund) name3 = INDEXES.get(name, name) name2 = name3 + ' - On Balance Volume (OBV)' name4 = name3 + ' - Significant OBV Changes' name5 = name3 + ' - Volume' if plot_output: dual_plotting(fund['Close'], obv, x=x, y1_label='Position Price', y2_label='On Balance Volume', x_label='Trading Days', title=name2, subplot=True) dual_plotting(fund['Close'], ofilter, x=x, y1_label='Position Price', y2_label='OBV-DIFF', x_label='Trading Days', title=name4, subplot=True) bar_chart(volume, x=x, position=fund, title=name5, all_positive=True) else: filename = os.path.join(name, view, f"obv_diff_{name}.png") filename2 = os.path.join(name, view, f"obv_standard_{name}.png") filename3 = os.path.join(name, view, f"volume_{name}.png") bar_chart(volume, x=x, position=fund, title=name5, saveFig=True, filename=filename3, all_positive=True) bar_chart(ofilter, x=x, position=fund, title=name4, saveFig=True, filename=filename) dual_plotting(fund['Close'], obv, x=x, y1_label='Position Price', y2_label='On Balance Volume', x_label='Trading Days', title=name2, saveFig=True, filename=filename2) if progress_bar is not None: progress_bar.uptick(increment=0.125) obv_dict['length_of_data'] = len(obv_dict['tabular']) return obv_dict
def get_ao_signal(position: pd.DataFrame, **kwargs) -> list: """Get Awesome Oscillator Signal Arguments: position {pd.DataFrame} -- dataset of fund Optional Args: short_period {int} -- moving average period (default: {5}) long_period {int} -- moving average period (default: {34}) filter_style {str} -- moving average type, 'sma' or 'ema' (default: {'sma'}) plot_output {bool} -- True plots in realtime (default: {True}) p_bar {ProgressBar} -- (default: {None}) name {str} -- name of fund (default: {''}) Returns: list -- awesome signal """ short_period = kwargs.get('short_period', 5) long_period = kwargs.get('long_period', 34) filter_style = kwargs.get('filter_style', 'sma') plot_output = kwargs.get('plot_output', True) p_bar = kwargs.get('progress_bar') name = kwargs.get('name', '') view = kwargs.get('view') signal = [] mid_points = [] for i, high in enumerate(position['High']): mid = (high + position['Low'][i]) / 2 mid_points.append(mid) if p_bar is not None: p_bar.uptick(increment=0.1) if filter_style == 'sma': short_signal = simple_moving_avg(mid_points, short_period, data_type='list') long_signal = simple_moving_avg(mid_points, long_period, data_type='list') elif filter_style == 'ema': short_signal = exponential_moving_avg(mid_points, short_period, data_type='list') long_signal = exponential_moving_avg(mid_points, long_period, data_type='list') else: short_signal = [] long_signal = [] if p_bar is not None: p_bar.uptick(increment=0.1) for i in range(long_period): signal.append(0.0) for i in range(long_period, len(long_signal)): diff = short_signal[i] - long_signal[i] signal.append(diff) if p_bar is not None: p_bar.uptick(increment=0.1) med_term = simple_moving_avg(signal, 14, data_type='list') long_term = simple_moving_avg(signal, long_period, data_type='list') signal, med_term, long_term = normalize_signals( [signal, med_term, long_term]) if p_bar is not None: p_bar.uptick(increment=0.1) triggers = ao_signal_trigger(signal, med_term, long_term) x = dates_extractor_list(position) name3 = INDEXES.get(name, name) name2 = name3 + ' - Awesome Oscillator' if plot_output: dual_plotting([signal, med_term, long_term], position['Close'], ['Awesome', 'Medium', 'Long'], 'Price') dual_plotting([signal, triggers], position['Close'], ['Awesome', 'Triggers'], 'Price') bar_chart(signal, position=position, x=x, title=name2, bar_delta=True) else: filename = os.path.join(name, view, f"awesome_bar_{name}") bar_chart(signal, position=position, x=x, saveFig=True, filename=filename, title=name2, bar_delta=True) if p_bar is not None: p_bar.uptick(increment=0.1) return signal