有人说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)}')
相关推荐
PanZonghui3 分钟前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
Victor3566 分钟前
MySQL(119)如何加密存储敏感数据?
后端
破无差16 分钟前
python实现简单的地图绘制与标记20250705
python
用户39661446871917 分钟前
TypeScript 系统入门到项目实战-慕课网
后端
guojl22 分钟前
Dubbo SPI原理与设计精要
后端
Lemon程序馆24 分钟前
搞懂 GO 的垃圾回收机制
后端·go
用户81221993672234 分钟前
React18+Next.js14+Nest.js全栈开发复杂低代码项目-仿问卷星
后端
喜欢吃豆38 分钟前
目前最火的agent方向-A2A快速实战构建(二): AutoGen模型集成指南:从OpenAI到本地部署的全场景LLM解决方案
后端·python·深度学习·flask·大模型
寻月隐君42 分钟前
Rust 网络编程实战:用 Tokio 手写一个迷你 TCP 反向代理 (minginx)
后端·rust·github