def test_io(): folder_relative = 'output/test/test_file_io' folder = jutil.join_relative_path(folder_relative) fp = jutil.join_relative_path(folder_relative + '/file.postfix') jutil.create_dir(fp) jutil.create_dir(folder)
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 test_output(): static_folder = jutil.join_relative_path('trade/analyze/static') r = Report({'mytitle': 'Test Title', 'mytable': 'Hello World!'}, source_dir=static_folder, template_fn='test_template.html', out_folder='../output') r.generate_html() r.output_html() r.output_pdf()
def test_read_save_pickle(): fp = jutil.join_relative_path('../output/tests/test_read_save_pickle.pic') d = {'a': 1.0, 'b': 2, 'c': True, 'd': list()} jutil.save_pickle(d, fp) d2 = jutil.load_pickle(fp) assert d2['b'] == 2 d3 = jutil.load_pickle('a_non_exits_file_blabla.pic') assert d3 is None
def analyze_signal(): # -------------------------------------------------------------------------------- # Step.1 load dataview dv = DataView() dv.load_dataview(dataview_folder) # -------------------------------------------------------------------------------- # Step.2 calculate mask (to mask those ill data points) trade_status = dv.get_ts('trade_status') mask_sus = trade_status == u'停牌'.encode('utf-8') df_index_member = dv.get_ts('index_member') mask_index_member = ~(df_index_member > 0) dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False) df_limit_reached = dv.get_ts('limit_reached') mask_limit_reached = df_limit_reached > 0 mask_all = np.logical_or( mask_sus, np.logical_or(mask_index_member, mask_limit_reached)) # -------------------------------------------------------------------------------- # Step.3 get signal, benchmark and price data # dv.add_formula('illi_daily', '(high - low) * 1000000000 / turnover', is_quarterly=False) # dv.add_formula('illi', 'Ewma(illi_daily, 11)', is_quarterly=False) # dv.add_formula('size', 'Log(float_mv)', is_quarterly=False) # dv.add_formula('value', '-1.0/pb', is_quarterly=False) # dv.add_formula('liquidity', 'Ts_Mean(volume, 22) / float_mv', is_quarterly=False) dv.add_formula('divert', '- Correlation(vwap_adj, volume, 10)', is_quarterly=False) signal = dv.get_ts('divert').shift(1, axis=0) # avoid look-ahead bias price = dv.get_ts('close_adj') price_bench = dv.data_benchmark # Step.4 analyze! my_period = 5 obj = signaldigger.digger.SignalDigger( output_folder=jutil.join_relative_path('../output'), output_format='pdf') obj.process_signal_before_analysis( signal, price=price, mask=mask_all, n_quantiles=5, period=my_period, benchmark_price=price_bench, ) res = obj.create_full_report()
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 md2rst(): input_dir = jutil.join_relative_path('../doc') output_dir = jutil.join_relative_path('../doc/source') for dir_path, dir_names, file_names in os.walk(input_dir): for fn in file_names: if fn.endswith('.md'): print "Converting {:s}...".format(fn) fn_pure = fn[:-2] fn_md = join(input_dir, fn) fn_html = join(input_dir, fn_pure + 'html') fn_rst = join(output_dir, fn_pure + 'rst') subprocess.check_output([ 'pandoc', fn_md, '-f', 'markdown_github', '-t', 'html', '-s', '-o', fn_html ]) subprocess.check_output([ 'pandoc', fn_html, '-f', 'html', '-t', 'rst', '-s', '-o', fn_rst ]) os.remove(fn_html)
def analyze_event(): # -------------------------------------------------------------------------------- # Step.1 load dataview dv = DataView() dv.load_dataview(dataview_folder) # -------------------------------------------------------------------------------- # Step.2 calculate mask (to mask those ill data points) trade_status = dv.get_ts('trade_status') mask_sus = trade_status == u'停牌'.encode('utf-8') df_index_member = dv.get_ts('index_member') mask_index_member = ~(df_index_member > 0) dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False) df_limit_reached = dv.get_ts('limit_reached') mask_limit_reached = df_limit_reached > 0 mask_all = np.logical_or( mask_sus, np.logical_or(mask_index_member, mask_limit_reached)) # -------------------------------------------------------------------------------- # Step.3 get signal, benchmark and price data dv.add_formula('new_high', 'close_adj >= Ts_Max(close_adj, 300)', is_quarterly=False) dv.add_formula('new_high_delay', 'Delay(Ts_Max(new_high, 300), 1)', is_quarterly=False) dv.add_formula('sig', 'new_high && (! new_high_delay)', is_quarterly=False) signal = dv.get_ts('sig').shift(0, axis=0) # avoid look-ahead bias price = dv.get_ts('close_adj') price_bench = dv.data_benchmark # Step.4 analyze! obj = SignalDigger(output_folder=jutil.join_relative_path('../output'), output_format='pdf') obj.create_binary_event_report(signal, price, mask_all, 5, price_bench, periods=[5, 20, 40])
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 test_backtest_analyze(): ta = ana.AlphaAnalyzer() dv = DataView() dv.load_dataview(folder_path=dataview_dir_path) ta.initialize(dataview=dv, file_folder=backtest_result_dir_path) print "process trades..." ta.process_trades() print "get daily stats..." ta.get_daily() print "calc strategy return..." ta.get_returns(consider_commission=True) # position change info is huge! # print "get position change..." # ta.get_pos_change_info() selected_sec = list(ta.universe)[:2] if len(selected_sec) > 0: print "Plot single securities PnL" for symbol in selected_sec: df_daily = ta.daily.get(symbol, None) if df_daily is not None: ana.plot_trades(df_daily, symbol=symbol, save_folder=backtest_result_dir_path) print "Plot strategy PnL..." ta.plot_pnl(backtest_result_dir_path) print "generate report..." static_folder = jutil.join_relative_path("trade/analyze/static") ta.gen_report(source_dir=static_folder, template_fn='report_template.html', out_folder=backtest_result_dir_path, selected=selected_sec) ta.brinson('sw1')
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 import numpy as np import pandas as pd from jaqs.data.dataview import DataView from jaqs.data.dataservice import RemoteDataService from jaqs.research import signaldigger import jaqs.util as jutil dataview_folder = jutil.join_relative_path('../output/prepared', 'test_signal') def save_dataview(): ds = RemoteDataService() ds.init_from_config() dv = DataView() props = { 'start_date': 20140101, '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',
import time import numpy as np import pandas as pd import jaqs.trade.analyze.analyze as ana from jaqs.data.dataservice import RemoteDataService from jaqs.data.dataview import DataView from jaqs.trade import model from jaqs.trade.backtest import AlphaBacktestInstance from jaqs.trade.tradegateway import AlphaTradeApi from jaqs.trade.portfoliomanager import PortfolioManager from jaqs.trade.strategy import AlphaStrategy import jaqs.util as jutil dataview_dir_path = jutil.join_relative_path('../output/Graham/dataview') backtest_result_dir_path = jutil.join_relative_path('../output/Graham') def test_save_dataview(): ds = RemoteDataService() ds.init_from_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()
# encoding: utf-8 import numpy as np import statsmodels.api as sm from jaqs.trade.strategy import EventDrivenStrategy from jaqs.trade import common, model from jaqs.data.dataservice import RemoteDataService from jaqs.trade.backtest import EventBacktestInstance from jaqs.trade.tradegateway import BacktestTradeApi from jaqs.trade.portfoliomanager import PortfolioManager import jaqs.util as jutil import jaqs.trade.analyze.analyze as ana result_dir_path = jutil.join_relative_path('../output/sector_rolling') class SectorRolling(EventDrivenStrategy): def __init__(self): super(SectorRolling, self).__init__() self.symbol = '' self.benchmark_symbol = '' self.quotelist = '' self.startdate = '' self.bufferSize = 0 self.rollingWindow = 0 self.bufferCount = 0 self.bufferCount2 = 0 self.closeArray = {} self.activeReturnArray = {}
end_date 20171001 """ import time from jaqs.data.dataservice import RemoteDataService from jaqs.trade.backtest import AlphaBacktestInstance import jaqs.util as jutil import jaqs.trade.analyze.analyze as ana from jaqs.trade.portfoliomanager import PortfolioManager from jaqs.trade.strategy import AlphaStrategy from jaqs.trade.tradegateway import AlphaTradeApi from jaqs.trade import model from jaqs.data.dataview import DataView dataview_dir_path = jutil.join_relative_path( '../output/select_stocks_pe_profit/dataview') backtest_result_dir_path = jutil.join_relative_path( '../output/select_stocks_pe_profit') def test_save_dataview(): ds = RemoteDataService() ds.init_from_config() dv = DataView() props = { 'start_date': 20170101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': 'pe_ttm,net_profit_incl_min_int_inc', 'freq': 1
3. subtract market value and re-normalize weights (positions) after (daily) market open, before sending orders """ import time from jaqs.data.dataservice import RemoteDataService from jaqs.trade.strategy import AlphaStrategy import jaqs.util as jutil import jaqs.trade.analyze.analyze as ana from jaqs.trade.backtest import AlphaBacktestInstance from jaqs.trade.portfoliomanager import PortfolioManager from jaqs.trade.tradegateway import AlphaTradeApi from jaqs.trade import model from jaqs.data.dataview import DataView dataview_dir_path = jutil.join_relative_path( '../output/prepared/test_backtest') backtest_result_dir_path = jutil.join_relative_path('../output/test_backtest') def save_dataview(): ds = RemoteDataService() ds.init_from_config() dv = DataView() props = { 'start_date': 20170101, 'end_date': 20171030, 'universe':
basestring = str import numpy as np import pandas as pd import matplotlib as mpl mpl.use('Agg') import matplotlib.pyplot as plt from matplotlib.ticker import Formatter from jaqs.trade.analyze.report import Report from jaqs.data import RemoteDataService from jaqs.data.basic.instrument import InstManager from jaqs.trade import common import jaqs.util as jutil STATIC_FOLDER = jutil.join_relative_path("trade/analyze/static") TO_PCT = 100.0 MPL_RCPARAMS = {'figure.facecolor': '#F6F6F6', 'axes.facecolor': '#F6F6F6', 'axes.edgecolor': '#D3D3D3', 'text.color': '#555555', 'grid.color': '#B1B1B1', 'grid.alpha': 0.3, # scale 'axes.linewidth': 2.0, 'axes.titlepad': 12, 'grid.linewidth': 1.0, 'grid.linestyle': '-', # font size 'font.size': 13, 'axes.titlesize': 18,
""" import time from jaqs.data.dataservice import RemoteDataService from jaqs.trade.backtest import AlphaBacktestInstance from jaqs.trade.portfoliomanager import PortfolioManager import jaqs.util as jutil import jaqs.trade.analyze.analyze as ana from jaqs.trade.strategy import AlphaStrategy from jaqs.trade.tradegateway import AlphaTradeApi from jaqs.trade import model from jaqs.data.dataview import DataView dataview_dir_path = jutil.join_relative_path('../output/single_factor_weight/dataview') backtest_result_dir_path = jutil.join_relative_path('../output/single_factor_weight') def test_save_dataview(): ds = RemoteDataService() ds.init_from_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()
# encoding: utf-8 from jaqs.data.dataservice import RemoteDataService from jaqs.data.dataview import DataView import jaqs.util as jutil daily_path = jutil.join_relative_path('../output/tests/test_dataview_d') quarterly_path = jutil.join_relative_path('../output/tests/test_dataview_q') def test_write(): ds = RemoteDataService() ds.init_from_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:
import time import pandas as pd from jaqs.data.dataservice import RemoteDataService from jaqs.trade.backtest import AlphaBacktestInstance import jaqs.util as jutil from jaqs.trade.portfoliomanager import PortfolioManager import jaqs.trade.analyze.analyze as ana from jaqs.trade.strategy import AlphaStrategy from jaqs.trade.tradegateway import AlphaTradeApi from jaqs.trade import model from jaqs.data.dataview import DataView dataview_dir_path = jutil.join_relative_path( '../output/select_stocks_industry_head/dataview') backtest_result_dir_path = jutil.join_relative_path( '../output/select_stocks_industry_head') def test_save_dataview(): ds = RemoteDataService() ds.init_from_config() dv = DataView() props = { 'start_date': 20170101, 'end_date': 20171001, 'universe': '000300.SH', 'fields': ('float_mv,pb,pe_ttm,sw2'), 'freq': 1
# encoding: utf-8 import numpy as np import statsmodels.api as sm from jaqs.trade.strategy import EventDrivenStrategy from jaqs.trade import common, model from jaqs.data.dataservice import RemoteDataService from jaqs.trade.backtest import EventBacktestInstance from jaqs.trade.tradegateway import BacktestTradeApi from jaqs.trade.portfoliomanager import PortfolioManager import jaqs.util as jutil import jaqs.trade.analyze.analyze as ana result_dir_path = jutil.join_relative_path('../output/calendar_spread') class CalendarSpread(EventDrivenStrategy): def __init__(self): super(CalendarSpread, self).__init__() self.symbol = '' self.s1 = '' self.s2 = '' self.quote1 = None self.quote2 = None self.bufferSize = 0 self.bufferCount = 0 self.spreadList = ''
""" import time import pandas as pd import jaqs.trade.analyze.analyze as ana from jaqs.data.dataservice import RemoteDataService from jaqs.data.dataview import DataView from jaqs.trade import model from jaqs.trade.portfoliomanager import PortfolioManager from jaqs.trade.backtest import AlphaBacktestInstance from jaqs.trade.tradegateway import AlphaTradeApi from jaqs.trade.strategy import AlphaStrategy import jaqs.util as jutil dataview_dir_path = jutil.join_relative_path('../output/fama_french/dataview') backtest_result_dir_path = jutil.join_relative_path('../output/fama_french') def test_save_dataview(sub_folder='test_dataview'): ds = RemoteDataService() ds.init_from_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
basestring = str import numpy as np import pandas as pd import matplotlib as mpl mpl.use('Agg') import matplotlib.pyplot as plt from matplotlib.ticker import Formatter from jaqs.trade.analyze.report import Report from jaqs.data import RemoteDataService from jaqs.data.basic.instrument import InstManager from jaqs.trade import common import jaqs.util as jutil STATIC_FOLDER = jutil.join_relative_path("trade/analyze/static") TO_PCT = 100.0 MPL_RCPARAMS = { 'figure.facecolor': '#F6F6F6', 'axes.facecolor': '#F6F6F6', 'axes.edgecolor': '#D3D3D3', 'text.color': '#555555', 'grid.color': '#B1B1B1', 'grid.alpha': 0.3, # scale 'axes.linewidth': 2.0, 'axes.titlepad': 12, 'grid.linewidth': 1.0, 'grid.linestyle': '-', # font size 'font.size': 13,
# encoding: utf-8 import numpy as np from jaqs.trade.strategy import EventDrivenStrategy from jaqs.trade import common, model from jaqs.data.dataservice import RemoteDataService from jaqs.trade.backtest import EventBacktestInstance from jaqs.trade.tradegateway import BacktestTradeApi from jaqs.trade.portfoliomanager import PortfolioManager import jaqs.util as jutil import jaqs.trade.analyze.analyze as ana result_dir_path = jutil.join_relative_path('../output/dual_thrust') class DualThrust(EventDrivenStrategy): def __init__(self): super(DualThrust, self).__init__() self.symbol = '' self.quote = None self.bufferCount = 0 self.bufferSize = 0 self.high_list = [] self.close_list = [] self.low_list = [] self.open_list = [] self.k1 = 0.0 self.k2 = 0.0 self.pos = 0
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
import time import numpy as np from jaqs.trade import common from jaqs.trade.strategy import EventDrivenStrategy from jaqs.data.dataservice import RemoteDataService from jaqs.trade import model from jaqs.trade.realtime import EventRealTimeInstance from jaqs.trade.backtest import EventBacktestInstance from jaqs.trade.tradegateway import RealTimeTradeApi, BacktestTradeApi from jaqs.trade.portfoliomanager import PortfolioManager import jaqs.util as jutil import jaqs.trade.analyze.analyze as ana result_dir_path = jutil.join_relative_path('../output/double_ma') is_backtest = True class DoubleMaStrategy(EventDrivenStrategy): """""" def __init__(self): super(DoubleMaStrategy, self).__init__() self.symbol = '' self.fast_ma_len = 13 self.slow_ma_len = 23 self.window_count = 0 self.window = self.slow_ma_len + 1