def predict_stock_base_on_similars(code): tops = find_similar_of_a_stock(code) if tops is None: return None tops = tops.head(config.nb_similar_make_prediction) pred_ratios1, pred_ratios5, pred_ratios10, pred_ratios20 = 0, 0, 0, 0 for _, top in tops.iterrows(): pred = market.get_data(start_date=top['DATE'], code=top['CODE']) if config.speed_method in ['rm_market_vr_fft']: pred_market_ratios1 = market.get_span_market_ratio(pred, 1) pred_market_ratios5 = market.get_span_market_ratio(pred, 5) pred_market_ratios10 = market.get_span_market_ratio(pred, 10) pred_market_ratios20 = market.get_span_market_ratio(pred, 20) else: pred_market_ratios1, pred_market_ratios5, pred_market_ratios10, pred_market_ratios20 = 0, 0, 0, 0 pred_ratios1 += (pred.iloc[1]['CLOSE'] - pred.iloc[0]['CLOSE'] ) / pred.iloc[0]['CLOSE'] - pred_market_ratios1 pred_ratios5 += (pred.iloc[5]['CLOSE'] - pred.iloc[0]['CLOSE'] ) / pred.iloc[0]['CLOSE'] - pred_market_ratios5 pred_ratios10 += (pred.iloc[10]['CLOSE'] - pred.iloc[0]['CLOSE'] ) / pred.iloc[0]['CLOSE'] - pred_market_ratios10 pred_ratios20 += (pred.iloc[20]['CLOSE'] - pred.iloc[0]['CLOSE'] ) / pred.iloc[0]['CLOSE'] - pred_market_ratios20 size = tops.shape[0] return [ code, pred_ratios1 / size, pred_ratios5 / size, pred_ratios10 / size, pred_ratios20 / size ]
def make_index_prediction(): pool = Pool(processes=config.cores) all_stocks_avg_pred_results = pool.map(predict_stock_base_on_similars, market.codes) pool.close() pred1, pred5, pred10, pred20 = 0, 0, 0, 0 for result in all_stocks_avg_pred_results: if result is None: continue pred1 += result[1] / len(all_stocks_avg_pred_results) pred5 += result[2] / len(all_stocks_avg_pred_results) pred10 += result[3] / len(all_stocks_avg_pred_results) pred20 += result[4] / len(all_stocks_avg_pred_results) m = market.get_data(start_date=market.current_date) act1 = (m['800_MARKET'].iloc[1] - m['800_MARKET'].iloc[0]) / m['800_MARKET'].iloc[0] act5 = (m['800_MARKET'].iloc[5] - m['800_MARKET'].iloc[0]) / m['800_MARKET'].iloc[0] act10 = (m['800_MARKET'].iloc[10] - m['800_MARKET'].iloc[0]) / m['800_MARKET'].iloc[0] act20 = (m['800_MARKET'].iloc[20] - m['800_MARKET'].iloc[0]) / m['800_MARKET'].iloc[0]
def test_get_historical_data(self): config.start_date = pd.to_datetime('2015-11-20') from codes.market import market pattern = market.get_data(start_date=config.start_date, code='603883.SH') self.assertEqual(pattern.shape[0], 30) self.assertEqual(str(market.current_date.date()), '2015-12-31')
def make_prediction(): pool = Pool(processes=config.cores) all_stocks_avg_pred_results = pool.map(predict_stock_base_on_similars, market.codes) pool.close() all_stocks_avg_pred_results = [ x for x in all_stocks_avg_pred_results if x is not None ] pred_ratios1, pred_ratios5, pred_ratios10, pred_ratios20 = [], [], [], [] act_ratios1, act_ratios5, act_ratios10, act_ratios20, codes = [], [], [], [], [] for avg_pred_result in all_stocks_avg_pred_results: codes.append(avg_pred_result[0]) pred_ratios1.append(avg_pred_result[1]) pred_ratios5.append(avg_pred_result[2]) pred_ratios10.append(avg_pred_result[3]) pred_ratios20.append(avg_pred_result[4]) act = market.get_data(start_date=market.current_date, code=avg_pred_result[0]) if config.speed_method in ['rm_market_vr_fft']: act_market_ratios1 = market.get_span_market_ratio(act, 1) act_market_ratios5 = market.get_span_market_ratio(act, 5) act_market_ratios10 = market.get_span_market_ratio(act, 10) act_market_ratios20 = market.get_span_market_ratio(act, 20) else: act_market_ratios1, act_market_ratios5, act_market_ratios10, act_market_ratios20 = 0, 0, 0, 0 act_ratios1.append((act.iloc[1]['CLOSE'] - act.iloc[0]['CLOSE']) / act.iloc[0]['CLOSE'] - act_market_ratios1) act_ratios5.append((act.iloc[5]['CLOSE'] - act.iloc[0]['CLOSE']) / act.iloc[0]['CLOSE'] - act_market_ratios5) act_ratios10.append((act.iloc[10]['CLOSE'] - act.iloc[0]['CLOSE']) / act.iloc[0]['CLOSE'] - act_market_ratios10) act_ratios20.append((act.iloc[20]['CLOSE'] - act.iloc[0]['CLOSE']) / act.iloc[0]['CLOSE'] - act_market_ratios20) preds = [pred_ratios1, pred_ratios5, pred_ratios10, pred_ratios20] acts = [act_ratios1, act_ratios5, act_ratios10, act_ratios20] get_prediction_and_calcu_corr(codes, preds, acts)
def apply(x): x_ = x.head(config.nb_similar_make_prediction).copy() pattern_code = x_['pattern'].values[0] pred_ratio1, pred_ratio2, pred_ratio3, pred_ratio4, pred_ratio5, pred_ratio10, pred_ratio20 = 0, 0, 0, 0, 0, 0, 0 size = 0 for index, top in x_.iterrows(): pred = market.get_data(start_date=top['DATE'], code=top['CODE']) if pred.shape[0] != 30: print('---Cannot found 30 ', top['CODE'], ' for ', pattern_code, ' start form ', str(top['DATE'])) continue size += 1 pred_ratio1 += market.get_span_ret( pred, 1) / market.get_span_market_ratio(pred, 1) - 1 pred_ratio2 += market.get_span_ret( pred, 2) / market.get_span_market_ratio(pred, 2) - 1 pred_ratio3 += market.get_span_ret( pred, 3) / market.get_span_market_ratio(pred, 3) - 1 pred_ratio4 += market.get_span_ret( pred, 4) / market.get_span_market_ratio(pred, 4) - 1 pred_ratio5 += market.get_span_ret( pred, 5) / market.get_span_market_ratio(pred, 5) - 1 pred_ratio10 += market.get_span_ret( pred, 10) / market.get_span_market_ratio(pred, 10) - 1 pred_ratio20 += market.get_span_ret( pred, 20) / market.get_span_market_ratio(pred, 20) - 1 if config.is_regression_test: act = market.get_data(start_date=market.current_date, code=pattern_code) act_ratios1.append( market.get_span_ret(act, 1) / market.get_span_market_ratio(act, 1) - 1) act_ratios2.append( market.get_span_ret(act, 2) / market.get_span_market_ratio(act, 2) - 1) act_ratios3.append( market.get_span_ret(act, 3) / market.get_span_market_ratio(act, 3) - 1) act_ratios4.append( market.get_span_ret(act, 4) / market.get_span_market_ratio(act, 4) - 1) act_ratios5.append( market.get_span_ret(act, 5) / market.get_span_market_ratio(act, 5) - 1) act_ratios10.append( market.get_span_ret(act, 10) / market.get_span_market_ratio(act, 10) - 1) act_ratios20.append( market.get_span_ret(act, 20) / market.get_span_market_ratio(act, 20) - 1) # else: # print('正在进行实际预测, 无实际值...', pattern_code) pred_ratios1.append(pred_ratio1 / size) pred_ratios2.append(pred_ratio2 / size) pred_ratios3.append(pred_ratio3 / size) pred_ratios4.append(pred_ratio4 / size) pred_ratios5.append(pred_ratio5 / size) pred_ratios10.append(pred_ratio10 / size) pred_ratios20.append(pred_ratio20 / size) codes.append(pattern_code)