def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20150101, 'end_date': 20170930, 'universe': '000905.SH', 'fields': ('turnover,float_mv,close_adj,pe,pb'), 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'Cutoff(Standardize(turnover / 10000 / float_mv), 2)' dv.add_formula('TO', factor_formula, is_quarterly=False) factor_formula = 'Cutoff(Standardize(1/pb), 2)' dv.add_formula('BP', factor_formula, is_quarterly=False) factor_formula = 'Cutoff(Standardize(Return(close_adj, 20)), 2)' dv.add_formula('REVS20', factor_formula, is_quarterly=False) factor_formula = 'Cutoff(Standardize(Log(float_mv)), 2)' dv.add_formula('float_mv_factor', factor_formula, is_quarterly=False) factor_formula = 'Delay(Return(close_adj, 1), -1)' dv.add_formula('NextRet', factor_formula, is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = { 'start_date': 20170101, 'end_date': 20171030, 'universe': '000300.SH', 'fields': ( 'open,high,low,close,vwap,volume,turnover,sw1,' # + 'pb,net_assets,' + 'eps_basic,total_mv,tot_profit,int_income'), 'freq': 1 } dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'close >= Delay(Ts_Max(close, 20), 1)' # 20 days new high factor_name = 'new_high' dv.add_formula(factor_name, factor_formula, is_quarterly=False) dv.add_formula('total_profit_growth', formula='Return(tot_profit, 4)', is_quarterly=True) dv.save_dataview(folder_path=dataview_dir_path)
def test_save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = { 'start_date': 20170101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': ('float_mv,pb,pe_ttm,sw2'), 'freq': 1 } dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'GroupQuantile(-float_mv, sw2, 10)' dv.add_formula('rank_mv', factor_formula, is_quarterly=False) factor_formula = 'GroupQuantile(If(pb >= 0.2, pb, 100), sw2, 10)' dv.add_formula('rank_pb', factor_formula, is_quarterly=False) factor_formula = 'GroupQuantile(If(pe_ttm >= 3, pe_ttm, 9999.0), sw2, 10)' dv.add_formula('rank_pe', factor_formula, is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = { 'start_date': 20150101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'volume,turnover,float_mv,pb,total_mv', 'freq': 1 } dv.init_from_config(props, ds) dv.prepare_data() trade_status = dv.get_ts('trade_status') mask_sus = trade_status == '停牌' dv.append_df(mask_sus, 'suspended', is_quarterly=False) dv.add_formula('not_index_member', '!index_member', is_quarterly=False) dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False) dv.save_dataview(dataview_folder)
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = { 'start_date': 20150101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'volume,turnover,float_mv,pb,total_mv', 'freq': 1 } dv.init_from_config(props, ds) dv.prepare_data() # for convenience to check limit reachers dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False) dv.add_formula('random', 'StdDev(volume, 20)', is_quarterly=False) dv.add_formula('momentum', 'Return(close_adj, 20)', is_quarterly=False) # dv.add_formula('size', '', is_quarterly=False) dv.save_dataview(dataview_folder)
def save_data(): """ This function fetches data from remote server and stores them locally. Then we can use local data to do back-test. """ dataview_props = {'start_date': 20170101, # Start and end date of back-test 'end_date': 20171030, 'universe': UNIVERSE, # Investment universe and performance benchmark 'benchmark': '000905.SH', 'fields': 'high,low,close', # Data fields that we need 'freq': 1 # freq = 1 means we use daily data. Please do not change this. } # RemoteDataService communicates with a remote server to fetch data ds = RemoteDataService() # Use username and password in data_config to login ds.init_from_config(data_config) # DataView utilizes RemoteDataService to get various data and store them dv = DataView() dv.init_from_config(dataview_props, ds) dv.prepare_data() # 以9日为周期的KD线为例。首先须计算出最近9日的RSV值,即未成熟随机值, # 计算公式为 # 9日RSV=(C-L9)÷(H9-L9)×100 # 式中,C为第9日的收盘价;L9为9日内的最低价;H9为9日内的最高价。 # K值=2/3×前一日K值+1/3×当日RSV # D值=2/3×前一日K值+1/3×当日RSV # J指标的计算公式为: J=3D—2K factor_formula = '2/3*50 + (close-Ts_Min(low,5))/(Ts_Max(high,5)-Ts_Min(low,5)*100)' dv.add_formula() dv.save_dataview(folder_path=dataview_store_folder)
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20160101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'volume,turnover', 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() # for convenience to check limit reachers dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False) dv.add_formula('mask_limit_reached', 'limit_reached > 0', is_quarterly=False) dv.add_formula('mask_index_member', '!(index_member > 0)', is_quarterly=False) trade_status = dv.get_ts('trade_status') mask_sus = trade_status == u'停牌' dv.append_df(mask_sus, 'mask_sus', is_quarterly=False) # dv.add_formula('size', '', is_quarterly=False) dv.save_dataview(dataview_folder)
def save_data(): """ This function fetches data from remote server and stores them locally. Then we can use local data to do back-test. """ dataview_props = { 'start_date': 20170101, # Start and end date of back-test 'end_date': 20171030, 'universe': UNIVERSE, # Investment universe and performance benchmark 'benchmark': '000300.SH', 'fields': 'total_mv,turnover', # Data fields that we need 'freq': 1 # freq = 1 means we use daily data. Please do not change this. } # RemoteDataService communicates with a remote server to fetch data ds = RemoteDataService() # Use username and password in data_config to login ds.init_from_config(data_config) # DataView utilizes RemoteDataService to get various data and store them dv = DataView() dv.init_from_config(dataview_props, ds) dv.prepare_data() dv.save_dataview(folder_path=dataview_store_folder)
def prepare_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) symbols = ['600036.SH', '000001.SZ'] dv_props = {'symbol': ','.join(symbols), 'start_date': backtest_props['start_date'], 'end_date': backtest_props['end_date'], 'benchmark': '000300.SH'} dv = EventDataView() dv.init_from_config(dv_props, ds) dv.prepare_data() import pandas as pd # target security diff_cols = ['open', 'high', 'low', 'close'] df0 = dv.get_symbol(symbols[0], fields=','.join(diff_cols)) df1 = dv.get_symbol(symbols[1], fields=','.join(diff_cols)) df_diff = df0 - df1 # calculate signal df_signal = pd.concat([df0[['close']], df1[['close']], df_diff[['close']]], axis=1) df_signal.columns = symbols + ['diff'] roll = df_signal['diff'].rolling(window=10) df_signal.loc[:, 'signal'] = (df_signal['diff'] - roll.mean()) / roll.std() dv.append_df_symbol(df_diff, '001.JZ') dv.data_custom = df_signal dv.save_dataview(dataview_dir_path)
def test_save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20150101, 'end_date': 20170930, 'universe': '000905.SH', 'fields': ('tot_cur_assets,tot_cur_liab,inventories,pre_pay,deferred_exp,' 'eps_basic,ebit,pe,pb,float_mv,sw1'), 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'pe < 30' dv.add_formula('pe_condition', factor_formula, is_quarterly=False) factor_formula = 'pb < 3' dv.add_formula('pb_condition', factor_formula, is_quarterly=False) factor_formula = 'Return(eps_basic, 4) > 0' dv.add_formula('eps_condition', factor_formula, is_quarterly=True) factor_formula = 'Return(ebit, 4) > 0' dv.add_formula('ebit_condition', factor_formula, is_quarterly=True) factor_formula = 'tot_cur_assets/tot_cur_liab > 2' dv.add_formula('current_condition', factor_formula, is_quarterly=True) factor_formula = '(tot_cur_assets - inventories - pre_pay - deferred_exp)/tot_cur_liab > 1' dv.add_formula('quick_condition', factor_formula, is_quarterly=True) dv.add_formula('mv_rank', 'Rank(float_mv)', is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def test_dataview_universe(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20170227, 'end_date': 20170327, 'universe': '000016.SH', # 'symbol': 'rb1710.SHF,rb1801.SHF', 'fields': ('open,high,low,close,vwap,volume,turnover,' + 'sw1,zz2,' + 'roe,net_assets,' + 'total_oper_rev,oper_exp,tot_profit,int_income' ), 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() data_bench = dv.data_benchmark.copy() dv.data_benchmark = data_bench try: dv.data_benchmark = data_bench.iloc[3:] except ValueError: pass dv.remove_field('roe,net_assets') dv.remove_field('close')
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = { 'start_date': 20160101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'volume,turnover', 'freq': 1 } dv.init_from_config(props, ds) dv.prepare_data() # for convenience to check limit reachers dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False) dv.add_formula('mask_limit_reached', 'limit_reached > 0', is_quarterly=False) dv.add_formula('mask_index_member', '!(index_member > 0)', is_quarterly=False) trade_status = dv.get_ts('trade_status') mask_sus = trade_status == u'停牌' dv.append_df(mask_sus, 'mask_sus', is_quarterly=False) # dv.add_formula('size', '', is_quarterly=False) dv.save_dataview(dataview_folder)
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = { 'start_date': 20150101, 'end_date': 20170930, 'universe': '000905.SH', 'fields': ('turnover,float_mv,close_adj,pe,pb'), 'freq': 1 } dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'Cutoff(Standardize(turnover / 10000 / float_mv), 2)' dv.add_formula('TO', factor_formula, is_quarterly=False) factor_formula = 'Cutoff(Standardize(1/pb), 2)' dv.add_formula('BP', factor_formula, is_quarterly=False) factor_formula = 'Cutoff(Standardize(Return(close_adj, 20)), 2)' dv.add_formula('REVS20', factor_formula, is_quarterly=False) factor_formula = 'Cutoff(Standardize(Log(float_mv)), 2)' dv.add_formula('float_mv_factor', factor_formula, is_quarterly=False) factor_formula = 'Delay(Return(close_adj, 1), -1)' dv.add_formula('NextRet', factor_formula, is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def test_dataview_universe(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = { 'start_date': 20170227, 'end_date': 20170327, 'universe': '000016.SH', # 'symbol': 'rb1710.SHF,rb1801.SHF', 'fields': ('open,high,low,close,vwap,volume,turnover,' + 'sw1,zz2,' + 'roe,net_assets,' + 'total_oper_rev,oper_exp,tot_profit,int_income'), 'freq': 1 } dv.init_from_config(props, ds) dv.prepare_data() data_bench = dv.data_benchmark.copy() dv.data_benchmark = data_bench try: dv.data_benchmark = data_bench.iloc[3:] except ValueError: pass dv.remove_field('roe,net_assets') dv.remove_field('close')
def test_write(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() secs = '600030.SH,000063.SZ,000001.SZ' props = { 'start_date': 20160601, 'end_date': 20170601, 'symbol': secs, 'fields': 'open,close,high,low,volume,pb,net_assets,pcf_ncf', 'freq': 1 } dv.init_from_config(props, data_api=ds) dv.prepare_data() assert dv.data_d.shape == (281, 48) assert dv.dates.shape == (281, ) # TODO """ PerformanceWarning: your performance may suffer as PyTables will pickle object types that it cannot map directly to c-types [inferred_type->mixed,key->block1_values] [items->[('000001.SZ', 'int_income'), ('000001.SZ', 'less_handling_chrg_comm_exp'), ('000001.SZ', 'net_int_income'), ('000001.SZ', 'oper_exp'), ('000001.SZ', 'symbol'), ('000063.SZ', 'int_income'), ('000063.SZ', 'less_handling_chrg_comm_exp'), ('000063.SZ', 'net_int_income'), ('000063.SZ', 'oper_exp'), ('000063.SZ', 'symbol'), ('600030.SH', 'int_income'), ('600030.SH', 'less_handling_chrg_comm_exp'), ('600030.SH', 'net_int_income'), ('600030.SH', 'oper_exp'), ('600030.SH', 'symbol')]] """ dv.save_dataview(folder_path=daily_path)
def test_livetrade(): props = {'symbol': 'rb1801.SHF', 'strategy_no': 46} tapi = RealTimeTradeApi(trade_config) ins = EventLiveTradeInstance() props.update(data_config) props.update(trade_config) ds = RemoteDataService() strat = DoubleMaStrategy() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) ds.subscribe(props['symbol']) ins.run() time.sleep(3) ins.stop() ins.save_results(result_dir_path) do_analyze()
def save_data(): """ This function fetches data from remote server and stores them locally. Then we can use local data to do back-test. """ dataview_props = {# Start and end date of back-test 'start_date': 20170101, 'end_date': 20171030, # Investment universe and performance benchmark 'universe': UNIVERSE, 'benchmark': '000300.SH', # Data fields that we need 'fields': 'total_mv,turnover', # freq = 1 means we use daily data. Please do not change this. 'freq': 1} # RemoteDataService communicates with a remote server to fetch data ds = RemoteDataService() # Use username and password in data_config to login ds.init_from_config(data_config) # DataView utilizes RemoteDataService to get various data and store them dv = DataView() dv.init_from_config(dataview_props, ds) dv.prepare_data() dv.save_dataview(folder_path=dataview_store_folder)
def analyze(): ta = ana.EventAnalyzer() ds = RemoteDataService() ds.init_from_config(data_config) ta.initialize(data_server_=ds, file_folder=result_dir_path) ta.do_analyze(result_dir=result_dir_path, selected_sec=[])
def analyze(): ta = ana.EventAnalyzer() ds = RemoteDataService() ds.init_from_config(data_config) ta.initialize(data_server_=ds, file_folder=result_dir_path) ta.do_analyze(result_dir=result_dir_path, selected_sec=props['symbol'].split(','))
def run_strategy(): ''' universe可以自己定义吗,就是从我筛选的一组股票里面挑选 把universe改成symbol,然后值设置成一系列代码的字符串,用逗号隔开 :return: ''' if is_backtest: """ 回测模式 """ props = { "symbol": '600519.SH', # "symbol": '002050.SZ', # "benchmark": '002050.SZ', "benchmark": '000300.SH', "start_date": 20170101, "end_date": 20171219, "fast_ma_length": 3, "slow_ma_length": 8, "live_ma_length": 34, "bar_type": "1d", # '1d' "init_balance": 50000} tapi = BacktestTradeApi() ins = EventBacktestInstance() else: """ 实盘/仿真模式 """ props = {'symbol': '600519.SH', "fast_ma_length": 3, "slow_ma_length": 5, "live_ma_length": 34, 'strategy.no': 1062} tapi = RealTimeTradeApi(trade_config) ins = EventLiveTradeInstance() props.update(data_config) props.update(trade_config) ds = RemoteDataService() strat = TripleMaStrategy() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) if not is_backtest: ds.subscribe(props['symbol']) ins.run() if not is_backtest: time.sleep(9999) ins.save_results(folder_path=result_dir_path)
def test_add_field(): dv = DataView() dv.load_dataview(folder_path=daily_path) nrows, ncols = dv.data_d.shape n_securities = len(dv.data_d.columns.levels[0]) ds = RemoteDataService() ds.init_from_config(data_config) dv.add_field('total_share', ds) assert dv.data_d.shape == (nrows, ncols + 1 * n_securities)
def test_bar(): from jaqs.data import RemoteDataService from jaqs.trade.common import QUOTE_TYPE ds = RemoteDataService() ds.init_from_config(data_config) df_quotes, msg = ds.bar(symbol='rb1710.SHF,hc1710.SHF', start_time=200000, end_time=160000, trade_date=20170704, freq=QUOTE_TYPE.MIN) bar_list = Bar.create_from_df(df_quotes) bar = bar_list[0] print(str(bar))
def test_inst_manager(): ds = RemoteDataService() ds.init_from_config(data_config) mgr = InstManager(ds) mgr.load_instruments() sym = '000001.SZ' inst_obj = mgr.get_instrument(sym) assert inst_obj.market == 'SZ' assert inst_obj.symbol == sym assert inst_obj.multiplier == 1 assert inst_obj.inst_type == 1
def test_bar(): from jaqs.data import RemoteDataService from jaqs.trade.common import QUOTE_TYPE ds = RemoteDataService() ds.init_from_config(data_config) df_quotes, msg = ds.bar(symbol='rb1710.SHF,hc1710.SHF', start_time=200000, end_time=160000, trade_date=20170704, freq=QUOTE_TYPE.MIN) quotes_list = Bar.create_from_df(df_quotes)
def run_strategy(): if is_backtest: """ 回测模式 """ props = { "symbol": '600519.SH', "start_date": 20170101, "end_date": 20171104, "fast_ma_length": 5, "slow_ma_length": 15, "bar_type": "1d", # '1d' "init_balance": 50000 } tapi = BacktestTradeApi() ins = EventBacktestInstance() else: """ 实盘/仿真模式 """ props = { 'symbol': '600519.SH', "fast_ma_length": 5, "slow_ma_length": 15, 'strategy.no': 1062 } tapi = RealTimeTradeApi(trade_config) ins = EventLiveTradeInstance() props.update(data_config) props.update(trade_config) ds = RemoteDataService() strat = DoubleMaStrategy() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) if not is_backtest: ds.subscribe(props['symbol']) ins.run() if not is_backtest: time.sleep(9999) ins.save_results(folder_path=result_dir_path)
def test_write_future(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() secs = 'rb1710.SHF,j1710.DCE' props = {'start_date': 20170401, 'end_date': 20170901, 'symbol': secs, 'fields': 'open,close,high,low,volume,oi', 'freq': 1, 'all_price': False} dv.init_from_config(props, data_api=ds) dv.prepare_data() assert dv.data_d.shape == (145, 14)
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20160101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'volume,turnover', 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() dv.save_dataview(dataview_folder)
def test_save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() print(DataView) props = {'start_date': 20170501, 'end_date': 20171001, 'universe': '000016.SH', 'fields': 'volume,pb,pe,ps,float_mv,sw1', 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() dv.save_dataview(dataview_folder)
def test_q_add_field(): dv = DataView() dv.load_dataview(folder_path=quarterly_path) nrows, ncols = dv.data_q.shape n_securities = len(dv.data_d.columns.levels[0]) ds = RemoteDataService() ds.init_from_config(data_config) dv.add_field('net_inc_other_ops', ds) """ dv.add_field('oper_rev', ds) dv.add_field('turnover', ds) """ assert dv.data_q.shape == (nrows, ncols + 1 * n_securities)
def do_analyze(): from jaqs.trade.analyze.analyze import TradeRecordEmptyError ta = ana.EventAnalyzer() ds = RemoteDataService() ds.init_from_config(data_config) try: ta.initialize(data_server_=ds, file_folder=result_dir_path) ta.do_analyze(result_dir=result_dir_path, selected_sec=[]) except TradeRecordEmptyError: pass
def test_add_formula_directly(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() secs = '600030.SH,000063.SZ,000001.SZ' props = {'start_date': 20160601, 'end_date': 20170601, 'symbol': secs, 'fields': 'open,close', 'freq': 1} dv.init_from_config(props, data_api=ds) dv.prepare_data() dv.add_formula("myfactor", 'close / open', is_quarterly=False) assert dv.data_d.shape == (281, 39)
def test_align(): # ------------------------------------------------------------------------------------- # input and pre-process demo data ds = RemoteDataService() ds.init_from_config(data_config) raw, msg = ds.query_lb_fin_stat('income', '600000.SH', 20151225, 20170501, 'oper_rev') assert msg == '0,' idx_list = ['report_date', 'symbol'] raw_idx = raw.set_index(idx_list) raw_idx.sort_index(axis=0, level=idx_list, inplace=True) df_ann = raw_idx.loc[pd.IndexSlice[:, :], 'ann_date'] df_ann = df_ann.unstack(level=1) df_value = raw_idx.loc[pd.IndexSlice[:, :], 'oper_rev'] df_value = df_value.unstack(level=1) date_arr = ds.query_trade_dates(20160101, 20170501) df_close = pd.DataFrame(index=date_arr, columns=df_value.columns, data=1e3) # ------------------------------------------------------------------------------------- # demo usage of parser parser = Parser() parser.register_function('Myfunc', lambda x: x * 0 + 1) # simultaneously test register function and align expr_formula = 'signal / Myfunc(close)' expression = parser.parse(expr_formula) for i in range(100): df_res = parser.evaluate({'signal': df_value, 'close': df_close}, df_ann, date_arr) # ------------------------------------------------------------------------------------- sec = '600000.SH' """ # print to validate results print "\n======Expression Formula:\n{:s}".format(expr_formula) print "\n======Report date, ann_date and evaluation value:" tmp = pd.concat([df_ann.loc[:, sec], df_value.loc[:, sec]], axis=1) tmp.columns = ['df_ann', 'df_value'] print tmp print "\n======Selection of result of expansion:" print "20161028 {:.4f}".format(df_res.loc[20161028, sec]) print "20161031 {:.4f}".format(df_res.loc[20161031, sec]) print "20170427 {:.4f}".format(df_res.loc[20170427, sec]) """ assert abs(df_res.loc[20161028, sec] - 82172000000) < 1 assert abs(df_res.loc[20161031, sec] - 120928000000) < 1 assert abs(df_res.loc[20170427, sec] - 42360000000) < 1
def run_strategy(): """ 回测模式 """ props = {"symbol": '510300.SH', "start_date": 20160201, "end_date": 20171231, "fast_ma_length": 10, "slow_ma_length": 20, "bar_type": "1d", "benchmark" : '000300.SH', "init_balance": 50000} tapi = BacktestTradeApi() ins = EventBacktestInstance() props.update(data_config) props.update(trade_config) ds = RemoteDataService() strat = DoubleMaStrategy() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) ins.run() ins.save_results(folder_path=result_dir_path)
def test_backtest(): props = { "symbol": "rb1710.SHF", "start_date": 20170710, "end_date": 20170730, "bar_type": "1M", # '1d' "init_balance": 2e4 } tapi = BacktestTradeApi() ins = EventBacktestInstance() props.update(data_config) props.update(trade_config) ds = RemoteDataService() strat = DoubleMaStrategy() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) ins.run() ins.save_results(result_dir_path) do_analyze()
def test_save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20170901, 'end_date': 20171129, 'universe': BENCHMARK, 'fields': 'close,volume,sw1', 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() dv.add_formula('ret', 'Return(close_adj, 20)', is_quarterly=False) dv.add_formula('rank_ret', 'Rank(ret)', is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def test_save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20170201, 'end_date': 20171001, 'universe': '000300.SH', 'fields': ('float_mv,sw2,sw1'), 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'GroupQuantile(float_mv, sw1, 10)' dv.add_formula('gq30', factor_formula, is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def do_livetrade(): dv = DataView() dv.load_dataview(folder_path=dataview_store_folder) props = {"period": "day", "strategy_no": 1044, "init_balance": 1e6} props.update(data_config) props.update(trade_config) strategy = AlphaStrategy(pc_method='market_value_weight') pm = PortfolioManager() bt = AlphaLiveTradeInstance() trade_api = RealTimeTradeApi(props) ds = RemoteDataService() context = model.Context(dataview=dv, instance=bt, strategy=strategy, trade_api=trade_api, pm=pm, data_api=ds) bt.init_from_config(props) bt.run_alpha() goal_positions = strategy.goal_positions print("Length of goal positions:", len(goal_positions)) task_id, msg = trade_api.goal_portfolio(goal_positions) print(task_id, msg)
def test_save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20170101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'pe_ttm,net_profit_incl_min_int_inc', 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'Return(net_profit_incl_min_int_inc, 4)' factor_name = 'net_profit_growth' dv.add_formula(factor_name, factor_formula, is_quarterly=True) dv.save_dataview(folder_path=dataview_dir_path)
def download_data(): dataview_props = { 'start_date': 20080101, 'end_date': 20180731, 'universe': '000016.SH', 'fields': 'open,close,high,low', 'freq': 1 } ds = RemoteDataService() ds.init_from_config(data_config) # DataView utilizes RemoteDataService to get various data and store them dv = DataView() dv.init_from_config(dataview_props, ds) dv.prepare_data() dv.save_dataview(folder_path=dataview_store_folder)
def save_data(self): """ This function fetches data from remote server and stores them locally. Then we can use local data to do back-test. """ # RemoteDataService communicates with a remote server to fetch data ds = RemoteDataService() # Use username and password in data_config to login ds.init_from_config(self.data_config) # DataView utilizes RemoteDataService to get various data and store them dv = DataView() dv.init_from_config(self.dataview_props, ds) dv.prepare_data() dv.save_dataview(folder_path=self.dataview_store_folder)
def test_q(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() secs = '600030.SH,000063.SZ,000001.SZ' props = {'start_date': 20160609, 'end_date': 20170601, 'symbol': secs, 'fields': ('open,close,' + 'pb,net_assets,' + 'total_oper_rev,oper_exp,' + 'cash_paid_invest,' + 'capital_stk,' + 'roe'), 'freq': 1} dv.init_from_config(props, data_api=ds) dv.prepare_data() dv.save_dataview(folder_path=quarterly_path)
def run_strategy(): if is_backtest: """ 回测模式 """ props = {"symbol": '600519.SH', "start_date": 20170101, "end_date": 20171104, "fast_ma_length": 5, "slow_ma_length": 15, "bar_type": "1d", # '1d' "init_balance": 50000} tapi = BacktestTradeApi() ins = EventBacktestInstance() else: """ 实盘/仿真模式 """ props = {'symbol': '600519.SH', "fast_ma_length": 5, "slow_ma_length": 15, 'strategy.no': 1062} tapi = RealTimeTradeApi(trade_config) ins = EventLiveTradeInstance() props.update(data_config) props.update(trade_config) ds = RemoteDataService() strat = DoubleMaStrategy() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) if not is_backtest: ds.subscribe(props['symbol']) ins.run() if not is_backtest: time.sleep(9999) ins.save_results(folder_path=result_dir_path)
def run_strategy(): start_date = 20150501 end_date = 20171030 index = '399975.SZ' ds = RemoteDataService() ds.init_from_config(data_config) symbol_list = ds.query_index_member(index, start_date, start_date) # add the benchmark index to the last position of symbol_list symbol_list.append(index) props = {"symbol": ','.join(symbol_list), "start_date": start_date, "end_date": end_date, "bar_type": "1d", "init_balance": 1e7, "std multiplier": 1.5, "m": 10, "n": 60, "commission_rate": 2E-4} props.update(data_config) props.update(trade_config) tapi = BacktestTradeApi() ins = EventBacktestInstance() strat = SectorRolling() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) ins.run() ins.save_results(folder_path=result_dir_path) ta = ana.EventAnalyzer() ta.initialize(data_server_=ds, file_folder=result_dir_path) df_bench, _ = ds.daily(index, start_date=start_date, end_date=end_date) ta.data_benchmark = df_bench.set_index('trade_date').loc[:, ['close']] ta.do_analyze(result_dir=result_dir_path, selected_sec=props['symbol'].split(',')[:2])
def test_save_dataview(sub_folder='test_dataview'): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20150101, 'end_date': 20170930, 'universe': '000905.SH', 'fields': ('float_mv,tot_shrhldr_eqy_excl_min_int,deferred_tax_assets,sw2'), 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'Quantile(-float_mv,5)' dv.add_formula('rank_mv', factor_formula, is_quarterly=False) factor_formula = 'Quantile(float_mv/(tot_shrhldr_eqy_excl_min_int+deferred_tax_assets), 5)' dv.add_formula('rank_pb', factor_formula, is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20150101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'volume,turnover,float_mv,pb,total_mv', 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() trade_status = dv.get_ts('trade_status') mask_sus = trade_status == '停牌' dv.append_df(mask_sus, 'suspended', is_quarterly=False) dv.add_formula('not_index_member', '!index_member', is_quarterly=False) dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False) dv.save_dataview(dataview_folder)
def test_write(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() secs = '600030.SH,000063.SZ,000001.SZ' props = {'start_date': 20160601, 'end_date': 20170601, 'symbol': secs, 'fields': 'open,close,high,low,volume,pb,net_assets,pcf_ncf', 'freq': 1} dv.init_from_config(props, data_api=ds) dv.prepare_data() assert dv.data_d.shape == (281, 48) assert dv.dates.shape == (281, ) # TODO """ PerformanceWarning: your performance may suffer as PyTables will pickle object types that it cannot map directly to c-types [inferred_type->mixed,key->block1_values] [items->[('000001.SZ', 'int_income'), ('000001.SZ', 'less_handling_chrg_comm_exp'), ('000001.SZ', 'net_int_income'), ('000001.SZ', 'oper_exp'), ('000001.SZ', 'symbol'), ('000063.SZ', 'int_income'), ('000063.SZ', 'less_handling_chrg_comm_exp'), ('000063.SZ', 'net_int_income'), ('000063.SZ', 'oper_exp'), ('000063.SZ', 'symbol'), ('600030.SH', 'int_income'), ('600030.SH', 'less_handling_chrg_comm_exp'), ('600030.SH', 'net_int_income'), ('600030.SH', 'oper_exp'), ('600030.SH', 'symbol')]] """ dv.save_dataview(folder_path=daily_path)
def test_save_dataview(): ds = RemoteDataService() ds.init_from_config(data_config) dv = DataView() props = {'start_date': 20170101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': ('float_mv,pb,pe_ttm,sw2'), 'freq': 1} dv.init_from_config(props, ds) dv.prepare_data() factor_formula = 'GroupQuantile(-float_mv, sw2, 10)' dv.add_formula('rank_mv', factor_formula, is_quarterly=False) factor_formula = 'GroupQuantile(If(pb >= 0.2, pb, 100), sw2, 10)' dv.add_formula('rank_pb', factor_formula, is_quarterly=False) factor_formula = 'GroupQuantile(If(pe_ttm >= 3, pe_ttm, 9999.0), sw2, 10)' dv.add_formula('rank_pe', factor_formula, is_quarterly=False) dv.save_dataview(folder_path=dataview_dir_path)
def test_calendar(): ds = RemoteDataService() ds.init_from_config(data_config) res1 = ds.query_trade_dates(20121224, 20130201) assert len(res1) == 27 day_zero = 20170102 res2 = ds.query_next_trade_date(day_zero) assert res2 == 20170103 res2_last = ds.query_last_trade_date(res2) assert res2_last == 20161230 res3 = ds.query_next_trade_date(20170104) assert res3 == 20170105 res4 = ds.query_last_trade_date(res3) assert res4 == 20170104 res11 = ds.query_trade_dates(20161224, 20170201) assert len(res11) == 23 assert not ds.is_trade_date(20150101) assert not ds.is_trade_date(20130501)
def test_livetrade(): props = {'symbol': 'rb1801.SHF', 'strategy_no': 1044} tapi = RealTimeTradeApi(trade_config) ins = EventLiveTradeInstance() props.update(data_config) props.update(trade_config) ds = RemoteDataService() strat = DoubleMaStrategy() pm = PortfolioManager() context = model.Context(data_api=ds, trade_api=tapi, instance=ins, strategy=strat, pm=pm) ins.init_from_config(props) ds.subscribe(props['symbol']) ins.run() time.sleep(3) ins.stop() ins.save_results(result_dir_path) do_analyze()
def my_globals(request): ds = RemoteDataService() ds.init_from_config(data_config) request.function.__globals__.update({'ds': ds})
raise exc ''' @pytest.fixture(autouse=True) def my_globals(request): ds = RemoteDataService() ds.init_from_config(data_config) request.function.__globals__.update({'ds': ds}) if __name__ == "__main__": import time t_start = time.time() ds = RemoteDataService() ds.init_from_config(data_config) g = globals() g = {k: v for k, v in g.items() if k.startswith('test_') and callable(v)} for test_name, test_func in g.items(): print("\n==========\nTesting {:s}...".format(test_name)) test_func() print("Test Complete.") t3 = time.time() - t_start print("\n\n\nTime lapsed in total: {:.1f}".format(t3))