北向资金布林线+20日涨幅的量化交易策略

Tags
这是一个结合北向资金和20日涨幅的策略,既可以在市场骤变时通过北向资金来快速反应,也可以在市场缓慢变化中通过20日涨幅来反应,可以一定程度弥补北向资金持续小幅流出的风险。

收益概述

回测区间:3年半,2018-01-01到2021-07-09
年化收益:46%
最大回撤:13%
夏普比率:2.22
notion image

月度收益热力图

最大月度亏损:-5.93%
最大月度盈利:24.79%
notion image

关于北向资金策略的说明

  1. 首先获取北向资金最近252个交易日(也就是一年)的每日净流入,然后求出均值以及标准差
  1. 然后当昨日北向资金净流入高于1.5个标准差时,策略将在今日开盘时买入指定标的;当昨日北向资金净流入低于1.5个标准差时,策略将在今日开盘时卖出指定标的
  1. 本策略更注重整体行情,当市场被低估时,北向资金就会大量买入;当市场被高估时,北向资金就会大量卖出。大量买入和卖出的信号就会被策略捕捉到,从而作出相关的买入或卖出。

关于20日涨幅策略的说明

  1. 首先获取指定标的的最近20日涨幅
  1. 然后当昨日的20日涨幅高于5%时,策略将在今日开盘时买入指定标的;当昨日的20日涨幅低于-5%时,策略将在今日开盘时卖出指定标的
  1. 本策略更注重个股趋势,当个股趋势向上时,20日涨幅一定会突破一个阈值,当个股趋势向下时,20日涨幅也一定会跌破一个阈值,这个阈值未必一定是[5%,-5%],视不同标的的波动而定。这种趋势策略,一般都能抓住大涨,防止大跌,但是容易在震荡行情里面反复打脸,所以阈值的设置很关键,防止在震荡行情里面频繁操作。

关于标的的选择

  1. 个股波动和风险都太大,本人不买卖任何个股,主要是各种场内基金(ETF、LOF)和场外基金,当然了,用这个策略回测一下自己关注的个股其实也是可以的,相当于一个照妖镜,标的好不好,回测一下就知道了
  1. 建议重点关注的标的不要6个,本人目前关注的主要是创业板、沪深300、兴全模式、景顺鼎益、广发小盘、万家优选,仓位上大致是宽基和主动基金对半分

关于止损

  1. 本策略设置的是持仓亏损超过10%时,无条件清仓

关于现金管理

  1. 目前代码里面没有设置,因为嫌弃麻烦,实操时可以考虑招行双债、国债ETF、银华日利等

一些相关的资源

  1. 关于北向资金,推荐一个持续跟踪北向资金的微信公众号:每日港资持股数据,一般来说超过50万的流入流出都是比较值得关注的,大家也可以直接在同花顺等App里面查看沪深港通,这个策略的来源是华泰证券金工研报:【华泰金工林晓明团队】北向资金走向预示市场短期或震荡——华泰金工量化资产配置 7月月报
  1. 关于20日涨幅,推荐使用华宝智投App查看,或者就用很多App都能查看的近一月涨幅替代也可以
  1. 关于微信推送通知,推荐一个服务号:WxPusher微信推送服务,可以直接通过一个http链接发送微信通知,方便及时跟踪调仓信息

关于微信提醒

想要关注本策略的话,欢迎关注这个服务号:
点击动态图片链接,扫码关注即可 [//wxpusher.zjiecode.com/api/qrcode/Lfmc3s7hddXNce2ncMj6h3I0jkyNE1aSzt4J1acP58oKPcgZ9hEqBqk1tJaXEedd.jpg](//wxpusher.zjiecode.com/api/qrcode/Lfmc3s7hddXNce2ncMj6h3I0jkyNE1aSzt4J1acP58oKPcgZ9hEqBqk1tJaXEedd.jpg)

或者在微信里面打开此链接:[//wxpusher.zjiecode.com/wxuser/?type=1&id=10295#/follow](//wxpusher.zjiecode.com/wxuser/?type=1&id=10295#/follow)

策略代码

# 北向资金数据克隆自聚宽文章:https://www.joinquant.com/post/28989
# 标题:沪深300ETF跟踪北向资金策略
# 作者:pia19

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.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.000, open_commission=0.0002, close_commission=0.0002, min_commission=5), type='fund')

    ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG''510300.XSHG'是一样的)
      # 开盘前运行
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
      # 开盘时运行
    run_daily(market_open, time='open', reference_security='000300.XSHG')
      # 收盘后运行
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')

## 开盘前运行函数
def before_market_open(context):
    # 输出运行时间
    # log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))
    get_flowin()
    # 给微信发送消息(添加模拟交易,并绑定微信生效)
    # send_message('美好的一天~')

## 开盘时运行函数
def market_open(context):
    # log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
    check_flowin(context)
    check_rate20(context)
    check_stop(context)
    #print(g.df.loc[yesterday,'total_flowin'],g.df.loc[yesterday,'total_flowin'])

## 收盘后运行函数
def after_market_close(context):
    # log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
    #得到当天所有成交记录
    trades = get_trades()
    for _trade in trades.values():
        log.info('成交记录:'+str(_trade))
    # log.info('一天结束')
    # log.info('##############################################################')

# 获取北向资金布林线 
def get_flowin():
    #沪股通数据  每日净流入
    df_hu = finance.run_query(query(finance.STK_ML_QUOTA.quota_daily,
    finance.STK_ML_QUOTA.quota_daily_balance,finance.STK_ML_QUOTA.day
 

© fishyer 2022 - 2023