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))

 

 

PTrade 是一款开源的、支持高频交易量化交易平台,适用于多种市场环境下的策略开发与实盘运行。它集成了高性能的数据处理能力和丰富的功能模块,帮助用户构建复杂的金融投资模型。 ### **Ptrade 量化策略案例分析** #### 案例背景 假设我们希望通过 Ptrade 平台实现一个基于均线交叉信号的简单趋势跟踪策略,用于捕捉股票市场的短期波动收益。 --- #### 策略描述 1. 计算两条移动平均线(如5日均线和20日均线)。 2. 当短周期均线上穿长周期均线时,视为买入信号;当短周期均线下穿长周期均线时,视为卖出信号。 3. 根据当前持仓状态动态调整买卖操作,并结合止损机制控制风险。 以下是该策略的基本伪代码框架: ```python # 初始化变量 short_period = 5 # 短期均线窗口大小 long_period = 20 # 长期均线窗口大小 def on_bar(data): """ 数据更新触发函数 :param data: 实时K线数据 """ global short_ma, long_ma # 更新均线值 short_ma = calculate_moving_average(short_period) long_ma = calculate_moving_average(long_period) if cross_above(short_ma, long_ma): # 均线上穿条件 place_order('buy') # 发出买单指令 elif cross_below(short_ma, long_ma): # 均线下穿条件 place_order('sell') # 发出卖单指令 ``` 上述例子仅作为入门级参考方案,在实际应用过程中需要进一步优化回测结果并引入更多风控措施才能更好地适应复杂多变的实际行情环境。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值