聚宽 - 简单策略试验

几种简单策略及其回测结果,基于聚宽平台测试。

策略1:均价-昨日收盘价策略(均线策略)

具体描述:计算该股一定时间(设为days)内的收盘均价,若低于昨日收盘价,则用当前所有资金买入股票;若高于收盘价,则将股票仓位调整到0,即全卖出。

策略模板代码

def initialize(context):# 初始化
    g.security = '600276.XSHG'# 股票代码,XSHG:上海证券交易所,XSHE:深圳证券交易所
def handle_data(context, data):# 每日循环
    last_price = data[g.security].close# 取得最近日收盘价
    # 获取该股票买前days日内的平均收盘价格
    average_price = data[g.security].mavg(days, 'close')
    cash = context.portfolio.cash# 取得当前的现金
    # 如果昨日收盘价高出days日平均价,则买入,否则卖出
    if last_price > average_price:
        order_value(g.security, cash)# 用当前所有资金买入股票
    elif last_price < average_price:
        order_target(g.security, 0)# 将股票仓位调整到0,即全卖出

特点:该策略只有检测到变化后才会进行买卖,因此无法实现抄底,当然,也不会跌到最低值才卖出。
结论:经过测试,当股票在回测时期内上涨,days一般越高越好;反之,若股票下跌,则缩短days可以及时止损。

以下为一些医疗企业运行该策略的回测结果。

000538 云南白药

时间:2019/3/1-2020/3/1
days:30日
策略收益: − 27.05 % \color{#55FF55}{-27.05\%} 27.05%
基准收益: 7.38 % \color{#FF0000}{7.38\%} 7.38%
0
简单分析了一下原因:云南白药自2019年3月后一直在跌,只要买入基本必亏。若将时间前置一年开始,则会得到如下结果。
时间:2018/3/1-2019/3/1
days:30日
策略收益: 7.85 % \color{#FF0000}{7.85\%} 7.85%
基准收益: − 6.81 % \color{#55FF55}{-6.81\%} 6.81%
1
结论:云南白药年期间浮动较大,年期内则较为稳定。

600276 恒瑞医药

恒瑞医药作为国内创新药龙头股,发展势头良好,以下为回测结果。
时间:2019/3/1-2020/3/1
days:45日
策略收益: 13.59 % \color{#FF0000}{13.59\%} 13.59%
基准收益: 7.38 % \color{#FF0000}{7.38\%} 7.38%
2

601607 上海医药

时间:2019/12/1-2020/3/1(近期)
days:30日
策略收益: 4.61 % \color{#FF0000}{4.61\%} 4.61%
基准收益: 2.91 % \color{#FF0000}{2.91\%} 2.91%
3

贸易出口上市公司测试

时间:2019/12/1-2020/3/1
days:30日
基准收益: 2.91 % \color{#FF0000}{2.91\%} 2.91%

股票代码股票名称所属行业策略收益
600146商赢环球服装-11.27%
300078思科医惠电子-22.94%
002489浙江永强休闲用品-11.37%
002611东方精工工业机械-10.76%
002640跨境通互联网零售1.59%

结论:受疫情与政策影响,跨境类出口贸易公司近期普遍受到较大影响。

策略2:均价交叉策略(双均线策略)

基本思想:双均线就是两条均线,比如5日均线和10日均线。由短周期均线自下向上穿越长周期的均线,则形成“金叉”,反之为“死叉”。双均线金叉的时候,表明该股近期很强势,反之很弱势。据此在强势的时候买入,弱势的时候卖出。

策略模板代码(此处设置为5日与20日均线)

# 初始化函数
def initialize(context):
    g.security='300027.XSHE'
    #设置每天运行
    run_daily(handle)
    
def handle(context):
    security=g.security
    n5=5
    n20=20  
    # 获取股票的收盘价
    close_data = attribute_history(security, n20, '1d',"close",df=False)
    print(close_data)
    # 取得过去 ma_n1 天的平均价格
    ma_n5 = close_data['close'][-n5:].mean()
    # 取得过去 ma_n2 天的平均价格
    ma_n20 = close_data['close'][-n20:].mean()
    print(ma_n5,ma_n20)
    # 取得当前的现金
    cash = context.portfolio.available_cash
    
    # 如果当前有余额
    if ma_n5 > ma_n20:
        # 用所有 cash 买入股票,order_value是买卖价值
        order_value(security, cash)
        # 记录这次买入
        log.info("Buying %s" % security)

    # 如果n5日均线小于n20日均线,并且目前有头寸
    elif ma_n5 < ma_n20 and context.portfolio.positions[security].closeable_amount > 0:
        # 全部卖出,order_target是买卖数量
        order_target(security, 0)

    # 绘制n5日均线价格
    record(ma_n5=ma_n5)
    # 绘制n20日均线价格
    record(ma_n20=ma_n20)

策略3:追涨策略

具体描述:在股票闭盘2小时前,即13:00对选定股票进行判断。若今日涨幅超过4%:当前价格/今日开盘价>1.040,则用当前所有资金买入股票;第二日开盘时全部卖出。
*注:自聚宽API-多股票追涨策略修改而来

策略模板代码

# 初始化程序, 整个回测只运行一次
def initialize(context):
    g.stock = '600160.XSHG'
    # 让每天早上开盘时执行 morning_sell_all
    run_daily(morning_sell_all, '09:30')

def morning_sell_all(context):
    
    order_target(g.stock, 0)

# 在每分钟的第一秒运行, data 是上一分钟的切片数据
def handle_data(context, data):

    # 判断是否在当日最后的2小时,我们只追涨最后2小时满足追涨条件的股票
    if context.current_dt.hour < 13:
        return
    
    # 得到当前价格
    price = data[g.stock].close

    current_data = get_current_data()
    last_close = current_data[g.stock].day_open

    if price/last_close > 1.040 and price/last_close < 1.099:
    
        # 得到当前资金余额
        cash = context.portfolio.available_cash
        order_value(g.stock, cash)

以巨化股份进行测试
4

策略横测

参数说明
时间:2019/3/1-2020-3/1
基准收益:7.38%
策略一:days=30
策略二:5日与20日双均线
策略三:涨幅阈值:4%

房地产企业

注:恒大、融创、万达、碧桂园、SOHO均未在A股上市

股票代码股票名称策略一策略二策略三
000002万科A0.35%-5.91%-4.50%
000402金融街-9.87%-8.85%0.50%
002146荣盛发展-7.56%-7.16%0.61%
600048保利地产-9.04%-8.83%-6.88%
上市银行

大型银行

股票代码股票名称策略一策略二策略三
601398工商银行-5.33%-4.28%-1.02%
601328交通银行-9.58%-15.65%0.00%
601288农业银行-9.92%-10.21%0.00%
601818光大银行-4.21%-2.35%-10.49%

城市商业银行

股票代码股票名称策略一策略二策略三
600926杭州银行-14.54%-7.73%-2.48%
601009南京银行1.95%1.86%-6.74%
601169北京银行-16.41%-11.44%0.00%
002142宁波银行11.02%15.36%-1.44%

政策性银行

股票代码股票名称策略一策略二策略三
600000浦东发展银行-12.70%-8.12%102.72%

策略4(选股策略):小市值策略

具体描述:每天找出市值排名最小的前stocksnum只股票作为要买入的股票。若已持有的股票的市值已经不够小而不在要买入的股票中,则卖出这些股票。买入要买入的股票,买入金额为当前可用资金的stocksnum分之一。

策略模板代码

def initialize(context):
  run_daily(period,time='every_bar')
  # 设定好要交易的股票数量
  g.stocksnum = 7
  # 设定交易周期
  g.period = 13
  # 记录策略进行天数
  g.days = 0

def period(context):
  # 判断策略进行天数是否能被轮动频率整除余1
  if g.days % g.period == 0:
      # 代码:找出市值排名最小的前stocksnum只股票作为要买入的股票
      # 获取上证指数和深证综指的成分股代码并连接,即为全A股市场所有股票的股票代码
      # 用加号可以连接两个list
      scu = get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')
      # 选出在scu内的市值排名最小的前stocksnum只股票
      q=query(valuation.code
                  ).filter(
                      valuation.code.in_(scu)
                  ).order_by( 
                      valuation.market_cap.asc()
                  ).limit(g.stocksnum)
      df = get_fundamentals(q)
      # 选取股票代码并转为list
      buylist=list(df['code'])

      # 代码:若已持有的股票的市值已经不够小而不在要买入的股票中,则卖出这些股票。
      # 对于每个当下持有的股票进行判断:现在是否已经不在buylist里,如果是则卖出
      for stock in context.portfolio.positions:
          if stock not in buylist: #如果stock不在buylist
              order_target(stock, 0) #调整stock的持仓为0,即卖出

      # 代码:买入要买入的股票,买入金额为可用资金的stocksnum分之一
      # 将资金分成g.stocksnum份
      position_per_stk = context.portfolio.cash/g.stocksnum
      # 用position_per_stk大小的g.stocksnum份资金去买buylist中的股票
      for stock in buylist:
          order_value(stock, position_per_stk)
  # 策略进行天数增加1        
  g.days = g.days + 1 

几组测试
时间:2019/8/1-2020/2/1
策略收益: 11.95 % \color{#FF0000}{11.95\%} 11.95%
基准收益: 4.39 % \color{#FF0000}{4.39\%} 4.39%
5
时间:2015/8/1-2020/2/1
策略收益: 214.65 % \color{#FF0000}{214.65\%} 214.65%
基准收益: 4.90 % \color{#FF0000}{4.90\%} 4.90%
6

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值