全球大类资产相关性及风险平价测算

今天基于基准指数做大类资产的“战略配置”。

基础框架是风险平价及期扩展。之前的文章说过,在投资里,为数不多的“确定性”, 一是市场长期向上;二是分散是免费的午餐。

如何分散。从股债20:80或者等级,到“均值-方差”的MVO模型,前沿资产从实操的角度,更倾向于配置风险。不是说风险平价比MVO更优,它更像一种近似,但由于MVO需要“预测”收益率且参数敏感性高,风险平价只需要协方差,计算量少且协方差具备一定的稳定性。

这种战略资产配置,完全是不预测的。若说有一个假设,就是协方差是相对稳定的,至少在最近的一段时间内是稳定的。——而这个假设是可以成立的。

从战术资产的角度,如果有些资产明显处于下行周期,那么可不把相关资产纳入配置或者降低权重。资产肯定在震荡,但在一个阶段是向上、横盘还是向下。

风险平价本质是控制风险,根据收益率的协方差,组合在一起可以降低波动。因为市场变化确实非常难预测。但若是短期内震荡下行的资产排除在外,可以在不提高波动的同时,提升收益率。这里还可以纳入“多因子”模型,给标的打分,短期预期下行的标的排除在外。

接着来说说具体工程上的实现,mongo存储基础数据,量价数据,因为涉及到增量更新,不能每次都通过api去调取。

全市场回测需要总体数据,所以,可以把mongo数据变成具体的dataframe存储到本地HDF5文件备用。尤其是回测,并不需要每天都更新,所以,这里增量更新是非必须的。

图片

基于因子表达式计算因子:

# encoding:utf8
import pandas as pd
from loguru import logger

from quant_project.dataloader.expr.expr_mgr import ExprMgr
from quant_project.dataloader.datafeed_hdf5 import Hdf5DataFeed
from quant_project.config import DATA_DIR_HDF5_FEATURES


class Dataloader:
    def __init__(self):
        self.expr = ExprMgr()
        self.feed = Hdf5DataFeed()

    def load_datas(self, symbols, names, fields, key='features'):
        dfs = self.load_dfs(symbols, names, fields)
        all = pd.concat(dfs)
        all.sort_index(ascending=True, inplace=True)
        all.dropna(inplace=True)

        with pd.HDFStore(DATA_DIR_HDF5_FEATURES.resolve()) as s:
            s[key] = all
        return all

    def load_from_cache(self, key):
        with pd.HDFStore(DATA_DIR_HDF5_FEATURES.resolve()) as store:
            key = 'features'
            if '/' + key in store.keys():  # 注意判断keys需要前面加“/”
                logger.info('从缓存中加载...')
                data = store[key]
                return data
            else:
                logger.error('{}不存在'.format(key))
        return None

    def load_dfs(self, symbols, names, fields):
        dfs = []
        for code in symbols:
            df = pd.DataFrame()
            for name, field in zip(names, fields):
                exp = self.expr.get_expression(field)
                # 这里可能返回多个序列
                se = exp.load(code)
                if type(se) is pd.Series:
                    df[name] = se
                if type(se) is tuple:
                    for i in range(len(se)):
                        df[name + '_' + se[i].name] = se[i]
            df['code'] = code
            dfs.append(df)

        return dfs


if __name__ == '__main__':
    names = ['收盘价']
    fields = ['$close']
    fields += ['BBands($close)']
    names += ['布林带']

    loader = Dataloader()

    df_returns = loader.load_datas(['N225', '000300.SH'], names, fields)
    print(df_returns)

 

图片

使用dagster计算因子:


@asset(description='指数因子')
def index_features(index_code_list):
    names = ['Roc_1']
    fields = ['$close/Ref($close,1) -1']
    df = Dataloader().load_datas(index_code_list, names, fields)
    print(df)
    return df

得到所有指数的收益率数据:

图片

df = Dataloader().load_datas(index_code_list, names, fields)
df = df.pivot_table(columns='code', values='close', index=df.index)
df.ffill(inplace=True)
df = df.pct_change()
df.dropna(inplace=True)
print(df.corr())

计算核心指数的收益率以及相关系数。

图片

可以看出来,同一市场比如沪深300, 中证500,创业板的相关系数高,都在0.7以上,而与美股的相关性不到0.2,港股是0.5。

所以,这样的大类资产配置在一起,是可以显著降低波动的。

有个收益率数据,可以计算风险平价:

solution x: [11.0326  9.943   8.8493 13.5096 12.8522 13.3536 15.1819 15.2778]

lambda star: 13.9064

risk contributions: [12.5 12.5 12.5 12.5 12.5 12.5 12.5 12.5]

根据过往十年的协方差,可以得出,沪深300配置11%,纳指100配置15%等等。

按过往一年的协方差来计算:

solution x: [12.7872 13.2409 10.5217 14.2504  8.1779  9.8577 17.9687 13.1956]

lambda star: 0.9205

risk contributions: [12.5 12.5 12.5 12.5 12.5 12.5 12.5 12.5]

结果也没有差特别多,与等权的12.5%相比,有些多一点,有些少一点,最多的17%,最少的也有8%。

因此我们要配置多因子,比如某市场就在下行,那当期不配置这样一个多因子的逻辑。

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

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

相关推荐

发表回复

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