def test_read_save_json(): fp = '../../output/tests/test_read_save_pickle.pic' d = {'a': 1.0, 'b': 2, 'c': True, 'd': list()} jutil.save_json(d, fp) d2 = jutil.read_json(fp) assert d2['b'] == 2 d3 = jutil.read_json('a_non_exits_file_blabla.pic') assert d3 == dict()
def init_from_config(self, props): self.set_trade_api_callbacks() def get_from_list_of_dict(l, key, default=None): res = None for dic in l: res = dic.get(key, None) if res is not None: break if res is None: res = default return res props_default = jutil.read_json( jutil.join_relative_path('etc/trade_config.json')) dic_list = [props, props_default] address = get_from_list_of_dict(dic_list, "remote.address", "") username = get_from_list_of_dict(dic_list, "remote.username", "") password = get_from_list_of_dict(dic_list, "remote.password", "") if address is None or username is None or password is None: raise ValueError("no address, username or password available!") # 使用用户名、密码登陆, 如果成功,返回用户可用的策略帐号列表 print("\nTradeApi login {}@{}".format(username, address)) user_info, msg = self.login(username, password) if not (msg == '0,'): print(" login failed: msg = '{}'\n".format(msg)) else: print(" login success. user info: \n" " {:s}\n".format(user_info))
def __init__(self, address=None): if address is None: props_default = jutil.read_json( jutil.join_relative_path('etc/trade_config.json')) address = props_default["remote.address"] super(RealTimeTradeApi, self).__init__(address) self.ctx = None
def init_from_config(self, props): """ Instantiate TradeAPI and login. Parameters ---------- props : dict """ if self._trade_api is not None: self._trade_api.close() def get_from_list_of_dict(l, key, default=None): res = None for dic in l: res = dic.get(key, None) if res is not None: break if res is None: res = default return res props_default = jutil.read_json( jutil.join_relative_path('etc/trade_config.json')) dic_list = [props, props_default] address = get_from_list_of_dict(dic_list, "remote.address", "") username = get_from_list_of_dict(dic_list, "remote.username", "") password = get_from_list_of_dict(dic_list, "remote.password", "") if address is None or username is None or password is None: raise ValueError("no address, username or password available!") tapi = TradeApi(address) self.set_trade_api_callbacks(tapi) # 使用用户名、密码登陆, 如果成功,返回用户可用的策略帐号列表 print("\n{}@{} login...".format(username, address)) user_info, msg = tapi.login(username, password) print(" Login msg: {:s}".format(msg)) print(" Login user info: {:s}\n".format(user_info)) self._trade_api = tapi # event types and trade_api functions are one-to-one corresponded self._omni_api_map = { EVENT_TYPE.QUERY_ACCOUNT: self._trade_api.query_account, EVENT_TYPE.QUERY_UNIVERSE: self._trade_api.query_universe, EVENT_TYPE.QUERY_POSITION: self._trade_api.query_position, EVENT_TYPE.QUERY_PORTFOLIO: self._trade_api.query_portfolio, EVENT_TYPE.QUERY_TASK: self._trade_api.query_task, EVENT_TYPE.QUERY_TRADE: self._trade_api.query_trade, EVENT_TYPE.QUERY_ORDER: self._trade_api.query_order, }
def get_ic(dv): """ Calculate factor IC on all dates and save it in a DataFrame :param dv: :return: DataFrame recording factor IC on all dates """ factorList = jutil.read_json(custom_data_path) ICPanel = {} for singleDate in dv.dates: singleSnapshot = dv.get_snapshot(singleDate) ICPanel[singleDate] = ic_calculation(singleSnapshot, factorList) ICPanel = pd.DataFrame(ICPanel).T return ICPanel
def get_ic(dv): """ Calculate factor IC on all dates and save it in a DataFrame :param dv: :return: DataFrame recording factor IC on all dates """ factorList = jutil.read_json(custom_data_path) ICPanel = {} for singleDate in dv.dates: singleSnapshot = dv.get_snapshot(singleDate) ICPanel[singleDate] = ic_calculation(singleSnapshot, factorList) ICPanel = pd.DataFrame(ICPanel).T return ICPanel
def test_alpha_strategy_dataview(): dv = DataView() dv.load_dataview(folder_path=dataview_dir_path) props = { "start_date": dv.start_date, "end_date": dv.end_date, "period": "week", "days_delay": 0, "init_balance": 1e8, 'commission_rate': 0.0 } props.update(data_config) props.update(trade_config) trade_api = AlphaTradeApi() bt = AlphaBacktestInstance() stock_selector = model.StockSelector() stock_selector.add_filter(name='myselector', func=my_selector) strategy = AlphaStrategy(stock_selector=stock_selector, pc_method='equal_weight') pm = PortfolioManager() context = model.AlphaContext(dataview=dv, trade_api=trade_api, instance=bt, strategy=strategy, pm=pm) store = pd.HDFStore(ic_weight_hd5_path) factorList = jutil.read_json(custom_data_path) context.ic_weight = store['ic_weight'] context.factorList = factorList store.close() for mdl in [stock_selector]: mdl.register_context(context) bt.init_from_config(props) bt.run_alpha() bt.save_results(folder_path=backtest_result_dir_path)
def test_alpha_strategy_dataview(): dv = DataView() dv.load_dataview(folder_path=dataview_dir_path) props = { "start_date": dv.start_date, "end_date": dv.end_date, "period": "week", "days_delay": 0, "init_balance": 1e8, 'commission_rate': 0.0 } props.update(data_config) props.update(trade_config) trade_api = AlphaTradeApi() bt = AlphaBacktestInstance() stock_selector = model.StockSelector() stock_selector.add_filter(name='myselector', func=my_selector) strategy = AlphaStrategy(stock_selector=stock_selector, pc_method='equal_weight') pm = PortfolioManager() context = model.AlphaContext(dataview=dv, trade_api=trade_api, instance=bt, strategy=strategy, pm=pm) store = pd.HDFStore(ic_weight_hd5_path) factorList = jutil.read_json(custom_data_path) context.ic_weight = store['ic_weight'] context.factorList = factorList store.close() for mdl in [stock_selector]: mdl.register_context(context) bt.init_from_config(props) bt.run_alpha() bt.save_results(folder_path=backtest_result_dir_path)
def init_from_config(self, props=None): if props is None: props = dict() if self.data_api is not None: if len(props) == 0: return else: self.data_api.close() def get_from_list_of_dict(l, key, default=None): res = None for dic in l: res = dic.get(key, None) if res is not None: break if res is None: res = default return res props_default = jutil.read_json( jutil.join_relative_path('etc/data_config.json')) dic_list = [props, props_default] address = get_from_list_of_dict(dic_list, "remote.address", "") username = get_from_list_of_dict(dic_list, "remote.username", "") password = get_from_list_of_dict(dic_list, "remote.password", "") if address is None or username is None or password is None: raise ValueError("no address, username or password available!") time_out = get_from_list_of_dict(dic_list, "timeout", 60) self.data_api = DataApi(address, use_jrpc=False) self.data_api.set_timeout(timeout=time_out) print("\nDataApi login: {}@{}".format(username, address)) r, msg = self.data_api.login(username=username, password=password) if not r: print(" login failed: msg = '{}'\n".format(msg)) else: print " login success \n" self.calendar = Calendar(self.data_api)
def __init__(self, data_api=None): if data_api is not None: self.data_api = data_api else: props = jutil.read_json( jutil.join_relative_path('etc/data_config.json')) address = props.get("remote.address", "") username = props.get("remote.username", "") password = props.get("remote.password", "") if address is None or username is None or password is None: raise ValueError("no address, username or password available!") time_out = props.get("timeout", 60) self.data_api = DataApi(address, use_jrpc=False) self.data_api.set_timeout(timeout=time_out) r, msg = self.data_api.login(username=username, password=password) if not r: print("DataAPI login failed: msg = '{}".format(msg)) else: print "DataAPI login success : {}@{}".format(username, address)
def load_dataview(self, folder_path='.'): """ Load data from local file. Parameters ---------- folder_path : str or unicode, optional Folder path to store hd5 file and meta data. """ path_meta_data = os.path.join(folder_path, 'meta_data.json') path_data = os.path.join(folder_path, 'data.hd5') if not (os.path.exists(path_meta_data) and os.path.exists(path_data)): raise IOError("There is no data file under directory {}".format(folder_path)) meta_data = jutil.read_json(path_meta_data) dic = self._load_h5(path_data) self.data = dic.get('/data', None) self._data_benchmark = dic.get('/data_benchmark', None) self._data_inst = dic.get('/data_inst', None) self.__dict__.update(meta_data) print("Dataview loaded successfully.")
def test_data_api(): dic = jutil.read_json(jutil.join_relative_path('etc/data_config.json')) address = dic.get("remote.address", None) username = dic.get("remote.username", None) password = dic.get("remote.password", None) if address is None or username is None or password is None: raise ValueError("no data service config available!") api = DataApi(address, use_jrpc=False) login_msg = api.login(username=username, password=password) print login_msg daily, msg = api.daily( symbol="600030.SH,000002.SZ", start_date=20170103, end_date=20170708, fields="open,high,low,close,volume,last,trade_date,settle") daily2, msg2 = api.daily( symbol="600030.SH", start_date=20170103, end_date=20170708, fields="open,high,low,close,volume,last,trade_date,settle") # err_code, err_msg = msg.split(',') assert msg == '0,' assert msg2 == '0,' assert daily.shape == (248, 9) assert daily2.shape == (124, 9) df, msg = api.bar(symbol="600030.SH", trade_date=20170904, freq=common.QUOTE_TYPE.MIN, start_time=90000, end_time=150000) print df.columns assert df.shape == (240, 15) print "test passed"
# encoding: utf-8 from __future__ import unicode_literals import numpy as np import pandas as pd from jaqs.data import DataView from jaqs.data import RemoteDataService from jaqs.research import SignalDigger import jaqs.util as jutil from config_path import DATA_CONFIG_PATH data_config = jutil.read_json(DATA_CONFIG_PATH) dataview_folder = '../../output/prepared/test_signal' 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)
import pandas as pd from jaqs.data import RemoteDataService from jaqs.trade import AlphaBacktestInstance import jaqs.util as jutil from jaqs.trade import PortfolioManager import jaqs.trade.analyze as ana from jaqs.trade import AlphaStrategy from jaqs.trade import AlphaTradeApi from jaqs.trade import model from jaqs.data import DataView from config_path import DATA_CONFIG_PATH, TRADE_CONFIG_PATH data_config = jutil.read_json(DATA_CONFIG_PATH) trade_config = jutil.read_json(TRADE_CONFIG_PATH) dataview_dir_path = '../../output/select_stocks_industry_head/dataview' backtest_result_dir_path = '../../output/select_stocks_industry_head' 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}
def test_trade_api(): dic = jutil.read_json(jutil.join_relative_path('etc/trade_config.json')) address = dic.get("remote.address", None) username = dic.get("remote.username", None) password = dic.get("remote.password", None) print address print username print password if address is None or username is None or password is None: raise ValueError("no trade service config available!") tapi = TradeApi(address) # TradeApi通过回调函数方式通知用户事件。事件包括三种:订单状态、成交回报、委托任务执行状态。 # 订单状态推送 def on_orderstatus(order): print "on_orderstatus:" #, order for key in order: print "%20s : %s" % (key, str(order[key])) print "" # 成交回报推送 def on_trade(trade): print "on_trade:" for key in trade: print "%20s : %s" % (key, str(trade[key])) print "" # 委托任务执行状态推送 # 通常可以忽略该回调函数 def on_taskstatus(task): print "on_taskstatus:" for key in task: print "%20s : %s" % (key, str(task[key])) print "" tapi.set_ordstatus_callback(on_orderstatus) tapi.set_trade_callback(on_trade) tapi.set_task_callback(on_taskstatus) # 使用用户名、密码登陆, 如果成功,返回用户可用的策略帐号列表 user_info, msg = tapi.login(username, password) print "msg: ", msg print "user_info:", user_info # 选择使用的策略帐号 # # 该函数成功后,下单、查持仓等和策略帐号有关的操作都和该策略帐号绑定。 # 没有必要每次下单、查询都调用该函数。重复调用该函数可以选择新的策略帐号。 # # 如果成功,返回(strategy_id, msg) # 否则返回 (0, err_msg) sid, msg = tapi.use_strategy(1) assert msg == '0,' print "sid: ", sid # 查询Portfolio # # 返回当前的策略帐号的Universe中所有标的的净持仓,包括持仓为0的标的。 df, msg = tapi.query_account() assert msg == '0,' print df # 查询当前策略帐号的所有持仓 # # 和 query_portfolio接口不一样。如果莫个期货合约 Long, Short两个方向都有持仓,这里是返回两条记录 # 返回的 size 不带方向,全部为 正 df, msg = tapi.query_position() assert msg == '0,' print df # Query Universe df_univ, msg = tapi.query_universe() # 查询Portfolio # # 返回当前的策略帐号的Universe中所有标的的净持仓,包括持仓为0的标的。 df_portfolio, msg = tapi.query_portfolio() assert msg == '0,' assert len(df_univ) == len(df_portfolio) # 下单接口 # (task_id, msg) = place_order(code, action, price, size ) # action: Buy, Short, Cover, Sell, CoverToday, CoverYesterday, SellToday, SellYesterday # 返回 task_id 可以用改 task_id task_id, msg = tapi.place_order("000718.SZ", "Buy", 57, 100) assert msg == '0,' print "task_id:", task_id df_order, msg = tapi.query_order(task_id=task_id) assert msg == '0,' print df_order df_trade, msg = tapi.query_trade(task_id=task_id) assert msg == '0,' print df_trade # 批量下单1:place_batch_order # # 返回task_id, msg。 orders = [ {"security":"600030.SH", "action" : "Buy", "price": 16, "size":1000}, {"security":"600519.SH", "action" : "Buy", "price": 320, "size":1000}, ] task_id, msg = tapi.place_batch_order(orders, "", dict()) print task_id print msg # cancel_order # 撤单 tapi.cancel_order(task_id) # 批量下单2:basket_order # # 返回task_id, msg。 orders = [ {"security":"601857.SH", "ref_price": 8.40, "inc_size":1000}, {"security":"601997.SH", "ref_price": 14.540, "inc_size":20000}, ] task_id, msg = tapi.basket_order(orders, "", {}) print task_id print msg # goal_protfolio # 参数:目标持仓 # 返回:(result, msg) # result: 成功或失败 # msg: 错误原因 # 注意:目标持仓中必须包括所有的代码的持仓,即使不修改 # 先查询当前的持仓, portfolio, msg = tapi.query_portfolio() print "msg", msg print "portfolio", portfolio goal = pd.DataFrame(portfolio['current_size']) goal.loc[:, 'size'] = goal['current_size'] goal.loc[:, 'ref_price'] = 0.0 goal.loc[:, 'urgency'] = 5 # 然后修改目标持仓 code = '601857.SH' goal.loc[code, 'ref_price'] = 8.38 goal.loc[code, 'size'] += 20000 code = '601997.SH' goal.loc[code, 'ref_price'] = 14.40 goal.loc[code, 'size'] += 10000 # stop_portfolio # 撤单, 撤销所有portfolio订单 tapi.stop_portfolio() # 发送请求 result, msg = tapi.goal_portfolio(goal) print result, msg
from __future__ import absolute_import import time from jaqs.data import RemoteDataService from jaqs.trade import AlphaBacktestInstance import jaqs.util as jutil import jaqs.trade.analyze as ana from jaqs.trade import PortfolioManager from jaqs.trade import AlphaStrategy from jaqs.trade import AlphaTradeApi from jaqs.trade import model from jaqs.data import DataView from config_path import DATA_CONFIG_PATH, TRADE_CONFIG_PATH data_config = jutil.read_json(DATA_CONFIG_PATH) trade_config = jutil.read_json(TRADE_CONFIG_PATH) dataview_dir_path = '../../output/select_stocks_pe_profit/dataview' backtest_result_dir_path = '../../output/select_stocks_pe_profit' 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}
# encoding: UTF-8 from __future__ import print_function import time from jaqs.trade.tradeapi import TradeApi import pandas as pd import jaqs.util as jutil from config_path import TRADE_CONFIG_PATH trade_config = jutil.read_json(TRADE_CONFIG_PATH) def test_trade_api(): address = trade_config.get("remote.trade.address", None) username = trade_config.get("remote.trade.username", None) password = trade_config.get("remote.trade.password", None) print(address) print(username) # print password if address is None or username is None or password is None: raise ValueError("no trade service config available!") tapi = TradeApi(address) # TradeApi通过回调函数方式通知用户事件。事件包括三种:订单状态、成交回报、委托任务执行状态。 # 订单状态推送 def on_orderstatus(order): print("on_orderstatus:") #, order
# encoding: UTF-8 from __future__ import print_function import time from jaqs.trade.tradeapi import TradeApi import pandas as pd import jaqs.util as jutil from config_path import TRADE_CONFIG_PATH trade_config = jutil.read_json(TRADE_CONFIG_PATH) def test_trade_api(): address = trade_config.get("remote.trade.address", None) username = trade_config.get("remote.trade.username", None) password = trade_config.get("remote.trade.password", None) print(address) print(username) # print password if address is None or username is None or password is None: raise ValueError("no trade service config available!") tapi = TradeApi(address) # TradeApi通过回调函数方式通知用户事件。事件包括三种:订单状态、成交回报、委托任务执行状态。 # 订单状态推送 def on_orderstatus(order): print("on_orderstatus:") #, order