新增两个策略:大小盘轮动+中国版全天候(代码+数据)

当前已经积累的策略集:

图片

代码已经发布至星球:

图片

今天的策略是风险平价:

图片

name = "全球大类资产风险平价"
desc = "全球大类资产风险平价"
symbols = ["563300.SH", "510300.SH", "510500.SH", "512100.SH", "159915.SZ", "159967.SZ", "159920.SZ", "513100.SH", "513500.SH", "518880.SH", "159985.SZ", "513520.SH", "510050.SH"]
algo_period = "RunMonthly"
algo_period_days = 20 #RunPeriod时有效
rules_buy = []
at_least_buy = 1
rules_sell = []
at_least_sell = 1
order_by = ""
topK = 1
dropN = 0
b_ascending = 0
algo_weight = "WeightERC"
algo_weight_fix = []
feature_names = []
features = []
start_date = "20100101"
end_date = ""
commission = 0.0001
slippage = 0.0001
init_cash = 1000000
benchmark = "510300.SH"

算子代码如下:

class WeightERC(Algo):
    """
    Sets temp['weights'] based on equal risk contribution algorithm.

    Sets the target weights based on ffn's calc_erc_weights. This
    is an extension of the inverse volatility risk parity portfolio in
    which the correlation of asset returns is incorporated into the
    calculation of risk contribution of each asset.

    The resulting portfolio is similar to a minimum variance portfolio
    subject to a diversification constraint on the weights of its components
    and its volatility is located between those of the minimum variance and
    equally-weighted portfolios (Maillard 2008).

    See:
        https://en.wikipedia.org/wiki/Risk_parity

    Args:
        * lookback (DateOffset): lookback period for estimating covariance
        * initial_weights (list): Starting asset weights [default inverse vol].
        * risk_weights (list): Risk target weights [default equal weight].
        * covar_method (str): method used to estimate the covariance. See ffn's
          calc_erc_weights for more details. (default ledoit-wolf).
        * risk_parity_method (str): Risk parity estimation method. see ffn's
          calc_erc_weights for more details. (default ccd).
        * maximum_iterations (int): Maximum iterations in iterative solutions
          (default 100).
        * tolerance (float): Tolerance level in iterative solutions (default 1E-8).


    Sets:
        * weights

    Requires:
        * selected

    """

    def __init__(
            self,
            lookback=pd.DateOffset(months=3),
            initial_weights=None,
            risk_weights=None,
            covar_method="ledoit-wolf",
            risk_parity_method="ccd",
            maximum_iterations=100,
            tolerance=1e-8,
            lag=pd.DateOffset(days=0),
    ):
        super(WeightERC, self).__init__()
        self.lookback = lookback
        self.initial_weights = initial_weights
        self.risk_weights = risk_weights
        self.covar_method = covar_method
        self.risk_parity_method = risk_parity_method
        self.maximum_iterations = maximum_iterations
        self.tolerance = tolerance
        self.lag = lag

    def __call__(self, target):
        selected = target.temp["selected"]
        curr_symbols = target.df_bar.index

        selected = [s for s in selected if s in curr_symbols]

        if len(selected) == 0:
            target.temp["weights"] = {}
            return True

        if len(selected) == 1:
            target.temp["weights"] = {selected[0]: 1.0}
            return True

        t0 = target.now - self.lag
        prc = target.df_close.loc[t0 - self.lookback: t0, selected]

        returns = prc.pct_change().dropna()
        if len(returns) < 10:
            return False
        # ERC = EqualRiskContribution(returns.cov())
        # ERC.solve()

        # tw = ERC.x
        # print(tw)

        tw = calc_erc_weights(
            returns,
            initial_weights=self.initial_weights,
            risk_weights=self.risk_weights,
            covar_method=self.covar_method,
            risk_parity_method=self.risk_parity_method,
            maximum_iterations=self.maximum_iterations,
            tolerance=self.tolerance,
        )

        target.temp["weights"] = tw.dropna().to_dict()
        return True

吾日三省吾身

想给一些量化新手提供更易用的“开箱即用”的平台。这几天调研了前端的开发。

有考虑过uni-app,ionic和flutter。

uni-app与ionic类似,都是web的解决方案,当然可以打包成app,flutter可以打包成原生的app。——当然app并非咱们直接的刚需,但有当然更好了。

三者缺点是都要引入新的技术栈。uni-app与ionic都支持vue3,而flutter背后是dart。

原先对于dart这种高级语言的形态还是很满意了。折腾了Andriod Studio,androd sdk, flutter sdk等,包非常大,动辄几个G,加上在外网就更慢了。在启动安卓虚拟机时,最终决定放弃了。——还是太重。

想起之前折腾过几天的flet。

又过了这么一段时间,有惊喜。

之前体验过flet 和 nicegui。工欲善其事,必先利其器-NiceGUI:AI量化投资研究开发,后来用nicegui是直接原因是当前flet竟然没有Datetime Picker控件。之后又不用nicegui的原因是,它的控件更面像桌面程序。做出来的web感觉四不像。而我们真正的诉求的手机H5为主,App为辅

Flet开发的图,还行吧。

图片

历史文章:

Quantlab v3.9.2:策略集合——创成长与红利低波动的智能Beta策略(年化29.3%,最大回撤24%)(附源码)

Quantlab3.9代码:内置大模型LLM因子挖掘,全A股数据源以及自带GUI界面

AI量化实验室——2024量化投资的星辰大海

继续写策略:大小盘轮动——沪深300与创业板ETF的轮动,取动量大者,若均小于0,则持有现金:

图片

年化18.1%,最大回撤28.2%。

图片

其实大家发现,结合我们昨天的三个策略:

Quantlab v3.9.2:策略集合——创成长与红利低波动的智能Beta策略(年化29.3%,最大回撤24%)(附源码)

要开发一个年化20-30%的策略并不难

为什么大家仍然觉得投资很难。

因为不确定性,更确切地说,因为回撤。

在回撤期,你无法相信是策略或因子失效,还是正常的策略回调。

国内版本的“全天候策略”:

图片

策略代码如下:

name = "中国版全天候策略"
desc = "中国版全天候策略"
symbols = ['159928.SZ','510050.SH','512010.SH','513100.SH','518880.SH','511220.SH','511010.SH','161716.SZ']
algo_period = "RunQuarterly"
algo_period_days = -1 #RunPeriod时有效
rules_buy = []
at_least_buy = 1
rules_sell = []
at_least_sell = 1
order_by = ""
topK = 1
dropN = 0
b_ascending = 0
algo_weight = "WeightFix"
algo_weight_fix = [0.03,0.06,0.08,0.05,0.1,0.32,0.26,0.1] # WeightFix时生效
feature_names = []
features = []
start_date = "20100101"
end_date = ""
commission = 0.0001
slippage = 0.0001
init_cash = 1000000
benchmark = "510300.SH"

系统源代码(策略与数据)请前往星球下载:

图片

所有的策略参数均在这个目录下(还是持续更新中):

图片

历史文章:

Quantlab v3.9.2:策略集合——创成长与红利低波动的智能Beta策略(年化29.3%,最大回撤24%)(附源码)

Quantlab3.9代码:内置大模型LLM因子挖掘,全A股数据源以及自带GUI界面

AI量化实验室——2024量化投资的星辰大海

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

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

相关推荐

发表回复

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