🚀 AI 一键生成 ptrade 策略代码
立即体验

如何在 ptrade 回测中通过上传本地 CSV 持仓文件,自动将其转化为策略底仓并进行交易?

ptrade | 发布时间: 2026/8/7
以下内容由 EasyQuant 生成。

问题描述

ptrade 快速回测:利用 convert_position_from_csv 实现一键导入初始 CSV 底仓并运行
如何在 ptrade 回测中通过上传本地 CSV 持仓文件,自动将其转化为策略底仓并进行交易?

解决方案

在 ptrade 量化交易平台中,进行策略回测时,如果需要模拟已持有一定股票(即底仓)的场景,可以通过上传本地 CSV 文件并利用 convert_position_from_csv 接口一键导入。配合 set_yesterday_position 函数,即可在策略初始化时自动建立初始持仓。

一、 CSV 文件格式要求

首先,您需要在 ptrade 的“研究”模块中上传一个 CSV 文件(例如命名为 Poslist.csv)。该文件的表头和内容格式必须严格遵守以下规范:

sid,enable_amount,amount,cost_basis
600570.SS,10000,10000,45
000001.SZ,5000,5000,12.5

字段说明:

  • sid:标的代码(须带后缀,如 .SS.SZ)。
  • amount:总持仓数量(整数)。
  • enable_amount:可用持仓数量(整数,通常等于或小于总持仓量)。
  • cost_basis:每股的持仓成本价格(浮点数)。

二、 核心 API 介绍

  1. convert_position_from_csv(path)

    • 使用场景:仅在回测模块可用。
    • 功能:从指定路径的 CSV 文件中读取持仓数据,并将其转换为符合底仓设置要求的字典列表(list[dict])。
  2. set_yesterday_position(poslist)

    • 使用场景:仅在回测模块可用。
    • 功能:设置回测的初始底仓。该函数会使策略在初始化运行阶段就自动创建出持仓对象。

三、 完整策略源码示例

以下是一个完整的 ptrade 策略示例。策略在 initialize 阶段导入 Poslist.csv 作为底仓,并在 handle_data 盘中交易时间对导入的底仓进行卖出操作。

# -*- coding: utf-8 -*-

def initialize(context):
    # 1. 设置我们要操作的股票池(可以包含底仓股票)
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 2. 从研究根目录下的 CSV 文件中转换持仓参数
    # 注意:请确保 Poslist.csv 已上传至您的 ptrade 研究工作区
    try:
        poslist = convert_position_from_csv("Poslist.csv")
        
        # 3. 将转换后的参数列表设置为初始底仓
        set_yesterday_position(poslist)
        log.info("底仓导入成功,初始持仓数据:%s" % str(poslist))
    except Exception as e:
        log.error("底仓导入失败,错误信息: %s" % str(e))

def handle_data(context, data):
    # 获取当前恒生电子(600570.SS)的持仓情况
    position = get_position(g.security)
    
    # 如果当前持有该股票,且可用资金或持仓满足条件,尝试卖出100股底仓
    if position.enable_amount >= 100:
        order(g.security, -100)
        log.info("成功卖出 100 股 %s,剩余可用持仓: %d" % (g.security, position.enable_amount - 100))

四、 注意事项

  1. 文件路径convert_position_from_csv 默认读取的是 ptrade 研究根目录下的文件。如果您的文件在子文件夹中,请传入相对路径(例如 "user_data/Poslist.csv")。
  2. 仅限回测convert_position_from_csvset_yesterday_position 均为回测专用函数。在实盘或模拟盘交易中,系统会自动获取您柜台的真实持仓,无需也无法手动设置底仓。