精华帖子

策略分享——金叉共振择时策略

由bqy53ve0创建,最终由bqy53ve0 被浏览 32 用户

1.指标介绍

1.1技术面指标

1.1.1macd指标

MACD(Moving Average Convergence Divergence)即移动平均线收敛散度指标,属于趋势类技术分析工具,通过计算不同周期移动平均线的差值,揭示股价趋势的强弱变化及转折信号。

  1. 快速线(DIF 线):通常为 12 日指数移动平均线(EMA12)与 26 日指数移动平均线(EMA26)的差值,反映短期趋势。
  2. 慢速线(DEA 线):DIF 线的 9 日指数移动平均线,平滑 DIF 线的波动,反映长期趋势。
  3. 柱状线(MACD 柱):DIF 线与 DEA 线的差值,通过柱体长短和颜色(红 / 绿)直观展示多空力量对比。
  4. 多头趋势:DIF 线与 DEA 线均位于 0 轴上方,且 DIF 线在 DEA 线上方,表明市场处于强势上涨周期。
  5. 空头趋势:DIF 线与 DEA 线均位于 0 轴下方,且 DIF 线在 DEA 线下方,表明市场处于弱势下跌周期。
  • 零上金叉:DIF 线从下向上突破 DEA 线,且两线均在 0 轴上方,为强势多头信号,上涨概率较高。
  • 零下金叉:DIF 线从下向上突破 DEA 线,但两线均在 0 轴下方,可能为下跌中继或弱势反弹,需结合其他指标验证。
  • 零上死叉:DIF 线从上向下跌破 DEA 线,且两线均在 0 轴上方,可能预示上涨趋势结束,需警惕回调。
  • 零下死叉:DIF 线从上向下跌破 DEA 线,且两线均在 0 轴下方,为强势空头信号,下跌动能增强。

1.1.2kdj指标

KDJ 指标(随机指标)由乔治・莱恩(George Lane)创立,属于超买超卖型技术分析工具,通过计算股价的收盘价在近期价格波动中的相对位置,判断市场短期超买或超卖状态,进而预测价格反转机会。

  1. K 线(快线):反映当前价格在周期内的相对位置,取值范围 0-100。

  2. D 线(慢线):K 线的移动平均线,平滑 K 线波动,取值范围 0-100。

  3. J 线(方向敏感线):对 K 线和 D 线的偏离程度进行放大,取值范围可超过 0-100(有时显示为 - 100~200),用于辅助判断趋势强度。

  4. 超买区(风险信号):K、D、J 线数值超过 80,表明短期上涨动能过度释放,价格可能回调或反转。

  5. 超卖区(机会信号):K、D、J 线数值低于 20,表明短期下跌动能过度释放,价格可能反弹或反转。

  6. 震荡区(观望信号):数值在 20-80 之间,市场处于震荡整理,指标信号可靠性降低。

    金叉(买入信号)

    • 超卖区金叉:K 线从下向上突破 D 线,且 K、D 值均低于 20,为较强的反弹信号,尤其是 J 线率先拐头向上时,可靠性更高。
    • 震荡区金叉:K 线在 20-80 区间内上穿 D 线,需结合成交量或趋势方向判断,可能为趋势延续或震荡反弹。

    死叉(卖出信号)

    • 超买区死叉:K 线从上向下跌破 D 线,且 K、D 值均高于 80,为较强的回调信号,若 J 线同时拐头向下,下跌动能更强。
    • 震荡区死叉:K 线在 20-80 区间内下穿 D 线,可能为趋势反转或震荡回落,需结合其他指标验证。

1.1.3rsi指标

RSI 指标(相对强弱指标)由威尔斯・怀尔德(Wells Wilder)提出,属于动量型技术分析工具,通过计算一段时间内股价上涨和下跌的动能比值,判断市场多空力量的强弱对比,识别超买、超卖状态及趋势反转信号。

  • 若股价上涨天数多于下跌天数且涨幅更大,RSI 数值升高,表明多方力量占优;
  • 若股价下跌天数多于上涨天数且跌幅更大,RSI 数值降低,表明空方力量占优。
  • RSI > 70,表明多方力量过度释放,短期可能见顶回落(对应 “物极必反”)
  • RSI < 30,表明空方力量过度释放,短期可能触底反弹。
  • 卖出信号:RSI 从超买区(>70)回落并跌破 70,表明多方力量衰退,可视为短期止盈信号。
  • 买入信号:RSI 从超卖区(<30)回升并突破 30,表明空方力量减弱,可视为短期入场信号。

1.2其他指标

资产负债率:资产负债率是企业总负债总资产的比率,表明企业资产对负债的覆盖程度,体现其财务杠杆水平和偿债风险。

debt_to_asset_lf
close/adjust_factor

前复权价格:以当前股价为基准,将历史股价按比例向下调整,使除权前的价格与现价保持连贯。以上市首日股价为基准,将后续股价按比例向上调整,体现股票的实际回报。前复权买卖,后复权研究。

        is_risk_warning = 0                    -- 剔除ST股
        AND suspended = 0                      -- 剔除停牌(未交易)
        AND st_status = 0                     -- 剔除st股(未交易)
        AND list_sector in (1,2,3)           -- 剔除科创板及京市

其他条件:一些非常常见的基本面过滤

\

2.策略逻辑编写

2.1 macd金叉、macd死叉

一种金叉判断

        macd_diff_12_26_9 AS dif,
        macd_dea_12_26_9 AS dea,
        CASE WHEN dif > dea AND m_lag(dif, 1) <= m_lag(dea, 1)
        THEN 1 ELSE 0 END AS macd_signal,

一种死叉判断

        macd_diff_12_26_9 AS dif,
        macd_dea_12_26_9 AS dea,
        CASE WHEN dif < dea AND m_lag(dif, 1) >= m_lag(dea, 1) THEN 1 ELSE 0 END AS macd_sell,

2.2 kdj金叉

一种金叉判断

        kdj_k_9_3_3 AS k_value,
        kdj_d_9_3_3 AS d_value,
        CASE WHEN k_value > d_value AND m_lag(k_value, 1) <= m_lag(d_value, 1) THEN 1 ELSE 0 END AS kdj_signal,

一种死叉判断

        kdj_k_9_3_3 AS k_value,
        kdj_d_9_3_3 AS d_value,
        CASE WHEN k_value < d_value AND m_lag(k_value, 1) >= m_lag(d_value, 1) THEN 1 ELSE 0 END AS kdj_sell,

2.3 rsi超买和死叉

超买信号,参数不确定

AND rsi_6 > 60

rsi死叉

        m_ta_rsi(close, 14) AS rsi_14,
        m_lag(m_ta_rsi(close, 14), 1) AS rsi_14_lag1,
        CASE WHEN m_lag(m_ta_rsi(close, 14), 1) >= 50 AND m_ta_rsi(close, 14) < 50 THEN 1 ELSE 0 END AS rsi_sell,

2.4 其他简单过滤条件

对股票池进行筛选

        is_risk_warning = 0                    -- 剔除ST股
        AND suspended = 0                      -- 剔除停牌(未交易)
        AND st_status = 0                     -- 剔除st股(未交易)
        AND list_sector in (1,2,3)           -- 剔除科创板及京市
        AND close/adjust_factor < 100          -- 前复权价格小于100
        AND float_market_cap > 5e8
        AND debt_to_asset_lf > 0

策略具体逻辑:比较有多样性,配合结合多种买入卖出信号,根据回测优化。

2.5 整体逻辑

满仓操作:时刻持有一定数目的股票,每卖出一只,就买入一只,保证资金充分运用。

        for instrument in instruments_to_sell:
            context.order_target_percent(instrument, 0)
            if instrument in context.positions_info:
                del context.positions_info[instrument] # 清除持仓信息
        num = 10 - len(positions) + len(instruments_to_sell)
        # print('卖出后',len(positions))
        # for instrument in top_stocks:
        for instrument in top_stocks[:num]:
            if instrument not in positions: # 如果不在仓位中才买入,避免重复买入
                context.order_target_percent(instrument, 1 / context.stock_count) # 等权重买入
                if instrument not in context.positions_info:
                    current_price = data.current(instrument, 'open') # 买入价格为开盘价
                    context.positions_info[instrument] = {'entry_price': current_price, 'hold_days': 0, 'entry_date': current_date} # 记录买入信息

3.策略优化结果

经过多次尝试,我们筛选满足基本面过滤,并且近两天出现过macd金叉、kdj金叉,并且rsi距离超买比较接近的股票。当出现macd死叉、kdj死叉以及rsi死叉两者的时候就卖出。

一个dataframe用于识别买入信号,一个dataframe用于识别卖出信号,分别诱导买入和满仓操作。由于每天需要进行择时判断,运行结果比较缓慢。

4.策略代码

在BigQuant平台的“策略社区”中的“AI策略”中。

https://bigquant.com/square/ai/52e68f2d-74cf-8d33-88aa-81fda47d0f8c

{link}