🚀 AI 一键生成 ptrade 策略代码

PTrade 教程:如何在策略中安全地读取和写入外部文件?

ptrade | 发布时间: 2025/12/5
以下内容由 EasyQuant 生成。

问题描述

我想在策略里读取一个配置文件,或者把每天的交易结果写到一个txt文件里,应该怎么做?

解决方案

在PTrade中读取配置文件或写入交易日志,核心在于获取正确的文件存储路径。由于PTrade平台出于安全考虑禁用了 import os 等系统级操作,你需要使用平台提供的专用API get_research_path() 来获取允许读写文件的根目录(通常是 /home/fly/notebook/)。

以下是具体的实现方案和代码示例。

核心步骤

  1. 获取路径:使用 get_research_path() 获取研究环境的根目录。
  2. 拼接文件名:将根目录与你的文件名拼接(注意:由于不能用 os.path.join,直接使用字符串拼接即可)。
  3. 读写文件:使用 Python 标准的 open() 函数进行读写操作。

策略代码示例

这个示例策略展示了两个功能:

  1. initialize 中尝试读取一个名为 strategy_config.json 的配置文件。
  2. after_trading_end(盘后)将当天的资产净值写入 daily_record.txt 文件。
import json
import datetime

def initialize(context):
    """
    初始化函数
    """
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 1. 获取研究目录路径
    # 注意:get_research_path() 返回的路径通常以 '/' 结尾,如 '/home/fly/notebook/'
    research_path = get_research_path()
    
    # 定义文件路径
    g.config_path = research_path + "strategy_config.json"
    g.log_path = research_path + "daily_record.txt"
    
    log.info("配置文件路径: %s" % g.config_path)
    log.info("日志文件路径: %s" % g.log_path)
    
    # 2. 读取配置文件示例
    read_config()

def read_config():
    """
    读取配置文件的辅助函数
    """
    try:
        # 使用标准 Python open 函数读取
        with open(g.config_path, 'r') as f:
            # 假设配置文件是 JSON 格式
            config_data = json.load(f)
            log.info("成功读取配置文件: %s" % str(config_data))
            
            # 可以在这里根据配置修改全局变量,例如:
            # if 'buy_amount' in config_data:
            #     g.buy_amount = config_data['buy_amount']
            
    except Exception as e:
        # 如果文件不存在或格式错误,进行捕获,避免策略崩溃
        log.warning("读取配置文件失败或文件不存在: %s" % str(e))
        # 如果没有文件,我们可以创建一个默认的(仅用于演示)
        create_default_config()

def create_default_config():
    """
    创建一个默认配置文件(仅用于演示,实际使用时你应该在研究端手动上传文件)
    """
    default_conf = {"strategy_name": "DemoStrategy", "risk_ratio": 0.8}
    try:
        with open(g.config_path, 'w') as f:
            json.dump(default_conf, f)
        log.info("已生成默认配置文件")
    except Exception as e:
        log.error("生成默认配置文件失败: %s" % str(e))

def handle_data(context, data):
    """
    盘中运行函数
    """
    # 简单的买入逻辑,仅为了产生交易数据
    if context.portfolio.positions[g.security].amount == 0:
        order(g.security, 100)

def after_trading_end(context, data):
    """
    盘后运行函数:记录当天的交易结果到 txt 文件
    """
    try:
        # 获取当前日期和资产总值
        current_date = context.blotter.current_dt.strftime("%Y-%m-%d")
        total_value = context.portfolio.portfolio_value
        cash = context.portfolio.cash
        
        # 构造要写入的字符串
        log_content = "日期: %s, 总资产: %.2f, 可用现金: %.2f\n" % (current_date, total_value, cash)
        
        # 3. 写入文件
        # 使用 'a' (append) 模式追加写入,这样不会覆盖旧数据
        with open(g.log_path, 'a') as f:
            f.write(log_content)
            
        log.info("今日交易数据已写入文件")
        
    except Exception as e:
        log.error("写入日志文件失败: %s" % str(e))

注意事项

  1. 文件位置

    • 通过 get_research_path() 读写的文件,实际上位于 PTrade 客户端或网页端的 “研究” (Research) 模块的文件列表中(通常在左侧文件树的根目录或 notebook 目录下)。
    • 你可以在“研究”界面中上传你的配置文件,或者下载策略生成的 .txt 结果文件。
  2. 禁止使用 os 模块

    • 不要尝试 import os 来进行路径拼接(如 os.path.join)或检查文件是否存在(如 os.path.exists),这会导致策略报错。
    • 请使用 try...except 块来处理文件不存在的情况。
    • 路径拼接直接使用字符串相加:path + "filename"
  3. 回测与实盘的区别

    • 回测:文件读写完全正常,文件保存在服务器的回测沙箱或研究目录下。
    • 实盘:大部分券商的 PTrade 实盘环境也支持 get_research_path(),但部分严格管控的环境可能限制文件写入。如果实盘写入失败,建议联系券商确认权限,或改用 log.info 记录关键信息(日志通常可以导出)。
  4. 编码问题

    • 如果配置文件包含中文,建议在 open 时指定编码(Python 3 默认通常是 UTF-8,但在某些 Windows 环境下需注意):
      with open(g.config_path, 'r', encoding='utf-8') as f:
      

Q&A

Q: 我可以在策略里读取 Excel (.xlsx) 文件吗?
A: 可以,但需要使用 pandas 库。你可以使用 pd.read_excel(path)。前提是该文件已经上传到了 get_research_path() 指向的目录中。

Q: 为什么我写入的文件在电脑本地找不到?
A: PTrade 是运行在券商服务器上的。get_research_path() 指向的是服务器上的路径。你需要登录 PTrade 客户端,进入“研究”标签页,在左侧文件列表中找到该文件,右键点击“下载”才能保存到本地电脑。

Q: 如果我想每天覆盖写入而不是追加写入怎么办?
A: 在 open() 函数中将模式从 'a' (append) 改为 'w' (write)。例如:with open(path, 'w') as f:。这会清空文件内容并重新写入。