问题描述
解决方案
在PTrade中读取配置文件或写入交易日志,核心在于获取正确的文件存储路径。由于PTrade平台出于安全考虑禁用了 import os 等系统级操作,你需要使用平台提供的专用API get_research_path() 来获取允许读写文件的根目录(通常是 /home/fly/notebook/)。
以下是具体的实现方案和代码示例。
核心步骤
- 获取路径:使用
get_research_path()获取研究环境的根目录。 - 拼接文件名:将根目录与你的文件名拼接(注意:由于不能用
os.path.join,直接使用字符串拼接即可)。 - 读写文件:使用 Python 标准的
open()函数进行读写操作。
策略代码示例
这个示例策略展示了两个功能:
- 在
initialize中尝试读取一个名为strategy_config.json的配置文件。 - 在
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))
注意事项
-
文件位置:
- 通过
get_research_path()读写的文件,实际上位于 PTrade 客户端或网页端的 “研究” (Research) 模块的文件列表中(通常在左侧文件树的根目录或notebook目录下)。 - 你可以在“研究”界面中上传你的配置文件,或者下载策略生成的
.txt结果文件。
- 通过
-
禁止使用
os模块:- 不要尝试
import os来进行路径拼接(如os.path.join)或检查文件是否存在(如os.path.exists),这会导致策略报错。 - 请使用
try...except块来处理文件不存在的情况。 - 路径拼接直接使用字符串相加:
path + "filename"。
- 不要尝试
-
回测与实盘的区别:
- 回测:文件读写完全正常,文件保存在服务器的回测沙箱或研究目录下。
- 实盘:大部分券商的 PTrade 实盘环境也支持
get_research_path(),但部分严格管控的环境可能限制文件写入。如果实盘写入失败,建议联系券商确认权限,或改用log.info记录关键信息(日志通常可以导出)。
-
编码问题:
- 如果配置文件包含中文,建议在
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:。这会清空文件内容并重新写入。