예제 #1
0
def train(date, strategy_id='机器学习1号', working_dir=working_dir, ui_log=None):
    date = QA_util_get_real_date(date)
    QA_util_log_info('##JOB01 Now Model Init ==== {}'.format(str(date)),
                     ui_log)
    model1 = model()
    QA_util_log_info('##JOB02 Now Prepare Date ==== {}'.format(str(date)),
                     ui_log)
    model1.get_data(start=str(int(date[0:4]) - 3) + "-01-01", end=date)
    QA_util_log_info('##JOB03 Now Set Target ==== {}'.format(str(date)),
                     ui_log)
    model1.set_target(mark=0.3, type='percent')
    QA_util_log_info(
        '##JOB04 Now Set Train time range ==== {}'.format(str(date)), ui_log)
    model1.set_train_rng(train_start=str(int(date[0:4]) - 3) + "-01-01",
                         train_end=(datetime.strptime(date, "%Y-%m-%d") -
                                    delta4).strftime('%Y-%m-%d'),
                         test_start=(datetime.strptime(date, "%Y-%m-%d") -
                                     delta3).strftime('%Y-%m-%d'),
                         test_end=(datetime.strptime(date, "%Y-%m-%d") -
                                   delta1).strftime('%Y-%m-%d'))
    model1.prepare_data()
    other_params = {
        'learning_rate': 0.1,
        'n_estimators': 100,
        'max_depth': 5,
        'min_child_weight': 1,
        'seed': 0,
        'subsample': 0.8,
        'colsample_bytree': 0.8,
        'gamma': 0,
        'reg_alpha': 0,
        'reg_lambda': 1
    }
    model1.build_model(other_params)
    QA_util_log_info('##JOB05 Now Model Trainnig ==== {}'.format(str(date)),
                     ui_log)
    model1.model_running()
    model1.model_check()
    QA_util_log_info('##JOB06 Now Save Model ==== {}'.format(str(date)),
                     ui_log)
    important = model1.model_important()
    model1.save_model('index', working_dir=working_dir)
    QA_util_log_info(
        '##JOB06 Now Model Trainning Report ==== {}'.format(str(date)), ui_log)
    msg1 = '模型训练日期:{model_date}'.format(model_date=model1.info['date'])
    body1 = build_table(pd.DataFrame(model1.info['train_report']), '训练集情况')
    body2 = build_table(pd.DataFrame(model1.info['rng_report']), '测试集情况')
    body3 = build_table(important.head(50), '特征重要性')

    msg = build_email(build_head(), msg1, body1, body2, body3)

    send_email('模型训练报告', msg, 'date')
    send_actionnotice(strategy_id,
                      '报告:{}'.format(date),
                      '模型训练完成,请查收结果',
                      direction='HOLD',
                      offset='HOLD',
                      volume=None)
예제 #2
0
def job111(trading_date):
    if datetime.strptime(trading_date, "%Y-%m-%d").weekday() == 4:
        train(trading_date, working_dir=working_dir)
    else:
        pass

    if QA_util_if_trade(trading_date):
        predict(trading_date)
    else:
        predict(QA_util_get_real_date(trading_date))
예제 #3
0
파일: QAUser.py 프로젝트: icjsb/Stock_test
    def subscribe_strategy(
            self,
            strategy_id: str,
            last: int,
            today=datetime.date.today(),
            cost_coins=10
    ):
        """订阅一个策略

        会扣减你的积分

        Arguments:
            strategy_id {str} -- [description]
            last {int} -- [description]

        Keyword Arguments:
            today {[type]} -- [description] (default: {datetime.date.today()})
            cost_coins {int} -- [description] (default: {10})
        """

        if self.coins > cost_coins:
            order_id = str(uuid.uuid1())
            self._subscribed_strategy[strategy_id] = {
                'lasttime':
                last,
                'start':
                str(today),
                'strategy_id':
                strategy_id,
                'end':
                QA_util_get_next_day(
                    QA_util_get_real_date(str(today),
                                          towards=1),
                    last
                ),
                'status':
                'running',
                'uuid':
                order_id
            }
            self.coins -= cost_coins
            self.coins_history.append(
                [
                    cost_coins,
                    strategy_id,
                    str(today),
                    last,
                    order_id,
                    'subscribe'
                ]
            )
            return True, order_id
        else:
            # return QAERROR.
            return False, 'Not Enough Coins'
예제 #4
0
    def get(self):
        """[summary]

        /fetcher

        http://localhost:8010/marketdata/fetcher?code=RB1905&market=future_cn&end=2018-12-01&gap=20&frequence=15min

        http://localhost:8010/marketdata/fetcher?code=000001&market=stock_cn&end=2018-12-01&gap=20&frequence=15min
        http://localhost:8010/marketdata/fetcher?code=000001,000002&market=stock_cn&end=2018-12-01&gap=20&frequence=realtime&source=tdx

        一个统一了多市场的多周期数据接口

        param:
            code
            market
            end
            gap
            frequence

        TODO:
            source

        """

        code = self.get_argument('code', '000001')
        market = self.get_argument('market', MARKET_TYPE.STOCK_CN)
        end = self.get_argument('end', str(datetime.date.today))
        gap = self.get_argument('gap', 50)
        frequence = self.get_argument('frequence', FREQUENCE.FIFTEEN_MIN)
        start = self.get_argument(
            'start', QA_util_get_last_day(QA_util_get_real_date(end),
                                          int(gap)))
        source = self.get_argument('source', DATASOURCE.MONGO)

        if len(code) > 6:
            try:
                code = code.split(',')
                print(code)
            except:
                code = code
        #print(code, start, end, frequence, market)
        res = QA_quotation(code,
                           start,
                           end,
                           frequence,
                           market,
                           source=source,
                           output=OUTPUT_FORMAT.DATASTRUCT)

        return self.write({'status': 200, 'result': res.to_json()})
예제 #5
0
    def __init__(self, code, start, end):
        super().__init__()
        self.frequence = FREQUENCE.DAY
        self.market_type = MARKET_TYPE.STOCK_CN
        self.backtest_stock_code = code
        start = QA_util_get_last_day(
            QA_util_get_real_date(start, trade_date_sse, -1), 100)
        self.stock_day_data = QAQuery_Advance.QA_fetch_stock_day_adv(
            self.backtest_stock_code, start, end)
        self.stock_day_data_qfq = self.stock_day_data.to_qfq()

        # print(self.stock_day_data)
        self.stock_bollinger_bands = QA_indicator_BOLL(
            self.stock_day_data_qfq())
        # print(len(self.stock_bollinger_bands))
        # print(self.stock_bollinger_bands)

        self.current_state = 0
예제 #6
0
def QA_fetch_stock_target(codes, start_date, end_date, type='close'):
    if QA_util_if_trade(end_date):
        pass
    else:
        end_date = QA_util_get_real_date(end_date)
    end = QA_util_get_next_datetime(end_date, 5)
    rng1 = pd.Series(pd.date_range(start_date, end_date,
                                   freq='D')).apply(lambda x: str(x)[0:10])
    data = QA.QA_fetch_stock_day_adv(codes, start_date, end)
    market = QA.QA_fetch_index_day(['000001'], start_date, end,
                                   format='pd')['close'].reset_index()
    market = index_pct(market)[[
        'date', 'INDEX_TARGET', 'INDEX_TARGET3', 'INDEX_TARGET4',
        'INDEX_TARGET5', 'INDEX_TARGET10'
    ]]
    res1 = data.to_qfq().data
    res1.columns = [x + '_qfq' for x in res1.columns]
    data = data.data.join(res1).fillna(0).reset_index()
    res = data.groupby('code').apply(pct, type=type)[[
        'date', 'code', 'PRE_DATE', 'OPEN_MARK', 'PASS_MARK', 'TARGET',
        'TARGET3', 'TARGET4', 'TARGET5', 'TARGET10', 'AVG_TARGET'
    ]]
    res = pd.merge(res, market, on='date')
    res['date'] = res['date'].apply(lambda x: str(x)[0:10])
    res['next_date'] = res['date'].apply(
        lambda x: QA_util_get_pre_trade_date(x, -2))
    res['PRE_DATE'] = res['PRE_DATE'].apply(lambda x: str(x)[0:10])
    res = res.set_index(['date', 'code']).loc[rng1]
    res['INDEX_TARGET'] = res['TARGET'] - res['INDEX_TARGET']
    res['INDEX_TARGET3'] = res['TARGET3'] - res['INDEX_TARGET3']
    res['INDEX_TARGET4'] = res['TARGET4'] - res['INDEX_TARGET4']
    res['INDEX_TARGET5'] = res['TARGET5'] - res['INDEX_TARGET5']
    res['INDEX_TARGET10'] = res['TARGET10'] - res['INDEX_TARGET10']
    for columnname in res.columns:
        if res[columnname].dtype == 'float64':
            res[columnname] = res[columnname].astype('float16')
        if res[columnname].dtype == 'int64':
            res[columnname] = res[columnname].astype('int8')
    return (res)
예제 #7
0
def QA_fetch_index_target(codes, start_date, end_date):
    if QA_util_if_trade(end_date):
        pass
    else:
        end_date = QA_util_get_real_date(end_date)
    end = QA_util_get_next_datetime(end_date, 5)
    rng1 = pd.Series(pd.date_range(start_date, end_date,
                                   freq='D')).apply(lambda x: str(x)[0:10])
    data = QA.QA_fetch_index_day_adv(codes, start_date,
                                     end).data.fillna(0).reset_index()
    res = data.groupby('code').apply(index_pct)[[
        'date', 'code', 'INDEX_TARGET', 'INDEX_TARGET3', 'INDEX_TARGET4',
        'INDEX_TARGET5', 'INDEX_TARGET10'
    ]]
    res['date'] = res['date'].apply(lambda x: str(x)[0:10])
    res = res.set_index(['date', 'code']).loc[rng1]
    for columnname in res.columns:
        if res[columnname].dtype == 'float64':
            res[columnname] = res[columnname].astype('float16')
        if res[columnname].dtype == 'int64':
            res[columnname] = res[columnname].astype('int8')
    return (res)