From c2d7854d62c1fa492db594575b416a3dd8fbba94 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Fri, 1 Sep 2017 21:39:22 +0300 Subject: [PATCH 1/3] add TA-lib dependency --- README.md | 1 + requirements.txt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ce7cc770..e8997a017 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ if not feel free to raise a github issue. ##### Prerequisites * python3.6 * sqlite +* [TA-lib](https://github.com/mrjbq7/ta-lib#dependencies) binaries ##### Install ``` diff --git a/requirements.txt b/requirements.txt index ca6ef974a..d4c164adc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,5 @@ PYQT5==5.9 scikit-learn==0.19.0 scipy==0.19.1 stockstats==0.2.0 -jsonschema==2.6.0 \ No newline at end of file +jsonschema==2.6.0 +TA-Lib==0.4.10 \ No newline at end of file From 06434385802837c12caed0b20b2087f8fd788aef Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sat, 2 Sep 2017 11:41:30 +0300 Subject: [PATCH 2/3] use TA-lib to calculate StochRSI --- analyze.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/analyze.py b/analyze.py index 835fe423f..7acc3b311 100644 --- a/analyze.py +++ b/analyze.py @@ -5,6 +5,7 @@ import arrow import requests from pandas.io.json import json_normalize from stockstats import StockDataFrame +import talib.abstract as ta logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') @@ -42,12 +43,9 @@ def get_ticker_dataframe(pair: str) -> StockDataFrame: dataframe = StockDataFrame(json_normalize(data)) # calculate StochRSI - window = 14 - rsi = dataframe['rsi_{}'.format(window)] - rolling = rsi.rolling(window=window, center=False) - low = rolling.min() - high = rolling.max() - dataframe['stochrsi'] = (rsi - low) / (high - low) + stochrsi = ta.STOCHRSI(dataframe) + dataframe['stochrsi'] = stochrsi['fastd'] # values between 0-100, not 0-1 + return dataframe @@ -59,13 +57,13 @@ def populate_trends(dataframe: StockDataFrame) -> StockDataFrame: """ """ dataframe.loc[ - (dataframe['stochrsi'] < 0.20) + (dataframe['stochrsi'] < 20) & (dataframe['close_30_ema'] > (1 + 0.0025) * dataframe['close_60_ema']), 'underpriced' ] = 1 """ dataframe.loc[ - (dataframe['stochrsi'] < 0.20) + (dataframe['stochrsi'] < 20) & (dataframe['macd'] > dataframe['macds']), 'underpriced' ] = 1 @@ -123,8 +121,8 @@ def plot_dataframe(dataframe: StockDataFrame, pair: str) -> None: ax2.legend() ax3.plot(dataframe.index.values, dataframe['stochrsi'], label='StochRSI') - ax3.plot(dataframe.index.values, [0.80] * len(dataframe.index.values)) - ax3.plot(dataframe.index.values, [0.20] * len(dataframe.index.values)) + ax3.plot(dataframe.index.values, [80] * len(dataframe.index.values)) + ax3.plot(dataframe.index.values, [20] * len(dataframe.index.values)) ax3.legend() # Fine-tune figure; make subplots close to each other and hide x ticks for From 82b90f24e7e2bb7a346a7126924bb9e243e83ca1 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sat, 2 Sep 2017 11:56:56 +0300 Subject: [PATCH 3/3] let TA-lib calculate macd, macdsignal and macdhistogram. remove the now unnecessary StockStats library --- analyze.py | 28 +++++++++++++++++----------- requirements.txt | 1 - 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/analyze.py b/analyze.py index 7acc3b311..4a38fcf0f 100644 --- a/analyze.py +++ b/analyze.py @@ -4,7 +4,8 @@ import logging import arrow import requests from pandas.io.json import json_normalize -from stockstats import StockDataFrame +from pandas import DataFrame +# from stockstats import StockDataFrame import talib.abstract as ta logging.basicConfig(level=logging.DEBUG, @@ -12,11 +13,11 @@ logging.basicConfig(level=logging.DEBUG, logger = logging.getLogger(__name__) -def get_ticker_dataframe(pair: str) -> StockDataFrame: +def get_ticker_dataframe(pair: str) -> DataFrame: """ Analyses the trend for the given pair :param pair: pair as str in format BTC_ETH or BTC-ETH - :return: StockDataFrame + :return: DataFrame """ minimum_date = arrow.now() - timedelta(hours=6) url = 'https://bittrex.com/Api/v2.0/pub/market/GetTicks' @@ -40,20 +41,25 @@ def get_ticker_dataframe(pair: str) -> StockDataFrame: 'low': t['L'], 'date': t['T'], } for t in sorted(data['result'], key=lambda k: k['T']) if arrow.get(t['T']) > minimum_date] - dataframe = StockDataFrame(json_normalize(data)) + dataframe = DataFrame(json_normalize(data)) # calculate StochRSI stochrsi = ta.STOCHRSI(dataframe) dataframe['stochrsi'] = stochrsi['fastd'] # values between 0-100, not 0-1 + macd = ta.MACD(dataframe) + dataframe['macd'] = macd['macd'] + dataframe['macds'] = macd['macdsignal'] + dataframe['macdh'] = macd['macdhist'] + return dataframe -def populate_trends(dataframe: StockDataFrame) -> StockDataFrame: +def populate_trends(dataframe: DataFrame) -> DataFrame: """ Populates the trends for the given dataframe - :param dataframe: StockDataFrame - :return: StockDataFrame with populated trends + :param dataframe: DataFrame + :return: DataFrame with populated trends """ """ dataframe.loc[ @@ -91,10 +97,10 @@ def get_buy_signal(pair: str) -> bool: return signal -def plot_dataframe(dataframe: StockDataFrame, pair: str) -> None: +def plot_dataframe(dataframe: DataFrame, pair: str) -> None: """ Plots the given dataframe - :param dataframe: StockDataFrame + :param dataframe: DataFrame :param pair: pair as str :return: None """ @@ -108,8 +114,8 @@ def plot_dataframe(dataframe: StockDataFrame, pair: str) -> None: fig, (ax1, ax2, ax3) = plt.subplots(3, sharex=True) fig.suptitle(pair, fontsize=14, fontweight='bold') ax1.plot(dataframe.index.values, dataframe['close'], label='close') - ax1.plot(dataframe.index.values, dataframe['close_30_ema'], label='EMA(60)') - ax1.plot(dataframe.index.values, dataframe['close_90_ema'], label='EMA(120)') + # ax1.plot(dataframe.index.values, dataframe['close_30_ema'], label='EMA(60)') + # ax1.plot(dataframe.index.values, dataframe['close_90_ema'], label='EMA(120)') # ax1.plot(dataframe.index.values, dataframe['sell'], 'ro', label='sell') ax1.plot(dataframe.index.values, dataframe['buy'], 'bo', label='buy') ax1.legend() diff --git a/requirements.txt b/requirements.txt index d4c164adc..fcd6c3954 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,5 @@ matplotlib==2.0.2 PYQT5==5.9 scikit-learn==0.19.0 scipy==0.19.1 -stockstats==0.2.0 jsonschema==2.6.0 TA-Lib==0.4.10 \ No newline at end of file