今天讲一个指标OBVM,就是OBV指数化。
量价指标: OBV (On-Balance Volume,净额成交量或叫能量潮指标)
由 Joe Granville 提出,通过统计成交量变动的趋势推测股价趋势
计算公式:以某日为基期,逐日累计每日上市股票总成交量,
若隔日指数或股票上涨,则基期OBV加上本日成交量为本日OBV;
若隔日指数或股票下跌,则基期OBV减去本日成交量为本日OBV。
要计算OBVM(OBV的长短期均线),我们需要两个函数,一是OBV,二是EMA:
一个简单的只开多仓的规则:当OBVM上穿Signal line,开多仓;当OBVM下穿Signal line,平仓。这个规则只捕捉上涨趋势。
策略代码如下(代码已经提交星球)
from engine.datafeed.dataloader import Hdf5Dataloader symbols = ['600519.SH'] loader = Hdf5Dataloader(symbols, start_date="20120101") df = loader.load(fields=['ema(ta_obv(close,volume),7)', 'ema(ta_obv(close,volume),10)', 'cross_up(obvm_7,obvm_10)', 'cross_down(obvm_7,obvm_10)', ], names=['obvm_7', 'obvm_10','buy', 'sell'] ) from engine.env import Env from engine.algo.algos import * from engine.algo.algo_weights import * bench_loader = Hdf5Dataloader(['000300.SH'], start_date='20120101') e = Env(df, name='OBVM择时', benchmarks=bench_loader.load()) e.set_algos([ #RunMonthly(), SelectBySignal(buy_rules=['ind(buy)'], sell_rules=['ind(sell)']), WeightEqually() ]) e.backtest_loop() e.show_results(plot=True) # e.save_results()
在我们的因子表达式库里补充一下函数:
def ema(se, N): return ta('EMA', se, N)
def _obv(close, volume): return talib.OBV(close, volume) def ta_obv(close, volume): close.name = 'close' volume.name = 'volume' df = pd.concat([close, volume], axis=1) se = df.groupby('symbol', group_keys=False).apply(lambda sub_df: _obv(sub_df['close'], sub_df['volume'])) if type(se) is pd.DataFrame: se = se.T return se
而后这样计算就可以了:
df['obvm_7'] = calc_expr(df, 'ema(ta_obv(close,volume),7)')
代码在工程的如下位置:
在mplfinance的文章里讲了基于matplotlib的K线图及指标的绘制,matplotlib是个不错的库,缺点就是静态图。尽管可以通过拖动事件来重绘,但实现起来就比较复杂的,后续我们还是考虑bokeh还绘制K线图,因子食信号以及交易记录。
qlib整合mlflow做了自己的机器工作流。其实在automl领域已经有不少自动化工作流的机器学习库,除了昨天年化29.3%,大类资产ETF动量轮动,添加商品与货币ETF,实盘跟进中(代码+数据下载)后面我们会说说autogluon之外还有pycaret。
再预告一下星球里开源项目下一步要完善的一些事情:
1、bokeh绘制回测结果,重点是交易记录分析,因子信号,相关性分析等。
2、autogluon,pycaret这样的自动机器学习框架。可以简化我们写模型和调仓的压力。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/104044
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!