量化交易系统开发-实时行情自动化交易-8.15.Ptrade/恒生平台

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

接下来会对于Ptrade/恒生平台介绍。

Ptrade(恒生量化交易平台)是恒生电子推出的一站式量化交易解决方案,支持量化策略的开发、回测和实盘交易。平台以高效的数据处理能力和丰富的市场接入支持(股票、期货、期权等)受到专业投资者的青睐。其开发语言通常为Python或C++,并提供强大的策略开发框架和API。

本文将以“双均线策略”为例,展示如何使用Ptrade平台完成从策略开发到回测的全过程。


1. 策略简介:双均线策略

双均线策略是一种经典的趋势跟随型策略,主要通过两条均线(短期均线和长期均线)的交叉信号来判断市场趋势,并进行交易决策。

策略规则
  • 买入条件:短期均线向上突破长期均线,产生“黄金交叉”信号。
  • 卖出条件:短期均线向下跌破长期均线,产生“死亡交叉”信号。
优点与不足
  • 优点:适合趋势行情,逻辑简单,适用范围广。
  • 不足:在震荡市中易出现较多的虚假信号。

2. 策略开发

Ptrade平台支持通过Python语言编写量化交易策略。以下是实现双均线策略的核心代码。

(1)初始化策略

在策略初始化部分,设置参数、加载数据并定义交易标的。

# 导入必要模块
from ptrade.api import *

# 初始化策略
def initialize(context):
    # 设置交易标的
    context.asset = '000001.SH'  # 上证指数
    # 设置策略参数
    context.short_window = 5    # 短期均线周期
    context.long_window = 20   # 长期均线周期
    # 设置初始仓位
    context.position = 0
    log.info("策略初始化完成")
(2)生成交易信号

策略的核心逻辑基于短期均线与长期均线的交叉信号。

# 策略逻辑
def handle_data(context, data):
    # 获取历史数据
    hist = data.history(context.asset, 'close', context.long_window + 1, '1d')
    
    # 计算短期和长期均线
    short_ma = hist[-context.short_window:].mean()
    long_ma = hist.mean()
    
    # 获取当前持仓状态
    current_position = context.position
    
    # 买入逻辑
    if short_ma > long_ma and current_position == 0:
        order_percent(context.asset, 1.0)  # 全仓买入
        context.position = 1
        log.info(f"买入信号触发: {context.asset}, 短期均线={short_ma}, 长期均线={long_ma}")
    
    # 卖出逻辑
    elif short_ma < long_ma and current_position > 0:
        order_percent(context.asset, 0)  # 清仓
        context.position = 0
        log.info(f"卖出信号触发: {context.asset}, 短期均线={short_ma}, 长期均线={long_ma}")

3. 回测

Ptrade平台提供了高效的回测引擎,可以在历史数据上验证策略的有效性。

(1)配置回测环境

在运行回测之前,需要设置回测的基础参数,包括:

  • 时间范围:如2015-01-01至2020-12-31。
  • 初始资金:100,000元。
  • 交易标的:上证指数。
def set_backtest_config(context):
    context.set_start_date('2015-01-01')  # 回测起始日期
    context.set_end_date('2020-12-31')    # 回测结束日期
    context.set_initial_cash(100000)      # 初始资金
    context.set_benchmark('000001.SH')    # 设置基准指数
    context.set_commission(0.0002)        # 手续费
    context.set_slippage(0.002)           # 滑点
(2)运行回测

运行策略回测后,平台会生成详细的绩效报告,包括收益率曲线、交易明细和风险指标。


4. 策略优化

(1)参数优化

通过网格搜索的方法优化短期和长期均线的窗口长度,找到最优参数组合。

# 参数优化
def optimize_parameters(context):
    best_params = None
    best_performance = float('-inf')
    for short_window in range(3, 10):
        for long_window in range(15, 30):
            if short_window >= long_window:
                continue
            # 设置参数并运行回测
            context.short_window = short_window
            context.long_window = long_window
            performance = run_backtest(context)  # 假设有回测函数返回绩效
            if performance['annual_return'] > best_performance:
                best_performance = performance['annual_return']
                best_params = (short_window, long_window)
    log.info(f"最佳参数组合: 短期均线={best_params[0]}, 长期均线={best_params[1]}")
(2)加入风险管理

为策略添加止盈止损机制,控制极端行情下的风险。

# 风险管理
def handle_data_with_risk_control(context, data):
    current_price = data.current(context.asset, 'close')
    cost_basis = context.portfolio.positions[context.asset].cost_basis if context.position > 0 else None
    
    # 止盈止损逻辑
    if context.position > 0:
        profit_ratio = (current_price - cost_basis) / cost_basis
        if profit_ratio > 0.1 or profit_ratio < -0.05:  # 止盈10%或止损5%
            order_percent(context.asset, 0)  # 清仓
            context.position = 0
            log.info("触发止盈或止损,清仓")

### 关于恒生Ptrade平台的量化交易策略实现 #### 初始化设置 初始化阶段定义了证券代码并设置了观测范围。通过`initialize`函数可以配置全局变量以及设定初始参数。 ```python def initialize(context): g.security = '600570.SS' set_universe(g.security) # 定义关注股票池 ``` 此部分确保每次回测或实盘运行前都处于相同状态[^1]。 #### 底仓管理 为了更好地控制仓位,在进入具体买卖逻辑之前可以通过`set_yesterday_position`来预设前一天结束后的持仓情况,这有助于模拟实际操作中的连续性和平滑过渡效果。 ```python pos = {} pos['sid'] = "600570.SS" pos['amount'] = 1000 # 总数量 pos['enable_amount'] = 600 # 可用数量 pos['cost_basis'] = 55 # 成本价 set_yesterday_position([pos]) ``` 上述代码片段展示了如何利用字典结构存储单个资产的信息,并将其传递给`set_yesterday_position`接口完成底仓设定[^2]。 #### 订单执行 当满足一定条件时触发买入行为;而在其他情况下,则可能需要调整现有头寸大小。下面的例子说明了简单的卖出指令: ```python def handle_data(context, data): order(g.security, -100) # 卖出指定数量的股份 ``` 这里的`handle_data`函数会在每一个时间点被调用来评估市场状况并作出相应决策。需要注意的是,真实环境中应当基于更复杂的模型来进行判断而不是固定数值的操作。 #### 综合案例展示 结合以上要素构建完整的简单版指数量化投资方案如下所示: ```python from hsgt import * g.security = None def initialize(context): global g g.security = '600570.SS' set_universe(g.security) pos = {'sid': "600570.SS", 'amount': 1000, 'enable_amount': 600, 'cost_basis': 55} set_yesterday_position([pos]) def handle_data(context, data): if not context.portfolio.positions[g.security].amount: order_target_value(g.security, 1e4) # 如果没有持有则按价值购买 elif some_condition(): # 假设有某种退出机制 order_percent(g.security, -0.1) # 减少一部分持股比例 ``` 这段程序首先建立了基础框架,接着引入了动态调整的原则——即根据账户内是否有该标的物决定下一步行动方向。当然,“some_condition()”代表了一个待填充的具体业务规则表达式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIGC数据超市

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值