VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 19
声望: 18

参数优化一直都是vnpy之中最耗时的部分,普通的家用电脑,优化一些参数,可能需要好几天的时间,虽然有更新遗传算法使得参数优化的过程变得更快,单经常进入局部最优值一直都是困扰,也很难寻找到合适的参数平原。
所以增加CPU就成了比较好的解决方案,我们参考人工智能深度学习等利用多台机器并行运算的方式,对vnpy进行了改造,使得参数回测部分,可以做到分布式的,多台机器并行优化
这边使用的是Ray,非常的简单易用,只需要对参数优化的部分,进行简单改造即可 https://github.com/ray-project/ray
将 optimize 改成 optimize.remote,使用ray.get() 将结果从节点中取回

for setting in settings:
    result = optimize.remote(
        target_name,
        self.strategy_class,
        setting,
        self.vt_symbol,
        self.interval,
        self.start,
        self.rate,
        self.slippage,
        self.size,
        self.pricetick,
        self.capital,
        self.end,
        self.mode,
        self.inverse,
    )
    results.append(result)

# Sort results and output
result_values = [ray.get(result) for result in results]
result_values.sort(reverse=True, key=lambda result: result[1])

在optimize函数上方增加@ray.remote(max_calls=1),这里的max_calls是为了防止内存溢出,每运行一次函数,都会新建一个进程,回收资源

@ray.remote(max_calls=1)
def optimize(
    target_name: str,
    strategy_class: CtaTemplate,
    setting: dict,
    vt_symbol: str,
    interval: Interval,
    start: datetime,
    rate: float,
    slippage: float,
    size: float,
    pricetick: float,
    capital: int,
    end: datetime,
    mode: BacktestingMode,
    inverse: bool,
):
    ......

我们来看看效果
阿里云12核24G的服务器32台

↓↓↓↓↓

视频演示

下面还有图片演示

description

Member
avatar
加入于:
帖子: 1
声望: 0

远程机器 除了配置ray环境 还需要做什么吗

Member
avatar
加入于:
帖子: 24
声望: 1

阿里云12核24G的服务器32台。。。。豪!

Member
avatar
加入于:
帖子: 19
声望: 18

suphhh wrote:

远程机器 除了配置ray环境 还需要做什么吗

回测数据的共享是个小问题,如果从Master机器传输到Slave机器的话,数据量过大,几个G的流量;如果从Sql中读取的话,数据库启动瞬间就挂了,建议在Slave节点,预先部署好数据,用sqlit就可以了

Member
avatar
加入于:
帖子: 50
声望: 12

@丘 Slave需要安装VNPY吗?

Member
avatar
加入于:
帖子: 1
声望: 0

不错学习了

Member
avatar
加入于:
帖子: 152
声望: 4

这个太牛了。。

不过小白不会用啊,希望详细介绍一下,谢谢。

Member
avatar
加入于:
帖子: 19
声望: 18

修复了链接地址

Member
加入于:
帖子: 28
声望: 0

wrote:

参数优化一直都是vnpy之中最耗时的部分,普通的家用电脑,优化一些参数,可能需要好几天的时间,虽然有更新遗传算法使得参数优化的过程变得更快,单经常进入局部最优值一直都是困扰,也很难寻找到合适的参数平原。
所以增加CPU就成了比较好的解决方案,我们参考人工智能深度学习等利用多台机器并行运算的方式,对vnpy进行了改造,使得参数回测部分,可以做到分布式的,多台机器并行优化
这边使用的是Ray,非常的简单易用,只需要对参数优化的部分,进行简单改造即可 https://github.com/ray-project/ray
将 optimize 改成 optimize.remote,使用ray.get() 将结果从节点中取回

for setting in settings:
    result = optimize.remote(
        target_name,
        self.strategy_class,
        setting,
        self.vt_symbol,
        self.interval,
        self.start,
        self.rate,
        self.slippage,
        self.size,
        self.pricetick,
        self.capital,
        self.end,
        self.mode,
        self.inverse,
    )
    results.append(result)

# Sort results and output
result_values = [ray.get(result) for result in results]
result_values.sort(reverse=True, key=lambda result: result[1])

在optimize函数上方增加@ray.remote(max_calls=1),这里的max_calls是为了防止内存溢出,每运行一次函数,都会新建一个进程,回收资源

@ray.remote(max_calls=1)
def optimize(
    target_name: str,
    strategy_class: CtaTemplate,
    setting: dict,
    vt_symbol: str,
    interval: Interval,
    start: datetime,
    rate: float,
    slippage: float,
    size: float,
    pricetick: float,
    capital: int,
    end: datetime,
    mode: BacktestingMode,
    inverse: bool,
):
    ......

我们来看看效果
阿里云12核24G的服务器32台

↓↓↓↓↓

视频演示

下面还有图片演示

description
请教下,RAY的head和node都部署虚好,连接正常,但是运行中提示

(pid=11056) 2021-05-20 18:14:50,716     ERROR serialization.py:248 -- No module named 'Test_strategy'
(pid=11056) Traceback (most recent call last):
(pid=11056)   File "/home/ubuntu/anaconda3/envs/lib/python3.7/site-packages/ray/serialization.py", line 246, in deserialize_objects
(pid=11056)     obj = self._deserialize_object(data, metadata, object_ref)
(pid=11056)   File "/home/ubuntu/anaconda3/envs/lib/python3.7/site-packages/ray/serialization.py", line 188, in _deserialize_object
(pid=11056)     return self._deserialize_msgpack_data(data, metadata_fields)
(pid=11056)   File "/home/ubuntu/anaconda3/envs/lib/python3.7/site-packages/ray/serialization.py", line 166, in _deserialize_msgpack_data
(pid=11056)     python_objects = self._deserialize_pickle5_data(pickle5_data)
(pid=11056)   File "/home/ubuntu/anaconda3/envs/lib/python3.7/site-packages/ray/serialization.py", line 156, in _deserialize_pickle5_data
(pid=11056)     obj = pickle.loads(in_band)
(pid=11056) ModuleNotFoundError: No module named 'Test_strategy'

这个策略是如何传到node节点的呢

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】