Esempio n. 1
0
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)
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 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()
Esempio n. 5
0
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()
Esempio n. 6
0
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
Esempio n. 7
0
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()
Esempio n. 8
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. 9
0
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)
Esempio n. 10
0
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])
Esempio n. 11
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. 12
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. 13
0
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')
Esempio n. 14
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. 15
0
# 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',
Esempio n. 16
0
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()
Esempio n. 17
0
# 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 = {}
Esempio n. 18
0
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
Esempio n. 19
0
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':
Esempio n. 20
0
    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,
Esempio n. 21
0
"""
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()
Esempio n. 22
0
# 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:
Esempio n. 23
0
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
Esempio n. 24
0
# 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 = ''
Esempio n. 25
0
"""
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
Esempio n. 26
0
    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,
Esempio n. 27
0
# 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
Esempio n. 28
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. 29
0
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