有人说10日低点买入法,赢率高达95%?我不信,于是亲自回测了下…

有人说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)}')
相关推荐
*愿风载尘*32 分钟前
ksql连接数据库免输入密码交互
数据库·后端
赵英英俊35 分钟前
Python day26
开发语言·python
你怎么知道我是队长36 分钟前
python---eval函数
开发语言·javascript·python
溟洵38 分钟前
Qt 窗口 工具栏QToolBar、状态栏StatusBar
开发语言·前端·数据库·c++·后端·qt
ppo921 小时前
MCP简单应用:使用SpringAI + Cline + DeepSeek实现AI创建文件并写入内容
人工智能·后端
创码小奇客1 小时前
Talos 使用全攻略:从基础到高阶,常见问题一网打尽
java·后端·架构
Re2751 小时前
ThreadLocal 入门:搞懂线程私有变量
后端
Rockson1 小时前
期货实时行情接口接入教程
python·api
midsummer_woo2 小时前
基于spring boot的纺织品企业财务管理系统(源码+论文)
java·spring boot·后端
zc-code2 小时前
Spring Boot + @RefreshScope:动态刷新配置的终极指南
java·spring boot·后端