def analyzeGoldenAndDeathCross(companyName='GOOG', nDays_short=50, nDays_long=200, start='2019-10-31'): # Load dataframe for company dataFr = general.loadCompanyData(companyName, start=start) # Create moving average columns dataFr = getMovingAverage(dataFr, colName='Close', nDays=nDays_short) dataFr = getMovingAverage(dataFr, colName='Close', nDays=nDays_long) fig = plt.figure(figsize=(20, 10)) ax = fig.add_subplot(111) ax.plot(dataFr['Date'].to_list(), dataFr['Close'].to_list(), label='Closing') ax.plot(dataFr['Date'].to_list(), dataFr['movingAverage_{}'.format(nDays_short)].to_list(), label='{}-day SMA'.format(nDays_short), linewidth=3) ax.plot(dataFr['Date'].to_list(), dataFr['movingAverage_{}'.format(nDays_long)].to_list(), label='{}-day SMA'.format(nDays_long), linewidth=3) plt.xticks(rotation=45, ha="right") for n, label in enumerate(ax.xaxis.get_ticklabels()): if n % every_nth != 0: label.set_visible(False) plt.legend(prop={'size': 20})
def computeAndPlotFullStochasticOscillator(companyName='GOOG', n1=14, n2=3, n3=3, start='2019-10-31', every_nth=20): # Load dataframe for company dataFr = general.loadCompanyData(companyName, start=start) dataFr['fast_%K'] = STOK(dataFr, n1) # SMA dataFr['full_%K'] = dataFr['fast_%K'].rolling(n2).mean() dataFr['full_%D'] = dataFr['full_%K'].rolling(n3).mean() fig = plt.figure(figsize=(20, 10)) # set height ratios for sublots gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1]) # the fisrt subplot ax0 = plt.subplot(gs[0]) # ax0.plot(dataFr['Date'].to_list(), # dataFr['Close'].to_list(), # label='Closing'); highList = dataFr['High'].to_list() lowList = dataFr['Low'].to_list() dateList = dataFr['Date'].to_list() closeList = dataFr['Close'].to_list() lowerError = [a - b for a, b in zip(closeList, lowList)] upperError = [a - b for a, b in zip(highList, closeList)] ax0.errorbar(x=dateList, y=closeList, yerr=[lowerError, upperError], fmt='o') for n, label in enumerate(ax0.xaxis.get_ticklabels()): if n % every_nth != 0: label.set_visible(False) plt.xticks(rotation=45, ha="right") # the second subplot ax1 = plt.subplot(gs[1], sharex=ax0) ax1.plot(dataFr['Date'].to_list(), dataFr['full_%K'].to_list(), label='Full %K', c='r') ax1.plot(dataFr['Date'].to_list(), dataFr['full_%D'].to_list(), label='Full %D', c='k') ax1.axhline(y=50, linestyle='-.') ax1.axhline(y=20, linestyle='-') ax1.axhline(y=80, linestyle='-') for n, label in enumerate(ax1.xaxis.get_ticklabels()): if n % every_nth != 0: label.set_visible(False) plt.xticks(rotation=45, ha="right") plt.yticks([0, 20, 50, 80, 100]) plt.legend(prop={'size': 14})
def getRSI(companyName='GOOG', start='2020-01-01', n=14, every_nth=20): # Load dataframe for company dataFr = general.loadCompanyData(companyName, start=start) dataFr.index = range(len(dataFr)) dataFr['change'] = dataFr['Close'].diff() dataFr['gain'] = dataFr.change.mask(dataFr.change < 0, 0.0) dataFr['loss'] = -dataFr.change.mask(dataFr.change > 0, -0.0) dataFr.loc[n:, 'avg_gain'] = rma(dataFr.gain[n + 1:].values, n, dataFr.loc[:n, 'gain'].mean()) dataFr.loc[n:, 'avg_loss'] = rma(dataFr.loss[n + 1:].values, n, dataFr.loc[:n, 'loss'].mean()) dataFr['rs'] = dataFr.avg_gain / dataFr.avg_loss dataFr['rsi_14'] = 100 - (100 / (1 + dataFr.rs)) # Plot data fig = plt.figure(figsize=(20, 10)) # set height ratios for sublots gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1]) # the first subplot ax0 = plt.subplot(gs[0]) # ax0.plot(dataFr['Date'].to_list(), # dataFr['Close'].to_list(), # label='Closing'); highList = dataFr['High'].to_list() lowList = dataFr['Low'].to_list() dateList = dataFr['Date'].to_list() closeList = dataFr['Close'].to_list() lowerError = [a - b for a, b in zip(closeList, lowList)] upperError = [a - b for a, b in zip(highList, closeList)] ax0.errorbar(x=dateList, y=closeList, yerr=[lowerError, upperError], fmt='o') for n, label in enumerate(ax0.xaxis.get_ticklabels()): if n % every_nth != 0: label.set_visible(False) plt.xticks(rotation=45, ha="right") # the second subplot ax1 = plt.subplot(gs[1], sharex=ax0) ax1.plot(dataFr['Date'].to_list(), dataFr['rsi_14'].to_list(), label='RSI', c='c') ax1.axhline(y=50, linestyle='-.', color='k') ax1.axhline(y=30, linestyle='-', color='g') ax1.axhline(y=70, linestyle='-', color='r') for n, label in enumerate(ax1.xaxis.get_ticklabels()): if n % every_nth != 0: label.set_visible(False) plt.xticks(rotation=45, ha="right") plt.yticks([0, 30, 50, 70, 100]) plt.legend(prop={'size': 12}, loc='upper left')
def getMACD(companyName='GOOG', start='2020-01-01', n1=12, n2=26, n3=9, every_nth=20): # Load dataframe for company dataFr = general.loadCompanyData(companyName, start=start) dataFr = getExponentialMovingAverage(dataFr, nDays=n1) dataFr = getExponentialMovingAverage(dataFr, nDays=n2) dataFr['MACD'] = dataFr.apply( lambda row: (row['EMA_{}'.format(n1)] - row['EMA_{}'.format(n2)]), axis=1) dataFr = getSignalLine(dataFr, colName='MACD', nDays=n3, n2=n2) dataFr['MACD_histogram'] = dataFr.apply( lambda row: row['MACD'] - row['SignalLine'], axis=1) # Plot data fig = plt.figure(figsize=(20, 10)) # set height ratios for sublots gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1]) # the first subplot ax0 = plt.subplot(gs[0]) # ax0.plot(dataFr['Date'].to_list(), # dataFr['Close'].to_list(), # label='Closing'); highList = dataFr['High'].to_list() lowList = dataFr['Low'].to_list() dateList = dataFr['Date'].to_list() closeList = dataFr['Close'].to_list() lowerError = [a - b for a, b in zip(closeList, lowList)] upperError = [a - b for a, b in zip(highList, closeList)] ax0.errorbar(x=dateList, y=closeList, yerr=[lowerError, upperError], fmt='o') for n, label in enumerate(ax0.xaxis.get_ticklabels()): if n % every_nth != 0: label.set_visible(False) plt.xticks(rotation=45, ha="right") ax0.plot(dateList, dataFr['EMA_{}'.format(n1)].to_list(), color='y', linewidth=3, label='{}-day EMA'.format(n1)) ax0.plot(dateList, dataFr['EMA_{}'.format(n2)].to_list(), color='m', linewidth=3, label='{}-day EMA'.format(n2)) plt.legend(prop={'size': 12}, loc='upper left') # the second subplot ax1 = plt.subplot(gs[1], sharex=ax0) ax1.plot(dataFr['Date'].to_list(), dataFr['MACD'].to_list(), label='MACD', c='r') ax1.plot(dataFr['Date'].to_list(), dataFr['SignalLine'].to_list(), label='Signal Line', c='k') ax1.bar(dataFr['Date'].to_list(), dataFr['MACD_histogram'].to_list(), label='MACD histogram', width=0.2, color='g') for n, label in enumerate(ax1.xaxis.get_ticklabels()): if n % every_nth != 0: label.set_visible(False) plt.xticks(rotation=45, ha="right") plt.legend(prop={'size': 12}, loc='upper left')