有人说10日低点买入法,赢率高达95%?我不信,于是亲自回测了下...
大家好,我是花姐🌸。最近在网上看到一个10日低点买入法的策略,据说盈率高达95%,花姐决定带大家一探究竟,是不是真如对方说的这么厉害。

策略逻辑,先讲透点
我先不急着贴代码,先把策略讲明白,其实很简单:
买入条件:
- 当前价格是过去10个交易日里的最低价
- 同时,股价得在50日和200日均线上方
卖出条件(满足任一即可):
- 当前价格是过去10日里的最高价(拿到阶段性收益就跑)
- 或者股价跌破50日均线(趋势转弱,止损止盈都可能)
- 或者持仓时间超过10天(避免死拿不放)
是不是听起来还挺"顺眼"的?那我问你:为啥不20日低点?为啥不30?50日均线跟200日均线放一起真的能提高成功率?🤔 这就是我要验证的地方。别光听别人说,回测才是检验真理的最好方式。
开整
这次选了花姐以前操作过的2个股票:xx眼科 、三xx零。初始模拟资金是10万元。
先看看回测结果
xx眼科 2020年到2025年做到了年化2.85%,策略总收益15.88%,盈利10次,亏损8次胜率55.6%,总体来说还算不错

三xx零 2020年到2025年做到了年化-6.71%,策略总收益-30.5%,盈利1次,亏损5次胜率16.7%,可以说是差到了极点

总体来说策略还是有借鉴之处,但是做到94%的胜率显然有点扯淡了
下面是策略回测代码,想自己试试的可以跑跑看
python
# 导入函数库
from jqdata import *
# 初始化函数,设定基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('xxxxxx.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 输出内容到日志 log.info()
log.info('初始函数开始运行且全局只运行一次')
# 过滤掉order系列API产生的比error级别低的log
# log.set_level('order', 'error')
### 股票相关设定 ###
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# 策略初始化设置
context.symbol = '601360.XSHG' # 聚宽标的格式
context.window_short = 10 # 短期窗口(10日)
context.window_medium = 50 # 中期均线(50日)
context.window_long = 200 # 长期均线(200日)
context.max_hold_days = 10 # 最大持仓天数
# 初始化持仓记录
context.holding_days = 0 # 当前持仓天数
context.buy_date = None # 买入日期记录
# 设置每日定时运行
run_daily(main_trade, time='09:30') # 交易时间选择在收盘前10分钟
def main_trade(context):
try:
symbol = context.symbol
# 获取历史数据(不包含当日)
count = context.window_long+15
# 获取收盘价历史数据
prices = attribute_history(symbol, count, unit='1d',
fields=['open', 'close', 'high', 'low', 'volume', 'money'],
skip_paused=True, df=True, fq='pre')
close_prices = prices['close'].values
low_prices = prices['low'].values
high_prices = prices['high'].values
dates = prices.index
# 计算技术指标
ma50 = np.mean(close_prices[-context.window_medium:])
ma200 = np.mean(close_prices[-context.window_long:])
recent_low = np.min(low_prices[-context.window_short:])
recent_high = np.max(high_prices[-context.window_short:])
current_price = close_prices[-1]
current_low = low_prices[-1]
current_high = high_prices[-1]
current_date = context.current_dt
# 持仓逻辑判断
# if symbol in context.portfolio.positions:
# ===== 买入条件判断 =====
if symbol not in context.portfolio.positions: # 当前无持仓
# 条件1: 当前价格是最近10日最低价
condition1 = current_low <= recent_low
# 条件2: 当前价格高于50日与200日均线
condition2 = (current_price > ma50) and (current_price > ma200)
if condition1 and condition2:
# 计算可买数量(聚宽按股数交易)
cash = context.portfolio.available_cash
if cash > 1000:
# 执行买入订单
log.info(f'{current_date}{dates[-1]} 买入 {cash}元 @ {current_price:.2f}')
order_value(symbol, cash)
# 记录买入日期
context.buy_date = current_date
context.holding_days = 0
# ===== 卖出条件判断 =====
else: # 当前有持仓
position = context.portfolio.positions.get(symbol).total_amount
if position>0:
# 更新持仓天数
if context.buy_date:
context.holding_days = (current_date - context.buy_date).days
# 条件1: 当前价格是最近10日最高价
condition1 = current_high >= recent_high
# 条件2: 跌破50日均线
condition2 = current_price < ma50
# 条件3: 持仓超过10个自然日
condition3 = context.holding_days >= context.max_hold_days
if condition1 or condition2 or condition3:
# 执行卖出订单
order_target(symbol, 0)
log.info(f'{current_date}{dates[-1]} 卖出全部股票 @ {current_price:.2f}')
# 重置持仓记录
context.holding_days = 0
context.buy_date = None
except Exception as e:
log.error(f'交易执行异常:{str(e)}')