Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,17 @@ These profiles use platform-provided `market_history` and do not require a separ
| --- | --- | --- | --- | --- |
| `cn_industry_etf_rotation_aggressive` | CN Industry ETF Rotation Aggressive | `market_history` | `510300` | Optional QMT live candidate; not the default runtime profile. |

### Research-only snapshot profiles

| Profile | Name | Input | Benchmark | Current role |
| --- | --- | --- | --- | --- |
| `cn_chinext_growth_momentum_quality_snapshot` | CN ChiNext Growth Momentum Quality Snapshot | `feature_snapshot` + manifest | `399006` | Research-only ChiNext growth-momentum-quality selector. |

### Planned external snapshot scaffolds

| Profile | Name | Notes |
| --- | --- | --- |
| `cn_small_cap_quality_snapshot` | CN Small-Cap Quality Snapshot | External snapshot scaffold; not registered in the runtime catalog yet. |
| `cn_chinext_growth_momentum_quality_snapshot` | CN ChiNext Growth Momentum Quality Snapshot | External snapshot scaffold for a ChiNext growth-momentum-quality sleeve; not registered in the runtime catalog yet. |
| `cn_chinext_tactical_rotation` | CN ChiNext Tactical Rotation | Research-only ChiNext tactical rotation line. |

## Performance and evidence boundary
Expand Down
7 changes: 6 additions & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,17 @@
| --- | --- | --- | --- | --- |
| `cn_industry_etf_rotation_aggressive` | CN Industry ETF Rotation Aggressive | `market_history` | `510300` | **Optional QMT live candidate**,不是默认 runtime。 |

### 研究侧 snapshot 策略

| Profile | 名称 | 输入 | 基准 | 当前角色 |
| --- | --- | --- | --- | --- |
| `cn_chinext_growth_momentum_quality_snapshot` | CN ChiNext Growth Momentum Quality Snapshot | `feature_snapshot` + manifest | `399006` | **研究轨**:创业板成长动量质量选择。 |

### 计划中的 snapshot-backed 策略

| Profile | 名称 | 输入 | 基准 | 当前角色 |
| --- | --- | --- | --- | --- |
| `cn_small_cap_quality_snapshot` | CN Small-Cap Quality Snapshot | `feature_snapshot` + manifest | `510300` | Research scaffold,尚未 promotion。 |
| `cn_chinext_growth_momentum_quality_snapshot` | CN ChiNext Growth Momentum Quality Snapshot | `feature_snapshot` + manifest | `399006` | Research scaffold,创业板成长动量质量增强腿。 |
| `cn_equity_combo` | CN Equity Combo | `market_history` + `feature_snapshot` | `510300` | Research-only 组合轨;底层 legs 需重新过关。 |
| `cn_chinext_tactical_rotation` | CN ChiNext Tactical Rotation | `market_history` | `510300` | Research-only 创业板 tactical 轮动线。 |

Expand Down
3 changes: 2 additions & 1 deletion docs/platform_integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
| --- | --- | --- | --- |
| `cn_index_etf_tactical_rotation` | `market_history` | `qmt` | `weight` |
| `cn_dividend_quality_snapshot` | `feature_snapshot` + manifest | `qmt` | `weight` |
| `cn_chinext_growth_momentum_quality_snapshot` | `feature_snapshot` + manifest | `qmt` | `weight` |
| `cn_chinext_tactical_rotation` | `market_history` | `qmt` | `weight` |
| `cn_equity_combo` | `market_history` + `feature_snapshot` | `qmt` | `weight` |

Expand All @@ -44,7 +45,7 @@ The strategy also requires defensive ETF history for benchmark risk-off switchin

## Planned snapshot scaffolds

`cn_small_cap_quality_snapshot` and `cn_chinext_growth_momentum_quality_snapshot` are tracked as external snapshot scaffolds only. They are not registered in the runtime catalog until `CnEquitySnapshotPipelines` publishes a contract and promotion evidence.
`cn_small_cap_quality_snapshot` remains an external snapshot scaffold. `cn_chinext_growth_momentum_quality_snapshot` is now registered as a research-only snapshot-backed profile after `CnEquitySnapshotPipelines` published its contract, but it still needs promotion evidence before any runtime enablement.

## Current lane policy

Expand Down
2 changes: 2 additions & 0 deletions src/cn_equity_strategies/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

__all__ = [
"CN_EQUITY_DOMAIN",
"CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE",
"CN_EXTERNAL_SNAPSHOT_SCAFFOLD_PROFILES",
"CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE",
"CN_CHINEXT_TACTICAL_ROTATION_PROFILE",
Expand Down Expand Up @@ -40,6 +41,7 @@
def __getattr__(name: str):
if name in {
"CN_EQUITY_DOMAIN",
"CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE",
"CN_EXTERNAL_SNAPSHOT_SCAFFOLD_PROFILES",
"CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE",
"CN_CHINEXT_TACTICAL_ROTATION_PROFILE",
Expand Down
62 changes: 60 additions & 2 deletions src/cn_equity_strategies/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
)

from cn_equity_strategies.strategies import cn_dividend_quality_snapshot as dividend_quality_strategy
from cn_equity_strategies.strategies import (
cn_chinext_growth_momentum_quality_snapshot as chinext_growth_momentum_quality_strategy,
)
from cn_equity_strategies.strategies import cn_chinext_tactical_rotation as chinext_tactical_strategy
from cn_equity_strategies.strategies import cn_index_etf_tactical_rotation as index_etf_strategy
from cn_equity_strategies.strategies import cn_industry_etf_rotation as industry_etf_strategy
Expand All @@ -28,6 +31,9 @@
CN_INDUSTRY_ETF_ROTATION_PROFILE = industry_etf_strategy.PROFILE_NAME
CN_INDUSTRY_ETF_ROTATION_AGGRESSIVE_PROFILE = industry_etf_aggressive_strategy.PROFILE_NAME
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE = dividend_quality_strategy.PROFILE_NAME
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE = (
chinext_growth_momentum_quality_strategy.PROFILE_NAME
)
CN_CHINEXT_TACTICAL_ROTATION_PROFILE = chinext_tactical_strategy.PROFILE_NAME
CN_EQUITY_COMBO_PROFILE = cn_combo_strategy.PROFILE_NAME

Expand All @@ -38,21 +44,26 @@
STRATEGY_STATUS_SCAFFOLD = "scaffold"

CN_DIRECT_MARKET_HISTORY_PROFILES = frozenset({CN_INDUSTRY_ETF_ROTATION_PROFILE})
CN_SNAPSHOT_BACKED_PROFILES = frozenset({CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE})
CN_SNAPSHOT_BACKED_PROFILES = frozenset(
{
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE,
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE,
}
)
# Scaffold profiles are planned but not yet implemented — calling
# get_strategy_definition() on them will raise ValueError. Use
# get_external_snapshot_scaffold_profiles() for forward-compat iteration only.
CN_EXTERNAL_SNAPSHOT_SCAFFOLD_PROFILES: frozenset[str] = frozenset(
{
"cn_small_cap_quality_snapshot",
"cn_chinext_growth_momentum_quality_snapshot",
}
)
CN_LIVE_CANDIDATE_PROFILES = frozenset({CN_INDUSTRY_ETF_ROTATION_AGGRESSIVE_PROFILE})
CN_RESEARCH_BACKTEST_ONLY_PROFILES = frozenset(
{
CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE,
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE,
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE,
CN_EQUITY_COMBO_PROFILE,
CN_CHINEXT_TACTICAL_ROTATION_PROFILE,
}
Expand All @@ -68,6 +79,7 @@
CN_INDUSTRY_ETF_ROTATION_AGGRESSIVE_PROFILE: frozenset({"qmt"}),
CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE: frozenset({"qmt"}),
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE: frozenset({"qmt"}),
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE: frozenset({"qmt"}),
CN_CHINEXT_TACTICAL_ROTATION_PROFILE: frozenset({"qmt"}),
CN_EQUITY_COMBO_PROFILE: frozenset({"qmt"}),
}
Expand All @@ -77,6 +89,7 @@
CN_INDUSTRY_ETF_ROTATION_AGGRESSIVE_PROFILE: frozenset({"market_history"}),
CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE: frozenset({"market_history"}),
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE: frozenset({"feature_snapshot"}),
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE: frozenset({"feature_snapshot"}),
CN_CHINEXT_TACTICAL_ROTATION_PROFILE: frozenset({"market_history"}),
CN_EQUITY_COMBO_PROFILE: frozenset({"market_history", "feature_snapshot"}),
}
Expand Down Expand Up @@ -180,6 +193,27 @@
"execution_cash_reserve_ratio": dividend_quality_strategy.DEFAULT_EXECUTION_CASH_RESERVE_RATIO,
"rebalance_frequency": "monthly",
},
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE: {
"safe_haven": chinext_growth_momentum_quality_strategy.SAFE_HAVEN,
"holdings_count": chinext_growth_momentum_quality_strategy.DEFAULT_HOLDINGS_COUNT,
"single_name_cap": chinext_growth_momentum_quality_strategy.DEFAULT_SINGLE_NAME_CAP,
"sector_cap": chinext_growth_momentum_quality_strategy.DEFAULT_SECTOR_CAP,
"min_adv20_cny": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_ADV20_CNY,
"min_market_cap_cny": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_MARKET_CAP_CNY,
"min_revenue_yoy": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_REVENUE_YOY,
"min_profit_yoy": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_PROFIT_YOY,
"min_momentum": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_MOMENTUM,
"min_list_days": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_LIST_DAYS,
"hold_buffer": chinext_growth_momentum_quality_strategy.DEFAULT_HOLD_BUFFER,
"hold_bonus": chinext_growth_momentum_quality_strategy.DEFAULT_HOLD_BONUS,
"risk_on_exposure": chinext_growth_momentum_quality_strategy.DEFAULT_RISK_ON_EXPOSURE,
"soft_defense_exposure": chinext_growth_momentum_quality_strategy.DEFAULT_SOFT_DEFENSE_EXPOSURE,
"hard_defense_exposure": chinext_growth_momentum_quality_strategy.DEFAULT_HARD_DEFENSE_EXPOSURE,
"soft_breadth_threshold": chinext_growth_momentum_quality_strategy.DEFAULT_SOFT_BREADTH_THRESHOLD,
"hard_breadth_threshold": chinext_growth_momentum_quality_strategy.DEFAULT_HARD_BREADTH_THRESHOLD,
"execution_cash_reserve_ratio": chinext_growth_momentum_quality_strategy.DEFAULT_EXECUTION_CASH_RESERVE_RATIO,
"rebalance_frequency": "monthly",
},
CN_EQUITY_COMBO_PROFILE: {
"etf_weight": 0.30,
"stock_weight": 0.50,
Expand All @@ -195,6 +229,9 @@
CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE: "cn_index_etf_tactical_rotation_entrypoint",
CN_CHINEXT_TACTICAL_ROTATION_PROFILE: "cn_chinext_tactical_rotation_entrypoint",
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE: "cn_dividend_quality_snapshot_entrypoint",
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE: (
"cn_chinext_growth_momentum_quality_snapshot_entrypoint"
),
CN_EQUITY_COMBO_PROFILE: "cn_equity_combo_entrypoint",
}

Expand All @@ -204,6 +241,7 @@
CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE: "weight",
CN_CHINEXT_TACTICAL_ROTATION_PROFILE: "weight",
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE: "weight",
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE: "weight",
CN_EQUITY_COMBO_PROFILE: "weight",
}

Expand Down Expand Up @@ -260,6 +298,11 @@ def _build_strategy_definition(
component_name="signal_logic",
module_path="cn_equity_strategies.strategies.cn_dividend_quality_snapshot",
),
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE: _build_strategy_definition(
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE,
component_name="signal_logic",
module_path="cn_equity_strategies.strategies.cn_chinext_growth_momentum_quality_snapshot",
),
CN_EQUITY_COMBO_PROFILE: _build_strategy_definition(
CN_EQUITY_COMBO_PROFILE,
component_name="signal_logic",
Expand Down Expand Up @@ -344,6 +387,21 @@ def _build_strategy_definition(
role="cn_snapshot_dividend_quality",
status="research_backtest_only",
),
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE: StrategyMetadata(
canonical_profile=CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE,
display_name="CN ChiNext Growth Momentum Quality Snapshot",
localized_display_names={"zh": "创业板成长动量质量"},
description=(
"Research-only snapshot-backed ChiNext selector emphasizing growth, momentum, "
"quality, and liquidity with defensive exposure control."
),
aliases=(),
cadence="monthly review",
asset_scope="cn_single_name_snapshot_factor",
benchmark="399006",
role="cn_snapshot_chinext_growth_momentum_quality",
status="research_backtest_only",
),
CN_EQUITY_COMBO_PROFILE: StrategyMetadata(
canonical_profile=CN_EQUITY_COMBO_PROFILE,
display_name="CN Equity Combo",
Expand Down
41 changes: 41 additions & 0 deletions src/cn_equity_strategies/entrypoints/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@
from quant_platform_kit.strategy_contracts import CallableStrategyEntrypoint, StrategyContext, StrategyDecision

from cn_equity_strategies.manifests import (
cn_chinext_growth_momentum_quality_snapshot_manifest,
cn_chinext_tactical_rotation_manifest,
cn_dividend_quality_snapshot_manifest,
cn_index_etf_tactical_rotation_manifest,
cn_industry_etf_rotation_aggressive_manifest,
cn_industry_etf_rotation_manifest,
)
from cn_equity_strategies.strategies import (
cn_chinext_growth_momentum_quality_snapshot as chinext_growth_momentum_quality_strategy,
)
from cn_equity_strategies.strategies import cn_chinext_tactical_rotation as chinext_tactical_strategy
from cn_equity_strategies.strategies import cn_dividend_quality_snapshot as dividend_quality_strategy
from cn_equity_strategies.strategies import cn_index_etf_tactical_rotation as index_etf_strategy
Expand Down Expand Up @@ -154,6 +158,41 @@ def evaluate_cn_chinext_tactical_rotation(ctx: StrategyContext) -> StrategyDecis
)


def evaluate_cn_chinext_growth_momentum_quality_snapshot(ctx: StrategyContext) -> StrategyDecision:
config = merge_runtime_config(cn_chinext_growth_momentum_quality_snapshot_manifest.default_config, ctx)
config.pop("execution_cash_reserve_ratio", None)
config.pop("rebalance_frequency", None)
config.pop("run_as_of", None)
weights, signal_desc, has_cash_residual, status_desc, metadata = (
chinext_growth_momentum_quality_strategy.compute_signals(
require_market_data(ctx, "feature_snapshot"),
get_current_holdings(ctx),
**config,
)
)
diagnostics = {
**metadata,
"signal_description": signal_desc,
"status_description": status_desc,
"signal_source": chinext_growth_momentum_quality_strategy.SIGNAL_SOURCE,
"actionable": True,
}
risk_flags: tuple[str, ...] = ()
if has_cash_residual:
risk_flags += ("cash_residual",)
return StrategyDecision(
positions=weights_to_positions(weights),
risk_flags=risk_flags,
diagnostics=diagnostics,
)


cn_chinext_growth_momentum_quality_snapshot_entrypoint = CallableStrategyEntrypoint(
manifest=cn_chinext_growth_momentum_quality_snapshot_manifest,
_evaluate=evaluate_cn_chinext_growth_momentum_quality_snapshot,
)


def evaluate_cn_dividend_quality_snapshot(ctx: StrategyContext) -> StrategyDecision:
config = merge_runtime_config(cn_dividend_quality_snapshot_manifest.default_config, ctx)
config.pop("execution_cash_reserve_ratio", None)
Expand Down Expand Up @@ -206,12 +245,14 @@ def evaluate_cn_equity_combo(ctx: StrategyContext) -> StrategyDecision:


__all__ = [
"evaluate_cn_chinext_growth_momentum_quality_snapshot",
"evaluate_cn_dividend_quality_snapshot",
"evaluate_cn_chinext_tactical_rotation",
"evaluate_cn_index_etf_tactical_rotation",
"evaluate_cn_industry_etf_rotation",
"evaluate_cn_industry_etf_rotation_aggressive",
"evaluate_cn_equity_combo",
"cn_chinext_growth_momentum_quality_snapshot_entrypoint",
"cn_chinext_tactical_rotation_entrypoint",
"cn_dividend_quality_snapshot_entrypoint",
"cn_index_etf_tactical_rotation_entrypoint",
Expand Down
41 changes: 41 additions & 0 deletions src/cn_equity_strategies/manifests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,19 @@
from quant_platform_kit.strategy_contracts import StrategyManifest

from cn_equity_strategies.strategies import cn_dividend_quality_snapshot as dividend_quality_strategy
from cn_equity_strategies.strategies import (
cn_chinext_growth_momentum_quality_snapshot as chinext_growth_momentum_quality_strategy,
)
from cn_equity_strategies.strategies import cn_chinext_tactical_rotation as chinext_tactical_strategy
from cn_equity_strategies.strategies import cn_index_etf_tactical_rotation as index_etf_strategy
from cn_equity_strategies.strategies import cn_industry_etf_rotation as industry_etf_strategy
from cn_equity_strategies.strategies import cn_industry_etf_rotation_aggressive as industry_etf_aggressive_strategy

CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE = index_etf_strategy.PROFILE_NAME
CN_CHINEXT_TACTICAL_ROTATION_PROFILE = chinext_tactical_strategy.PROFILE_NAME
CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE = (
chinext_growth_momentum_quality_strategy.PROFILE_NAME
)
CN_INDUSTRY_ETF_ROTATION_PROFILE = industry_etf_strategy.PROFILE_NAME
CN_INDUSTRY_ETF_ROTATION_AGGRESSIVE_PROFILE = industry_etf_aggressive_strategy.PROFILE_NAME
CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE = dividend_quality_strategy.PROFILE_NAME
Expand Down Expand Up @@ -158,6 +164,39 @@ def _manifest(
},
)

cn_chinext_growth_momentum_quality_snapshot_manifest = _manifest(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Register the new snapshot manifest in MANIFESTS

When callers look up the newly registered profile through the manifest registry, get_strategy_manifest("cn_chinext_growth_momentum_quality_snapshot") still indexes MANIFESTS, but this new manifest is never inserted into that dict below. Direct imports of the variable work, but platform/discovery code that resolves manifests by profile will get a KeyError for this profile despite the catalog and docs saying it is registered.

Useful? React with 👍 / 👎.

profile=CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE,
domain=chinext_growth_momentum_quality_strategy.CN_EQUITY_DOMAIN,
display_name="CN ChiNext Growth Momentum Quality Snapshot",
description=(
"Research-only snapshot-backed ChiNext selector emphasizing growth, momentum, "
"quality, and liquidity with defensive exposure control."
),
aliases=(),
required_inputs=frozenset({"feature_snapshot"}),
default_config={
"safe_haven": chinext_growth_momentum_quality_strategy.SAFE_HAVEN,
"holdings_count": chinext_growth_momentum_quality_strategy.DEFAULT_HOLDINGS_COUNT,
"single_name_cap": chinext_growth_momentum_quality_strategy.DEFAULT_SINGLE_NAME_CAP,
"sector_cap": chinext_growth_momentum_quality_strategy.DEFAULT_SECTOR_CAP,
"min_adv20_cny": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_ADV20_CNY,
"min_market_cap_cny": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_MARKET_CAP_CNY,
"min_revenue_yoy": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_REVENUE_YOY,
"min_profit_yoy": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_PROFIT_YOY,
"min_momentum": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_MOMENTUM,
"min_list_days": chinext_growth_momentum_quality_strategy.DEFAULT_MIN_LIST_DAYS,
"hold_buffer": chinext_growth_momentum_quality_strategy.DEFAULT_HOLD_BUFFER,
"hold_bonus": chinext_growth_momentum_quality_strategy.DEFAULT_HOLD_BONUS,
"risk_on_exposure": chinext_growth_momentum_quality_strategy.DEFAULT_RISK_ON_EXPOSURE,
"soft_defense_exposure": chinext_growth_momentum_quality_strategy.DEFAULT_SOFT_DEFENSE_EXPOSURE,
"hard_defense_exposure": chinext_growth_momentum_quality_strategy.DEFAULT_HARD_DEFENSE_EXPOSURE,
"soft_breadth_threshold": chinext_growth_momentum_quality_strategy.DEFAULT_SOFT_BREADTH_THRESHOLD,
"hard_breadth_threshold": chinext_growth_momentum_quality_strategy.DEFAULT_HARD_BREADTH_THRESHOLD,
"execution_cash_reserve_ratio": chinext_growth_momentum_quality_strategy.DEFAULT_EXECUTION_CASH_RESERVE_RATIO,
"rebalance_frequency": "monthly",
},
)

cn_dividend_quality_snapshot_manifest = _manifest(
profile=CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE,
domain=dividend_quality_strategy.CN_EQUITY_DOMAIN,
Expand Down Expand Up @@ -217,11 +256,13 @@ def get_strategy_manifest(profile: str) -> StrategyManifest:
__all__ = [
"CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE",
"CN_CHINEXT_TACTICAL_ROTATION_PROFILE",
"CN_CHINEXT_GROWTH_MOMENTUM_QUALITY_SNAPSHOT_PROFILE",
"CN_INDEX_ETF_TACTICAL_ROTATION_PROFILE",
"CN_INDUSTRY_ETF_ROTATION_AGGRESSIVE_PROFILE",
"CN_INDUSTRY_ETF_ROTATION_PROFILE",
"MANIFESTS",
"get_strategy_manifest",
"cn_chinext_growth_momentum_quality_snapshot_manifest",
"cn_chinext_tactical_rotation_manifest",
"cn_dividend_quality_snapshot_manifest",
"cn_index_etf_tactical_rotation_manifest",
Expand Down
Loading
Loading