import datetime import json import random import pandas as pd import requests from py_jftech import format_date from ai.config import LABEL_TAG, LABEL_RANGE from ai.dao import robo_predict from ai.dao.robo_datas import get_base_info, get_index_list, get_fund_list symbols = ['ACWI', 'EWJ', 'MCHI', 'EEM', 'BKF', 'INDA', 'AAXJ', 'VGK', 'QQQ', 'SPY', 'SPX', 'IWN', 'IUSG', 'IWD', 'DON', 'GDX', 'TOLZ', 'XLU', 'XBI', 'ESGD', 'IGE', 'EMLC', 'IGAA', 'LQD', 'HYG', 'SHY', 'IEI', 'IEF', 'GLD', 'IYR', 'UUP', 'CEW', 'TLT'] def do_reporter(start='2023-10-01', end=datetime.date.today()): url = f"https://jrp.jfquant.com/api/v1.0/ai/predict?startTime={start}&endTime={end.strftime('%Y-%m-%d')}" resp = requests.get(url) datas = [] symbol_index_dict = {symbol: index for index, symbol in enumerate(symbols)} for value in resp.json()['body'].values(): for item in value: data = { 'Forcast On Date': item['aiPredict']['predictDate'], 'Ticker': item['bloombergTicker'].replace(' Index', '').replace(' Equity', ''), 'In 21 business days': 'UP' if item['aiPredict']['predict'] == 1 else 'DOWN', 'Ticker Name': item['indexName'], } datas.append(data) sorted_data = sorted(datas, key=lambda x: symbol_index_dict[x['Ticker'].split(' ')[0]]) print(json.dumps(sorted_data, ensure_ascii=False)) pf = pd.DataFrame(sorted_data) pf.to_excel("Forcast_Report.xlsx", index=False) def do_reporter2(): datas = [] index_info = get_base_info() info = {x['id']: x for x in index_info} symbol_index_dict = {symbol: index for index, symbol in enumerate(symbols)} records = robo_predict.get_list() for item in records: result, rtn, real = is_right(item['rbd_id'], info.get(item['rbd_id'])['type'], item['date'], item['predict']) labels = list(LABEL_RANGE.keys())[::-1] data = { 'Forcast On Date': item['date'], 'Ticker': info.get(item['rbd_id'])['ticker'].replace(' Index', '').replace(' Equity', ''), 'In 21 business days': LABEL_TAG.get(item['predict']), 'real outcome label': LABEL_TAG.get(real), 'random variable label': LABEL_TAG.get(random.randint(labels[0], labels[-1])), 'Ticker Name': json.loads(info.get(item['rbd_id'])['datas'])['chineseName'], 'Run On Time': item['create_time'], 'return in 21 business days': rtn, 'result': result } datas.append(data) sorted_data = sorted(datas, key=lambda x: symbol_index_dict[x['Ticker'].split(' ')[0]]) pf = pd.DataFrame(sorted_data) pf.to_excel("Forcast_Report_chu.xlsx", index=False) def map_to_label(ret): for label, (lower, upper) in LABEL_RANGE.items(): if float(lower) <= ret < float(upper): return label def is_right(id, type, start, predict): predict_term = 21 navs = [] if type == 'INDEX': navs = get_index_list(index_ids=id, min_date=start, limit=predict_term) navs = [nav['rid_close'] for nav in navs] elif type == 'FUND': navs = get_fund_list(fund_ids=id, min_date=start, limit=predict_term) navs = [nav['rfn_nav_cal'] for nav in navs] if len(navs) == predict_term: rtn = navs[-1] / navs[0] - 1 real = map_to_label(rtn) result = True if predict == real or (rtn < 0 and predict < 0) or (rtn > 0 and predict > 0) else False return result, round(rtn * 100, 2), real return None, None, None if __name__ == '__main__': do_reporter2() # sync()