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)
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))
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'
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()})
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
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)
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)