深红利与创成长轮动:年化27.5%,优化了一下策略(代码+数据)

调了一版参数,主要是lambda_l1, lambda_l2,防止过拟合的,有明显的效果:年化29.3%,最大回撤18.5%,还有继续优化的空间。

图片

图片

def train(df_train, df_val, feature_cols, label_col='label'):
    model = LGBMRegressor(boosting='gbdt',  # gbdt \ dart
                          n_estimators=600,  # 迭代次数
                          learning_rate=0.1,  # 步长
                          max_depth=10,  # 树的最大深度
                          seed=42,  # 指定随机种子,为了复现结果
                          num_leaves=250,
                          # min_split_gain=0.01,
                          lambda_l1=2,
                          lambda_l2=2000
                          )

目前使用的是GridCV网格参数搜索:

ef adj_params(X_train, y_train):
    """模型调参"""
    params = {
        # 'n_estimators': [100, 200, 300, 400,500,600,700,800],
        # 'learning_rate': [0.01, 0.03, 0.05, 0.1],
        'max_depth': range(10, 64, 2),
        # 'lambda_l1': range(0,3),
        # 'lambda_l2':[200,400,800,1000,1200,1400,1600,2000]
    }

    other_params = {'learning_rate': 0.1, 'seed': 42, 'lambda_l1': 2, 'lambda_l2': 2000}
    model_adj = LGBMRegressor(**other_params)

    # sklearn提供的调参工具,训练集k折交叉验证(消除数据切分产生数据分布不均匀的影响)
    optimized_param = GridSearchCV(estimator=model_adj, param_grid=params, scoring='r2', cv=5, verbose=1)
    # 模型训练
    optimized_param.fit(X_train, y_train)

    # 对应参数的k折交叉验证平均得分
    means = optimized_param.cv_results_['mean_test_score']
    params = optimized_param.cv_results_['params']
    for mean, param in zip(means, params):
        print("mean_score: %f,  params: %r" % (mean, param))
    # 最佳模型参数
    print('参数的最佳取值:{0}'.format(optimized_param.best_params_))
    # 最佳参数模型得分
    print('最佳模型得分:{0}'.format(optimized_param.best_score_))

后续考虑使用hyperopt以及gluon来调参:

ModelTrainer:基于AutoGluon的多因子合成AI量化通用流程

代码与数据均在星球更新:

吾日三省吾身

昨天有同学留言说,现在这后半段有点鸡汤了。

我向来反感和警惕鸡汤,因此,我仔细反思了一下。

当下的大环境,大家越发渴望确定性,希望快速成功,赚钱,获得安全感。

但如果想听真话的话——这个世界没有“速成”之说。

成功也没有秘籍——没有武侠小说里,那种猴子肚子里掏出一本书,然后几天内达到别人30年的功力,然后年纪轻轻就独步天下——没有。

所谓心得,其实都是显学。

理财——多多储蓄,坚持长期投资,保持耐心。——没有了。

无论你想不想慢慢变富,你都会慢慢变老。区别在于,你是又老且富,还是又老且穷。

你说有没有财富自由快车道,——有,也是按3-7年往前看的。

有谁见过,花1000块钱不到,买一个策略或系统,然后赚1000万的?——谁这么跟你说,一定对你别有所图。

美好的东西都是需要时间这个变量来孵化。

它可能很慢,尤其在前期,慢到很多人没有耐心等到它发生。量化过程很慢,但越到后期才指数级复利加速。

如何度过这个孵化期——信念、系统。

种一棵树,最好的时间是十年前,其次是现在。

今天把这个数据统一处理,以便后续统一调用。

有8个指数可以通过tushare获取,包括A股指数和一些国际指数。

if __name__ == '__main__':
indexes = [
'000300.SH', # 沪深300
'000905.SH', # 中证500
'399006.SZ', # 创业板指数
'000012.SH', # 国债指数
'000832.CSI', # 中证转债指数
'HSI', # 香港恒生
'N225', # 日经225
'GDAXI' # 德国DAX指数
]
from config import DATA_DIR_QUOTES
for s in indexes:
df = get_index_quotes(s, '20050101')
print(df)
df.to_csv(DATA_DIR_QUOTES.joinpath('{}.csv'.format(s)), index=False)

另外四支,通过yfiance获取。

if __name__ == '__main__':
    for s in [
        'CL', # 原油
        'TNX', # 美十年期国债
        'GOLD', # 黄金
        '^NDX', #纳指100
    ]:
        df = get_quotes(s)
        print(df)
        df.to_csv(DATA_DIR_QUOTES.joinpath('{}.csv'.format(s)), index=False)

与原研报相比,我加了一个“创业板指数“——个人认为小市值还是比较重要的。

if __name__ == '__main__':
    for s in [
        'CL', # 原油
        'TNX', # 美十年期国债
        'GOLD', # 黄金
        '^NDX', #纳指100
    ]:
        df = get_quotes(s)
        print(df)
        df.to_csv(DATA_DIR_QUOTES.joinpath('{}.csv'.format(s)), index=False)

一共12支,历史以来所有日线:

图片

下载好的数据,格式也已经统一整理好,在星球发布了:

图片

图片

图片

这就是研报的benchark,在quantlab框架下复现还是比较容易的。

图片

下一步要引入机器学习来排序。

理论与实验

如同物理学分为理论物理和实验物理。

数学也分理论数学与应用数据。

理论与工程总是交替进行,理论的突然,需要数十上百年,可能需要天才的灵光乍现和临门一脚。

——比如相对论、质能方程、麦克斯韦方程组、图灵机。

工程上的改进,往往让理论落地,并生产实际价值,且最终受益。

比如做实验的爱迪生、造计算机的埃里克,电话、电报…,原子弹…

理论到实战还有非常远之距离,比如爱因斯坦本人就认为原子弹造不出来。

当前的大模型,AIGC或者说AGI之路,没有很强的理论支撑,都是工程上的改进。

——普通人似乎有机会做点啥。

爱迪生与特斯拉

《特斯拉传》和《爱迪生传》确实应该放到一起读。

图片

近几年,随着埃隆.马斯克把他的电动车命名为特斯拉,尼古拉.特斯拉,这个天才发明家,作为一个悲情英雄登上历史舞台。

1912年,特斯拉和爱迪生都被授予诺贝尔物理学奖,但都拒绝此奖,理由是无法忍受和对方一起分享这一荣誉!

真相如何,我们已经无从得知。

我们更关心,我们能学到点什么?

几个关键的信息,特斯拉放弃了交流电的专利权,其实拿到手里,用或不用与直接放弃,有天壤之别——就像金庸可以把版权1块钱出售。

尼古拉要支持自己那么多超前的想法,没有雄厚的资金是不现实的。

尼古拉的想法过于超前,而爱迪生的发明更加务实和解决实际问题。包括特斯拉做了无线电的实验,但波波夫和马可尼则是直接把它变得实用,并应用于生活场景之中。

对于我们普通人的启示——针对应用场景去改进。而不是天马行空,一则没有特斯拉这样的天份和才华,二来,这样的生活,也许也不是你想要的。

“股票投资和减肥一样,决定最终结果的不是头脑而是耐心。”

《彼得·林奇的成功投资》

修正一个小bug:(bt框架里获取历史持仓的逻辑,有一些小变化,这里做了一下修正),主体不受影响,策略表现较之前更好了。

图片

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.loc[:, 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) date_pre = target.now - timedelta(days=1) if date_pre in target.positions.index: sig = target.positions.loc[date_pre] > 0 holdings = list(sig[sig == True].index) # noqa: E712 else: holdings = [] print(target.now) if len(holdings): print(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

 

吾日三省吾身

其实没有人可以预见未来,生活就是这么一步步走出来的。

什么人生规划,职业规划,既然不可知,如何规划。

只能说是一个模糊的方向。

比如特斯拉坚持不去做牧师,而要学理工科,做电气工程师。

而拿破仑,立志要解放科西嘉,成为海岛的主人。

这些都是模糊的方向,然后做大量的,长期的积累。

对于盲目的船来说,所有的风向都是逆风。一个人生命中的最大幸运,莫过于在他的人生中途,即在他年富力强时发现了自己的人生使命。

斯蒂芬·茨威格在《人类的群星闪耀时》

没有人在乎你想要什么,你想过什么样的生活。

重要的事,你能为这个世界做些什么?你想为这个世界做些什么?

这两个不同领域的英雄的故事,代表了两个不同的方向:

特斯拉是个人英雄主义的代表,发明家,一身心血痴迷于发明创造。

如同这几天非常火的姜萍,这是需要天分加后天努力的。

科学家外加商业能力,那将无往而不利,比如爱迪生。

个人英雄主义适合于起步,然后要构建自己的组织,让生意或事业可以自主运转。

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

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

相关推荐

发表回复

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