有人说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)}')
相关推荐
Julyyyyyyyyyyy1 小时前
【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
python·selenium·pycharm·自动化
蓝婷儿2 小时前
6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
开发语言·python·学习
love530love2 小时前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
Mr Aokey2 小时前
Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
java·后端·spring
水银嘻嘻2 小时前
05 APP 自动化- Appium 单点触控& 多点触控
python·appium·自动化
狐凄3 小时前
Python实例题:Python计算二元二次方程组
开发语言·python
地藏Kelvin3 小时前
Spring Ai 从Demo到搭建套壳项目(二)实现deepseek+MCP client让高德生成昆明游玩4天攻略
人工智能·spring boot·后端
烛阴4 小时前
Python枚举类Enum超详细入门与进阶全攻略
前端·python
菠萝014 小时前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
长勺4 小时前
Spring中@Primary注解的作用与使用
java·后端·spring