Skip to content

Commit f7c3d7a

Browse files
committed
Migrate RiceQuant integration code to new framework
1 parent 9332a13 commit f7c3d7a

File tree

9 files changed

+169
-123
lines changed

9 files changed

+169
-123
lines changed

README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ Mac/Linux
194194
- 修改策略代码,可参考如下示例:
195195

196196
- examples/ricequant/simple\_strategy.py - 基本用法
197+
- examples/ricequant/advanced\_strategy.py - 高级同步用法(非侵入式设计,推荐)
197198
- examples/ricequant/new\_stocks\_purchase.py - 新股申购
198199
- examples/ricequant/repo.py - 逆回购
199200

config/online-quant/research/shipane_sdk_config_template.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ managers:
134134
# 工作模式
135135
# 1. SYNC: 指按模拟交易的持仓进行同步
136136
# 2. FOLLOW:指按模拟交易的下单进行跟单
137+
# 目前米筐只支持 SYNC 模式
137138
mode: SYNC
138139
# 同步选项
139140
# 如果该策略无需同步操作,可以省略 sync 配置项
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import shipane_sdk
2+
3+
4+
def init(context):
5+
context.s1 = "000001.XSHE"
6+
7+
def before_trading(context):
8+
# 创建 RiceQuantStrategyManagerFactory 对象
9+
# 参数为 shipane_sdk_config_template.yaml 中配置的 manager id
10+
context.__manager = shipane_sdk.RiceQuantStrategyManagerFactory(context).create('manager-1')
11+
12+
def handle_bar(context, bar_dict):
13+
try:
14+
order_target_value(context.s1, 0)
15+
order_target_value(context.s1, 500)
16+
finally:
17+
# 放在 finally 块中,以防原有代码抛出异常或者 return
18+
# 在函数结尾处加入以下语句,用来将模拟盘同步至实盘
19+
g.__manager.work()

examples/ricequant/new_stocks_purchase.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,13 @@ def init(context):
1212

1313

1414
def before_trading(context):
15-
# 创建 RiceQuantExecutor 对象
16-
# 可选参数包括:host, port, key, client, timeout 等
17-
# 请将下面的 IP 替换为实际 IP
18-
context.__executor = shipane_sdk.RiceQuantExecutor(
19-
host='xxx.xxx.xxx.xxx',
20-
port=8888,
21-
key='',
22-
client=''
23-
)
15+
# 创建 RiceQuantStrategyManagerFactory 对象
16+
# 参数为 shipane_sdk_config_template.yaml 中配置的 manager id
17+
context.__manager = shipane_sdk.RiceQuantStrategyManagerFactory(context).create('manager-1')
2418

2519

2620
def purchase_new_stocks(context, bar_dict):
2721
if context.run_info.run_type == RUN_TYPE.PAPER_TRADING:
28-
context.__executor.purchase_new_stocks()
22+
context.__manager.purchase_new_stocks()
2923
else:
3024
logger.info('回测中不进行新股申购')

examples/ricequant/repo.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,9 @@ def initialize(context):
1212

1313

1414
def process_initialize(context):
15-
# 创建 RiceQuantExecutor 对象
16-
# 可选参数包括:host, port, key, client, timeout 等
17-
# 请将下面的 IP 替换为实际 IP
18-
g.__executor = shipane_sdk.RiceQuantExecutor(
19-
host='xxx.xxx.xxx.xxx',
20-
port=8888,
21-
key='',
22-
client=''
23-
)
15+
# 创建 RiceQuantStrategyManagerFactory 对象
16+
# 参数为 shipane_sdk_config_template.yaml 中配置的 manager id
17+
g.__manager = shipane_sdk.RiceQuantStrategyManagerFactory(context).create('manager-1')
2418

2519

2620
def repo(context):
@@ -34,6 +28,6 @@ def repo(context):
3428
'price': float(quote_df['bid'][0]),
3529
'amountProportion': 'ALL'
3630
}
37-
g.__executor.client.execute(**order)
31+
g.__manager.execute(**order)
3832
else:
3933
log.info('回测中不进行逆回购')
Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,22 @@
1-
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
21
import shipane_sdk
32

43

5-
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
64
def init(context):
75
context.s1 = "000001.XSHE"
8-
# 实时打印日志
9-
logger.info("Interested at stock: " + str(context.s1))
106

117
def before_trading(context):
12-
# 创建 RiceQuantExecutor 对象
13-
# 可选参数包括:host, port, key, client, timeout 等
14-
# 请将下面的 IP 替换为实际 IP
15-
context.__executor = shipane_sdk.RiceQuantExecutor(
16-
host='xxx.xxx.xxx.xxx',
17-
port=8888,
18-
key='',
19-
client=''
20-
)
8+
# 创建 RiceQuantStrategyManagerFactory 对象
9+
# 参数为 shipane_sdk_config_template.yaml 中配置的 manager id
10+
context.__manager = shipane_sdk.RiceQuantStrategyManagerFactory(context).create('manager-1')
2111

22-
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
2312
def handle_bar(context, bar_dict):
24-
# 开始编写你的主要的算法逻辑
13+
# 保存 order
14+
order_ = order_shares(context.s1, 100)
15+
# 实盘易依据 order_ 下单
16+
context.__manager.execute(order_)
2517

26-
# bar_dict[order_book_id] 可以拿到某个证券的bar信息
27-
# context.portfolio 可以拿到现在的投资组合状态信息
18+
order_ = order_shares(context.s1, -100)
19+
context.__manager.execute(order_)
2820

29-
# 使用order_shares(id_or_ins, amount)方法进行落单
30-
31-
# TODO: 开始编写你的算法吧!
32-
# 保存 order_id
33-
order_id = order_shares(context.s1, 100)
34-
# 实盘易依据 order_id 下单
35-
context.__executor.execute(order_id)
36-
37-
order_id = order_shares(context.s1, -100)
38-
context.__executor.execute(order_id)
39-
40-
cancel_order(order_id)
41-
context.__executor.cancel(order_id)
21+
cancel_order(order_)
22+
context.__manager.cancel(order_)

shipane_sdk/base_manager.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def __init__(self):
1313

1414
def create(self, id):
1515
traders = self._create_traders(id)
16-
return StrategyManager(id, self._create_logger(), self._config, traders)
16+
return StrategyManager(id, self._create_logger(), self._config, traders, self._get_context())
1717

1818
def _get_context(self):
1919
pass
@@ -60,6 +60,9 @@ def is_sim_trade(self):
6060
def is_backtest(self):
6161
pass
6262

63+
def is_read_file_allowed(self):
64+
return False
65+
6366

6467
class BaseLogger(object):
6568
def debug(self, msg, *args, **kwargs):
@@ -81,11 +84,12 @@ def exception(self, msg, *args, **kwargs):
8184
class StrategyManager(object):
8285
THEMATIC_BREAK = '-' * 50
8386

84-
def __init__(self, id, logger, config, traders):
87+
def __init__(self, id, logger, config, traders, strategy_context):
8588
self._id = id
8689
self._logger = logger
8790
self._config = config
8891
self._traders = traders
92+
self._strategy_context = strategy_context
8993

9094
@property
9195
def id(self):
@@ -130,6 +134,8 @@ def work(self):
130134
self._logger.info(self.THEMATIC_BREAK)
131135

132136
def _refresh(self):
137+
if not self._strategy_context.is_read_file_allowed():
138+
return
133139
self._config.reload()
134140
trader_configs = self._config.build_trader_configs(self._id)
135141
for id, trader in self._traders.items():
@@ -270,7 +276,7 @@ def _execute(self, order):
270276
if not self._should_run():
271277
self._logger.info("[%s] %s", self.id, order)
272278
return None
273-
actual_order = self._do_execute(order)
279+
actual_order = self._do_execute(order)
274280
return actual_order
275281

276282
def _cancel(self, order):
@@ -388,7 +394,7 @@ def data(self):
388394

389395
def reload(self):
390396
content = self._strategy_context.read_file('shipane_sdk_config.yaml')
391-
stream = six.StringIO(content)
397+
stream = six.BytesIO(content)
392398
self._data = yaml.load(stream, Loader=OrderedDictYAMLLoader)
393399
self._proxies = self._create_proxy_configs()
394400
stream.close()

shipane_sdk/joinquant/manager.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ def is_sim_trade(self):
8686
def is_backtest(self):
8787
return not self.is_sim_trade()
8888

89+
def is_read_file_allowed(self):
90+
return True
91+
8992
@staticmethod
9093
def _convert_position(quant_position):
9194
position = Position()

0 commit comments

Comments
 (0)