年化收益19.3%, 最大回撤率:-18.32​%。

基于pybroker实现的“创业板-择时策略”,策略代码在这个notebook里,

图片

首先加载数据——这里可以加载多个symbols,

from datafeed.dataloader import CSVDataloader
df = CSVDataloader.get_df(['000300.SH', #沪深300
'000905.SH', #创业板
'159915.SZ'
])
df

得到如下数据:

图片

自定义一个指标,这里我们没有使用pandas的函数,而是使用numba来加速。

这里需要说明的是ctx里的数据,已经是按symbol,group_by之后的结果,因此可以直接使用。

import talib
import pybroker
import numpy as np
from numba import njit

def roc_N(bar_data, lookback):

    @njit  # Enable Numba JIT.
    def vec_roc(values):
        # Initialize the result array.
        n = len(values)
        out = np.array([np.nan for _ in range(n)])

        for i in range(lookback, n):
            out[i] = values[i]/values[i-lookback] -1
        return out

    # Calculate with close prices.
    return vec_roc(bar_data.close)

这里的指标,还有更简洁的实现方式,调用talib:

roc_20 = pybroker.indicator('roc_20', lambda data: talib.ROC(data.close, timeperiod=20)/100)

与如下这行代码是等价的:

roc_20 = pybroker.indicator('roc_20', roc_N, lookback=20)

定义好的指标,就可以开始写策略了:

def pick_time(ctx):
    if ctx.indicator("roc_20")[-1] > 0.08:
        ctx.buy_shares = ctx.calc_target_shares(1.0)
    if ctx.indicator("roc_20")[-1] < 0:

ctx.sell_all_shares()

 

roc_20 = pybroker.indicator('roc_20', roc_N, lookback=20)

from pybroker import Strategy
strategy = Strategy(df, '20100101','20240601')
strategy.add_execution(pick_time, ['159915.SZ'],indicators=[roc_20])
result = strategy.backtest()
result.orders

图片

图片

年化收益19.3%, 最大回撤率:-18.32%。

这里需要说明的是,简单的信号择时策略,bt框架也是胜任的,而且代码量会更少。

不过如果要涉及更复杂的操作,比如加减仓策略,止损、止赢等,那bt就不太方便了,或者多重逻辑判断,多重if-else信号,bt也比较麻烦。

因此,还是那句话,每个框架有其优缺点。

比如backtesing.py就支持多个参数网格调优,搜寻最优参数——类似backtrader的单symbol版本,但代码更简洁,它不支持多symbols。

backtrader不支持机器学习,qlib不支持传统规则量化。

vnpy和wonder trader偏重实盘,写策略就有点麻烦了。

所以,都可以关注一下,艺多不压身,当然更重要的是,策略、思路、因子。——框架只是工具罢了。

Quantlab5.0代码发布:

值得说明,Quantlab5与4没有继承关系,5开始的思路是:

1、尽量少封装,保留回测框架最原始的功能。

2、取消配置、可视化界面,使用notebook写策略,方便大家直观学习。

后续会引入多框架,包含但不限于:bt, pybroker, backtesting.py, backtrader, qlib,vnpy, wonder trader…

图片

希望可视化回测系统前下载4.3版本:

【代码发布】Quantlab4.3:lightGBM应用于全球大类资产的多因子智能策略(代码+数据)

先从方法论上讲讲,投资的三个层次:大类资产配置、战术资产调优和择时。

续前文:稳稳的长期年化10%,想以投资为生?先理解投资三大层次——大类资产配置背后的逻辑基础

大类资产——风险平价——配置曲线看就就挺舒服的:

图片

我们先来一个”大类资产——等权配置“作为对比:

图片

波动会大一些,但作为普通用户,其实等权也是可以的。

——曾经有人问马可维茨(因投资组合理论获诺奖),他自己是否使用”均值—方差理论来做配置“。

他的回答是,他做股债平衡时,也是自己给一个固定比例的股债平衡,然后定期再平衡。

今天我们来聊——战术资产配置。

战略资产配置,就是给不同类型的投资品,分配相应的权重,不做预测。

而战术资产配置,在战略资产的基础上,加上一些择优。——这里仍然不做市场预测,就像我们不预测气温,但夏天的时候少穿衣服,冬天时候多穿衣服肯定是没错的。

那如何判断当前投资品的市场是夏天还是冬天呢?

——低相关性的标的之间,使用趋势指标来择优。

bt内置没有实现轮动函数,我扩展了一个:

class SelectTopK(bt.AlgoStack):
    def __init__(self, signal, K, sort_descending=True, all_or_none=False, filter_selected=False):
        super(SelectTopK, self).__init__(bt.algos.SetStat(signal),
                                         bt.algos.SelectN(K, sort_descending, all_or_none, filter_selected))

回测结果如下:——另外,bt有一个很大的优点,可以多策略一起跑,然后参数进行对比,其实框架这一点需要自己实现。

图片

图片

可以看出,K=1,也就是选择最强的标的最优,年化达到21%,最大回撤35%,但K=3时,卡玛比最优,最大回撤才20%(年化15.2%)。

代码在如下位置:

图片

基于pybroker实现的“创业板-择时策略”,策略代码在这个notebook里,

图片

首先加载数据——这里可以加载多个symbols,

from datafeed.dataloader import CSVDataloader
df = CSVDataloader.get_df(['000300.SH', #沪深300
'000905.SH', #创业板
'159915.SZ'
])
df

得到如下数据:

图片

自定义一个指标,这里我们没有使用pandas的函数,而是使用numba来加速。

这里需要说明的是ctx里的数据,已经是按symbol,group_by之后的结果,因此可以直接使用。

import talib
import pybroker
import numpy as np
from numba import njit

def roc_N(bar_data, lookback):

    @njit  # Enable Numba JIT.
    def vec_roc(values):
        # Initialize the result array.
        n = len(values)
        out = np.array([np.nan for _ in range(n)])

        for i in range(lookback, n):
            out[i] = values[i]/values[i-lookback] -1
        return out

    # Calculate with close prices.
    return vec_roc(bar_data.close)

这里的指标,还有更简洁的实现方式,调用talib:

roc_20 = pybroker.indicator('roc_20', lambda data: talib.ROC(data.close, timeperiod=20)/100)

与如下这行代码是等价的:

roc_20 = pybroker.indicator('roc_20', roc_N, lookback=20)

定义好的指标,就可以开始写策略了:

def pick_time(ctx):
    if ctx.indicator("roc_20")[-1] > 0.08:
        ctx.buy_shares = ctx.calc_target_shares(1.0)
    if ctx.indicator("roc_20")[-1] < 0:

ctx.sell_all_shares()

 

roc_20 = pybroker.indicator('roc_20', roc_N, lookback=20)

from pybroker import Strategy
strategy = Strategy(df, '20100101','20240601')
strategy.add_execution(pick_time, ['159915.SZ'],indicators=[roc_20])
result = strategy.backtest()
result.orders

图片

图片

年化收益19.3%, 最大回撤率:-18.32%。

这里需要说明的是,简单的信号择时策略,bt框架也是胜任的,而且代码量会更少。

不过如果要涉及更复杂的操作,比如加减仓策略,止损、止赢等,那bt就不太方便了,或者多重逻辑判断,多重if-else信号,bt也比较麻烦。

因此,还是那句话,每个框架有其优缺点。

比如backtesing.py就支持多个参数网格调优,搜寻最优参数——类似backtrader的单symbol版本,但代码更简洁,它不支持多symbols。

backtrader不支持机器学习,qlib不支持传统规则量化。

vnpy和wonder trader偏重实盘,写策略就有点麻烦了。

所以,都可以关注一下,艺多不压身,当然更重要的是,策略、思路、因子。——框架只是工具罢了。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103217
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 26 日
下一篇 2024 年 7 月 26 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注