摘要:本文是 PTrade 量化交易入门系列第七篇,从 Python 函数基础概念出发,结合股票收益计算实战案例,详解 PTrade 策略开发中最核心的内置函数 —— 初始化函数initialize、周期执行函数handle_data、定时执行函数run_daily以及交易下单函数,帮助零基础读者快速掌握 PTrade 策略的基本框架与开发逻辑。

一、Python 函数基础:量化策略的 “积木单元”

如果把量化策略比作一套完整的交易系统,Python 的函数就像是多功能料理机:你放入食材(传入参数),选择对应功能(调用函数名),就能得到预期的料理(返回结果)。函数的核心价值是封装重复逻辑,让策略代码更简洁、更易维护。

1.1 函数的标准定义格式

Python 中函数通过def关键字定义,标准结构如下:

def 函数名(参数1, 参数2, ...):
    # 函数体:具体的执行逻辑
    return 返回值

1.2 实战案例:计算股票交易收益

我们以 “计算单只股票买卖收益” 为例,编写一个可复用的函数,直观感受函数的使用方式:

def calculate_profit(buy_price, sell_price, shares):
    """
    计算股票交易收益
    :param buy_price: 买入单价
    :param sell_price: 卖出单价
    :param shares: 交易股数
    :return: 总收益金额
    """
    profit = (sell_price - buy_price) * shares
    return profit

# 调用函数计算收益
buy = 10.5    # 买入价
sell = 12.8   # 卖出价
quantity = 100  # 交易股数
result = calculate_profit(buy, sell, quantity)
print(f"股票收益: {result} 元")

运行输出结果:

股票收益: 230.00000000000006 元

1.3 函数执行完整流程

上述代码的执行逻辑可以拆解为 5 步:

  1. 定义函数:通过def声明calculate_profit函数,预设参数与计算逻辑;
  2. 调用函数:传入买入价、卖出价、股数三个实际参数,触发函数运行;
  3. 执行计算:函数内部完成收益公式的运算;
  4. 返回结果:通过return将计算结果返回给调用处;
  5. 输出打印:接收返回值并格式化打印最终收益。

二、PTrade 核心内置函数详解

PTrade 作为券商官方量化交易终端,内置了大量封装好的 Python 函数,直接对应策略运行、行情获取、交易下单等核心能力。掌握这些内置函数,是编写可运行 PTrade 策略的基础。

2.1 策略入口:初始化函数 initialize ()

每一个可运行的 PTrade 策略,都必须包含initialize(context)函数,它是策略的启动入口,仅在策略启动时执行 1 次,用于完成全局配置。

核心要点
  • context:策略运行的上下文对象,存储账户资金、持仓、运行状态等全局信息;
  • set_universe():设置策略的股票池,指定策略关注的标的范围;
  • set_benchmark():设置策略回测 / 实盘的业绩基准指数;
  • g:全局变量对象,可在策略全生命周期内存储和读取自定义变量。
代码示例
def initialize(context):
    """策略初始化设置"""
    # 设置股票池
    set_universe(['600570.SS', '000001.SZ'])
    # 设置基准指数(沪深300)
    set_benchmark('000300.SS')
    # 定义全局变量
    g.security = '600570.SS'
    g.buy_threshold = 1.02  # 买入阈值:价格高于均线2%

2.2 策略运行控制函数

PTrade 提供两类执行逻辑,分别对应 “周期循环运行” 和 “定点定时运行” 两种场景。

2.2.1 周期循环执行:handle_data ()

handle_data(context, data)是 PTrade 的默认周期执行函数,会按照策略设定的周期(日线 / 分钟线)自动重复执行,适合需要持续盯盘、逐周期判断信号的策略。

适用场景
  • 分钟级短线交易、日内做 T 策略;
  • 日线级别均线、量能等指标循环判断。
代码示例:均线突破买入策略
def handle_data(context, data):
    """每分钟执行一次的交易逻辑"""
    # 获取当前标的最新价格
    current_price = data[g.security].price
    
    # 获取最近5日收盘价,计算5日均线
    hist = get_history(5, '1d', 'close', g.security)
    ma5 = hist['close'].mean()
    
    # 当前价高于5日均线2%时,买入100股
    if current_price > ma5 * g.buy_threshold:
        order(g.security, 100)  # 买入100股
        log.info(f"{g.security} 买入100股,当前价格:{current_price}")
2.2.2 定点定时执行:run_daily ()

run_daily()用于在每日固定时间点执行指定函数,适合无需持续盯盘、仅在特定时点操作的策略(如尾盘选股、收盘前调仓)。

适用场景
  • 每日收盘前固定时间检查持仓、调仓换股;
  • 开盘后固定时间执行选股下单。
代码示例:每日 14:30 持仓检查
def initialize(context):
    # 配置每日14:30执行持仓检查函数
    run_daily(check_position, "14:30")

def check_position(context):
    """每天下午2:30检查持仓,无持仓则买入"""
    position = get_position(g.security)
    if position.amount > 0:
        log.info(f"当前持仓:{g.security} {position.amount} 股")
    else:
        order(g.security, 100)
        log.info(f"未持有标的,执行买入:{g.security} 100股")

2.3 交易下单核心函数

下单交易是量化策略的最终落地动作,PTrade 提供了多种下单函数,覆盖不同的交易需求。

2.3.1 按股数下单:order ()

最基础的下单函数,直接指定标的和交易股数,正数为买入,负数为卖出。

# 买入标的600570.SS 100股
order('600570.SS', 100)

# 卖出标的600570.SS 100股
order('600570.SS', -100)
2.3.2 按资金比例下单

如果想按账户可用资金的固定比例买入,需要结合持仓与资金查询函数实现。例如用账户可用资金的 20% 买入标的:

def buy_by_ratio(context, security, ratio=0.2):
    """按可用资金比例买入"""
    # 获取账户可用资金
    available_cash = context.portfolio.cash
    # 获取标的最新价格
    current_price = get_history(1, '1d', 'close', security)['close'][0]
    # 计算买入股数(取整为100的整数倍)
    buy_amount = int((available_cash * ratio) / current_price / 100) * 100
    
    if buy_amount >= 100:
        order(security, buy_amount)
        log.info(f"按20%资金买入 {security},数量:{buy_amount} 股")

三、学习思路总结

PTrade 的内置函数就像乐高积木,每一个函数对应一项独立能力,掌握基础组件后,就能通过组合搭建出复杂的交易策略。

学习建议:

  1. 从简单入手:先熟练掌握initialize+handle_data+order的基础框架,写出第一个可运行的简单策略;
  2. 逐层累加逻辑:在基础框架上逐步添加指标计算、仓位管理、风险控制等函数,不要一开始就追求复杂策略;
  3. 先模拟后实盘:所有函数逻辑先在模拟环境验证跑通,确认下单、撤单、持仓查询均正常后,再接入实盘运行。

风险提示:本文只做教学,不做任何投资建议,投资有风险,入市需谨慎,不呢恩作者对文章享有一切解释权

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐