def test_mail_notify_sender(self): df_predict = k_data_predict_log_dao.get_predict_log_list( get_current_date()) html = mail_content_render('mail_predict_daily_report_template.html', {'df_predict': df_predict}) mail_notify_sender(default_config.MAIL_TO, 'Predict Daily Report', html)
def get_multiple_k_data(self, code_list=None, start=None, end=None): if start is None: start = get_next_date(-720) if end is None: end = get_current_date() sql = None if code_list is None: sql = ('''select * from k_data where time_key BETWEEN %(start)s and %(end)s order by time_key asc ''') codes_list = None else: sql = ('''select * from k_data where code in %(code_list)s and time_key BETWEEN %(start)s and %(end)s order by time_key asc ''') codes_list = [fill_market(code) for code in code_list] data = pd.read_sql(sql=sql, params={"code_list": codes_list, "start": start, "end": end} , con=dataSource.mysql_quant_conn) return data
def test_mail_content_render(self): df_predict = k_data_predict_log_dao.get_predict_log_list( get_current_date()) html = mail_content_render('mail_predict_daily_report_template.html', {'df_predict': df_predict}) print(html)
def test_get_last_macd_cross_point(self): df = k_data_dao.get_k_data(code="601668", start=get_next_date(-120), end=get_current_date()) df = df.join(cal_macd(df)) item = k_data_dao.get_last_macd_cross_point(df, window_size=8) print(item)
def test_get_data(self): state, data = self.futu_quote_ctx.get_history_kline( fill_market('600196'), ktype='K_WEEK', autype='qfq', start='2018-08-01', end=get_current_date()) print(data)
def insert(self, code, name, best_estimator, train_score, test_score, desc=None): sql = text('replace into k_data_model_log (date, code, name, best_estimator, train_score, test_score, `desc`) ' 'VALUES(:date,:code,:name,:best_estimator,:train_score,:test_score,:desc)') result = dataSource.mysql_quant_conn.execute(sql, date=datetime_utils.get_current_date(), code=code, name=name, best_estimator=best_estimator , train_score=train_score, test_score=test_score, desc=desc) return result
def exists(self, code): # 绑定引擎 # 连接数据表 table = Table('k_data_model_log', dataSource.mysql_quant_metadata, autoload=True) s = select([table.c.code, table.c.date]) \ .where(and_(table.c.date == datetime_utils.get_current_date(), table.c.code == code)) result = dataSource.mysql_quant_conn.execute(s) logger.debug("row count:%s" % result.rowcount) return result.rowcount > 0
def test_training(self): code = '600276' data, features = k_data_dao.get_k_data_with_features( code, '2015-01-01', datetime_utils.get_current_date()) pac = PCAModel('k_data') pac.training_model(code=code, data=data, features=features) model = SequantialNeuralClassifier() model.training_model(code, data, features)
def cal_stock_pool(): df_poll = stock_pool_dao.get_list() code_list = list(df_poll['code'].values) w_data_list = k_data_weekly_dao.get_multiple_k_data(code_list, start='2013-01-01', end=get_current_date()) k_data_list = k_data_dao.get_multiple_k_data(code_list=code_list, start=get_next_date(-720), end=get_current_date()) # k_data_list = k_data_list.set_index('code', inplace=True) # k_data_list = k_data_dao.get_market_snapshot(code_list=code_list, futu_quote_ctx=futu_quote_ctx) matched = [] for code in code_list: rs = cal_single_stock(code, k_data_list, w_data_list) if rs is True: matched.append(code) print("matched:%s" % matched)
def collect_single_daily(code, futu_quote_ctx, start=None, end=None): table_name = 'k_data' if start is None: start = get_current_date() if end is None: end = get_current_date() try: state, data = futu_quote_ctx.get_history_kline(fill_market(code), ktype='K_DAY', autype='qfq', start=start, end=end) data = data.tail(1) data.to_sql(table_name, dataSource.mysql_quant_engine, if_exists='append', index=False) except Exception as e: logger.error(e)
def get_k_data(self, code, start, end): if start is None: start = '2013-01-01' if end is None: end = get_current_date() sql = ('''select * from k_data_weekly where code=%(code)s and time_key BETWEEN %(start)s and %(end)s order by time_key asc ''') data = pd.read_sql(sql=sql, params={"code": fill_market(code), "start": start, "end": end} , con=dataSource.mysql_quant_conn) return data
def get_k_data(self, code, start=None, end=None): if start is None: start = get_next_date(-720) if end is None: end = get_current_date() sql = ('''select time_key, code, open, close as close, high, low, change_rate, last_close, turnover, turnover_rate, volume, pe_ratio from k_data where code=%(code)s and time_key BETWEEN %(start)s and %(end)s order by time_key asc ''') data = pd.read_sql(sql=sql, params={"code": fill_market(code), "start": start, "end": end} , con=dataSource.mysql_quant_conn) return data
def init_pool(self): self.truncate() stocks = stock_dao.query_all() k_data_list = k_data_dao.get_multiple_k_data(start=get_next_date(-720), end=get_current_date()) df = pd.DataFrame(columns=['code', 'name']) for stock in stocks: try: k_data = k_data_list.loc[k_data_list['code'] == fill_market(stock.code)] k_data = k_data.join(cal_macd(k_data)) k_data['turnover7'] = cal_mavol7(k_data, column='turnover') k_turnover7 = k_data['turnover7'].values[-1] if len(k_data['code'].values) == 0: continue stock_basic = stock_basic_dao.get_by_code(stock.code) eps_value = stock_basic['eps'].values[0] profits_yoy_value = stock_basic['profits_yoy'].values[0] if eps_value < 0: continue if profits_yoy_value < 0: continue if k_turnover7 < 65000000: continue dict = {"code": stock.code, "name": stock.name} df = df.append(dict, ignore_index=True) logger.debug("append code:%s" % stock.code) except Exception as e: logger.debug("code:%s, error:%s" % (stock.code, traceback.format_exc())) df.to_sql('stock_pool', dataSource.mysql_quant_engine, if_exists='append', index=False) '''
def cal_bk_vol(): bk_vol_frame = pd.DataFrame(columns=['bkcode', 'bk_name', 'total_mavol_3']) filter_list = [ 'BK0743', 'BK0804', 'BK0568', 'BK0707', 'BK0701', 'BK0611', 'BK0705', 'BK0612', 'BK0500' ] org_bk_code_list = list(stock_industry_dao.get_bkcode_list().values) bk_code_list = [c for c in org_bk_code_list if c not in filter_list] for bk in bk_code_list: bk_stocks = stock_industry_dao.get_by_bkcode(bk[0]) bk_vol3 = 0 try: bk_name = bk_stocks['bk_name'][0] except: bk_name = 'N/A' for code in bk_stocks['code'].values: stock_df = k_data_dao.get_k_data(code=code, start=get_next_date(-30), end=get_current_date()) if len(stock_df) == 0: continue stock_df['mavol3'] = cal_mavol3(stock_df) try: bk_vol3 += stock_df['mavol3'].values[-1:][0] except Exception as e: logger.debug("code:%s, error:%s" % (code, repr(e))) bk_vol_frame.loc[bk_vol_frame.shape[0] + 1] = { 'bkcode': bk, 'bk_name': bk_name, 'total_mavol_3': bk_vol3 } bk_vol_frame = bk_vol_frame.sort_values('total_mavol_3', ascending=False) bk_vol_frame.to_csv('bk_csv.csv', encoding='utf_8_sig')
def insert(self, code, logistic_regression, random_forest_classifier, support_vector_classifier, xgb_classifier, sequantial_neural): sql = text( 'replace into k_data_predict_log (date, code, ' 'logistic_regression, ' 'random_forest_classifier, ' 'support_vector_classifier, ' 'xgb_classifier, ' 'sequantial_neural) ' 'values(:date,:code,:logistic_regression,:random_forest_classifier,:support_vector_classifier,:xgb_classifier,:sequantial_neural)' ) result = dataSource.mysql_quant_conn.execute( sql, date=datetime_utils.get_current_date(), code=code, logistic_regression=logistic_regression, random_forest_classifier=random_forest_classifier, support_vector_classifier=support_vector_classifier, xgb_classifier=xgb_classifier, sequantial_neural=sequantial_neural) return result
def test_collect_single(self): collect_single(code='601899', futu_quote_ctx=self.futu_quote_ctx, start='2013-01-01', end=get_current_date())
# 死叉 # if pre_k > pre_d and ((k_value <= d_value) or (abs(k_value - d_value) <= 10)): # # shares = self.context.portfolio.positions[code].shares # # 清仓 # if shares > 0: # self.sell_value(code, shares) if __name__ == '__main__': context = Context(start='2018-07-01', end='2018-07-14', base_capital=50000) kdj = KDJStrategy() kdj.init(context) context.current_date = get_current_date() kdj.handle_data() logger.debug("base_capital:%s" % context.base_capital) logger.debug("blance:%s" % context.blance) # context.current_date = convert_to_datetime('2018-07-04') # kdj.handle_data() # logger.debug(context.order_book[1]) logger.debug("blance:%s" % context.blance) logger.debug("base_capital:%s" % context.base_capital) kdj.futu_quote_ctx.close()
df_stock_industry = stock_industry_dao.get_by_code(code[3:]) name = df_stock_industry['name'].values[0] if name.find('ST') > -1: continue bk_code = df_stock_industry['bk_code'].values[0] bk_name = df_stock_industry['bk_name'].values[0] data = data.append( { 'bk_code': bk_code, 'bk_name': bk_name, 'code': code[3:], 'name': name, 'date': get_current_date(), 'label': label, 'k': k, 'd': d }, ignore_index=True) except Exception as e: logger.debug("code:%s, error:%s" % (code, repr(e))) data.to_sql('k_data_strategy_kdj_log', dataSource.mysql_quant_engine, if_exists='append', index=False) ''' label = cal_single_stock('600006')