【量化】基于聚宽实现MACD均线择时策略

MACD均线择时策略是十分基础的策略,适合咱们这种新手学习,这篇博客就分享一下基于聚宽实现MACD均线择时策略。

代码:

注:需要到聚宽的量化平台去运行。

# MACD均线择时策略
'''
筛选出符合:
10<市盈率(pe_ratio)<40, 市净率(pb_ratio)<3, 净利润环比增长率(inc_net_profit_annual)>0.3,净资产收益率(roe)>15的股票,按照销售毛利率进行降序排列,选取前50只
买入:DIF从下而上穿过DEA,即形成金叉
卖出:DIF从上往下穿过DEA,即形成死叉
十天一次调仓
'''
import pandas as pd
import numpy as np
import talib  ## 使用talib计算MACD的参数
def initialize(context):
    g.days=0#计算持有天数
    g.refresh_rate=10#调仓的频率
    set_benchmark('000300.XSHG')#设置参考指数
    set_option('use_real_price', True)
    log.set_level('order', 'error')#过滤日志错误
    run_daily(trade, 'every_bar')
    
def before_trading_start(context):
    set_slip_fee(context)

#设置下滑,交易费率
def set_slip_fee(context):
    set_slippage(FixedSlippage(0.02)) 
    dt=context.current_dt
    set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type='stock')
    # if dt>datetime.datetime(2013,1, 1):
    #     set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type='stock')
    # else:
    #     set_order_cost(OrderCost(open_tax=0, open_commission=0.003,close_commission=0.003, close_tax=0.001,min_commission=5), type='stock')

#过滤停牌股票 
def paused_filter(security_list):
    current_data=get_current_data()
    security_list = [stock for stock in security_list if not current_data[stock].paused]
    return security_list

#过滤退市股票
def delisted_filter(security_list):
    current_data = get_current_data()
    security_list = [stock for stock in security_list if not '退' in current_data[stock].name]
    return security_list

#过滤ST   
def st_filter(security_list):
    current_data = get_current_data()
    security_list = [stock for stock in security_list if not current_data[stock].is_st]
    return security_list 
    
#对持仓股票每日进行检查,死叉卖出   
def zy_zs(context):
    dqhold = list(context.portfolio.positions.keys())
    for stock in dqhold:
            prices=attribute_history(stock,300,'1d',['close'])
            price=array(prices['close'])
            MACD_tmp=talib.MACD(price,fastperiod=12,slowperiod=26,signalperiod=20)
            DIF=MACD_tmp[0]
            DEA=MACD_tmp[1]
            MACD=MACD_tmp[2]
            if MACD[-1]<0 and MACD[-4]>0:
                order_target_value(stock, 0)
def trade(context):
    zy_zs(context)#卖出死叉个股
    #如果手中不持有股票,则立即进行选股
    if len(context.portfolio.positions.keys())==0:
        g.days=0
    #10<市盈率(pe_ratio)<40,每股盈余(eps)>0.3,净资产收益率(roe)>15,净利润环比增长率>0.3,并按照市净率进行升序排列,取前五十只。
    if g.days%g.refresh_rate==0:
        stock_to_choose=get_fundamentals(query(
                valuation.code,valuation.pe_ratio,valuation.market_cap,
                indicator.eps,indicator.inc_net_profit_annual
                ).filter(
                        valuation.pe_ratio<40,
                        valuation.pe_ratio>10,
                        indicator.eps>0.3,
                        indicator.inc_net_profit_annual>0.3,
                        indicator.roe>15
                        ).order_by(valuation.pb_ratio.asc()
                        ).limit(
                                50),date=None)
        #过滤停牌、退市、ST个股
        stockpool = list(stock_to_choose['code'])
        stockpool = paused_filter(stockpool)
        stockpool = delisted_filter(stockpool)
        stockpool = st_filter(stockpool)
        jx_list=[]#MACD金叉列表
        sx_list=[]#MACD死叉列表
        hold=[]#持有列表
          
        for stock in stockpool:
            prices=attribute_history(stock,300,'1d',['close'])
            price=array(prices['close'])
            MACD_tmp=talib.MACD(price,fastperiod=12,slowperiod=26,signalperiod=20)
            DIF=MACD_tmp[0]
            DEA=MACD_tmp[1]
            MACD=MACD_tmp[2]
            if MACD[-1]>0 and MACD[-4]<0:
                jx_list.append(stock)
            elif MACD[-1]<0 and MACD[-4]>0:
                sx_list.append(stock)
                
        #卖出手中死叉个股          
        stockset = list(context.portfolio.positions.keys())
        for stock in stockset:
            if stock in jx_list:
                hold.append(stock)#如果金叉则持有
            else:
                 order_target_value(stock, 0) #卖出非金叉个股
        #构建买入列表
        buy_list = []
        for stock in jx_list:
            if stock not in hold:
                buy_list.append(stock)#新增的买入股票
              
        #分配资金,购买股票      
        if len(buy_list)==0:
            Cash=context.portfolio.available_cash
        else:
            Cash = context.portfolio.available_cash/len(buy_list)
            for stock in buy_list:
                order_target_value(stock, Cash)        
        g.days = 1
    else:
        g.days += 1

 回测结果:

 

  • 12
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是聚宽期货量化交易双均线策略及源代码: 策略概述: 该策略是一种基于双均线的趋势跟踪策略,使用两条移动平均线(MA)来确定买入和卖出信号。当短期MA(如5日MA)上穿长期MA(如20日MA)时,产生买入信号;当短期MA下穿长期MA时,产生卖出信号。该策略适用于大部分的期货品种。 源代码: # 导入聚宽期货模块 import jqdata from jqdata import * import talib # 初始化函数,设定基准等等 def initialize(context): set_benchmark('RB9999.XSGE') set_option('use_real_price', True) log.set_level('order', 'error') # 设定股票池,这里以螺纹钢为例 g.stock = 'RB9999.XSGE' # 设定参数,这里以5日MA和20日MA为例 g.short_ma = 5 g.long_ma = 20 # 设定交易费率,这里以万分之二为例 set_order_cost(OrderCost(open_tax=0.00002, close_tax=0.00002, open_commission=0.00002, close_commission=0.00002, minimum_commission=5), type='future') # 开盘时运行函数 def handle_data(context, data): # 获取股票价格数据 price = attribute_history(g.stock, g.long_ma + 1, '1d', ['close'], skip_paused=True, df=False)['close'] # 计算短期和长期移动平均线 short_ma = talib.SMA(price, g.short_ma)[-1] long_ma = talib.SMA(price, g.long_ma)[-1] # 判断是否买入或卖出 if short_ma > long_ma and context.portfolio.positions[g.stock].total_amount == 0: # 买入 order_value(g.stock, context.portfolio.cash) elif short_ma < long_ma and context.portfolio.positions[g.stock].total_amount > 0: # 卖出 order_target(g.stock, 0)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值