问题描述
客户想通过持仓获取到自己实际的持仓进行回测,需要如何处理?
解决方案
在ptrade量化平台的回测环境中,策略是运行在虚拟的沙盒环境中的,因此无法直接“获取”您实盘账户的实时持仓。但是,如果您希望基于自己当前的实际持仓来进行回测,可以通过**设置底仓(初始持仓)**的方式来实现。
ptrade 提供了两种设置回测底仓的方法:
方法一:在代码中直接定义底仓 (set_yesterday_position)
您可以使用 set_yesterday_position(poslist) 函数在 initialize 初始化阶段手动设置底仓。这适用于持仓股票数量较少的情况。
数据格式要求:
传入一个包含字典的列表,每个字典代表一只股票的持仓信息:
sid: 标的代码 (如 '600570.SS')amount: 持仓数量enable_amount: 可用数量cost_basis: 每股的持仓成本价格
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 设置底仓
pos = {}
pos['sid'] = "600570.SS"
pos['amount'] = "1000"
pos['enable_amount'] = "600"
pos['cost_basis'] = "55"
# 传入列表
set_yesterday_position([pos])
def handle_data(context, data):
# 此时 context.portfolio.positions 中已经包含了设置的底仓
# 可以直接进行卖出操作
order(g.security, -100)
方法二:通过 CSV 文件导入底仓 (convert_position_from_csv)
如果您的实际持仓股票较多,手动编写代码比较繁琐,可以将实际持仓导出为 CSV 文件,然后上传到 ptrade 的研究环境中,通过 convert_position_from_csv(path) 读取并设置。
CSV 文件格式要求:
表头必须包含:sid, enable_amount, amount, cost_basis。
例如 (文件名为 Poslist.csv):
sid,enable_amount,amount,cost_basis
600570.SS,10000,10000,45
000001.SZ,5000,5000,12.5
代码示例:
def initialize(context):
# 假设您已经在研究环境中上传了 Poslist.csv 文件
# 从 csv 文件中获取设置底仓的参数列表
poslist = convert_position_from_csv("Poslist.csv")
# 设置底仓
set_yesterday_position(poslist)
# 将底仓中的股票加入股票池
sids = [pos['sid'] for pos in poslist]
set_universe(sids)
def handle_data(context, data):
pass
总结
通过以上两种方法,您可以将实盘的持仓数据“快照”导入到回测环境中,从而测试您的策略在现有持仓基础上的表现。请注意,这些设置仅在回测模块有效,实盘交易模块会自动获取您真实的账户持仓。