Esempio n. 1
0
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()
Esempio n. 2
0
    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))
Esempio n. 3
0
    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
Esempio n. 4
0
    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,
        }
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
    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)
Esempio n. 10
0
    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)
Esempio n. 11
0
    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.")
Esempio n. 12
0
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"
Esempio n. 13
0
# 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}
Esempio n. 15
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
Esempio n. 16
0
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}
    
Esempio n. 17
0
# 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
Esempio n. 18
0
# 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