ETF大小盘轮动策略回测分析

akshare写etf动量滚动策略 导入包: import akshare as ak import pandas as pd import numpy as np import matplotlib 日线换周线: #日线换为周线数据 def transferToWeekLine(df,period='W'): data1=df stock_data = pd.DataFrame(data1) #设定转换周期period_type 转换为周是'W',月'M',季度线'Q',五分钟'5min',12 阅读详情

从前面的ETF基金定投策略回测和周内效应分析文章中可以看到,代表大盘指数的沪深300ETF基金510300和代表小盘的创业板ETF基金159915的收益在长期来看差别较大。但是单独定投小盘指数收益高,但是回撤比较大;单独定投大盘指数回撤也不小,收益也不够高。

根据组合资产理论,通过不同标的组合,可以在一定程度上分散风险。当然,前提是所选标的最好是不相关的。但实际上如果只在A股市场的指数里选择,要找两个完全不相关的标的估计是不太可能。这里要求不高,找两个相关性不高的标的就好了。这里我偷个懒,根据网友的研究结果,沪深300指数000300和和中证1000指数000852的差异是最大的,而这两个指数刚好也能够作为大盘股和小盘股的代表。那么下面就选择这两个指数作为标的,对应的ETF基金分别是沪深300ETF基金510300和中证1000ETF基金512100。

由于我是想寻找傻瓜定投策略,所以这里不会把ETF当作股票来买卖做趋势跟踪,还是采取每月或者每周定投的方式。

一、轮换策略

风格轮换定投策略如下:

(1)每个交易日收盘后计算沪深300指数和中证1000指数过去N个交易日的累积涨幅(动量)。

(2)根据两个指数的动量的相对大小确定下一个交易日买入动量大的指数对应的ETF基金,金额固定为1000元。

(3)买入后一直持有,回测结束时计算收益。

二、回测结果

下面我们来测试一下看看轮动买入的策略是否会更好。

本次回测中每次定投固定金额1000元,滑点率为0.01%,交易费率为0.05%。回测区间从2016年12月1日到2022年9月1日。由于是傻瓜定投,因此买入后一直持有,直到回测结束。

回测使用的代码如下:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
import akshare as ak
from math import sqrt, pow
import numpy as np
import numpy_financial as npf



# 计算动量策略
def momentum(sz50, zz1000, etf50, etf1000, n=20):
    diff = set(etf50['date'])-set(etf1000['date'])
    diff1 = set(etf50['date'])-set(sz50['date'])
    print(diff, diff1)
    stock_data = pd.DataFrame({'date': etf50['date'], 'big_index_close': sz50['close'],
                               'small_index_close': zz1000['close'],
                               'big_open': etf50['open'], 'big_close': etf50['close'],
                               'big_change': etf50['change'], 'small_open': etf1000['open'],
                               'small_close': etf1000['close'], 'small_change': etf1000['change']})
    # 动量策略
    momentum_days = 20
    stock_data['big_mom'] = stock_data['big_index_close'].pct_change(periods=momentum_days)  # 计算N日的动量momentum
    stock_data['small_mom'] = stock_data['small_index_close'].pct_change(periods=momentum_days)
    stock_data.index = range(len(stock_data))
    stock_data.loc[stock_data['big_mom'] > stock_data['small_mom'], 'big_sig'] = 1
    stock_data.loc[stock_data['big_mom'] < stock_data['small_mom'], 'small_sig'] = 1
    # 下跌趋势停投
    stock_data.loc[(stock_data['big_mom'] < 0) & (stock_data['small_mom'] < 0), 'big_sig'] = 0
    stock_data.loc[(stock_data['big_mom'] < 0) & (stock_data['small_mom'] < 0), 'small_sig'] = 0
    # 上涨趋势停投
    # stock_data.loc[(stock_data['big_mom'] > 0) & (stock_data['small_mom'] > 0), 'big_sig'] = 0
    # stock_data.loc[(stock_data['big_mom'] > 0) & (stock_data['small_mom'] > 0), 'small_sig'] = 0
    global amount, commis_rate, slippage_rate
    old_pos_big = 0
    old_invest = 0
    stock_data['big_poschg'] = 0
    stock_data['big_pos'] = 0
    stock_data['invest_big'] = 0
    i = 0
    while i < len(stock_data) :  # 大盘ETF处理
        if stock_data.loc[i, 'big_sig'] == 1:  # i+1日买入etf300
            # print(i,stock_data.loc[i, 'position'])
            stock_data.loc[i, 'big_poschg'] = old_pos_big
            stock_data.loc[i, 'invest_big'] = old_invest  # 累计投入金额
            old_pos_big = amount * (1 - commis_rate - slippage_rate) / stock_data.loc[i, 'big_open']  # 定投日增加固定金额
            old_invest += amount
            i += 1
        else:
            stock_data.loc[i, 'big_poschg'] = old_pos_big
            stock_data.loc[i, 'invest_big'] = old_invest
            old_pos_big = 0
            i += 1
    stock_data['big_pos'] = stock_data['big_poschg'].cumsum()  # 累计申购份额
    # stock_data['invest_big'] = amount * stock_data['big_sig'].cumsum()  # 累计投入金额
    stock_data['current_big'] = stock_data['big_close'] * stock_data['big_pos']  # 累计现值
    stock_data['capital_big'] = stock_data['current_big'] / stock_data['invest_big']  # 累计净值
    stock_data['capital_rtn_big'] = stock_data['capital_big'].pct_change()  # 日涨跌幅
    # 处理第一行数据为NAN问题
    stock_data['capital_big'] = stock_data['capital_big'].fillna(1)  # 将资金列的NAN改为1
    stock_data['capital_rtn_big'] = stock_data['capital_rtn_big'].fillna(0)  # 将资金列的NAN改为0

    old_pos_small = 0
    old_invest = 0
    stock_data['small_poschg'] = 0
    stock_data['small_pos'] = 0
    stock_data['invest_small'] = 0
    i = 0
    while i < len(stock_data):  # 小盘ETF处理
        if stock_data.loc[i, 'small_sig'] == 1:  # i+1日买入etf1000
            # print(i,stock_data.loc[i, 'position'],oldPosition)
            stock_data.loc[i, 'small_poschg'] = old_pos_small
            stock_data.loc[i, 'invest_small'] = old_invest  # 累计投入金额
            old_pos_small = amount * (1 - commis_rate - slippage_rate) / stock_data.loc[i, 'small_open']  # 定投日增加固定金额
            old_invest += amount
            i += 1
        else:
            stock_data.loc[i, 'small_poschg'] = old_pos_small
            stock_data.loc[i, 'invest_small'] = old_invest
            old_pos_small = 0
            i += 1
    stock_data['small_pos'] = stock_data['small_poschg'].cumsum()  # 累计申购份额
    # stock_data['invest_small'] = amount * stock_data['small_sig'].cumsum()  # 累计投入金额
    stock_data['current_small'] = stock_data['small_close'] * stock_data['small_pos']  # 累计现值
    stock_data['capital_small'] = stock_data['current_small'] / stock_data['invest_small']  # 累计净值
    stock_data['capital_rtn_small'] = stock_data['capital_small'].pct_change()  # 日涨跌幅
    # 处理第一行数据为NAN问题
    stock_data['capital_small'] = stock_data['capital_small'].fillna(1)  # 将资金列的NAN改为1
    stock_data['capital_rtn_small'] = stock_data['capital_rtn_small'].fillna(0)  # 将资金列的NAN改为0

    stock_data.to_excel("trade.xlsx", sheet_name='trade', index=False)
    return stock_data


# 计算股票和策略年收益
def calc_rtn(data, invest_num, current, type):
    dft = data[['date', 'change', 'capital_rtn']].copy()
    dft['date'] = pd.to_datetime(dft['date'])  # 将str类型改为时间戳格式
    # 计算每一年股票、资金曲线的收益
    year_rtn = dft.set_index('date')[['change', 'capital_rtn']].resample('A').apply(lambda x: (x + 1.0).prod() - 1.0)
    year_rtn.dropna(inplace=True)
    # 计算策略和股票的年胜率
    date_list = list(data['date'])
    capital_list = list(data['capital'])
    index_list = list(data['close'])
    dft = pd.DataFrame({'date': date_list, 'capital': capital_list, 'close': index_list})
    dft.sort_values(by='date', inplace=True)
    dft.reset_index(drop=True, inplace=True)
    rng = pd.period_range(dft['date'].iloc[0], dft['date'].iloc[-1], freq='D')  # 创建时间范围,用于计算回测天数
    capital_cum = dft['capital'].iloc[-1] / dft['capital'].iloc[0]
    stock_cum = dft['close'].iloc[-1] / dft['close'].iloc[0]
    # capital_annual = (dft['capital'].iloc[-1] / dft['capital'].iloc[0]) ** (trade_day / len(rng)) - 1
    stock_annual = (dft['close'].iloc[-1] / dft['close'].iloc[0]) ** (trade_day / len(rng)) - 1
    # 计算年化收益率
    global amount
    fund = invest_num * amount
    pl = [-amount] * (invest_num + 1)  # 建立irr计算用list
    pl[invest_num] = current  # 资金现值
    month_capital = npf.irr(pl)  # 计算收益
    print(month_capital)
    capital_annual = pow((1 + month_capital), 244) - 1  # 根据日收益计算年化收益

    capital_drawdown = max_drawdown(date_list, capital_list)
    stock_drawdown = max_drawdown(date_list, index_list)
    tt = drawdown(date_list, capital_list)
    print(type)
    print('定投次数:%d  投入资金:%d  账户现值:%d' % (invest_num, fund, current))
    print('策略累积收益:%f  基金累积收益:%f' % (capital_cum, stock_cum))
    print('策略年化收益:%.2f%%  基金年化收益:%.2f%%' % (round(100*capital_annual, 2), round(100*stock_annual, 2)))
    print('策略最大回撤:%f,开始日期:%s,结束日期:%s' % capital_drawdown)
    print('股票最大回撤:%f,开始日期:%s,结束日期:%s' % stock_drawdown)


# 计算最大回撤
def max_drawdown(date_list, capital_list):
    df = pd.DataFrame({'date': date_list, 'capital': capital_list})
    df['max2here'] = df['capital'].expanding().max()  # 计算当日之前的账户最大价值
    df['dd2here'] = df['capital'] / df['max2here'] - 1  # 计算当日的回撤
    # 计算最大回撤和结束时间
    temp = df.sort_values(by='dd2here').iloc[0][['date', 'dd2here']]
    max_dd = temp['dd2here']
    end_date = temp['date']
    # 计算开始时间
    df = df[df['date'] <= end_date]
    start_date = df.sort_values(by='capital', ascending=False).iloc[0]['date']
    # df.to_excel("dropdown.xlsx", sheet_name='capital', index=False)
    # print('最大回撤为:%f,开始日期:%s,结束日期:%s' % (max_dd, start_date, end_date))
    return max_dd, start_date, end_date


def drawdown(date_list, capital_list):  # 计算最大回撤,但无法记录出现日期
    df = pd.DataFrame({'date': date_list, 'capital': capital_list})
    # df['capital'] = (1 + df['capital_rtn']).cumprod()  # 计算净值
    previos_max = df['capital'].cummax()  # 计算上一个最高点
    drawdowns = (df['capital'] - previos_max) / previos_max  # 计算回撤
    tt = drawdowns.min()  # 找出最大回撤
    return tt


# 定义求动量且绘时序图及动量图的函数
def momentum_plot(price, period):
    lagPrice = price.shift(period)
    moment = price - lagPrice
    moment = moment.dropna()

    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.subplot(211)
    plt.plot(price, 'b*')
    plt.xlabel('date')
    plt.ylabel('Close')
    plt.grid(True)
    plt.title('收盘价时序图(上)&{}日动量图(下)'.format(period))


# ====读取股票数据
df_hs300 = pd.read_csv('000300.csv', encoding='gbk')
df_zz1000 = pd.read_csv('000852.csv', encoding='gbk')
cols = ['date', 'code', 'name', 'open', 'high', 'low', 'close', 'volume', 'money', 'amp', 'change', 'chg', 'turnover']
df_hs300.columns = cols
df_zz1000.columns = cols
df_hs300.index = pd.to_datetime(df_hs300.date)
df_hs300.index = df_hs300.index.strftime('%Y%m%d')
df_hs300 = df_hs300.sort_index()
df_zz1000.index = pd.to_datetime(df_zz1000.date)
df_zz1000.index = df_zz1000.index.strftime('%Y%m%d')
df_zz1000 = df_zz1000.sort_index()
df_etf300 = pd.read_csv('510300.csv', encoding='gbk')
df_etf1000 = pd.read_csv('512100.csv', encoding='gbk')
cols_etf = ['date', 'code', 'name', 'open', 'high', 'low', 'close', 'volume']
df_etf300.columns = cols_etf
df_etf1000.columns = cols_etf
df_etf300['change'] = df_etf300['close'].pct_change()
df_etf1000['change'] = df_etf1000['close'].pct_change()
df_etf300.index = pd.to_datetime(df_etf300.date)
df_etf300.index = df_etf300.index.strftime('%Y%m%d')
df_etf300 = df_etf300.sort_index()
df_etf1000.index = pd.to_datetime(df_etf1000.date)
df_etf1000.index = df_etf1000.index.strftime('%Y%m%d')
df_etf1000 = df_etf1000.sort_index()

# ====设置回测参数
trade_day = 244  # 每年平均交易日天数
n_short = 10  # 双均线短周期
n_long = 30  # 双均线长周期
s_date = '20161201'  # 回测开始日期
e_date = '20220901'  # 回测开始日期
# s_date = '20180101'  # 回测开始日期
# e_date = '20220309'  # 回测开始日期
amount = 1000
slippage_rate = 0.1 / 1000  # 滑点率
commis_rate = 5 / 10000  # 交易费率
# ====根据策略,计算仓位,资金曲线等
# 计算买卖信号
start_date=pd.to_datetime(s_date)
end_date=pd.to_datetime(e_date)
# 从指定时间开始
hs300 = df_hs300[df_hs300['date'] >= start_date.strftime('%Y-%m-%d')].copy()
hs300 = hs300[hs300['date'] <= end_date.strftime('%Y-%m-%d')].copy()
zz1000 = df_zz1000[df_zz1000['date'] >= start_date.strftime('%Y-%m-%d')].copy()
zz1000 = zz1000[zz1000['date'] <= end_date.strftime('%Y-%m-%d')].copy()
etf300 = df_etf300[df_etf300['date'] >= start_date.strftime('%Y-%m-%d')].copy()
etf300 = etf300[etf300['date'] <= end_date.strftime('%Y-%m-%d')].copy()
etf1000 = df_etf1000[df_etf1000['date'] >= start_date.strftime('%Y-%m-%d')].copy()
etf1000 = etf1000[etf1000['date'] <= end_date.strftime('%Y-%m-%d')].copy()
df = momentum(hs300, zz1000, etf300, etf1000, n=20)

# ====根据策略结果,计算评价指标
print("回测区间:%s-%s" % (s_date, e_date))
# 大盘ETF收益
data = pd.DataFrame({'date': df['date'], 'change': df['big_change'], 'close': df['big_close'],
                               'capital_rtn': df['capital_rtn_big'], 'capital': df['capital_big']})
invest_big = len(df[df['big_sig'] > 0]) - 1
current_big = df['current_big'].iloc[-1]
calc_rtn(data, invest_big, current_big, '沪深300')
# 小盘ETF收益
data = pd.DataFrame({'date': df['date'], 'change': df['small_change'], 'close': df['small_close'],
                               'capital_rtn': df['capital_rtn_small'], 'capital': df['capital_small']})
invest_small = len(df[df['small_sig'] > 0]) - 1
current_small = df['current_small'].iloc[-1]
calc_rtn(data, invest_small, current_small, '中证1000')

# 净值曲线图
df['stock_big'] = (1 + df['big_change']).cumprod()
df['stock_small'] = (1 + df['small_change']).cumprod()
hs300['stock'] = (1 + hs300['change']/100).cumprod()
zz1000['stock'] = (1 + zz1000['change']/100).cumprod()
# plt.plot(df['date'], df['stock_big'], label='510300')
# plt.plot(df['date'], df['stock_small'], label='512100')
plt.plot(df['date'], hs300['stock'], label='index-000300')
plt.plot(df['date'], zz1000['stock'], label='index-000852')
plt.plot(df['date'], df['capital_big'], label='动量-ETF300')
plt.plot(df['date'], df['capital_small'], label='动量-ETF1000')
plt.ylabel("净值", fontproperties="SimSun")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("大小盘轮动定投净值曲线(%s-%s)" % (s_date, e_date))
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(100))  # 设置x轴密度
plt.xticks(rotation=45)  # 旋转45度显示
plt.legend(loc='best')
plt.savefig('大小盘轮动定投-' + s_date + '-' + e_date + '.png')
# plt.show()
plt.close()
# 收盘价曲线图
# plt.plot(df['date'], hs300['close'], label='index-000300')
# plt.plot(df['date'], zz1000['close'], label='index-000852')
plt.plot(df['date'], hs300['stock'], label='index-000300')
plt.plot(df['date'], zz1000['stock'], label='index-000852')
# plt.plot(df['date'], df['big_mom'], label='动量-000300')
# plt.plot(df['date'], df['small_mom'], label='动量-000852')
# plt.plot(df['date'], df['capital_big'], label='510300')
# plt.plot(df['date'], df['capital_small'], label='512100')
plt.ylabel("收盘价", fontproperties="SimSun")
plt.rcParams['font.sans-serif'] = ['SimHei']
# plt.title("大小盘轮动定投净值曲线(%s-%s)" % (s_date, e_date))
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(100))  # 设置x轴密度
plt.xticks(rotation=45)  # 旋转45度显示
plt.legend(loc='best')
plt.savefig('大小盘指数动量对比-' + s_date + '-' + e_date + '.png')
plt.show()

对于N=20的情况,回测结果如下:

累积净值曲线如下:

对于N=10的情况,回测结果如下:

对于N=30的情况,回测结果如下:

结果分析:

(1)大盘指数ETF的收益较差,收益随着N的增大而有所增加。说明大盘指数对动量指标的变化不敏感?轮动效应不明显?

(2)小盘指数的收益还不错,但回撤更大。

(3)N的选择年化收益的影响不明显。

由于选择的是大盘指数和小盘指数轮动,因此基本上没有都有买入,市场的涨涨跌跌基本上都没落下。大盘指数的这个结果基本跟直接持有指数没有区别,但是小盘指数定投真的是出乎意料的好啊。

三、策略优化

观察策略收益曲线会发现,策略在指数上涨时能保持同步上涨,但在市场下跌时也会同步下跌。很明显,单边市场会影响定投的结果。

由于本策略是只买不卖,与股票的涨时持仓跌时空仓有所不同。理论上来讲,如果能够在市场下跌时连续定投,可以降低总体成本;反之,在市场上涨时连续定投,则会增加总体成本。

1.上涨或下跌停止定投策略分析

下面来回测一下这一判断是否正确。将策略修改为在市场上涨时停投和在市场下跌时停投,看看是否有区别。

对于上涨时停止定投(N=20)的情况,回测结果如下:

对于下跌时停止定投(N=20)的情况,回测结果如下:

从结果可以看出,在上涨时停止定投,大盘和小盘指数ETF的年化收益都能够增加,小盘指数ETF增加幅度非常大;在下跌时停止定投,大盘指数ETF收益变为负,小盘指数ETF收益还是有一定幅度的增加。

四、存在的问题

1.年化收益的计算问题

本文采用的是numpy中的irr()函数计算,具体解释参考《ETF基金定投策略回测分析》。

fund = invest_num * amount

pl = [-amount] * (invest_num + 1)  # 建立irr计算用list

pl[invest_num] = current  # 资金现值

month_capital = npf.irr(pl)  # 计算收益

print(month_capital)

capital_annual = pow((1 + month_capital), 244) - 1  # 根据日收益计算年化收益

这里有个问题,采用本文的定投策略,不管是定投大盘还是小盘ETF,其时间间隔都是不确定的。这里都是把irr()的结果当做日收益率,然后采用一年244个交易日来计算年化收益。目前还没有完全想清楚这个方式是否存在问题~~~

2.回测区间问题

回测区间为2016年12月1日到2022年9月1日。回测区间本来是打算一直到写文章这天的,但是512100在2022年9月2日做了一次份额合并,然后导致AKShare中下载的当天数据缺失,现在还不知道怎么把这个数据补上(知道的朋友麻烦告诉我一下^-^~~~)。为了避免这个问题的影响,就把回测区间的结束日期取到这天之前。

3.沪深300指数ETF的定投收益问题

从上面的回测结果可以看到,沪深300指数ETF的定投怎么弄收益都不行。开始我以为是因为它对动量指标不敏感,于是我用以前的周内定投方式测试了一下,结果如下:

大家看到了,结果更差!好吧,必须要承认被沪深300 指数ETF打败了。这就是一头死猪,完全不怕开水烫啊~~~

感觉上是跟这个回测区间及指数在这期间的走势有关,不过还没找到具体原因,后续有时间仔细分析下。现在我只能说,这个区间选择真的是神了。

-----------------------------------

原创不易,请多支持!

ETF动量策略实盘接入全记录:从回测到一键下单的实战指南 程序化交易是量化投资落地的重要方式,其核心价值在于把历史回测中验证过的交易逻辑,通过代码自动执行到真实市场。动量策略作为经典趋势跟踪因子,常被用于ETF轮动选股,但回测中的理想成交与实盘环境存在数据延迟、滑点、手续费、涨跌停、T+1限制等现实约束。理解这些差异,是回测策略能否顺利走向实盘接入的关键。从动量排名计算、交易通道封装到一键调仓流程设计,工程化地处理订单状态、资金冻结与异常重试,能显著降低实盘翻车风险。以ETF动量排名策略的实盘接入为例,梳理从回测到实盘的完整路径,为量化交易系统的实战落地提供参考。 阅读详情

相关推荐

用Python和Numpy手撸一个ETF动量轮动策略(附完整代码与回测结果)

本文详细介绍了如何使用Python和Numpy构建一个ETF动量轮动策略,包括数据准备、动量因子计算、组合构建与回测实现。通过斜率动量因子和改进的轮动逻辑,策略在趋势市场中表现优异,同时提供了波动率调整和止损机制等风险控制方法。附完整代码与回测结果,帮助投资者掌握量化策略的底层实现。

weixin_28731223的博客 708

ETF 轮动策略 —— 大小盘动量轮动

ETF 轮动策略 —— 大小盘动量轮动

domodo2012的博客 7708

经典量化策略:二八轮动策略

买大盘股好,还是买小盘股好,这是二八轮动策略(也称大小盘轮动策略)所思考的“哲学”问题。 在A股市场,大盘股数量和小盘股数量往往二八分。而占市场股票数量20%的大盘股,其市值往往占全市场的80%左右,呈现明显的二八定律,这也算是A股的特色,在成熟的美国市场,大小盘之间轮动就不那么的显著了。 A股市场中具有代表性的大盘股指数有上证50指数和沪深300指数,小盘股代表性指数有中证500、中证1000和创业板指。 由于指数不能直接交易,所以该策略的交易标的往往选择其对应的指数ETF或者成分股..

量化交易研究 3297

近4个月狂揽62%!年化飙升453%!六年11倍「ETF双池动量轮动」策略

本文详细介绍了「ETF双池动量轮动」策略的核心逻辑与实战表现。该策略创新性地采用静态精选池与动态流动性池相结合的方式,通过三重筛选机制(双均线趋势过滤、加权平滑动量打分、量价异动排雷)严格筛选标的,并配备8%止损、放量清仓等风控措施。回测显示,该策略近4个月收益达62.61%(年化453.97%),6年累计收益超11倍,展现出优异的爆发力与长期稳健性。实盘采用3只分仓模式以平衡收益与风险。文章还提供了策略参数表、执行细节及开源代码链接,为量化投资者提供了可复制的策略框架。

stars580的博客 1793

RSRS指标择时及大小盘轮动

context.stk1 = '510300.OF' # 沪深300(大盘)context.stk2 = '510500.OF' # 中证500(小盘)set_params(context) # 设置策略参数。set_slippage(PriceSlippage(0.002)) # 设置可变滑点。4)若RSRS指标在-S和S中间时,两标的的RSRS相对大小变化,则表示风格轮动,换仓,否则不交易。

2302_82062185的博客 1203

大A社群丨全球宽基ETF轮动(GP02)

在上一期中,我们分享了技术多因子(外加一些基本简单的财务因子)策略,本期我们分享ETF轮动策略,该策略是历史所有策略中(包括期货社群、可达鸭社群分享的策略)最适合钱少、风险承受能力弱、投资交易理念落后与知识匮乏的投资者。那么问题来了,多个ETF指的是哪多个?这些具有一定特色的指数,根据一定简单标准也可以尝试纳入其中,由于具体篇幅有限,以及策略迭代性多等情况,上述逻辑和宽基指数并未在该版本中考虑,不过这是后续迭代重点。3、该策略迭代空间很大,例如轮动逻辑,宽基指数扩张,宽窄基混合,股债混合等等。

松鼠宽客的博客 1171

【浅析-大小轮动ETF策略】

本文深入探讨了A股市场中大小盘轮动策略的核心逻辑与实践方法。文章以沪深300(代表大盘)和中证500(代表小盘)为经典组合,分析了二者历史表现的分化特征(如2017年与2021年的显著差异)。估值法(看PE历史分位)、趋势法(动量策略)和经济周期法。重点介绍了简单有效的"二八轮动"策略及其回测表现(2005-2022年年化收益超15%),同时客观指出了其在震荡市中容易"来回打脸"的局限性。文章进一步探讨了进阶玩法(如均线过滤、多指数轮动)以及当前市场环境下策略的适用性与调整方法(如拉长周期、分仓操作)。

majunfu 224

量化策略之ETF核心资产轮动

这个量化策略的核心在于选择相关性较低的核心资产ETF,主要是商品(黄金、豆粕)、美股(标普500、纳指100)、A股(沪深300、创业板100),通过动量因子来打分进行轮动,每日进行调仓。

qq_29301281的博客 1704

大小盘轮动策略:如何在上证50ETF与创业板50ETF之间实现高效投资

1引言大小盘动量轮动策略是一种常见的量化投资策略,它利用市场中不同市值板块之间的相对强弱来实现盈利。本文以上证50ETF作为大盘股代表,以创业板50ETF作为小盘股代表。上证50ETF主要反映的是大盘蓝筹股的走势,其成份股主要是市值较大、流动性好、盈利能力强的优质企业。大盘股的投资特点是稳健、低风险,但可能收益较低。相比之下,创业板50ETF主要反映的是小盘成长股的走势,其成份股主要是市值较小、成...

Python金融量化 1927

第四章:经典量化策略集锦(第二篇:从“二八轮动”中学择时)

 导语:作为策略锦集第二篇,我们以沪深A 股市场出了名的“二八轮动”现象为基础,向大 家介绍经典择时策略:二八轮动策略。 一、策略阐述     在介绍二八轮动策略之前,我们首先来了解一下择时交易,择时交易是指利用某种方法 来判断后市走势,如果判断是上涨,则买入持有;如果判断是下跌,则卖出清仓;如果判断 是震荡,则进行高抛低吸,这样可以获得远远超越简单买入持有策略的收益率,所以择时交 易是收益率最高...

无语僧 2750

ETF轮动策略:基于动量与趋势过滤的量化投资框架解析

量化投资通过系统化规则替代主观决策,旨在克服人性弱点并实现稳健收益。其核心原理在于利用数学模型与历史数据构建交易信号,技术价值体现在纪律性执行与风险分散。在资产配置领域,动量模型与均值回归是两种基础策略思路,分别对应追涨杀跌与高抛低吸的逻辑。ETF轮动策略作为典型应用,通过在不同类别ETF间定期切换,结合趋势过滤与动量排名,试图捕捉资产轮动机会。本文以全天候五福ETF轮动为例,深入拆解其基于双均线趋势过滤与动量排名的轮动引擎,并提供完整的Python回测实现,涵盖数据获取、信号生成到绩效评估的全流程,为构建

weixin_29039773的博客 359

手把手教你构建与改进轮动策略(十年10倍,附Python源码)

撸起袖子,吭哧吭哧~

iamquantman的博客 5545

[QMT量化交易小白入门]-二十四、年化收益47%的全球核心资产轮动策略(含代码解析)

m_days = 25 #动量参考天数period=200m_days被设置为25,表示动量参考的天数为25天;period被设置为200,用于指定获取市场数据的周期长度。

木头大左的博客 2967

基于 A 股 ETF 的轮动策略例子 新手学习

这个例子提供了一个相对完整且考虑了稳健性的 A 股 ETF 轮动策略框架,你可以基于此进行修改、扩展和深入研究。,实现在不同市场环境下轮动持有表现较好或风险较低的 ETF,以期达到超越基准、控制回撤的稳健目标。我们来设计一个基于 A 股 ETF 的轮动策略(新手学习,不能实盘)

zhangyunchou2015的博客 2403

[QMT量化交易小白入门]-七十一、十年回测ETF动量策略,超额年化收益率为10.6%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1850

三菱FX5U通信之CCLINK操作步骤

11. 连接 CC‐Link 用的端子排,连接 Ver.1.10 对应 CC‐Link 专用电缆。备注:1、以上对应的寄存器都是一一对应的,主站的点数可以比从站多,但是都需要一一对应起来。3.直接安装孔,用于直接安装的螺钉孔(2‐φ4.5,安装螺钉为 M4 螺钉)2.点阵 LED(显示模块中设置的站号和测试模式的内容)5.次段扩展连接器(连接扩展模块的扩展电缆的连接器)4.动作状态(显示 LED 显示模块的动作状态)10 电源连接器,用于连接电源电缆的连接器。1.扩展电缆(扩展时连接用的电缆)

ZXL622722的博客 6925

抱团股会一直涨?无脑执行大小盘轮动策略,轻松跑赢指数5倍【附Python代码】

引言: 邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。 前言: 巴蛇吞象,扬州跨鹤。人性之贪婪,逝者如此,来者亦然。 王朝兴衰,人生起落。周期之更替,顺之则昌,逆之则亡。 金融市场变化万千,唯独人性与周期,始终如一。 智者善以不变应万变,量化策略亦是如此。从不变的人性和周期入手构建策略,就能经得起市场考验。 本文就从周期角度介绍一个简单有效、拓展性强的量化策略...

xingbuxing_py的博客 3590

数字取证双雄:Passware Kit Forensic 与 ElcomSoft 在实战场景下的能力边界解析

本文深入解析了Passware Kit Forensic与ElcomSoft在数字取证实战中的能力边界,涵盖Windows、macOS、iOS和Android系统的密码恢复与数据提取技术。通过真实案例对比两款工具在硬件加速、分布式计算及云取证等场景下的表现差异,为取证专家提供关键决策参考。特别探讨了密码恢复软件在加密设备突破中的核心作用。

weixin_30342209的博客 397

ETF策略之核心资产轮动!

所以,当初根据市场的两种主要风格选择了具有“成长股,科技股,题材性,中小盘”属性的创业板ETF,以及具有“价值股,蓝筹股,防御性,中大盘”属性的上证180ETF。.更新后的策略,继续保留创业板ETF,因为创业板代表我国科技行业的未来,是一个拥有市梦率的指数,如果牛市来临,相信创业板指会有更大的涨幅。最后总结,新版的ETF轮动策略的思想核心是,通过使用被国内外学者及投资人广泛印证长期有效的动量法,捕捉具备核心资产属性且相关性较弱的大宗商品,海外资产,国内价值股与成长股之间的轮动效应,从而获取超额收益。

GJ57017_wx的博客 1704

ComfyUI 的 LoRA 训练:秋叶 LoRA-scripts 参数设置与测试方法详解

秋叶 LoRA-scripts 的参数设置需结合理论(如模型原理、优化器机制)和硬件条件(显存、算力),新手可先按推荐值起步,再逐步调整。测试时,loss 值帮你判断训练是否正常,XYZ 图表法帮你找到最佳使用参数。掌握这些知识,你就能避开 LoRA 训练的常见坑,从 “盲目调参” 变为 “精准训练”。

2301_78150483的博客 2398

基于UWB技术的自动跟随避障系统设计研究

基于UWB技术的自动跟随避障系统设计研究 摘要:目前我国针对自动跟随避障系统方面的研究较少,同时国内自动跟随避障系统仍然处在未成熟阶段,多数仍停留在应用蓝牙控制或摄像头捕捉这类跟随方式,但这类方式在实际应用过程中往往会出现易受干扰,精度差,易受环境干扰等问题,这不仅会降低自动跟随避障系统的性能,同时也会对用户造成诸多困扰。因此,就需要结合目前较为有效的UWB技术,对自动跟随避障系统进行设计。基于此,本文首先将会针对UWB技术展开概述,而后对基于UWB技术的自动跟随避障系统组成展开分析,进而对基于UWB技术的

qq_43543515的博客 7991

年化29.6%:基于ETF评分的轮动策略加止损风控版本,更稳健(python代码+数据)

t.select_sell = ['(1-close/shift(close,1))>0.04'] # 止损条件。t.select_buy = ['close>ma(close,4)'] # 入场条件。'159915.SZ', # 创业板100(成长股,科技股,中小盘)'159915.SZ', # 创业板100(成长股,科技股,中小盘)'510180.SH', # 上证180(价值股,蓝筹股,中大盘)'513100.SH', # 纳指100(海外资产)

weixin_38175458的博客 3377

大疆 DJI Mobile SDK实战指南——从零构建Android示例开发环境

本文提供了一份详尽的DJI Mobile SDK Android开发环境搭建实战指南。文章手把手教你从注册开发者账号、获取App Key,到配置Android Studio、下载官方示例代码,最终成功运行DJI官方Android示例程序,帮助开发者快速入门无人机应用开发,避开常见编译与依赖问题。

weixin_29188043的博客 273
上一篇: 周内效应对ETF定投的影响分析
下一篇: 估值择时对ETF基金定投的影响
--莫名--
博客等级 码龄24年 653粉丝 35原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值