Esempio n. 1
0
def quant_stock(stock_number, **kwargs):
    sdt_li = SDT.objects(Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0) &
                         Q(date__lte=kwargs['date'])).order_by('date')
    stock_name = sdt_li[0].stock_name

    trading_data = []
    for s in sdt_li:
        trading_data.append({'date': s.date, 'price': s.today_closing_price, 'total_stock': s.total_stock})
    # trading_data = restore_right(trading_data)

    df = DataFrame(trading_data).set_index(['date'])
    df['short_ema'] = df['price'].ewm(span=kwargs['short_ema']).mean()
    df['long_ema'] = df['price'].ewm(span=kwargs['long_ema']).mean()
    df['dif'] = df['short_ema'] - df['long_ema']
    df['dea'] = df['dif'].ewm(span=kwargs['dif_ema']).mean()
    df['macd'] = df['dif'] - df['dea']

    today_macd = df.iloc[-1]
    yestoday_macd = df.iloc[-2]

    if today_macd['dif'] < 0 and today_macd['dea'] < 0 < today_macd['macd'] and yestoday_macd['macd'] < 0:
        strategy_direction = 'long'
        strategy_name = 'macd_long_%s_%s_%s' % (kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])

        qr = QR(
            stock_number=stock_number, stock_name=stock_name, date=today_macd.name,
            strategy_direction=strategy_direction, strategy_name=strategy_name, init_price=today_macd['price']
        )

        if not check_duplicate(qr):
            qr.save()
def quant_stock(stock_number, short_ma_num, long_ma_num, qr_date):
    if short_ma_num <= long_ma_num:
        strategy_direction = 'long'
        quant_count = long_ma_num + 5
    else:
        strategy_direction = 'short'
        quant_count = short_ma_num + 5
    strategy_name = 'ma_%s_%s_%s' % (strategy_direction, short_ma_num, long_ma_num)

    sdt = SDT.objects(Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0) &
                      Q(date__lte=qr_date)).order_by('-date')[:quant_count]
    if len(sdt) < quant_count:
        # trading data not enough
        return

    trading_data = format_trading_data(sdt, qr_date)
    if not trading_data:
        return

    df = DataFrame(trading_data).set_index(['date'])
    df['short_ma'] = df['price'].rolling(window=short_ma_num, center=False).mean()
    df['long_ma'] = df['price'].rolling(window=long_ma_num, center=False).mean()
    df['diff'] = df['short_ma'] - df['long_ma']

    today_ma = df.iloc[-1]
    yestoday_ma = df.iloc[-2]

    if today_ma['diff'] > 0 > yestoday_ma['diff']:
        qr = QR(
            stock_number=stock_number, stock_name=today_ma['stock_name'], date=today_ma.name,
            strategy_direction=strategy_direction, strategy_name=strategy_name, init_price=today_ma['price']
        )

        if not check_duplicate(qr):
            qr.save()
Esempio n. 3
0
def quant_stock(stock_number, stock_name, **kwargs):
    qr_date = kwargs['qr_date']
    week_long = kwargs.get('week_long', False)
    if not pre_sdt_check(stock_number, **kwargs):
        return

    strategy_name = 'goup_staying'
    if week_long:
        strategy_name = 'weeklong_' + strategy_name

    sdt = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=qr_date)).order_by('-date')[:quant_count]
    if len(sdt) < quant_count:
        return

    if float(sdt[0].increase_rate.replace('%', '').strip()) > goup_stay:
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=qr_date,
                strategy_direction='long',
                strategy_name=strategy_name,
                init_price=sdt[0].today_closing_price,
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=float(sdt[0].increase_rate.replace('%',
                                                                 '').strip()))
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
Esempio n. 4
0
def strategy_statistics(strategy_name, strategy_count, stock_model=''):
    all_qr = QR.objects(strategy_name=strategy_name)
    if not all_qr:
        print('Wrong Strategy Name!')
        return

    trading_date = QR.objects().distinct('date')
    trading_date.sort()
    trading_date = trading_date[0 - strategy_count:]
    bt_result = {}
    for d in trading_date:
        bt_result[str(d.date())] = back_test_success(strategy_name, d,
                                                     stock_model)

    frame = DataFrame(bt_result)
    pd.set_option('display.width', 200)
    pd.set_option('display.max_rows', strategy_count + 100)
    print(
        frame.reindex([
            'count', 'one_back_test', 'one_yield', 'three_back_test',
            'three_yield', 'five_back_test', 'five_yield', 'ten_back_test',
            'ten_yield'
        ]).T)
    pd.set_option('display.width', None)
    pd.set_option('display.max_rows', None)
Esempio n. 5
0
def back_test_success(strategy_name, date, stock_model=''):
    if stock_model:
        cursor = QR.objects(
            Q(strategy_name=strategy_name) & Q(date=date)
            & Q(stock_number__startswith=stock_model))
    else:
        cursor = QR.objects(Q(strategy_name=strategy_name) & Q(date=date))

    res_by_date = {}
    for k, v in back_test_attr.iteritems():
        qualified_sample = [qr for qr in cursor if qr[k] is not None]
        if not qualified_sample:
            res_by_date['count'] = cursor.count()
            continue

        succ_sample = [q for q in qualified_sample if q[k] is True]
        res_by_date[k] = str(
            round(float(len(succ_sample)) / float(len(qualified_sample)), 4) *
            100) + '%'

        yield_exp = 0.0
        if 'long' in strategy_name:
            for i in qualified_sample:
                yield_exp += (i[v[0]] - i.init_price) / i.init_price
        elif 'short' in strategy_name:
            for i in qualified_sample:
                yield_exp += (i.init_price - i[v[0]]) / i.init_price

        res_by_date[v[1]] = str(
            round(yield_exp / len(qualified_sample), 4) * 100) + '%'
        res_by_date['count'] = cursor.count()
    return res_by_date
Esempio n. 6
0
def quant_stock(stock_number, stock_name, **kwargs):
    if not pre_sdt_check(stock_number, **kwargs):
        return

    real_time = kwargs.get('real_time', False)
    sdt = SDT.objects(Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0) &
                      Q(date__lte=kwargs['qr_date'])).order_by('-date')[:ema_volume]

    if float(sdt[0].increase_rate.replace('%', '')) > 9:
        return ''

    if real_time:
        sdt = setup_realtime_sdt(stock_number, sdt, kwargs)
        if not sdt:
            return
    trading_data = format_trading_data(sdt)
    df = calculate_macd(DataFrame(trading_data), kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])
    today = df.iloc[-1]
    yestoday = df.iloc[-2]
    strategy_direction = 'long'

    if yestoday['dif'] < 0 < today['dif']:
        strategy_name = 'dif_day_%s_%s_%s_%s' % (strategy_direction, kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])
        increase_rate = round((today['close_price'] - yestoday['close_price']) / yestoday['close_price'], 4) * 100
        qr = QR(
            stock_number=stock_number, stock_name=stock_name, date=today.name,
            strategy_direction=strategy_direction, strategy_name=strategy_name, init_price=today['close_price'],
            industry_involved=kwargs.get('industry_involved'), increase_rate=increase_rate
        )
        if real_time and strategy_direction == 'long':
            return qr
        if not real_time and not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return ''
Esempio n. 7
0
def quant_stock(stock_number, stock_name, **kwargs):
    qr_date = kwargs['qr_date']
    if not pre_sdt_check(stock_number, **kwargs):
        return

    strategy_name = "depart_long_week"
    last_trade_date = qr_date + datetime.timedelta(days=7)
    swt = SWT.objects(
        Q(stock_number=stock_number)
        & Q(last_trade_date__lte=last_trade_date)).order_by(
            '-last_trade_date')[:ema_volume]
    use_ad_price, swt = is_ad_price(stock_number, qr_date, swt)
    if not swt:
        return

    trading_data = format_trading_data(swt, use_ad_price)
    df = calculate_macd(DataFrame(trading_data), short_ema, long_ema, dif_ema)
    df = calculate_ma(df, short_ma, long_ma)
    this_week = df.iloc[-1]
    last_week = df.iloc[-2]

    if last_week['close_price'] < last_week['long_ma'] and this_week['close_price'] > this_week['short_ma']\
       and this_week['close_price'] > this_week['long_ma']:
        if use_ad_price:
            init_price = swt[0].weekly_close_price
        else:
            init_price = this_week['close_price']

        increase_rate = round(
            (this_week['close_price'] - last_week['close_price']) /
            last_week['close_price'], 4) * 100

        short_point = -1
        for i in range(1, len(df)):
            if df.iloc[-i].diff_ma > 0:
                short_point = i
                break

        # if short_point < period:
        #     return

        if df.iloc[-short_point:].macd.sum() > 0:
            # print(stock_number)
            # pd.set_option('display.max_columns', 500)
            # pd.set_option('display.width', 1000)
            # print(df.iloc[-short_point:])

            qr = QR(stock_number=stock_number,
                    stock_name=stock_name,
                    date=qr_date,
                    strategy_direction='long',
                    strategy_name=strategy_name,
                    init_price=init_price,
                    industry_involved=kwargs.get('industry_involved'),
                    increase_rate=increase_rate)
            if not check_duplicate_strategy(qr):
                qr.save()
                return qr
Esempio n. 8
0
def quant_stock(stock_number, stock_name, **kwargs):
    short_ma = kwargs['short_ma']
    long_ma = kwargs['long_ma']
    qr_date = kwargs['qr_date']
    week_long = kwargs.get('week_long', False)
    if not pre_sdt_check(stock_number, **kwargs):
        return

    real_time = kwargs.get('real_time', False)
    if short_ma <= long_ma:
        strategy_direction = 'long'
        quant_count = long_ma + 5
    else:
        strategy_direction = 'short'
        quant_count = short_ma + 5

    strategy_name = 'ma_%s_%s_%s' % (strategy_direction, short_ma, long_ma)
    if week_long:
        strategy_name = 'weeklong_' + strategy_name

    sdt = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=qr_date)).order_by('-date')[:quant_count]
    if len(sdt) < quant_count:
        # trading data not enough
        return

    if real_time:
        sdt = setup_realtime_sdt(stock_number, sdt, kwargs)
        if not sdt:
            return
    trading_data = format_trading_data(sdt)
    if not trading_data:
        return

    df = calculate_ma(DataFrame(trading_data), short_ma, long_ma)
    today = df.iloc[-1]
    yestoday = df.iloc[-2]

    if today['diff_ma'] > 0 > yestoday['diff_ma']:
        increase_rate = round(
            (today['close_price'] - yestoday['close_price']) /
            yestoday['close_price'], 4) * 100
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=today.name,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=today['close_price'],
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=increase_rate)
        if real_time:
            return qr
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return ''
Esempio n. 9
0
def quant_stock(stock_number, stock_name, **kwargs):
    week_long = kwargs.get('week_long', False)
    if not pre_sdt_check(stock_number, **kwargs):
        return

    real_time = kwargs.get('real_time', False)
    sdt = SDT.objects(Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0) &
                      Q(date__lte=kwargs['qr_date'])).order_by('-date')[:ema_volume]

    if float(sdt[0].increase_rate.replace('%', '')) > 9:
        return

    if real_time:
        sdt = setup_realtime_sdt(stock_number, sdt, kwargs)
        if not sdt:
            return
    trading_data = format_trading_data(sdt)
    df = calculate_macd(DataFrame(trading_data), kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])
    df = calculate_ma(df, kwargs['short_ma'], kwargs['long_ma'])
    today = df.iloc[-1]
    yestoday = df.iloc[-2]

    if short_ma <= long_ma:
        strategy_direction = 'long'
    else:
        strategy_direction = 'short'
    strategy_name = 'ma_macd_%s_%s_%s' % (strategy_direction, short_ma, long_ma)
    if week_long:
        strategy_name = 'weeklong_' + strategy_name

    if today['diff_ma'] > 0 > yestoday['diff_ma']:
        increase_rate = round((today['close_price'] - yestoday['close_price']) / yestoday['close_price'], 4) * 100
        qr = ''
        if strategy_direction == 'long':
            if today['macd'] > 0 > today['dif'] and today['dea'] < 0:
                qr = QR(
                    stock_number=stock_number, stock_name=stock_name, date=today.name,
                    strategy_direction=strategy_direction, strategy_name=strategy_name,
                    init_price=today['close_price'], industry_involved=kwargs.get('industry_involved'),
                    increase_rate=increase_rate
                )
        elif strategy_direction == 'short':
            if today['macd'] < 0 < today['dif'] and today['dea'] > 0:
                qr = QR(
                    stock_number=stock_number, stock_name=stock_name, date=today.name,
                    strategy_direction=strategy_direction, strategy_name=strategy_name,
                    init_price=today['close_price'], industry_involved=kwargs.get('industry_involved'),
                    increase_rate=increase_rate
                )

        if isinstance(qr, QR):
            if real_time:
                return qr
            if not check_duplicate_strategy(qr):
                qr.save()
                return qr
    return ''
def quant_stock(stock_number, stock_name, **kwargs):
    real_time = kwargs.get('real_time', False)
    strategy_direction = 'long'
    strategy_name = 'break_through_%s_%s_%s' % (
        strategy_direction, kwargs['short_ma'], kwargs['long_ma'])

    sdt = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=kwargs['qr_date'])).order_by(
            '-date')[:kwargs['long_ma'] + 10]

    if not sdt:
        return
    if float(sdt[0].increase_rate.replace('%', '')) > 9:
        return
    if sdt[0].today_closing_price <= sdt[0].today_average_price:
        return
    if sdt[0].turnover_amount <= sdt[1].turnover_amount:
        return

    if real_time:
        today_sdt = SDT.objects(date=kwargs['qr_date'])
        if kwargs['qr_date'] == datetime.date.today() and not today_sdt:
            today_trading = kwargs.get('today_trading', {})
            if not today_trading.get(stock_number):
                return
            if float(
                    today_trading.get(stock_number).increase_rate.replace(
                        '%', '')) > 9:
                return

            sdt = list(sdt)
            sdt.insert(0, today_trading.get(stock_number))
    trading_data = format_trading_data(sdt)
    df = calculate_ma(DataFrame(trading_data), short_ma, long_ma)
    today = df.iloc[-1]
    yestoday = df.iloc[-2]

    break_through = 1.8
    if yestoday['close_price'] < yestoday['short_ma'] and yestoday['close_price'] < yestoday['long_ma']\
        and today['close_price'] > today['short_ma'] and today['close_price'] > today['long_ma']:
        if  today['quantity_relative_ratio'] > break_through or\
            today['turnover_amount']/float(yestoday['turnover_amount']) > break_through:
            qr = QR(stock_number=stock_number,
                    stock_name=stock_name,
                    date=today.name,
                    strategy_direction=strategy_direction,
                    strategy_name=strategy_name,
                    init_price=today['close_price'])

            if real_time:
                return qr
            if not check_duplicate_strategy(qr):
                qr.save()
                return qr
    return ''
Esempio n. 11
0
def quant_stock(stock_number, stock_name, **kwargs):
    short_ma = kwargs['short_ma']
    long_ma = kwargs['long_ma']
    qr_date = kwargs['qr_date']
    if not pre_sdt_check(stock_number, **kwargs):
        return

    if short_ma < long_ma:
        strategy_direction = 'long'
        quant_count = long_ma + 5
    else:
        strategy_direction = 'short'
        quant_count = short_ma + 5
    strategy_name = 'week_through_%s_%s_%s' % (strategy_direction, short_ma,
                                               long_ma)

    last_trade_date = qr_date + datetime.timedelta(days=7)
    swt = SWT.objects(
        Q(stock_number=stock_number)
        & Q(last_trade_date__lte=last_trade_date)).order_by(
            '-last_trade_date')[:quant_count]

    use_ad_price, swt = is_ad_price(stock_number, qr_date, swt)
    if not swt:
        return

    trading_data = format_trading_data(swt, use_ad_price)
    # end_date = qr_date.strftime('%Y-%m-%d')
    # start_date = (qr_date - datetime.timedelta(days=max(short_ma, long_ma) * 7)).strftime('%Y-%m-%d')
    # trading_data = get_week_trading(stock_number, start_date, end_date)
    df = calculate_ma(DataFrame(trading_data), short_ma, long_ma)
    this_week = df.iloc[-1]
    last_week = df.iloc[-2]

    if last_week['close_price'] < last_week['long_ma'] and this_week['close_price'] > this_week['short_ma']\
       and this_week['close_price'] > this_week['long_ma']:
        if use_ad_price:
            init_price = swt[0].weekly_close_price
        else:
            init_price = this_week['close_price']

        increase_rate = round(
            (this_week['close_price'] - last_week['close_price']) /
            last_week['close_price'], 4) * 100
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=qr_date,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=init_price,
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=increase_rate)
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return
Esempio n. 12
0
def quant_stock(stock_number, stock_name, **kwargs):
    sdt_li = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=kwargs['date'])).order_by('-date')[:ema_volume]
    if len(sdt_li) < 20:
        return

    trading_data = []
    qr_date = kwargs['date']
    standard_total_stock = sdt_li[0].total_stock
    if not standard_total_stock:
        standard_total_stock = sdt_li[1].total_stock
    if not standard_total_stock:
        standard_total_stock = sdt_li[2].total_stock
    if not standard_total_stock:
        return

    for s in sdt_li:
        total_stock = s.total_stock
        if total_stock and total_stock != standard_total_stock:
            today_closing_price = s.today_closing_price * float(
                total_stock) / float(standard_total_stock)
        else:
            today_closing_price = s.today_closing_price
        trading_data.append({
            'date': s.date,
            'price': today_closing_price,
            'total_stock': s.total_stock
        })
    trading_data.reverse()

    df = DataFrame(trading_data).set_index(['date'])
    df['short_ema'] = df['price'].ewm(span=kwargs['short_ema']).mean()
    df['long_ema'] = df['price'].ewm(span=kwargs['long_ema']).mean()
    df['dif'] = df['short_ema'] - df['long_ema']
    df['dea'] = df['dif'].ewm(span=kwargs['dif_ema']).mean()
    df['macd'] = df['dif'] - df['dea']

    today_macd = df.iloc[-1]
    yestoday_macd = df.iloc[-2]

    if yestoday_macd['macd'] < 0 < today_macd['macd']:
        strategy_direction = 'long'
        strategy_name = 'macd_long_%s_%s_%s' % (
            kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])

        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=today_macd.name,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=today_macd['price'])

        if not check_duplicate(qr):
            qr.save()
Esempio n. 13
0
def quant_stock(stock_number, stock_name, **kwargs):
    real_time = kwargs.get('real_time', False)
    sdt = SDT.objects(Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0) &
                      Q(date__lte=kwargs['qr_date'])).order_by('-date')[:ema_volume]
    if len(sdt) < ema_volume-50:
        return
    if float(sdt[0].increase_rate.replace('%', '')) > 9:
        return

    if real_time:
        today_sdt = SDT.objects(date=kwargs['qr_date'])
        if kwargs['qr_date'] == datetime.date.today() and not today_sdt:
            today_trading = kwargs.get('today_trading', {})
            if not today_trading.get(stock_number):
                return

            sdt = list(sdt)
            sdt.insert(0, today_trading.get(stock_number))
    trading_data = format_trading_data(sdt)
    df = calculate_macd(DataFrame(trading_data), kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])
    df = calculate_ma(df, kwargs['short_ma'], kwargs['long_ma'])
    today_analysis = df.iloc[-1]
    yestoday_analysis = df.iloc[-2]

    if short_ma <= long_ma:
        strategy_direction = 'long'
    else:
        strategy_direction = 'short'
    strategy_name = 'ma_macd_%s_%s_%s' % (strategy_direction, short_ma, long_ma)

    if today_analysis['diff_ma'] > 0 > yestoday_analysis['diff_ma']:
        qr = ''
        if strategy_direction == 'long':
            if today_analysis['macd'] > 0 > today_analysis['dif'] and today_analysis['dea'] < 0:
                qr = QR(
                    stock_number=stock_number, stock_name=stock_name, date=today_analysis.name,
                    strategy_direction=strategy_direction, strategy_name=strategy_name,
                    init_price=today_analysis['close_price']
                )
        elif strategy_direction == 'short':
            if today_analysis['macd'] < 0 < today_analysis['dif'] and today_analysis['dea'] > 0:
                qr = QR(
                    stock_number=stock_number, stock_name=stock_name, date=today_analysis.name,
                    strategy_direction=strategy_direction, strategy_name=strategy_name,
                    init_price=today_analysis['close_price']
                )

        if isinstance(qr, QR):
            if real_time:
                return qr
            if not check_duplicate_strategy(qr):
                qr.save()
                return qr
    return ''
Esempio n. 14
0
def save_quant_result(sdt, strategy_name, strategy_direction='long'):
    if isinstance(sdt, SDT):
        stock_number = sdt.stock_number
        stock_name = sdt.stock_name
        date = sdt.date
        strategy_name = strategy_name
        init_price = sdt.today_closing_price

        if not check_duplicate(stock_number, date, strategy_name):
            qr = QR(stock_number=stock_number, stock_name=stock_name, date=date, strategy_name=strategy_name,
                    init_price=init_price, strategy_direction=strategy_direction)
            qr.save()
Esempio n. 15
0
def quant_stock(stock_number, stock_name, **kwargs):
    short_ma = kwargs['short_ma']
    long_ma = kwargs['long_ma']
    qr_date = kwargs['qr_date']
    real_time = kwargs.get('real_time', False)
    if short_ma <= long_ma:
        strategy_direction = 'long'
        quant_count = long_ma + 5
    else:
        strategy_direction = 'short'
        quant_count = short_ma + 5
    strategy_name = 'ma_%s_%s_%s' % (strategy_direction, short_ma, long_ma)

    sdt = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=qr_date)).order_by('-date')[:quant_count]
    if len(sdt) < quant_count:
        # trading data not enough
        return
    if float(sdt[0].increase_rate.replace('%', '')) > 9:
        return

    if real_time:
        today_sdt = SDT.objects(date=kwargs['qr_date'])
        if kwargs['qr_date'] == datetime.date.today() and not today_sdt:
            today_trading = kwargs.get('today_trading', {})
            if not today_trading.get(stock_number):
                return

            sdt = list(sdt)
            sdt.insert(0, today_trading.get(stock_number))
    trading_data = format_trading_data(sdt)
    if not trading_data:
        return

    df = calculate_ma(DataFrame(trading_data), short_ma, long_ma)
    today_ma = df.iloc[-1]
    yestoday_ma = df.iloc[-2]

    if today_ma['diff_ma'] > 0 > yestoday_ma['diff_ma']:
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=today_ma.name,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=today_ma['close_price'])
        if real_time:
            return qr
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return ''
def quant_stock(stock_number, stock_name, **kwargs):
    short_ma = kwargs['short_ma']
    long_ma = kwargs['long_ma']
    qr_date = kwargs['qr_date']
    if not pre_sdt_check(stock_number, **kwargs):
        return

    if short_ma < long_ma:
        strategy_direction = 'long'
        quant_count = long_ma + 5
    else:
        strategy_direction = 'short'
        quant_count = short_ma + 5
    strategy_name = 'maweek_%s_%s_%s' % (strategy_direction, short_ma, long_ma)

    swt = SWT.objects(
        Q(stock_number=stock_number)
        & Q(last_trade_date__lte=qr_date)).order_by(
            '-last_trade_date')[:quant_count]
    if not swt:
        return

    use_ad_price, swt = is_ad_price(stock_number, qr_date, swt)
    if not swt:
        return

    trading_data = format_trading_data(swt, use_ad_price)
    df = calculate_ma(DataFrame(trading_data), short_ma, long_ma)
    this_week = df.iloc[-1]
    last_week = df.iloc[-2]

    if this_week['diff_ma'] > 0 > last_week['diff_ma']:
        if use_ad_price:
            init_price = swt[0].weekly_close_price
        else:
            init_price = this_week['close_price']

        increase_rate = round(
            (this_week['close_price'] - last_week['close_price']) /
            last_week['close_price'], 4) * 100
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=this_week.name,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=init_price,
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=increase_rate)
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return
Esempio n. 17
0
def quant_stock(stock_number, stock_name, **kwargs):
    if not pre_sdt_check(stock_number, **kwargs):
        return

    real_time = kwargs.get('real_time', False)
    week_long = kwargs.get('week_long', False)
    strategy_direction = 'long'
    strategy_name = 'break_through_%s_%s_%s' % (strategy_direction, kwargs['short_ma'], kwargs['long_ma'])
    if week_long:
        strategy_name = 'weeklong_' + strategy_name

    sdt = SDT.objects(Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0) &
                      Q(date__lte=kwargs['qr_date'])).order_by('-date')[:kwargs['long_ma']+10]

    if not sdt:
        return
    if not real_time:
        if sdt[0].today_closing_price <= sdt[0].today_average_price:
            return

    if real_time:
        sdt = setup_realtime_sdt(stock_number, sdt, kwargs)
        if not sdt:
            return
    if sdt[0].today_closing_price < sdt[0].today_opening_price:
        return

    trading_data = format_trading_data(sdt)
    df = calculate_ma(DataFrame(trading_data), short_ma, long_ma)
    today = df.iloc[-1]
    yestoday = df.iloc[-2]

    if yestoday['close_price'] < yestoday['long_ma'] and today['close_price'] > today['short_ma']\
       and today['close_price'] > today['long_ma']:
        increase_rate = round((today['close_price'] - yestoday['close_price']) / yestoday['close_price'], 4) * 100
        qr = QR(
            stock_number=stock_number, stock_name=stock_name, date=today.name,
            strategy_direction=strategy_direction, strategy_name=strategy_name,
            init_price=today['close_price'], industry_involved=kwargs.get('industry_involved'),
            increase_rate=increase_rate
        )

        if real_time:
            return qr
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return ''
Esempio n. 18
0
def quant_stock(stock_number, stock_name, **kwargs):
    short_ema = kwargs['short_ema']
    long_ema = kwargs['long_ema']
    dif_ema = kwargs['dif_ema']
    qr_date = kwargs['qr_date']
    if not pre_sdt_check(stock_number, **kwargs):
        return

    strategy_direction = 'long'
    quant_count = 150

    strategy_name = 'week_macd_%s_%s_%s_%s' % (strategy_direction, short_ema,
                                               long_ema, dif_ema)

    last_trade_date = qr_date + datetime.timedelta(days=7)
    swt = SWT.objects(
        Q(stock_number=stock_number)
        & Q(last_trade_date__lte=last_trade_date)).order_by(
            '-last_trade_date')[:quant_count]

    use_ad_price, swt = is_ad_price(stock_number, qr_date, swt)
    if not swt:
        return

    trading_data = format_trading_data(swt, use_ad_price)
    df = calculate_macd(DataFrame(trading_data), short_ema, long_ema, dif_ema)
    this_week = df.iloc[-1]
    last_week = df.iloc[-2]

    if last_week['macd'] < 0 < this_week['macd']:
        if use_ad_price:
            init_price = swt[0].weekly_close_price
        else:
            init_price = this_week['close_price']

        increase_rate = round(
            (this_week['close_price'] - last_week['close_price']) /
            last_week['close_price'], 4) * 100
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=qr_date,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=init_price,
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=increase_rate)
        if not check_duplicate_strategy(qr):
            qr.save()
Esempio n. 19
0
def back_test_success(strategy_name, date):
    cursor = QR.objects(Q(strategy_name=strategy_name) & Q(date=date))

    res_by_date = {}
    for k, v in back_test_attr.iteritems():
        qualified_sample = [qr for qr in cursor if qr[k] is not None]
        if not qualified_sample:
            continue

        succ_sample = [q for q in qualified_sample if q[k] is True]
        res_by_date[k] = str(
            round(float(len(succ_sample)) / float(len(qualified_sample)), 4) *
            100) + '%'

        yield_expectation = 0.0
        if 'long' in strategy_name:
            for i in qualified_sample:
                yield_expectation += (i[v[0]] - i.init_price) / i.init_price
        elif 'short' in strategy_name:
            for i in qualified_sample:
                yield_expectation += (i.init_price - i[v[0]]) / i.init_price

        res_by_date[v[1]] = str(
            round(yield_expectation / len(qualified_sample), 4) * 100) + '%'
    return res_by_date
Esempio n. 20
0
def strategy_statistics(strategy_name):
    all_qr = QR.objects(strategy_name=strategy_name)
    if not all_qr:
        print "Wrong Strategy Name!"
        return

    trading_date = SDT.objects(stock_number__startswith="300").distinct("date")
    trading_date.sort()
    bt_result = {}
    for d in trading_date:
        bt_result[str(d.date())] = back_test_success(strategy_name, d)

    frame = DataFrame(bt_result)
    pd.set_option("display.width", 200)
    pd.set_option("display.max_rows", 400)
    print frame.reindex(
        [
            "count",
            "one_back_test",
            "one_yield_expectation",
            "three_back_test",
            "three_yield_expectation",
            "five_back_test",
            "five_yield_expectation",
        ]
    ).T
    pd.set_option("display.width", None)
    pd.set_option("display.max_rows", None)
Esempio n. 21
0
def check_duplicate(stock_number, date, strategy_name):
    cursor = QR.objects(Q(stock_number=stock_number) & Q(date=date) & Q(strategy_name=strategy_name))

    if cursor:
        return True
    else:
        return False
Esempio n. 22
0
def save_quant_result(sdt, strategy_name, strategy_direction='long'):
    if isinstance(sdt, SDT):
        stock_number = sdt.stock_number
        stock_name = sdt.stock_name
        date = sdt.date
        strategy_name = strategy_name
        init_price = sdt.today_closing_price

        if not check_duplicate(stock_number, date, strategy_name):
            qr = QR(stock_number=stock_number,
                    stock_name=stock_name,
                    date=date,
                    strategy_name=strategy_name,
                    init_price=init_price,
                    strategy_direction=strategy_direction)
            qr.save()
def is_duplicate(stock_number, date, strategy_name):
    try:
        cursor = QR.objects(
            Q(stock_number=stock_number) & Q(date=date)
            & Q(strategy_name=strategy_name))
    except Exception, e:
        logging.error('Query %s QR failed:%s' % (stock_number, e))
def quant_stock(stock_number, stock_name, **kwargs):
    sdt_li = SDT.objects(Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0) &
                         Q(date__lte=kwargs['date'])).order_by('-date')[:ema_volume]
    if len(sdt_li) < 20:
        return

    trading_data = []
    qr_date = kwargs['date']
    standard_total_stock = sdt_li[0].total_stock
    if not standard_total_stock:
        standard_total_stock = sdt_li[1].total_stock
    if not standard_total_stock:
        standard_total_stock = sdt_li[2].total_stock
    if not standard_total_stock:
        return

    for s in sdt_li:
        total_stock = s.total_stock
        if total_stock and total_stock != standard_total_stock:
            today_closing_price = s.today_closing_price * float(total_stock) / float(standard_total_stock)
        else:
            today_closing_price = s.today_closing_price
        trading_data.append({'date': s.date, 'price': today_closing_price, 'total_stock': s.total_stock})
    trading_data.reverse()

    df = DataFrame(trading_data).set_index(['date'])
    df['short_ema'] = df['price'].ewm(span=kwargs['short_ema']).mean()
    df['long_ema'] = df['price'].ewm(span=kwargs['long_ema']).mean()
    df['dif'] = df['short_ema'] - df['long_ema']
    df['dea'] = df['dif'].ewm(span=kwargs['dif_ema']).mean()
    df['macd'] = df['dif'] - df['dea']

    today_macd = df.iloc[-1]
    yestoday_macd = df.iloc[-2]

    if yestoday_macd['macd'] < 0 < today_macd['macd']:
        strategy_direction = 'long'
        strategy_name = 'macd_long_%s_%s_%s' % (kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])

        qr = QR(
            stock_number=stock_number, stock_name=stock_name, date=today_macd.name,
            strategy_direction=strategy_direction, strategy_name=strategy_name, init_price=today_macd['price']
        )

        if not check_duplicate(qr):
            qr.save()
Esempio n. 25
0
def quant_stock(stock_number, stock_name, **kwargs):
    short_ema = kwargs['short_ema']
    long_ema = kwargs['long_ema']
    dif_ema = kwargs['dif_ema']
    qr_date = kwargs['qr_date']
    if not pre_sdt_check(stock_number, **kwargs):
        return

    strategy_direction = 'long'
    strategy_name = 'week_boot_long_%s_%s_%s' % (short_ema, long_ema, dif_ema)

    end_date = qr_date.strftime('%Y-%m-%d')
    start_date = (qr_date - datetime.timedelta(days=max(short_ema, long_ema) *
                                               7)).strftime('%Y-%m-%d')
    trading_data = get_week_trading(stock_number, start_date, end_date)
    if len(trading_data):
        return

    df = calculate_macd(DataFrame(trading_data), short_ema, long_ema, dif_ema)
    this_week = df.iloc[-1]
    last_week = df.iloc[-2]

    recent_period = df.iloc[-20:]
    recent_dif = recent_period['dif']
    # print('dif max:%s' % recent_dif.max())
    if recent_dif.max() > 0:
        return

    # print("%s last:%s, this:%s" % (stock_number, last_week['dif'], this_week['dif']))
    if last_week['dif'] < 0 < this_week['dif']:

        init_price = this_week['close_price']
        increase_rate = round(
            (this_week['close_price'] - last_week['close_price']) /
            last_week['close_price'], 4) * 100

        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=qr_date,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=init_price,
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=increase_rate)
        if not check_duplicate_strategy(qr):
            qr.save()
Esempio n. 26
0
def check_duplicate(stock_number, date, strategy_name):
    cursor = QR.objects(
        Q(stock_number=stock_number) & Q(date=date)
        & Q(strategy_name=strategy_name))

    if cursor:
        return True
    else:
        return False
Esempio n. 27
0
def quant_stock(stock_number, stock_name, **kwargs):
    qr_date = kwargs['qr_date']
    if not pre_sdt_check(stock_number, **kwargs):
        return

    strategy_name = "depart_long_day"
    sdt = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=qr_date)).order_by('-date')[:ema_volume]
    trading_data = format_trading_data(sdt)
    df = calculate_ma(DataFrame(trading_data), short_ma, long_ma)
    df = calculate_macd(df, short_ema, long_ema, dif_ema)
    today = df.iloc[-1]
    yestoday = df.iloc[-2]

    if yestoday['close_price'] < yestoday['long_ma'] and today['close_price'] > today['short_ma'] \
        and today['close_price'] > today['long_ma']:

        short_point = -1
        for i in range(1, len(df)):
            if df.iloc[-i].diff_ma > 0:
                short_point = i
                break

        if short_point < period:
            return

        if df.iloc[-short_point:].macd.sum() > 0:
            increase_rate = round(
                (today['close_price'] - yestoday['close_price']) /
                yestoday['close_price'], 4) * 100

            qr = QR(stock_number=stock_number,
                    stock_name=stock_name,
                    date=today.name,
                    strategy_direction='long',
                    strategy_name=strategy_name,
                    init_price=today['close_price'],
                    industry_involved=kwargs.get('industry_involved'),
                    increase_rate=increase_rate)

            if not check_duplicate_strategy(qr):
                qr.save()
                return qr
Esempio n. 28
0
def back_testing():
    quant_result = QR.objects()

    for i in quant_result:
        for t in test_pattern:
            if i[test_pattern[t]['test']] is None and i[test_pattern[t]['price']] is None:
                try:
                    test_by_day(i, t)
                except Exception, e:
                    logging.error('Error occur when back testing %s: %s' % (i.stock_number, e))
Esempio n. 29
0
def quant_stock(stock_number, stock_name, **kwargs):
    short_ema = kwargs['short_ema']
    long_ema = kwargs['long_ema']
    dif_ema = kwargs['dif_ema']
    qr_date = kwargs['qr_date']
    if not pre_sdt_check(stock_number, **kwargs):
        return

    strategy_direction = 'long'
    strategy_name = 'month_macd_%s_%s_%s_%s' % (strategy_direction, short_ema,
                                                long_ema, dif_ema)

    end_date = qr_date.strftime('%Y-%m-%d')
    start_date = (qr_date - datetime.timedelta(days=short_ema * long_ema *
                                               31)).strftime('%Y-%m-%d')

    trading_data = get_month_trading(stock_number, start_date, end_date)
    trading_data = trading_data.iloc[-150:]

    if len(trading_data) < max(short_ema, long_ema):
        return

    df = calculate_macd(trading_data, short_ema, long_ema, dif_ema)
    this_month = df.iloc[-1]
    last_month = df.iloc[-2]

    if last_month['macd'] < 0 < this_month['macd']:
        init_price = this_month['close_price']
        increase_rate = round(
            (this_month['close_price'] - last_month['close_price']) /
            last_month['close_price'], 4) * 100
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=this_month.name,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=init_price,
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=increase_rate)
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return
Esempio n. 30
0
def quant_stock(stock_number, stock_name, **kwargs):
    sdt_li = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=kwargs['date'])).order_by('-date')[:200]
    if not sdt_li:
        return

    trading_data = []
    for s in sdt_li:
        trading_data.append({
            'date': s.date,
            'price': s.today_closing_price,
            'total_stock': s.total_stock
        })
    trading_data.reverse()
    # trading_data = restore_right(trading_data)

    df = DataFrame(trading_data).set_index(['date'])
    df['short_ema'] = df['price'].ewm(span=kwargs['short_ema']).mean()
    df['long_ema'] = df['price'].ewm(span=kwargs['long_ema']).mean()
    df['dif'] = df['short_ema'] - df['long_ema']
    df['dea'] = df['dif'].ewm(span=kwargs['dif_ema']).mean()
    df['macd'] = df['dif'] - df['dea']

    today_macd = df.iloc[-1]
    yestoday_macd = df.iloc[-2]

    if today_macd['dif'] < 0 and today_macd['dea'] < 0 < today_macd[
            'macd'] and yestoday_macd['macd'] < 0:
        strategy_direction = 'long'
        strategy_name = 'macd_long_%s_%s_%s' % (
            kwargs['short_ema'], kwargs['long_ema'], kwargs['dif_ema'])

        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=today_macd.name,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=today_macd['price'])

        if not check_duplicate(qr):
            qr.save()
def strategy_statistics(strategy_name, strategy_count):
    all_qr = QR.objects(strategy_name=strategy_name)
    if not all_qr:
        print 'Wrong Strategy Name!'
        return

    trading_date = QR.objects().distinct('date')
    trading_date.sort()
    trading_date = trading_date[0-strategy_count:]
    bt_result = {}
    for d in trading_date:
        bt_result[str(d.date())] = back_test_success(strategy_name, d)

    frame = DataFrame(bt_result)
    pd.set_option('display.width', 200)
    pd.set_option('display.max_rows', 2000)
    print frame.reindex(['count', 'one_back_test', 'one_yield_expectation', 'three_back_test', 'three_yield_expectation',
                         'five_back_test', 'five_yield_expectation']).T
    pd.set_option('display.width', None)
    pd.set_option('display.max_rows', None)
Esempio n. 32
0
def quant_stock(stock_number, short_ma_num, long_ma_num, qr_date):
    if short_ma_num <= long_ma_num:
        strategy_direction = 'long'
        quant_count = long_ma_num + 5
    else:
        strategy_direction = 'short'
        quant_count = short_ma_num + 5
    strategy_name = 'ma_%s_%s_%s' % (strategy_direction, short_ma_num,
                                     long_ma_num)

    sdt = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=qr_date)).order_by('-date')[:quant_count]
    if len(sdt) < quant_count:
        # trading data not enough
        return

    trading_data = format_trading_data(sdt, qr_date)
    if not trading_data:
        return

    df = DataFrame(trading_data).set_index(['date'])
    df['short_ma'] = df['price'].rolling(window=short_ma_num,
                                         center=False).mean()
    df['long_ma'] = df['price'].rolling(window=long_ma_num,
                                        center=False).mean()
    df['diff'] = df['short_ma'] - df['long_ma']

    today_ma = df.iloc[-1]
    yestoday_ma = df.iloc[-2]

    if today_ma['diff'] > 0 > yestoday_ma['diff']:
        qr = QR(stock_number=stock_number,
                stock_name=today_ma['stock_name'],
                date=today_ma.name,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=today_ma['price'])

        if not check_duplicate(qr):
            qr.save()
def check_duplicate(qr):
    if isinstance(qr, QR):
        try:
            cursor = QR.objects(Q(stock_number=qr.stock_number) & Q(strategy_name=qr.strategy_name) &
                                Q(date=qr.date))
        except Exception, e:
            logging.error('Error when check dupliate %s strategy %s date %s: %s' % (qr.stock_number, qr.strategy_name,
                                                                                    qr.date, e))
        if cursor:
            return True
        else:
            return False
def check_duplicate_strategy(qr):
    if isinstance(qr, QR):
        try:
            cursor = QR.objects(Q(stock_number=qr.stock_number) & Q(strategy_name=qr.strategy_name) &
                                Q(date=qr.date))
        except Exception, e:
            logging.error('Error when check dupliate %s strategy %s date %s: %s' % (qr.stock_number, qr.strategy_name,
                                                                                    qr.date, e))
        if cursor:
            return True
        else:
            return False
def quant_stock(stock_number, stock_name, **kwargs):
    length = kwargs['length']
    qr_date = kwargs['qr_date']
    real_time = kwargs.get('real_time', False)
    if not pre_sdt_check(stock_number, **kwargs):
        return

    strategy_name = 'new_peak_%s' % length
    strategy_direction = 'long'

    sdt = SDT.objects(
        Q(stock_number=stock_number) & Q(today_closing_price__ne=0.0)
        & Q(date__lte=qr_date)).order_by('-date')[:length]
    if len(sdt) < length:
        return

    if real_time:
        sdt = setup_realtime_sdt(stock_number, sdt, kwargs)
    trading_data = format_trading_data(sdt)
    if not trading_data:
        return

    df = DataFrame(trading_data)
    today_data = df.iloc[-1]

    if df['close_price'].max() <= today_data['close_price']:
        qr = QR(stock_number=stock_number,
                stock_name=stock_name,
                date=today_data.date,
                strategy_direction=strategy_direction,
                strategy_name=strategy_name,
                init_price=today_data['close_price'],
                industry_involved=kwargs.get('industry_involved'),
                increase_rate=float(sdt[0].increase_rate.replace('%', '')))
        if real_time:
            return qr
        if not check_duplicate_strategy(qr):
            qr.save()
            return qr
    return
def generate_statement():
    today = datetime.date.today()
    quant_res = QR.objects(date=today)

    if not quant_res:
        return

    file_name = today.strftime('%Y-%m-%d') + '.txt'
    strategy_li = []
    for i in quant_res:
        if i.strategy_name not in strategy_li:
            strategy_li.append(i.strategy_name)

    current_path = dirname(abspath(__file__))
    for s in strategy_li:
        strategy_path = join(current_path, s)
        if not isdir(strategy_path):
            mkdir(strategy_path)

        file_path = join(strategy_path, file_name)
        if exists(file_path):
            continue

        with codecs.open(file_path, 'w+', 'utf-8') as fd:
            fd.write('-------------%s-------------\n' % str(QR.objects(Q(strategy_name=s) & Q(date=today)).count()))
            for i in trade_sector:
                cursor = QR.objects(Q(strategy_name=s) & Q(date=today) &
                                    Q(stock_number__startswith=i['market_code'])).order_by('stock_number')

                fd.write(u'-----------%s--%s-----------\n' % (i['market_name'], cursor.count()))
                for j in cursor:
                    fd.write('%s %s %s\n' % (j.stock_number, j.stock_name, j.init_price))

    chdir(current_path)
    system('git add -A')
    system("git commit -m \'" + today.strftime('%Y-%m-%d') + " statement\'")
    system('git push origin')
    time.sleep(10)
    system('git push origin')
Esempio n. 37
0
def strategy_statistics(strategy_name):
    all_qr = QR.objects(strategy_name=strategy_name)
    if not all_qr:
        print 'Wrong Strategy Name!'
        return

    trading_date = SDT.objects(stock_number__startswith='300').distinct('date')
    trading_date.sort()
    bt_result = {}
    for d in trading_date:
        bt_result[str(d.date())] = back_test_success(strategy_name, d)

    frame = DataFrame(bt_result)
    pd.set_option('display.width', 200)
    pd.set_option('display.max_rows', 200)
    print frame.reindex([
        'count', 'one_back_test', 'one_yield_expectation', 'three_back_test',
        'three_yield_expectation', 'five_back_test', 'five_yield_expectation'
    ]).T
    pd.set_option('display.width', None)
    pd.set_option('display.max_rows', None)
Esempio n. 38
0
def strategy_statistics(strategy_name):
    all_qr = QR.objects(strategy_name=strategy_name)

    if not all_qr:
        print 'Wrong Strategy Name!'
        return

    all_date = []
    for i in all_qr:
        if i.date not in all_date:
            all_date.append(i.date)

    all_date.sort()
    bt_result = {}
    for d in all_date:
        bt_result[str(d.date())] = back_test_success(strategy_name, d)

    frame = DataFrame(bt_result)
    pd.set_option('display.width', 200)
    print frame.reindex(['one_back_test', 'one_yield_expectation', 'three_back_test', 'three_yield_expectation',
                         'five_back_test', 'five_yield_expectation']).T
    pd.set_option('display.width', None)
Esempio n. 39
0
def back_test_success(strategy_name, date):
    cursor = QR.objects(Q(strategy_name=strategy_name) & Q(date=date))

    res_by_date = {}
    for k, v in back_test_attr.iteritems():
        qualified_sample = [qr for qr in cursor if qr[k] is not None]
        if not qualified_sample:
            continue

        succ_sample = [q for q in qualified_sample if q[k] is True]
        res_by_date[k] = str(round(float(len(succ_sample))/float(len(qualified_sample)), 4) * 100) + '%'

        yield_expectation = 0.0
        if 'long' in strategy_name:
            for i in qualified_sample:
                yield_expectation += (i[v[0]] - i.init_price)/i.init_price
        elif 'short' in strategy_name:
            for i in qualified_sample:
                yield_expectation += (i.init_price - i[v[0]])/i.init_price

        res_by_date[v[1]] = str(round(yield_expectation/len(qualified_sample), 4) * 100) + '%'
    return res_by_date
Esempio n. 40
0
def strategy_statistics(strategy_name):
    all_qr = QR.objects(strategy_name=strategy_name)

    if not all_qr:
        print 'Wrong Strategy Name!'
        return

    all_date = []
    for i in all_qr:
        if i.date not in all_date:
            all_date.append(i.date)

    all_date.sort()
    bt_result = {}
    for d in all_date:
        bt_result[str(d.date())] = back_test_success(strategy_name, d)

    frame = DataFrame(bt_result)
    pd.set_option('display.width', 200)
    print frame.reindex([
        'one_back_test', 'one_yield_expectation', 'three_back_test',
        'three_yield_expectation', 'five_back_test', 'five_yield_expectation'
    ]).T
    pd.set_option('display.width', None)
def is_duplicate(stock_number, date, strategy_name):
    try:
        cursor = QR.objects(Q(stock_number=stock_number) & Q(date=date) & Q(strategy_name=strategy_name))
    except Exception, e:
        logging.error("Query %s QR failed:%s" % (stock_number, e))
    increase_rate = '5%'
    quantity_relative_ratio = 2.5
    try:
        sdt = SDT.objects(
            Q(date=today) & Q(increase_rate__gte=increase_rate)
            & Q(quantity_relative_ratio__gte=quantity_relative_ratio))
    except Exception, e:
        logging.error('Query DB failed:%s' % e)
        raise e

    for i in sdt:
        if persist_increase(i.stock_number):
            continue

        strategy_name = 'turnover_short'
        qr = QR()
        qr.stock_number = i.stock_number
        qr.stock_name = i.stock_name
        qr.date = i.date
        qr.strategy_direction = 'short'
        qr.strategy_name = strategy_name
        qr.init_price = i.today_closing_price

        try:
            if not is_duplicate(i.stock_number, i.date, strategy_name):
                qr.save()
        except Exception, e:
            logging.error('Save %s quant result failed:%s' %
                          (i.stock_number, e))

    today = datetime.date.today()
    increase_rate = "6%"
    quantity_relative_ratio = 3
    try:
        sdt = SDT.objects(
            Q(date=today)
            & Q(increase_rate__gte=increase_rate)
            & Q(quantity_relative_ratio__gte=quantity_relative_ratio)
        )
    except Exception, e:
        logging.error("Query DB failed:%s" % e)
        raise e

    for i in sdt:
        strategy_name = "turnover_short"
        qr = QR()
        qr.stock_number = i.stock_number
        qr.stock_name = i.stock_name
        qr.date = i.date
        qr.strategy_direction = "short"
        qr.strategy_name = strategy_name
        qr.init_price = i.today_closing_price

        try:
            if not is_duplicate(i.stock_number, i.date, strategy_name):
                qr.save()
        except Exception, e:
            logging.error("Save %s quant result failed:%s" % (i.stock_number, e))


if __name__ == "__main__":