PTrade - 量化交易股票策略示例

集合竞价追涨停策略

策略说明

设置股票池,每天9:23分运行集合竞价处理函数:如果最新价不小于涨停价则买入。

def initialize(context):
    # 初始化此策略
    # 设置股票池, 这里我们只操作一支股票
    g.security = '600570.SS'
    set_universe(g.security)
    #每天9:23分运行集合竞价处理函数
    run_daily(context, aggregate_auction_func, time='9:23')

def aggregate_auction_func(context):
    stock = g.security
    # 获取最新价
    snapshot = get_snapshot(stock)
    price = snapshot[stock]['last_px']
    # 获取涨停价
    up_limit = snapshot[stock]['up_px']
    # 如果最新价不小于涨停价则买入
    if float(price) >= float(up_limit):
        order(g.security, 100, limit_price=up_limit)

def handle_data(context, data):
    pass

tick级别均线策略

策略说明

设置股票池,盘前准备历史数据,每3秒钟触发一次:首先用最新的tick行情数据计算五日均线和十日均线,然后进行比较:当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出。

def initialize(context):
    # 初始化此策略
    # 设置股票池, 这里我们只操作一支股票
    g.security = '600570.SS'
    set_universe(g.security)
    # 每3秒运行一次主函数
    run_interval(context, func, seconds=3)

# 盘前准备历史数据
def before_trading_start(context, data):
    history = get_history(10, '1d', 'close', g.security, fq='pre', include=False)
    g.close_array = history['close'].values

# 当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def func(context):

    stock = g.security

    # 获取最新价
    snapshot = get_snapshot(stock)
    price = snapshot[stock]['last_px']

    # 获取五日均线价格
    days = 5
    ma5 = get_MA_day(stock, days, g.close_array[-4:], price)
    # 获取十日均线价格
    days = 10
    ma10 = get_MA_day(stock, days, g.close_array[-9:], price)

    # 获取当前资金余额
    cash = context.portfolio.cash

    # 如果当前有余额,并且五日均线大于十日均线则买入
    if ma5 > ma10:
        # 用所有 cash 买入股票
        order_value(stock, cash)
        # 记录这次买入
        log.info("Buying %s" % (stock))

    # 如果五日均线小于十日均线,并且目前有头寸,则全部卖出
    elif ma5 < ma10 and get_position(stock).amount > 0:
        # 全部卖出
        order_target(stock, 0)
        # 记录这次卖出
        log.info("Selling %s" % (stock))

# 计算实时均线函数
def get_MA_day(stock,days,close_array,current_price):
    close_sum = close_array[-(days-1):].sum()
    MA = (current_price + close_sum)/days
    return MA

def handle_data(context, data):
    pass

双均线策略

策略说明

设置股票池,每个handle_data周期进行如下判断处理:当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出。

def initialize(context):
    # 初始化此策略
    # 设置股票池, 这里我们只操作一支股票
    g.security = '600570.SS'
    set_universe(g.security)

# 当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def handle_data(context, data):
    security = g.security

    # 获取十日历史价格
    df = get_history(10, '1d', 'close', security, fq=None, include=False)

    # 获取五日均线价格
    ma5 = round(df['close'][-5:].mean(), 3)

    # 获取十日均线价格
    ma10 = round(df['close'][-10:].mean(), 3)

    # 获取昨天收盘价
    price = data[security]['close']

    # 获取当前资金余额
    cash = context.portfolio.cash

    # 如果当前有余额,并且五日均线大于十日均线
    if ma5 > ma10:
        # 用所有 cash 买入股票
        order_value(security, cash)
        # 记录这次买入
        log.info("Buying %s" % (security))

    # 如果五日均线小于十日均线,并且目前有头寸
    elif ma5 < ma10 and get_position(security).amount > 0:
        # 全部卖出
        order_target(security, 0)
        # 记录这次卖出
        log.info("Selling %s" % (security))

macd策略

策略说明

用历史日K线数据计算MACD指标,以计算结果进行买入卖出交易。

"""
macd强势金叉买入、macd弱势死叉卖出
"""
def initialize(context):
    g.hold_num = 10

def before_trading_start(context, data):
    # 获取沪深300股票
    g.security_list = get_index_stocks('000300.SS')
    g.close_data_dict = {}
    # 获取K线数据
    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))

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值