年化26.1%,夏普2+,改进后的轮动策略(代码+数据下载)

郭有才的爆火,真相实现蛮恐怖的。

平台的流量加持,造就一个个平民神话。

董宇辉,至少是一个文化符号,读了那么多的书,有那么深的思考。让很多人望尘莫及,也激发了很多人思考和读书的热情。

但郭有才,一首歌,一天拿到普通人一辈子收入。

这个叫榜样的力量?!

十年寒窗,谁还苦读。

有人说,这就是市场经济嘛。

你看科学家做冷板凳,十年如一日,还不如明星上两天综艺。

但不管怎么样,再流量明星,他至少长得好看吧,唱跳俱佳吧。至少有过一些作品,付出过努力吧。

而且,这样的人在人群中毕竟少数,大家不觉得可以有样学样。

全民娱乐至死。

但普通人,给出这个的先例,就不好了。

图片

图片

class SelectBySignal(bt.Algo):
    def __init__(self, df, rules_buy=[], buy_at_least_count=1, rules_sell=[], sell_at_least_count=1):
        super(SelectBySignal, self).__init__()
        self.rules_buy = rules_buy
        self.rules_sell = rules_sell
        self.df = df

        if buy_at_least_count > len(rules_buy):
            buy_at_least_count = len(rules_buy)
        if buy_at_least_count <= 0:
            buy_at_least_count = 1
        self.buy_at_least_count = buy_at_least_count

        if sell_at_least_count > len(rules_sell):
            sell_at_least_count = len(rules_sell)
        if sell_at_least_count <= 0:
            sell_at_least_count = 1
        self.sell_at_least_count = sell_at_least_count

    def _check_if_matched(self, df_bar, rules, at_least_count):

        se_count = pd.Series(index=df_bar.index, data=0)
        for r in rules:
            se_count += df_bar.eval(r)

        matched_items = se_count[(se_count.values >= at_least_count)].index
        return list(matched_items)

    def __call__(self, target):
        if len(self.rules_buy) == 0 and len(self.rules_sell) == 0:
            return True

        df_bar = self.df.loc[target.now]
        if type(df_bar) is pd.Series:
            df_bar = df_bar.to_frame().T
        df_bar.set_index('symbol', inplace=True)
        for c in df_bar.columns:
            df_bar[c] = df_bar[c].astype(float)
        # df_bar['roc_20'] = df_bar['roc_20'].astype(float)
        matched_buy = []
        matched_sell = []
        if self.rules_buy and len(self.rules_buy):
            matched_buy = self._check_if_matched(df_bar, self.rules_buy, self.buy_at_least_count)
        else:
            matched_buy = list(df_bar.index)  # 没有配置买入规则,但有卖出,就是选全选。

        if self.rules_sell and len(self.rules_sell):
            matched_sell = self._check_if_matched(df_bar, self.rules_sell, self.sell_at_least_count)

        #holdings = context.portfolio.positions.keys()
        if target.now in target.positions.index:
            sig = target.positions.loc[target.now] > 0
            holdings = list(sig[sig == True].index)  # noqa: E712
        else:
            holdings = []

        # holdings = target.get_long_symbols(target.ctxs)
        if holdings and len(holdings) > 0:
            matched_buy += holdings
            matched_buy = list(set(matched_buy))

        if matched_sell:
            for sell in matched_sell:
                if sell in matched_buy:
                    matched_buy.remove(sell)

        matched_buy = list(set(matched_buy))
        target.temp['selected'] = matched_buy
        # if len(matched_buy) > 1:
        #    print(matched_buy)
        return True

吾日三省吾身

财富自由为什么?为了把时间“浪费”在自己认为美好的事物上。

——那你直接把时间发在自己喜欢的事情上,不就好了?!

一个人,时间精力非常有限,一天能做的事情,非常少。

但长期复利的结果确很惊人。

这个矛盾的背后,是三天打雨两天晒网的人,很难拿到结果。

可是,努力与选择背后,只差一个坚持嘛?

没这么简单。

因为不确定,不确定付出多大可能可以得到回报,是结果注定就不好,还是努力不够?

因此,过程中要尽快建立反馈机制,确保你的努力可以“看得见”。

自己真的感兴趣,没有回报也愿意持续去做的事情。——天生热爱。

自己想用的产品,解决自己的问题,而不是盲目去抄一个竞品,光有样子没有灵魂。

时间,精力着实有限,“如无实在必要,勿加实体”,切实克制冲动。

开源世界很精彩,若非必要,不要重新造轮子。借助开源生态,快速达成自己的目标。

直奔目标而去,最重要的事情解决了,其它就变得不重要或者根本不需要做。

策略篇

我们知道,择时非常难。

轮动相对容易。

指增本身也是轮动。它介入主动管理与被动管理之间。

轮动本质也不预测。

比如多因子评分,还是动量轮动。这里的轮动因子,就是相对优势。我们持有有相对优势,淘汰相对落后的。

但K通常不能取太小,为何。

就好比按考试成绩排名,我们应该把前20%的同学都保留,甚至更多。而不应该只取第1名,这里存在随机性。

图片

图片

import algos_extend
K = int(len(symbols)*0.3)
print(K)
s = bt.Strategy('轮动不择时', [
                       algos_extend.SelectTopK(df_roc,K),
                       bt.algos.WeighEqually(),
                       bt.algos.Rebalance()])

s_pick = bt.Strategy('轮动+择时', [
                       bt.algos.SelectWhere(signal),
                       algos_extend.SelectTopK(df_roc,K),
                       bt.algos.WeighEqually(),
                       bt.algos.Rebalance()])

bench_bh = bt.Strategy("benchmark-等权-买入并持有",[bt.algos.RunOnce(),
                                 bt.algos.SelectAll(),
                                 bt.algos.WeighEqually(),
                       bt.algos.Rebalance()])

bench = bt.Strategy("benchmark-等权-月平衡",[bt.algos.RunMonthly(),
                                 bt.algos.SelectAll(),
                                 bt.algos.WeighEqually(),
                       bt.algos.Rebalance()])
bench_erc = bt.Strategy("benchmark-风险平价-月平衡",[bt.algos.RunMonthly(),
                                 bt.algos.SelectAll(),
                                 bt.algos.WeighERC(),
                       bt.algos.Rebalance()])

stras = [s,s_pick,bench_bh,bench]
bkts = []
for s in stras:
    bkt = bt.Backtest(s, df_close,progress_bar=True)
    bkts.append(bkt)

res = bt.run(*bkts)
res.plot()

专栏篇

对于AI量化而言,数据是基础:

星球专栏已经更新到数据部分,基本写完了。

调一些api,存储到mongo很简单,但如何设计一个通用的,可扩展的,可持续更新的数据管理,还是需要花一番心思。

下面是我们的最佳实践:

图片

现在这一套代码,无论是更新etf, 可转债,股票,期货都是通用的,基本就是配置一个表名即可以入库。

维护起来比较省心省力。

吾日三省吾身

郭有才火了,山东菏泽南站也火了。

流量为王的时代,做生产者很重要。

其实,任何年代皆如此,从web 2.0开始,自媒体登上历史舞台。

互联网给了草根无限可能。

早年只能通过表演,出唱片,现在自己一个屏幕,都可以默默努力。

当然,不是所有人都有好的故事,好的才艺,能唱会跳。况且,能唱会跳高颜值的人不要太多。

但持续生产可以打动人心的,有长期价值的内容一定是铁律。

你的努力,需要让世界看得见。

很多人说,娱乐至死有什么价值?——那流行娱乐有什么价值,电影有什么价值呢?——就是情绪价值吧。

在经济下行周期,大家都迷茫,压抑。

需要释放,需要共情。

我们需要一些故事,努力可以有未来,一些普通人,平凡人,他们的善良,勤奋,美好的爱情。。。

董宇辉也为现象级明星,也因为他提供了巨大的情绪价值。

我们心里,总得信点啥。

不确定的时代,带来的不安全感。

要在发展中解决所谓不安全感的问题,不能因为可能的风险,就啥也不干。不发展才是最大的不安全,你有能力了,就算出现一些意料之外的事情,也能轻松解决。

明天会发生什么,不知道。

当然不是说随意冒险,而是尽量评估,然后用心去做,但不必过份思虑。

其他的,一切皆是体验,“允许一切发生”。

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

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

相关推荐

发表回复

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