择时策略:年化19.7%,回测18.8%

昨天已经完成:

1、择时模板:带创业板动量策略1份。

2、stramlit gui,支持选择策略并回测。

今日计划: 

1、择时-通道突破策略。 

2、streamlit显示orders, trades,并检查结果。 

3、参考alphalens,引入单因子分析框架。

大家不必着急,按星球惯例,咱们是每周至少迭代一次,最晚明天更新代码。Quantlab3.3是值得期待的,全新架构与思路。

今天第一个任务是择时策略里,需要使用到talib的布林带:

def bbands_up(close, timeperiod=20, nbdevup=2, nbdevdn=2):
upper_band, middle_band, lower_band = talib.BBANDS(close, timeperiod=timeperiod, nbdevup=nbdevup, nbdevdn=nbdevdn)
return upper_band

def bbands_down(close, timeperiod=20, nbdevup=2, nbdevdn=2):
upper_band, middle_band, lower_band = talib.BBANDS(close, timeperiod=timeperiod, nbdevup=nbdevup, nbdevdn=nbdevdn)
return lower_band

使用咱们的策略模板,也非常简单:

def PickTime_bbands():
    task = TaskPickTime()
    task.name = '择时策略-创业板-布林带'
    task.benchmark = '159915.SZ'
    task.symbols = ["159915.SZ"]

    task.features = ["bbands_up(close,20,2)","bbands_down(close,20,2)"]
    task.feature_names = ["bbands_up","bbands_down"]

    task.rules_buy = ['close>bbands_up']
    task.rules_sell = ["close<bbands_down"]
    return task

运行结果如下:

图片

年化12.8%,回撤20%+,比基准还是好不少。

今天第2项工作把交易详情打印出来:

图片

今天的第3项工作——单因子分析框架:

传统量化主要基于规则,规则策略的优化空间就是——超参数优化,这个咱们后面会专项支持。当然机器学习模型驱动也需要超参数优化,这是通用的功能。

而AI量化的基础是——因子。

所以,我们开始建立因子分析框架。

Alphalens是比较成熟,当然现在已经年久失修的框架。

代码在datafeed/alphalens里:

图片

之前咱们也写过alphalens相关的文章:

因子特征工程:alphalens库深度解析

elif choose == "单因子分析":
    from config import DATA_DIR

    instru = DATA_DIR.joinpath('instruments')
    import os

    files = os.listdir(instru.resolve())
    filename = st.selectbox('请选择投资标的集合:', options=files)
    with open(instru.joinpath(filename).resolve(), 'r') as f:
        symbols = f.readlines()

    symbols = [s.replace('\n','') for s in symbols]
    st.write(symbols)
    factor_expr = st.text_input('请输入因子表达式', value='slope(close,20)')
    if st.button('加载数据并计算因子值'):
        from datafeed import CSVDataloader

        loader = CSVDataloader(DATA_DIR.joinpath('etfs'), symbols)
        df = loader.load(fields=[factor_expr], names=['factor_name'])
        factor_df = df[['symbol', 'factor_name']]
        factor_df.set_index([factor_df.index, 'symbol'], inplace=True)
        close_df = df.pivot_table(values='close', index='date', columns='symbol')
        st.write(factor_df)
        st.write(close_df)

        from datafeed.alphalens.utils import get_clean_factor_and_forward_returns
        results = get_clean_factor_and_forward_returns(factor_df, close_df)
        st.write(results)

        from datafeed.alphalens.streamit_tears import create_full_tear_sheet
        create_full_tear_sheet(results)

加载因子值,和收盘价:

图片

图片

图片

代码在最后检查中,最晚明天提交至星球。

择时策略:年化19.7%,回测18.8%——创业板指数动量择时策略(最优超参数是如何优化的)。

还有3位同学加入后就涨价了。

【就要提价了,进度93%】AI量化实验室——2024量化投资的星辰大海

自动挖因子,自动超参数优化,多策略组合与全天候实盘——Quantlab的2024进化路线图

今天我们来完成如下两个功能: 择时策略模板和streamlit实现GUI。

图片

择时模板更为简单:

@dataclass
class TaskPickTime(Task):  # 择时策略模板
    def get_algos(self):
        return [
            RunAlways(),
            SelectBySignal(rules_buy=self.rules_buy,
                           buy_at_least_count=self.at_least_buy,
                           rules_sell=self.rules_sell,
                           sell_at_least_count=self.at_least_sell
                           ),
          WeightEqually(),
            Rebalance()
        ]

就是配置一下买入,卖出信号:

from engine.engine import Engine
from engine.task import TaskPickTime

task = TaskPickTime()

task.benchmark = '159915.SZ'
task.symbols = [ "159915.SZ"]

task.features = [ "买入信号"]
task.feature_names = ["买入信号"]

task.rules_buy = ['信号>x']
task.rules_sell = ["信号<y"]

e = Engine(task=task)
e.run()
e.stats()

回测结果:

图片

年化19.7%,回测18.8%,远超创业板指数本身。

图片

上面的参数,在一些平台是收费的,因此我没有直接贴出来。

大家可能好奇,这些最优参数怎么来的

其实这就是下一步我们要做的事情——超参数优化。

使用机器学习,遗传算法等对参数空间进行搜索,找到最优化的参数集。——你发现,你改动参数,结果大概率会变差,因为这是我们优化的结果。

今天的第二项任务是streamlit做界面,有一个界面方便大家运行策略,分析结果。

图片

图片

大家可以下载代码自行体验:

图片

星球每天给大家写实战代码、交付策略:

gui的核心代码如下:

import streamlit as st
from streamlit_option_menu import  option_menu

from engine.engine import Engine
from examples.strategies import task_list

st.set_page_config(page_title='Quantlab - AI量化实验室', page_icon=":bar_chart:", layout='wide')

#定义边栏导航
with st.sidebar:
    choose = option_menu('Quantlab-AI量化实验室',['策略回测','数据分析','机器学习'],
                         icons=['house','book-half','book-half'])

task = st.selectbox(label='请选择策略:', options=task_list())


if st.button('回测'):
    st.write('启动回测:' + task.name)

    with st.spinner('回测进行中,请稍后...'):
        e = Engine(task=task)
        e.run()
        df_all = e.get_df_equities()
        st.line_chart(df_all)
        df_ratios = e.get_ratios(df_all)
        st.write(df_ratios)

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

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

相关推荐

发表回复

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