基于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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!