diff --git a/chan/__init__.py b/chan/__init__.py index 74571e6950c23b6fec8deb12bc84d07a017f8cfa..aafb7034e2addd494bee2f58d2483c8c02889559 100644 --- a/chan/__init__.py +++ b/chan/__init__.py @@ -3,7 +3,7 @@ from .analyze import KlineAnalyze, SolidAnalyze -__version__ = "0.1.1" +__version__ = "0.1.2" __author__ = "zengbin93" __email__ = "zeng_bin8888@163.com" diff --git a/examples/combine_with_goldminer.py b/examples/combine_with_goldminer.py new file mode 100644 index 0000000000000000000000000000000000000000..f0817e2484f9974f4aa64f0c38ad31453c9b6b1c --- /dev/null +++ b/examples/combine_with_goldminer.py @@ -0,0 +1,89 @@ +# coding: utf-8 +""" +结合掘金的数据使用 chan 进行缠论技术分析 + +author: zengbin93 +email: zeng_bin8888@163.com +date: 2020-02-02 +======================================================================================================================== +""" + +from gm.api import * +from datetime import datetime +from chan import KlineAnalyze, SolidAnalyze + +# 在这里设置你的掘金token,用于获取数据 +set_token("your gm token") + + +def get_kline(symbol, end_date=None, freq='1d', k_count=5000): + """从掘金获取历史K线数据 + + 参考: https://www.myquant.cn/docs/python/python_select_api#6fb030ec42984aff + + :param symbol: + :param end_date: str + 交易日期,如 2019-12-31 + :param freq: str + K线级别,如 1d + :param k_count: int + :return: pd.DataFrame + """ + if not end_date: + end_date = datetime.now() + df = history_n(symbol=symbol, frequency=freq, end_time=end_date, + fields='symbol,eob,open,close,high,low,volume', + count=k_count, df=True) + if freq == '1d': + df = df.iloc[:-1] + df['dt'] = df['eob'] + df['vol'] = df['volume'] + df = df[['symbol', 'dt', 'open', 'close', 'high', 'low', 'vol']] + df.sort_values('dt', inplace=True, ascending=True) + df['dt'] = df.dt.apply(lambda x: x.strftime(r"%Y-%m-%d %H:%M:%S")) + df.reset_index(drop=True, inplace=True) + + for col in ['open', 'close', 'high', 'low']: + df[col] = df[col].apply(round, args=(2,)) + return df + + +def get_klines(symbol, end_date=None, freqs='60s,300s,1800s,1d', k_count=5000): + """获取不同级别K线""" + klines = dict() + freqs = freqs.split(",") + for freq in freqs: + df = get_kline(symbol, end_date, freq, k_count) + klines[freq] = df + return klines + + +def use_kline_analyze(): + print('=' * 100, '\n') + print("KlineAnalyze 的使用方法:\n") + kline = get_kline(symbol='SHSE.000300', end_date="2020-02-02") + ka = KlineAnalyze(kline) + print("线段:", ka.xd, "\n") + print("中枢:", ka.zs, "\n") + + +def use_solid_analyze(): + print('=' * 100, '\n') + print("SolidAnalyze 的使用方法:\n") + klines = get_klines(symbol='SZSE.300455', end_date="2020-02-02") + sa = SolidAnalyze(klines) + + # 查看指定级别的三买 + tb = sa.is_third_buy('1800s') + print("指定级别三买:", tb, "\n") + + # 查看多个级别的三买 + tb = sa.check_third_buy(['60s', '300s', '1800s']) + print("多级别三买:", tb, "\n") + + +if __name__ == '__main__': + use_kline_analyze() + use_solid_analyze() + + diff --git a/examples/combine_with_tushare.py b/examples/combine_with_tushare.py new file mode 100644 index 0000000000000000000000000000000000000000..b6264f0f8de29753b02cf674ce59995e82538164 --- /dev/null +++ b/examples/combine_with_tushare.py @@ -0,0 +1,121 @@ +# coding: utf-8 +""" +结合掘金的数据使用 chan 进行缠论技术分析 + +author: zengbin93 +email: zeng_bin8888@163.com +date: 2020-02-02 +======================================================================================================================== +""" + +import tushare as ts +from datetime import datetime, timedelta +from chan import KlineAnalyze, SolidAnalyze + +# 首次使用,需要在这里设置你的 tushare token,用于获取数据;在同一台机器上,tushare token 只需要设置一次 +# ts.set_token("your tushare token") + + +def _get_start_date(end_date, freq): + end_date = datetime.strptime(end_date, '%Y%m%d') + if freq == '1min': + start_date = end_date - timedelta(days=30) + elif freq == '5min': + start_date = end_date - timedelta(days=70) + elif freq == '30min': + start_date = end_date - timedelta(days=500) + elif freq == 'D': + start_date = end_date - timedelta(weeks=500) + elif freq == 'W': + start_date = end_date - timedelta(weeks=1000) + else: + raise ValueError("'freq' value error, current value is %s, " + "optional valid values are ['1min', '5min', '30min', " + "'D', 'W']" % freq) + return start_date + + +def get_kline(ts_code, end_date, freq='30min', asset='E'): + """获取指定级别的前复权K线 + + :param ts_code: str + 股票代码,如 600122.SH + :param freq: str + K线级别,可选值 [1min, 5min, 15min, 30min, 60min, D, M, Y] + :param end_date: str + 日期,如 20190610 + :param asset: str + 交易资产类型,可选值 E股票 I沪深指数 C数字货币 FT期货 FD基金 O期权 CB可转债(v1.2.39),默认E + :return: pd.DataFrame + columns = ["symbol", "dt", "open", "close", "high", "low", "vol"] + """ + start_date = _get_start_date(end_date, freq) + start_date = start_date.date().__str__().replace("-", "") + end_date = datetime.strptime(end_date, '%Y%m%d') + end_date = end_date + timedelta(days=1) + end_date = end_date.date().__str__().replace("-", "") + + df = ts.pro_bar(ts_code=ts_code, freq=freq, start_date=start_date, end_date=end_date, + adj='qfq', asset=asset) + + # 统一 k 线数据格式为 6 列,分别是 ["symbol", "dt", "open", "close", "high", "low", "vr"] + if "min" in freq: + df.rename(columns={'ts_code': "symbol", "trade_time": "dt"}, inplace=True) + else: + df.rename(columns={'ts_code': "symbol", "trade_date": "dt"}, inplace=True) + + df.drop_duplicates(subset='dt', keep='first', inplace=True) + df.sort_values('dt', inplace=True) + df['dt'] = df.dt.apply(str) + if freq.endswith("min"): + # 清理 9:30 的空数据 + df['not_start'] = df.dt.apply(lambda x: not x.endswith("09:30:00")) + df = df[df['not_start']] + df.reset_index(drop=True, inplace=True) + + k = df[['symbol', 'dt', 'open', 'close', 'high', 'low', 'vol']] + + for col in ['open', 'close', 'high', 'low']: + k[col] = k[col].apply(round, args=(2,)) + return k + + +def get_klines(ts_code, end_date, freqs='1min,5min,30min,D', asset='E'): + """获取不同级别K线""" + klines = dict() + freqs = freqs.split(",") + for freq in freqs: + df = get_kline(ts_code, end_date, freq=freq, asset=asset) + klines[freq] = df + return klines + + +def use_kline_analyze(): + print('=' * 100, '\n') + print("KlineAnalyze 的使用方法:\n") + kline = get_kline(ts_code="000300.SH", end_date="20200202", freq='D', asset="I") + ka = KlineAnalyze(kline) + print("线段:", ka.xd, "\n") + print("中枢:", ka.zs, "\n") + + +def use_solid_analyze(): + print('=' * 100, '\n') + print("SolidAnalyze 的使用方法:\n") + klines = get_klines(ts_code="300455.SZ", end_date="20200202", freqs='1min,5min,30min,D', asset='E') + sa = SolidAnalyze(klines) + + # 查看指定级别的三买 + tb = sa.is_third_buy('30min') + print("指定级别三买:", tb, "\n") + + # 查看多个级别的三买 + tb = sa.check_third_buy(['1min', '5min', '30min', "D"]) + print("多级别三买:", tb, "\n") + + +if __name__ == '__main__': + use_kline_analyze() + use_solid_analyze() + +