diff --git a/hikyuu/__init__.py b/hikyuu/__init__.py index 3bcbd5fe..3a8a32d8 100644 --- a/hikyuu/__init__.py +++ b/hikyuu/__init__.py @@ -57,6 +57,7 @@ from .extend import * from .deprecated import * from .indicator import * from .trade_manage import * +from .trade_sys import * __version__ = get_version() diff --git a/hikyuu/trade_manage/trade.py b/hikyuu/trade_manage/trade.py index 008daf66..e4646aa7 100644 --- a/hikyuu/trade_manage/trade.py +++ b/hikyuu/trade_manage/trade.py @@ -30,9 +30,8 @@ #=============================================================================== #TradeManager.buy等方法默认参数使用了Part,这里必须先导入,否则报初始化错误 -from hikyuu import Datetime, Query, QueryByDate, StockManager, System +from hikyuu import Datetime, Query, QueryByDate, StockManager, System, getSystemPartName from hikyuu.util.slice import list_getitem -from hikyuu.trade_sys.system import getSystemPartName BUSINESS.INIT = BUSINESS.BUSINESS_INIT BUSINESS.BUY = BUSINESS.BUSINESS_BUY diff --git a/hikyuu/trade_sys/__init__.py b/hikyuu/trade_sys/__init__.py index fd64cee6..cffa790a 100644 --- a/hikyuu/trade_sys/__init__.py +++ b/hikyuu/trade_sys/__init__.py @@ -24,8 +24,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. - -__all__ = ['system', 'environment', 'condition', 'moneymanager', 'signal', - 'stoploss', 'profitgoal', 'slippage', 'selector', 'portfolio', - 'allocatefunds'] - +from .trade_sys import * diff --git a/hikyuu/trade_sys/allocatefunds.py b/hikyuu/trade_sys/allocatefunds.py deleted file mode 100644 index a00aaa50..00000000 --- a/hikyuu/trade_sys/allocatefunds.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import (AllocateFundsBase, SystemWeight, SystemWeightList, AF_EqualWeight) -from hikyuu.util.slice import list_getitem - -SystemWeightList.__getitem__ = list_getitem - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -#------------------------------------------------------------------ -# add doc-string for build_in func -#------------------------------------------------------------------ diff --git a/hikyuu/trade_sys/condition.py b/hikyuu/trade_sys/condition.py deleted file mode 100644 index dadcca16..00000000 --- a/hikyuu/trade_sys/condition.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import ConditionBase, CN_OPLine - - -def cn_init(self, name, params): - super(self.__class__, self).__init__(name) - self._name = name - self._params = params - for k, v in params.items(): - self.setParam(k, v) - - -def crtCN(func, params={}, name='crtCN'): - """ - 快速创建自定义不带私有属性的系统有效条件 - - :param func: 系统有效条件函数 - :param {} params: 参数字典 - :param str name: 自定义名称 - :return: 自定义系统有效条件实例 - """ - meta_x = type(name, (ConditionBase, ), {'__init__': cn_init}) - meta_x._clone = lambda self: meta_x(self._name, self._params) - meta_x._calculate = func - return meta_x(name, params) - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -ConditionBase.__init__.__doc__ = """ -__init__(self[, name="ConditionBase"]) - - 初始化构造函数 - - :param str name: 名称 -""" diff --git a/hikyuu/trade_sys/environment.py b/hikyuu/trade_sys/environment.py deleted file mode 100644 index 867ba5b4..00000000 --- a/hikyuu/trade_sys/environment.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import EnvironmentBase, EV_TwoLine - - -def ev_init(self, name, params): - super(self.__class__, self).__init__(name) - self._name = name - self._params = params - for k, v in params.items(): - self.setParam(k, v) - - -def crtEV(func, params={}, name='crtEV'): - """ - 快速创建自定义不带私有属性的市场环境判断策略 - - :param func: 市场环境判断策略函数 - :param {} params: 参数字典 - :param str name: 自定义名称 - :return: 自定义市场环境判断策略实例 - """ - meta_x = type(name, (EnvironmentBase, ), {'__init__': ev_init}) - meta_x._clone = lambda self: meta_x(self._name, self._params) - meta_x._calculate = func - return meta_x(name, params) - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -EnvironmentBase.__init__.__doc__ = """ -__init__(self[, name='EnvironmentBase']) - - 初始化构造函数 - - :param str name: 名称 -""" diff --git a/hikyuu/trade_sys/moneymanager.py b/hikyuu/trade_sys/moneymanager.py deleted file mode 100644 index cda80454..00000000 --- a/hikyuu/trade_sys/moneymanager.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import ( - MoneyManagerBase, MM_Nothing, MM_FixedRisk, MM_FixedCapital, MM_FixedCount, MM_FixedPercent, - MM_FixedUnits, MM_WilliamsFixedRisk -) - - -def mm_init(self, name, params): - super(self.__class__, self).__init__(name) - self._name = name - self._params = params - for k, v in params.items(): - self.setParam(k, v) - - -def crtMM(func, params={}, name='crtMM'): - """ - 快速创建自定义不带私有属性的资金管理策略 - - :param func: 资金管理策略计算函数 - :param {} params: 参数字典 - :param str name: 自定义名称 - :return: 自定义资金管理策略实例 - """ - meta_x = type(name, (MoneyManagerBase, ), {'__init__': mm_init}) - meta_x._clone = lambda self: meta_x(self._name, self._params) - meta_x._calculate = func - return meta_x(name, params) - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -MoneyManagerBase.__init__.__doc__ = """ -__init__(self[, name="MoneyManagerBase]) - - 初始化构造函数 - - :param str name: 名称 -""" diff --git a/hikyuu/trade_sys/portfolio.py b/hikyuu/trade_sys/portfolio.py deleted file mode 100644 index 6000e70a..00000000 --- a/hikyuu/trade_sys/portfolio.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import (Portfolio, PF_Simple) - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -Portfolio.__doc__ = """实现多标的、多策略的投资组合""" - -Portfolio.name.__doc__ = """名称""" - -Portfolio.tm.__doc__ = """关联的交易管理实例""" - -Portfolio.se.__doc__ = """选择器策略""" - -Portfolio.run.__doc__ = """ -run(self, query) - - 运行投资组合策略 - - :param Query query: 查询条件 -""" - -#------------------------------------------------------------------ -# add doc-string for build_in func -#------------------------------------------------------------------ - -PF_Simple.__doc__ = """ -PF_Simple([tm, sys, se]) - - 创建一个多标的、单系统策略的投资组合 - - :param TradeManager tm: 交易管理 - :param System sys: 系统策略 - :param SelectorBase se: 选择器 -""" diff --git a/hikyuu/trade_sys/profitgoal.py b/hikyuu/trade_sys/profitgoal.py deleted file mode 100644 index 41cba4c7..00000000 --- a/hikyuu/trade_sys/profitgoal.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import (ProfitGoalBase, PG_NoGoal, PG_FixedPercent, PG_FixedHoldDays) - - -def pg_init(self, name, params): - super(self.__class__, self).__init__(name) - self._name = name - self._params = params - for k, v in params.items(): - self.setParam(k, v) - - -def crtPG(func, params={}, name='crtPG'): - """ - 快速创建自定义不带私有属性的盈利目标策略 - - :param func: 盈利目标策略函数 - :param {} params: 参数字典 - :param str name: 自定义名称 - :return: 盈利目标策略实例 - """ - meta_x = type(name, (ProfitGoalBase, ), {'__init__': pg_init}) - meta_x._clone = lambda self: meta_x(self._name, self._params) - meta_x._calculate = func - return meta_x(name, params) - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -ProfitGoalBase.__init__.__doc__ = """ -__init__(self[, name="ProfitGoalBase"]) - - 初始化构造函数 - - :param str name: 名称 -""" diff --git a/hikyuu/trade_sys/selector.py b/hikyuu/trade_sys/selector.py deleted file mode 100644 index 3137a6a9..00000000 --- a/hikyuu/trade_sys/selector.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import (SelectorBase, SE_Fixed) - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -SelectorBase.__doc__ = """ -选择器策略基类,实现标的、系统策略的评估和选取算法 - -公共参数: - - freq (int | 1) 变化频度,选股的变化周期,以Bar为单位 - -自定义选择器策略接口: - - SelectorBase.getSelectedSystemList - 【必须】获取指定时刻选择的系统实例列表 - SelectorBase._reset - 【可选】重置私有属性 - SelectorBase._clone - 【必须】克隆接口 -""" - -SelectorBase.name.__doc__ = """名称""" - -SelectorBase.__init__.__doc__ = """ -__init__(self[, name="SelectorBase]) - - 初始化构造函数 - - :param str name: 名称 -""" - -SelectorBase.getParam.__doc__ = """ -getParam(self, name) - - 获取指定的参数 - - :param str name: 参数名称 - :return: 参数值 - :raises out_of_range: 无此参数 -""" - -SelectorBase.setParam.__doc__ = """ -setParam(self, name, value) - - 设置参数 - - :param str name: 参数名称 - :param value: 参数值 - :type value: int | bool | float | string - :raises logic_error: Unsupported type! 不支持的参数类型 -""" - -SelectorBase.addStock.__doc__ = """ -addStock(self, stock, sys) - - 加入初始标的及其对应的系统策略原型 - - :param Stock stock: 加入的初始标的 - :param System sys: 系统策略原型 -""" - -SelectorBase.addStockList.__doc__ = """ -addStockList(self, stk_list, sys) - - 加入初始标的列表及其系统策略原型 - - :param StockList stk_list: 加入的初始标的列表 - :param System sys: 系统策略原型 -""" - -SelectorBase.clear.__doc__ = """ -clear(self) - - 清除已加入的所有交易系统实例 -""" - -SelectorBase.getSelectedSystemList.__doc__ = """ -getSelectedSystemList(self, datetime) - - 【重载接口】获取指定时刻选取的标的及其权重 - - :param Datetime datetime: 指定时刻 - :return: 选取的系统交易实例列表 - :rtype: SystemList -""" - -SelectorBase._reset.__doc__ = """ -_reset(self) - - 【重载接口】子类复位接口,复位内部私有变量 -""" - -SelectorBase._clone.__doc__ = """ -_clone(self) - - 【重载接口】子类克隆接口 -""" - -#------------------------------------------------------------------ -# add doc-string for build_in func -#------------------------------------------------------------------ - -SE_Fixed.__doc__ = """ -SE_Fixed([stocklist, sys]) - - 固定选择器,即始终选择初始划定的标的及其系统策略原型 - - :param StockList stocklist: 初始划定的标的 - :param System sys: 系统策略原型 - :return: SE选择器实例 -""" diff --git a/hikyuu/trade_sys/signal.py b/hikyuu/trade_sys/signal.py deleted file mode 100644 index d773babd..00000000 --- a/hikyuu/trade_sys/signal.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import ( - SignalBase, SG_Bool, SG_Single, SG_Single2, SG_Cross, SG_CrossGold, SG_Flex -) - - -def sig_init(self, name, params): - super(self.__class__, self).__init__(name) - self._name = name - self._params = params - for k, v in params.items(): - self.setParam(k, v) - - -def crtSG(func, params={}, name='crtSG'): - """ - 快速创建自定义不带私有属性的信号指示器 - - :param func: 信号策略函数 - :param {} params: 参数字典 - :param str name: 自定义名称 - :return: 自定义信号指示器实例 - """ - meta_x = type(name, (SignalBase, ), {'__init__': sig_init}) - meta_x._clone = lambda self: meta_x(self._name, self._params) - meta_x._calculate = func - return meta_x(name, params) - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -SignalBase.__init__.__doc__ = """ -__init__(self[, name="SignalBase"]) - - :param str name: 名称 -""" diff --git a/hikyuu/trade_sys/slippage.py b/hikyuu/trade_sys/slippage.py deleted file mode 100644 index 6ebb047e..00000000 --- a/hikyuu/trade_sys/slippage.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import (SlippageBase, SL_FixedPercent, SL_FixedValue) - - -def sl_init(self, name, params): - super(self.__class__, self).__init__(name) - self._name = name - self._params = params - for k, v in params.items(): - self.setParam(k, v) - - -def crtSL(func, params={}, name='crtSL'): - """ - 快速创建自定义不带私有属性的移滑价差算法 - - :param func: 移滑价差算法函数 - :param {} params: 参数字典 - :param str name: 自定义名称 - :return: 移滑价差算法实例 - """ - meta_x = type(name, (SlippageBase, ), {'__init__': sl_init}) - meta_x._clone = lambda self: meta_x(self._name, self._params) - meta_x._calculate = func - return meta_x(name, params) - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -SlippageBase.__init__.__doc__ = """ -__init__(self[, name="SlippageBase"]) - - 初始化构造函数 - - :param str name: 名称 -""" diff --git a/hikyuu/trade_sys/stoploss.py b/hikyuu/trade_sys/stoploss.py deleted file mode 100644 index d37f9f98..00000000 --- a/hikyuu/trade_sys/stoploss.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import hikyuu.cpp.core as csys - -StoplossBase = csys.StoplossBase - -ST_FixedPercent = csys.ST_FixedPercent -ST_Indicator = csys.ST_Indicator -ST_Saftyloss = csys.ST_Saftyloss - - -def st_init(self, name, params): - super(self.__class__, self).__init__(name) - self._name = name - self._params = params - for k, v in params.items(): - self.setParam(k, v) - - -def crtST(func, params={}, name='crtST'): - """ - 快速创建自定义不带私有属性的止损/止盈策略 - - :param func: 止损/止盈策略函数 - :param {} params: 参数字典 - :param str name: 自定义名称 - :return: 止损/止盈策略实例 - """ - meta_x = type(name, (StoplossBase, ), {'__init__': st_init}) - meta_x._clone = lambda self: meta_x(self._name, self._params) - meta_x._calculate = func - return meta_x(name, params) - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -StoplossBase.__init__.__doc__ = """ -__init__(self[, name="StoplossBase"]) - - :param str name: 名称 -""" diff --git a/hikyuu/trade_sys/system.py b/hikyuu/trade_sys/system.py deleted file mode 100644 index f7d0b20a..00000000 --- a/hikyuu/trade_sys/system.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf8 -*- -# cp936 -# -# The MIT License (MIT) -# -# Copyright (c) 2010-2017 fasiondog -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hikyuu.cpp.core import (System, SystemList, getSystemPartName, getSystemPartEnum, TradeRequest) -from hikyuu.cpp.core import SYS_Simple as cpp_SYS_Simple -from hikyuu.util.slice import list_getitem - -System.ENVIRONMENT = System.Part.ENVIRONMENT -System.CONDITION = System.Part.CONDITION -System.SIGNAL = System.Part.SIGNAL -System.STOPLOSS = System.Part.STOPLOSS -System.TAKEPROFIT = System.Part.TAKEPROFIT -System.MONEYMANAGER = System.Part.MONEYMANAGER -System.PROFITGOAL = System.Part.PROFITGOAL -System.SLIPPAGE = System.Part.SLIPPAGE -System.INVALID = System.Part.INVALID - -SystemList.__getitem__ = list_getitem -SystemList.__str__ = lambda self: str(list(self)) -SystemList.__repr__ = lambda self: repr(list(self)) - -#SystemPart = System.Part - - -def SYS_Simple(tm=None, mm=None, ev=None, cn=None, sg=None, st=None, tp=None, pg=None, sp=None): - """ - 创建简单系统实例(每次交易不进行多次加仓或减仓,即每次买入后在卖出时全部卖出), - 系统实例在运行时(调用run方法),至少需要一个配套的交易管理实例、一个资金管理策略 - 和一个信号指示器),可以在创建系统实例后进行指定。如果出现调用run时没有任何输出, - 且没有正确结果的时候,可能是未设置tm、sg、mm。进行回测时,使用 run 方法,如:: - - #创建模拟交易账户进行回测,初始资金30万 - my_tm = crtTM(initCash = 300000) - - #创建信号指示器(以5日EMA为快线,5日EMA自身的10日EMA最为慢线,快线向上穿越 - #慢线时买入,反之卖出) - my_sg = SG_Flex(OP(EMA(n=5)), slow_n=10) - - #固定每次买入1000股 - my_mm = MM_FixedCount(1000) - - #创建交易系统并运行 - sys = SYS_Simple(tm = my_tm, sg = my_sg, mm = my_mm) - sys.run(sm['sz000001'], Query(-150)) - - :param TradeManager tm: 交易管理实例 - :param MoneyManager mm: 资金管理策略 - :param EnvironmentBase ev: 市场环境判断策略 - :param ConditionBase cn: 系统有效条件 - :param SignalBase sg: 信号指示器 - :param StoplossBase st: 止损策略 - :param StoplossBase tp: 止盈策略 - :param ProfitGoalBase pg: 盈利目标策略 - :param SlippageBase sp: 移滑价差算法 - :return: system实例 - """ - sys_ins = cpp_SYS_Simple() - if tm: - sys_ins.tm = tm - if mm: - sys_ins.mm = mm - if ev: - sys_ins.ev = ev - if cn: - sys_ins.cn = cn - if sg: - sys_ins.sg = sg - if st: - sys_ins.st = st - if tp: - sys_ins.tp = tp - if pg: - sys_ins.pg = pg - if sp: - sys_ins.sp = sp - return sys_ins - - -#------------------------------------------------------------------ -# add doc-string -#------------------------------------------------------------------ - -System.Part.__doc__ = """ -系统部件枚举值,系统的买入/卖出等操作可由这些部件触发,用于标识实际交易指令的来源, -参见::py:class:`TradeRecord`。 - -实际使用中,可使用 System.ENVIRONMENT 的简化方式 代替 System.Part.ENVIRONMENT, -其他与此类似。 - -- System.Part.ENVIRONMENT - 市场环境判断策略 -- System.Part.CONDITION - 系统有效条件 -- System.Part.SIGNAL - 信号指示器 -- System.Part.STOPLOSS - 止损策略 -- System.Part.TAKEPROFIT - 止盈策略 -- System.Part.MONEYMANAGER - 资金管理策略 -- System.Part.PROFITGOAL - 盈利目标策略 -- System.Part.SLIPPAGE - 移滑价差算法 -- System.Part.INVALID - 无效值边界,大于等于该值时为无效部件 -""" diff --git a/hikyuu/trade_sys/trade_sys.py b/hikyuu/trade_sys/trade_sys.py new file mode 100644 index 00000000..ecc05d30 --- /dev/null +++ b/hikyuu/trade_sys/trade_sys.py @@ -0,0 +1,366 @@ +# -*- coding: utf8 -*- + +from hikyuu.util.slice import list_getitem +from hikyuu.cpp.core import SYS_Simple as cpp_SYS_Simple +from hikyuu.cpp.core import ( + System, SystemList, SystemWeight, SystemWeightList, ConditionBase, EnvironmentBase, + MoneyManagerBase, ProfitGoalBase, SelectorBase, SignalBase, SlippageBase, StoplossBase +) + +#------------------------------------------------------------------ +# System +#------------------------------------------------------------------ + +System.Part.__doc__ = """ +系统部件枚举值,系统的买入/卖出等操作可由这些部件触发,用于标识实际交易指令的来源, +参见::py:class:`TradeRecord`。 + +实际使用中,可使用 System.ENVIRONMENT 的简化方式 代替 System.Part.ENVIRONMENT, +其他与此类似。 + +- System.Part.ENVIRONMENT - 市场环境判断策略 +- System.Part.CONDITION - 系统有效条件 +- System.Part.SIGNAL - 信号指示器 +- System.Part.STOPLOSS - 止损策略 +- System.Part.TAKEPROFIT - 止盈策略 +- System.Part.MONEYMANAGER - 资金管理策略 +- System.Part.PROFITGOAL - 盈利目标策略 +- System.Part.SLIPPAGE - 移滑价差算法 +- System.Part.INVALID - 无效值边界,大于等于该值时为无效部件 +""" + +System.ENVIRONMENT = System.Part.ENVIRONMENT +System.CONDITION = System.Part.CONDITION +System.SIGNAL = System.Part.SIGNAL +System.STOPLOSS = System.Part.STOPLOSS +System.TAKEPROFIT = System.Part.TAKEPROFIT +System.MONEYMANAGER = System.Part.MONEYMANAGER +System.PROFITGOAL = System.Part.PROFITGOAL +System.SLIPPAGE = System.Part.SLIPPAGE +System.INVALID = System.Part.INVALID + +SystemList.__getitem__ = list_getitem +SystemList.__str__ = lambda self: str(list(self)) +SystemList.__repr__ = lambda self: repr(list(self)) + + +def SYS_Simple(tm=None, mm=None, ev=None, cn=None, sg=None, st=None, tp=None, pg=None, sp=None): + """ + 创建简单系统实例(每次交易不进行多次加仓或减仓,即每次买入后在卖出时全部卖出), + 系统实例在运行时(调用run方法),至少需要一个配套的交易管理实例、一个资金管理策略 + 和一个信号指示器),可以在创建系统实例后进行指定。如果出现调用run时没有任何输出, + 且没有正确结果的时候,可能是未设置tm、sg、mm。进行回测时,使用 run 方法,如:: + + #创建模拟交易账户进行回测,初始资金30万 + my_tm = crtTM(initCash = 300000) + + #创建信号指示器(以5日EMA为快线,5日EMA自身的10日EMA最为慢线,快线向上穿越 + #慢线时买入,反之卖出) + my_sg = SG_Flex(OP(EMA(n=5)), slow_n=10) + + #固定每次买入1000股 + my_mm = MM_FixedCount(1000) + + #创建交易系统并运行 + sys = SYS_Simple(tm = my_tm, sg = my_sg, mm = my_mm) + sys.run(sm['sz000001'], Query(-150)) + + :param TradeManager tm: 交易管理实例 + :param MoneyManager mm: 资金管理策略 + :param EnvironmentBase ev: 市场环境判断策略 + :param ConditionBase cn: 系统有效条件 + :param SignalBase sg: 信号指示器 + :param StoplossBase st: 止损策略 + :param StoplossBase tp: 止盈策略 + :param ProfitGoalBase pg: 盈利目标策略 + :param SlippageBase sp: 移滑价差算法 + :return: system实例 + """ + sys_ins = cpp_SYS_Simple() + if tm: + sys_ins.tm = tm + if mm: + sys_ins.mm = mm + if ev: + sys_ins.ev = ev + if cn: + sys_ins.cn = cn + if sg: + sys_ins.sg = sg + if st: + sys_ins.st = st + if tp: + sys_ins.tp = tp + if pg: + sys_ins.pg = pg + if sp: + sys_ins.sp = sp + return sys_ins + + +#------------------------------------------------------------------ +# allocatefunds +#------------------------------------------------------------------ + +SystemWeightList.__getitem__ = list_getitem +SystemWeightList.__str__ = lambda self: str(list(self)) +SystemWeightList.__repr__ = lambda self: repr(list(self)) + +#------------------------------------------------------------------ +# condition +#------------------------------------------------------------------ + +ConditionBase.__init__.__doc__ = """ +__init__(self[, name="ConditionBase"]) + + 初始化构造函数 + + :param str name: 名称 +""" + + +def cn_init(self, name, params): + super(self.__class__, self).__init__(name) + self._name = name + self._params = params + for k, v in params.items(): + self.setParam(k, v) + + +def crtCN(func, params={}, name='crtCN'): + """ + 快速创建自定义不带私有属性的系统有效条件 + + :param func: 系统有效条件函数 + :param {} params: 参数字典 + :param str name: 自定义名称 + :return: 自定义系统有效条件实例 + """ + meta_x = type(name, (ConditionBase, ), {'__init__': cn_init}) + meta_x._clone = lambda self: meta_x(self._name, self._params) + meta_x._calculate = func + return meta_x(name, params) + + +#------------------------------------------------------------------ +# environment +#------------------------------------------------------------------ + +EnvironmentBase.__init__.__doc__ = """ +__init__(self[, name='EnvironmentBase']) + + 初始化构造函数 + + :param str name: 名称 +""" + + +def ev_init(self, name, params): + super(self.__class__, self).__init__(name) + self._name = name + self._params = params + for k, v in params.items(): + self.setParam(k, v) + + +def crtEV(func, params={}, name='crtEV'): + """ + 快速创建自定义不带私有属性的市场环境判断策略 + + :param func: 市场环境判断策略函数 + :param {} params: 参数字典 + :param str name: 自定义名称 + :return: 自定义市场环境判断策略实例 + """ + meta_x = type(name, (EnvironmentBase, ), {'__init__': ev_init}) + meta_x._clone = lambda self: meta_x(self._name, self._params) + meta_x._calculate = func + return meta_x(name, params) + + +#------------------------------------------------------------------ +# moneymanager +#------------------------------------------------------------------ + +MoneyManagerBase.__init__.__doc__ = """ +__init__(self[, name="MoneyManagerBase]) + + 初始化构造函数 + + :param str name: 名称 +""" + + +def mm_init(self, name, params): + super(self.__class__, self).__init__(name) + self._name = name + self._params = params + for k, v in params.items(): + self.setParam(k, v) + + +def crtMM(func, params={}, name='crtMM'): + """ + 快速创建自定义不带私有属性的资金管理策略 + + :param func: 资金管理策略计算函数 + :param {} params: 参数字典 + :param str name: 自定义名称 + :return: 自定义资金管理策略实例 + """ + meta_x = type(name, (MoneyManagerBase, ), {'__init__': mm_init}) + meta_x._clone = lambda self: meta_x(self._name, self._params) + meta_x._calculate = func + return meta_x(name, params) + + +#------------------------------------------------------------------ +# profitgoal +#------------------------------------------------------------------ + +ProfitGoalBase.__init__.__doc__ = """ +__init__(self[, name="ProfitGoalBase"]) + + 初始化构造函数 + + :param str name: 名称 +""" + + +def pg_init(self, name, params): + super(self.__class__, self).__init__(name) + self._name = name + self._params = params + for k, v in params.items(): + self.setParam(k, v) + + +def crtPG(func, params={}, name='crtPG'): + """ + 快速创建自定义不带私有属性的盈利目标策略 + + :param func: 盈利目标策略函数 + :param {} params: 参数字典 + :param str name: 自定义名称 + :return: 盈利目标策略实例 + """ + meta_x = type(name, (ProfitGoalBase, ), {'__init__': pg_init}) + meta_x._clone = lambda self: meta_x(self._name, self._params) + meta_x._calculate = func + return meta_x(name, params) + + +#------------------------------------------------------------------ +# selector +#------------------------------------------------------------------ + +SelectorBase.__init__.__doc__ = """ +__init__(self[, name="SelectorBase]) + + 初始化构造函数 + + :param str name: 名称 +""" + +#------------------------------------------------------------------ +# signal +#------------------------------------------------------------------ + +SignalBase.__init__.__doc__ = """ +__init__(self[, name="SignalBase"]) + + :param str name: 名称 +""" + + +def sig_init(self, name, params): + super(self.__class__, self).__init__(name) + self._name = name + self._params = params + for k, v in params.items(): + self.setParam(k, v) + + +def crtSG(func, params={}, name='crtSG'): + """ + 快速创建自定义不带私有属性的信号指示器 + + :param func: 信号策略函数 + :param {} params: 参数字典 + :param str name: 自定义名称 + :return: 自定义信号指示器实例 + """ + meta_x = type(name, (SignalBase, ), {'__init__': sig_init}) + meta_x._clone = lambda self: meta_x(self._name, self._params) + meta_x._calculate = func + return meta_x(name, params) + + +#------------------------------------------------------------------ +# slippage +#------------------------------------------------------------------ + +SlippageBase.__init__.__doc__ = """ +__init__(self[, name="SlippageBase"]) + + 初始化构造函数 + + :param str name: 名称 +""" + + +def sl_init(self, name, params): + super(self.__class__, self).__init__(name) + self._name = name + self._params = params + for k, v in params.items(): + self.setParam(k, v) + + +def crtSL(func, params={}, name='crtSL'): + """ + 快速创建自定义不带私有属性的移滑价差算法 + + :param func: 移滑价差算法函数 + :param {} params: 参数字典 + :param str name: 自定义名称 + :return: 移滑价差算法实例 + """ + meta_x = type(name, (SlippageBase, ), {'__init__': sl_init}) + meta_x._clone = lambda self: meta_x(self._name, self._params) + meta_x._calculate = func + return meta_x(name, params) + + +#------------------------------------------------------------------ +# stoploss +#------------------------------------------------------------------ + +StoplossBase.__init__.__doc__ = """ +__init__(self[, name="StoplossBase"]) + + :param str name: 名称 +""" + + +def st_init(self, name, params): + super(self.__class__, self).__init__(name) + self._name = name + self._params = params + for k, v in params.items(): + self.setParam(k, v) + + +def crtST(func, params={}, name='crtST'): + """ + 快速创建自定义不带私有属性的止损/止盈策略 + + :param func: 止损/止盈策略函数 + :param {} params: 参数字典 + :param str name: 自定义名称 + :return: 止损/止盈策略实例 + """ + meta_x = type(name, (StoplossBase, ), {'__init__': st_init}) + meta_x._clone = lambda self: meta_x(self._name, self._params) + meta_x._calculate = func + return meta_x(name, params) diff --git a/hikyuu_pywrap/trade_sys/_Portfolio.cpp b/hikyuu_pywrap/trade_sys/_Portfolio.cpp index 2f94b941..449c38d3 100644 --- a/hikyuu_pywrap/trade_sys/_Portfolio.cpp +++ b/hikyuu_pywrap/trade_sys/_Portfolio.cpp @@ -7,21 +7,22 @@ #include #include +#include +#include #include "../_Parameter.h" #include "../pickle_support.h" using namespace boost::python; using namespace hku; -BOOST_PYTHON_FUNCTION_OVERLOADS(PF_Simple_overload, PF_Simple, 0, 3); - void (Portfolio::*pf_set_name)(const string&) = &Portfolio::name; const string& (Portfolio::*pf_get_name)() const = &Portfolio::name; void export_Portfolio() { - class_("Portfolio", init<>()) + class_("Portfolio", R"(实现多标的、多策略的投资组合)", init<>()) .def(init()) .def(init()) + .def(self_ns::str(self)) .def(self_ns::repr(self)) @@ -30,10 +31,16 @@ void export_Portfolio() { .def("have_param", &Portfolio::haveParam) .add_property("name", make_function(pf_get_name, return_value_policy()), - pf_set_name) - .add_property("tm", &Portfolio::getTM, &Portfolio::setTM) - .add_property("se", &Portfolio::getSE, &Portfolio::setSE) - .def("run", &Portfolio::run) + pf_set_name, "名称") + .add_property("tm", &Portfolio::getTM, &Portfolio::setTM, "设置或获取交易管理对象") + .add_property("se", &Portfolio::getSE, &Portfolio::setSE, "设置或获取交易对象选择算法") + + .def("run", &Portfolio::run, R"(run(self, query) + + 运行投资组合策略 + + :param Query query: 查询条件)") + #if HKU_PYTHON_SUPPORT_PICKLE .def_pickle(name_init_pickle_suite()) #endif @@ -41,5 +48,13 @@ void export_Portfolio() { register_ptr_to_python(); - def("PF_Simple", PF_Simple, PF_Simple_overload()); + def("PF_Simple", PF_Simple, + (arg("tm") = TradeManagerPtr(), arg("se") = SE_Fixed(), arg("af") = AF_EqualWeight()), + R"(PF_Simple([tm, sys, se]) + + 创建一个多标的、单系统策略的投资组合 + + :param TradeManager tm: 交易管理 + :param System sys: 系统策略 + :param SelectorBase se: 选择器)"); }