test_analyze.py 4.5 KB
Newer Older
1
# coding: utf-8
2 3 4
import tushare as ts
from datetime import datetime, timedelta
import sys
5
from functools import lru_cache
6
sys.path.insert(0, r'C:\git_repo\zengbin93\chan')
7

8 9 10 11
import chan
from chan import KlineAnalyze, SolidAnalyze

print(chan.__version__)
12 13 14 15 16 17 18 19 20

# 首次使用,需要在这里设置你的 tushare token,用于获取数据;在同一台机器上,tushare token 只需要设置一次
# 没有 token,到 https://tushare.pro/register?reg=7 注册获取
# 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':
21
        start_date = end_date - timedelta(days=60)
22
    elif freq == '5min':
23
        start_date = end_date - timedelta(days=150)
24
    elif freq == '30min':
25
        start_date = end_date - timedelta(days=1000)
26
    elif freq == 'D':
27
        start_date = end_date - timedelta(weeks=1000)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    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("-", "")

    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线"""
81
    freq_map = {"1min": "1分钟", "5min": "5分钟", "30min": "30分钟", "D": "日线"}
82 83 84 85
    klines = dict()
    freqs = freqs.split(",")
    for freq in freqs:
        df = get_kline(ts_code, end_date, freq=freq, asset=asset)
86
        klines[freq_map[freq]] = df
87 88 89
    return klines


90
def test_kline_analyze():
Z
zengbin93 已提交
91
    df = get_kline(ts_code="300803.SZ", freq='5min', end_date="20200316")
92 93 94 95 96 97
    ka = KlineAnalyze(df)


@lru_cache(maxsize=128)
def create_sa(ts_code, end_date):
    klines = get_klines(ts_code=ts_code, freqs='1min,5min,30min,D', asset="E", end_date=end_date)
Z
zengbin93 已提交
98
    sa = SolidAnalyze(klines)
99 100 101 102 103
    return sa


def test_solid_analyze():
    test_data = [
Z
zengbin93 已提交
104 105 106 107 108
        {"ts_code": '300033.SZ', "freq": "5分钟", "end_date": "20200307", "bs": "二买"},
        {"ts_code": '300033.SZ', "freq": "1分钟", "end_date": "20200307", "bs": "二买"},
        {"ts_code": '000012.SZ', "freq": "5分钟", "end_date": "20200307", "bs": "二卖"},
        {"ts_code": '002405.SZ', "freq": "5分钟", "end_date": "20200307", "bs": "一卖"},
        {"ts_code": '603383.SH', "freq": "日线", "end_date": "20200227", "bs": "线卖"},
109 110 111 112 113
    ]
    for row in test_data:
        print("=" * 100)
        print(row)
        sa = create_sa(row['ts_code'], row['end_date'])
Z
zengbin93 已提交
114
        if row['bs'] == '二买':
115 116
            b, detail = sa.is_second_buy(row['freq'], tolerance=0.1)
            print(b, detail)
Z
zengbin93 已提交
117
        elif row['bs'] == '二卖':
118 119
            b, detail = sa.is_second_sell(row['freq'], tolerance=0.1)
            print(b, detail)
Z
zengbin93 已提交
120
        elif row['bs'] == '一卖':
121 122 123
            b, detail = sa.is_first_sell(row['freq'], tolerance=0.1)
            print(b, detail)
        print('\n')
124