Skip to content
All strategies

Strategies

SuperMind A股选股规则补全:周线MA5金叉MA10、日振幅超过1%、九日K低于20

Outcome: Abandoned

SuperMindCompletedWeekLowK

Outcome Summary

SuperMindCompletedWeekLowK operationalized three screening conditions on eight A-shares with supplemented holding and exit rules, and the run recorded two iterations. Its backtest produced 12 trades with a reported -0.229% total return, -0.120 Sharpe, and -0.724% average net trade return. Backtest review abandoned it because losses outweighed gains after costs; the thin sample left uncertainty but offered no affirmative case for optimization. Later analysis and risk review were not reached.

Hypothesis

Derived by the Research Lead from 同花顺 SuperMind《振幅大于1、周线MA5金叉MA10、k小于20》:保留正文的三个选股条件,在固定八只A股研究篮子上补充可执行的持仓与退出规则。分类为部分规则,非完整交易策略的忠实移植。原文没有明确振幅和K的周期,本实验明确选择日振幅与九个交易日日线K;周均线只使用完整交易周。正文与Python示例不一致:示例未计算周线金叉或K,而是使用股价低于20元、四个交易日上涨和强收盘条件,本实验不混合这两套规则。固定篮子是研究选择,不声称复现历史全A股选股,也不使用今日成分推断历史成员。退出、风险预算及持仓期限均为研究补充。日线决策在下一交易日开盘成交,遵守买入当天不得卖出的T+1约束。S2二维码图片未读取,不用于推断策略。

保留来源的A股市场及技术筛选条件,不为满足配额改成加密货币或加入来源没有的空头腿。CNEQ仅占给定实验的0.3%,八标的设计减少单标的集中;corpus_concentration为空,无法验证具体股票或周期的使用份额。该实验区别于已有A股长周期输家篮子:以新发生的周均线金叉结合日线低K筛选,而非横截面长期反转。来源条件可能稀疏,触发频率尚未测量,不将每年十次写成已知事实,也不为增加交易数擅自放宽原始阈值。

negative_expectancy: Reject this Research Lead operationalization of the SuperMind screening conditions on the fixed eight-stock basket with supplemented exits, rather than the source screening concept. The measured trades lose money after posted commission and impact, confirming QA's economic concern descriptively. The thin sample leaves uncertainty, but provides no affirmative case for spending on exit_k and hold_sessions optimization. No implementation or accounting defect is established.

Implementation

Long-only daily strategy on eight China A-shares (CNEQ). A stock becomes eligible when the 5-week moving average of completed weekly closes crosses above the 10-week one. While eligible, the strategy buys at the next session's open on a day when the daily range is above 1% of the previous close and the 9-day K is below 20. It exits when K reaches exit_k, after hold_sessions sessions, or on an 8% loss measured at a close. Orders fill at the next session's open, so a stock is never sold on the day it was bought (T+1). Sizing: 0.5% of equity at risk at the 8% stop, at most 10% of equity per stock and 50% in total.

Iteration 2 fixes the two defects QA found. (1) Stop: get_position_pnl_pct() returns percentage points, so the result is now compared directly with -stop_loss_pct. The stop now fires at an 8% loss instead of 0.08%. Sizing still uses the 0.08 fraction as the stop distance. (2) Crossover window: the crossover now stores the number of completed weeks at the time of the cross. It stays valid through the next week's sessions and expires when the next completed weekly close is processed (crossover_valid_weeks completed weeks). The one-trade-per-crossover tracking is unchanged. Execution uses next_open_fill, which this session venue supports.

Verification Results

Optional: count a dropped week explicitly, or reset the weekly MA state after a gap so a crossover is never computed across a hole.

Completed-week detection depends on the stock's own bars. The week counts as complete only if this stock's first bar of the week is the calendar's first trading day, and the weekly close is pushed only when the bar on the calendar's last trading day of the week arrives. If a stock is suspended on Monday or Friday, that week is silently dropped from its weekly series. The 5/10-week MAs then span non-contiguous weeks. There is no look-ahead, and this matches the contract's 'complete weeks only' rule, but the MA windows stretch over suspensions.

Mark the crossover as used in on_order_filled / on_position_opened for the primary instrument instead.

position_size() marks the crossover as used before the base template has actually submitted the order. If the base later drops the primary entry (min notional, a pending order, a warmup or freeze gate), that crossover is consumed without a trade. The extra-leg path marks it only after _submit_entry_instrument, which is correct.

This needs no change. Returning warmup_bars would make the intent explicit.

min_bars_required() returns 1, and warmup is enforced per instrument through count >= warmup_bars (80). This works, but Layer 1 flags the override.

The sandbox made 11 closed trades over 1512 days across 8 names, with avg_trade_return_pct -0.50%, PF 0.93 and total return -5.4%. The three source conditions together (a fresh weekly 5/10 golden cross, K<20 inside the following week, and amplitude >1%) are rare and somewhat contradictory: a fresh weekly up-cross rarely coincides with a daily K below 20. The full history will likely give a thin sample, perhaps ~20-40 trades over 8 years. Large-cap bank names also rarely move far enough in a 10-30 session hold. Separately, the sandbox reported total_commission = 0 on CNEQ although the venue config has a 0.05% maker/taker fee and A-shares charge stamp duty on sells. This is the same platform fee-application issue raised on ShanghaiMaCompressionKdjBasket. Per-trade net figures are therefore flattering by about 0.10-0.15%.

Backtest Review

Sharpe
-0.12
Total return
-0.23%
Max drawdown
0.68%
Trades
12
Win rate
58.3%
Profit factor
0.73

All 12 trades are long, in 100-share lots, with 4–28 calendar-day holds and no same-day exits. These patterns match the declared implementation.

Full-history commissions are 60.73 CNY; QA's zero-commission symptom is absent.

Average net trade return is -0.724% versus the +0.15% CNEQ review floor. PF is 0.730 and total return is -0.229%.

Seven winners averaging 88.46 CNY do not offset five losers averaging 169.74 CNY.

The 12-trade sample limits generalization. Sparse trading alone is not the rejection reason.

Forecast IC is 0.049 with t=0.4. No measured viable region or identified implementation defect supports exit-only optimization.

Iteration History

Verification failed (Layer 4 — QA review) [class=code_defect]: - [edge_concern] The smoke test reports -0.583% average net trade return over only four closed positions. Assess full-history economics after correcting the stop; negative smoke performance does not justify failure. - [critical] get_position_pnl_pct() returns percentage points: a 1% loss returns -1.0. Dividing stop_loss_pct=8 by 100 sets the exit threshold to -0.08, triggering at a 0.08% loss instead of the specified 8% close-based loss on every leg.……Show moreShow less

Verification failed (Layer 4 — QA review) [class=code_defect]: - [edge_concern] The smoke test reports -0.583% average net trade return over only four closed positions. Assess full-history economics after correcting the stop; negative smoke performance does not justify failure. - [critical] get_position_pnl_pct() returns percentage points: a 1% loss returns -1.0. Dividing stop_loss_pct=8 by 100 sets the exit threshold to -0.08, triggering at a 0.08% loss instead of the specified 8% close-based loss on every leg. Sizing still assumes an 8% stop. (line 84) — fix: Compare the helper result directly with -float(self.parameters.get('stop_loss_pct', 8)). Retain /100 in _quantity(), which requires a fractional stop distance. - [critical] The crossover expires at the next calendar week's first session instead of the next completed weekly close stated in the rationale. cross stores the Monday ordinal of the week whose last session detects the cross. The difference is zero on detection, but becomes 7 on the following Monday and fails <7. A one-week crossover is consequently usable only on its detection session, excluding the subsequent daily amplitude/K opportunities in its intended validity week. (line 75) — fix: Record the completed-week index at crossover and expire eligibility when the next completed weekly close is processed, or after the configured number of completed weeks. Preserve one-trade-per-crossover tracking.

Compare the helper result directly with -float(self.parameters.get('stop_loss_pct', 8)). Retain /100 in _quantity(), which requires a fractional stop distance.

get_position_pnl_pct() returns percentage points: a 1% loss returns -1.0. Dividing stop_loss_pct=8 by 100 sets the exit threshold to -0.08, triggering at a 0.08% loss instead of the specified 8% close-based loss on every leg. Sizing still assumes an 8% stop.

Record the completed-week index at crossover and expire eligibility when the next completed weekly close is processed, or after the configured number of completed weeks. Preserve one-trade-per-crossover tracking.

The crossover expires at the next calendar week's first session instead of the next completed weekly close stated in the rationale. cross stores the Monday ordinal of the week whose last session detects the cross. The difference is zero on detection, but becomes 7 on the following Monday and fails <7. A one-week crossover is consequently usable only on its detection session, excluding the subsequent daily amplitude/K opportunities in its intended validity week.

Outcome Summary

This fixed-basket operationalization needs evidence of positive net expectancy before exit tuning; its rejection does not establish that the source screening concept fails.

Backtest review returned abandon for negative expectancy after commission and impact, with no established implementation or accounting defect and no affirmative case for exit-only optimization. Optimization, post-optimization analysis, and risk review were not reached.

It combined a completed-week MA5/MA10 bullish crossover, daily amplitude above 1%, and nine-session stochastic K below 20 on a fixed eight-stock A-share basket, adding exits and next-session execution under T+1 constraints.

The backtest recorded 12 closed trades, a reported total return of -0.229%, Sharpe of -0.120, and profit factor of 0.730. Average net trade return was -0.724%, below the +0.15% review floor, despite a 58.3% win rate.

Analysis

(supermind量化-)振幅大于1、周线MA5金叉MA10、k小于20_

Backtest and paper results are hypothetical. Trading involves risk of loss.