Ptrade 完整策略 代码逐行解析----个人量化学习

客户的策略需求是

买入信号:DIF、DEA均为正,macd金叉

卖出信号

DIF、DEA均为负,macd死叉

这个完整的交易案例采用的是Ptrade量化引擎中【盘中交易】板块下的handle_data函数

(日线和分钟级别的盘中交易-----用handle_data,

tick级别的盘中交易----用tick_data或者run_interval)

def initialize(context):
    g.hold_num = 100

def before_trading_start(context, data):
    
    g.security_list = get_index_stocks('000300.SS')
    g.close_data_dict = {}
    
    history = get_history(100, frequency='1d', field=["close"], security_list=g.security_list, fq='dypre',
                             include=False, is_dict=True)
    for stock in g.security_list:
        close_data = history[stock]['close']
        g.close_data_dict[stock] = close_data
    g.every_value = context.portfolio.portfolio_value/g.hold_num

def handle_data(context, data):

    for security in g.security_list:
        close_data = g.close_data_dict[security]
        macdDIF_data, macdDEA_data, macd_data = get_MACD(close_data, 12, 26, 9)
        DIF = macdDIF_data[-1]
        DEA = macdDEA_data[-1]
        macd_current = macd_data[-1]
        macd_pre = macd_data[-2]


        current_price = data[security].price

        position = context.portfolio.positions
        # DIF、DEA均为正,macd金叉,买入信号参考
        if position[security].amount == 0:
            if DIF > 0 and DEA > 0 and macd_pre < 0 and macd_current >= 0:
                if context.portfolio.cash < g.every_value*0.8:
                    continue

                # 以市单价买入股票,日回测时即是开盘价
                order_target_value(security, g.every_value)
                # 记录这次买入
                log.info("Buying %s" % (security))
        else:            
            # DIF、DEA均为负,macd死叉,卖出信号参考
            if DIF < 0 and DEA < 0 and macd_pre >= 0 and macd_current < 0:
                # 卖出所有股票,使这只股票的最终持有量为0
                order_target(security, 0)
                # 记录这次卖出
                log.info("Selling %s" % (security))

第四行

g.security_list = get_index_stocks('000300.SS')

用来定义你的选股范围,本例中取沪深300股票

第六行

history = get_history(100, frequency='1d', field=["close"], security_list=g.security_list, fq='dypre', include=False, is_dict=True)

获取K线数据

其中frequency:代表K线周期,根据策略中需要的频率选择不同参数,1分钟线(1m)、5分钟线(5m)、15分钟线(15m)、30分钟线(30m)、60分钟线(60m)、120分钟线(120m)、日线(1d)、周线(1w/weekly)、月线(mo/monthly)、季度线(1q/quarter)和年线(1y/yearly)频率的数据;选填参数,默认为'1d';入参类型:字符串str

(另外 如果需要获取分时成交行情数据,可以替换为get_tick_direction)

第八行和13行

用for循环获取选股池中的价格数据,并计算MACD值

    for security in g.security_list:
        close_data = g.close_data_dict[security]
        macdDIF_data, macdDEA_data, macd_data = get_MACD(close_data, 12, 26, 9)
        DIF = macdDIF_data[-1]
        DEA = macdDEA_data[-1]
        macd_current = macd_data[-1]
        macd_pre = macd_data[-2]

获取当前价格 current_price

获取当前的现金 position

之后就是最重要的交易信号

用if函数判断买入信号: DIF、DEA均为正,macd金叉

if position[security].amount == 0:
            if DIF > 0 and DEA > 0 and macd_pre < 0 and macd_current >= 0:
                if context.portfolio.cash < g.every_value*0.8:
                    continue

用 order_target_value下单,并用log函数记录这笔交易

                # 以市单价买入股票,日回测时即是开盘价
                order_target_value(security, g.every_value)
                # 记录这次买入
                log.info("Buying %s" % (security))

最后一段代码是卖出信号

DIF、DEA均为负,macd死叉

        else:            
            # 
            if DIF < 0 and DEA < 0 and macd_pre >= 0 and macd_current < 0:
                # 卖出所有股票,使这只股票的最终持有量为0
                order_target(security, 0)
                # 记录这次卖出
                log.info("Selling %s" % (security))

完整的策略闭环就完成了:数据获取、交易信号判断、下单交易、订单记录

由于篇幅有限,一些函数的更多使用方法没有展开讨论,

朋友们在使用过程中任何问题可以留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值