pybroker:原生支持机器学习模型进行量化

今天开始使用pybroker进行机器学习赋能量化投资。

这里先写下一些思考,传统的投资也好,量化也罢,终究是一个“多因子”的问题。价值投资,你考虑了基本面因子,估值因子,可能还会考虑行业、宏观景气度之类的。只是有些是个人主观判断,没有去量化罢了。——其实是可以且应该量化的。技术分析更不必说的,一个roc_20,或者macd金叉,等等,都可以看做是因子。

只不过价值投资,偏左侧交易,就是只判断位置,不“预测”方向。就是我觉得这个东西值,那就屯起来,等不值了就卖掉。从大逻辑上讲,这个体系是自洽的,没有人可以“预测”市场。估值与位置相对好判断一些,但需要花大量的时间调研,访谈,其实普通人拿到的,听到了,都是过了N手的消息了,普通人做这些没有优势,倒不如找一个靠谱的基金公司或者基金经理。

另外价值投资有一个缺点,就是太难熬。有时间市场错位的时间,会远远超出你的耐心和承受力。

普通人,程序员,做量化,而且是偏右侧可能更有机会。

话说,如果从估值来看,这几年来,纳指100都没有机会上车,估值PE分位点一直在80%往上居高不下。但我通过恒定市值定投上车,涨10%就卖出这10%,跌10%就定投补仓,成本持续降低,而且也被动低买高卖,也挺好。这就是相信这个指数的未来。——从这个角度上,我们只需要找到高ROE的指数,恒定市值定投也是不错的一条路。

白酒ROE非常高,现在看百分位还行。煤炭有点出乎意料。

图片

右侧交易的逻辑,就是趋势交易或者均值回归。CTA也是趋势交易,趋势交易就是“追涨杀跌”,这个符合人性。不能叫“预测”市场,而是跟随市场,在趋势确认的情况下,进场;趋势变化了,离场。如此而已。

pybroker整合机器学习

pybroker的扩展完全是传入函数,这是充分使用了python的特点。

传入的参数是symbol,以及这个symbol按train_size划分的数据集——dataframe格式,然后使用sklearn的slr作为示例。

这里有一个问题,与qlib不同,qlib是使用所symbols的数据训练一个模型,而pybroker是为每个symbol单独训练一个模型。这里的优点是,假设每个证券有自己的规律,相互之间不影响。这个假设有一定的道理,尤其是沪深300与标普500这样的低相关性的指数,各自训练自己模型。

但是在一些轮动型的策略里,比如可转债的双低,我们使用多因子来训练,是会模向比较标的之间的动量,估值情况等。这个在pybroker里似乎不好做了。

在规则量化里,pyBroker使用set_after_exec来动态再平衡,set_before_exec来横向比较权重。但机器学习里没有看到这个部分。当然我们可以考虑自己扩展。

def train_slr(symbol, train_data, test_data):
    # Train
    # Previous day close prices.
    train_prev_close = train_data['close'].shift(1)
    # Calculate daily returns.
    train_daily_returns = (train_data['close'] - train_prev_close) / train_prev_close
    # Predict next day's return.
    train_data['pred'] = train_daily_returns.shift(-1)
    train_data = train_data.dropna()
    # Train the LinearRegession model to predict the next day's return
    # given the 20-day CMMA.

    inds = ['cmma_20']

    X_train = train_data[inds]
    y_train = train_data[['pred']]
    model = LinearRegression()
    model.fit(X_train, y_train)

    # Test
    test_prev_close = test_data['close'].shift(1)
    test_daily_returns = (test_data['close'] - test_prev_close) / test_prev_close
    test_data['pred'] = test_daily_returns.shift(-1)
    test_data = test_data.dropna()
    X_test = test_data[inds]
    y_test = test_data[['pred']]
    # Make predictions from test data.
    y_pred = model.predict(X_test)
    # Print goodness of fit.
    r2 = r2_score(y_test, np.squeeze(y_pred))
    print(symbol, f'R^2={r2}')

    # Return the trained model and columns to use as input data.
    return model#,['cmma_20']

这里的逻辑是每天预测明天的收益率,如果为正,则买入,反之卖出。

这里我们可以在回测时,按预测的得分排序,然后最高分者持仓,倒也可以。标的之间自己的模型不影响。

pybroker使用WalkforwandAnalysis:

图片

这是比较前沿的做法。

后续几件事情:

1、因子表达式。

2、模型比如随机森林、lightGBM, xgboost,深度模型等等。

3、因子评估,比如alphalens。

4、积木式开发。

 

 

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

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

相关推荐

发表回复

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