问题描述
回测结果想包含账户已有持仓
解决方案
在PTrade量化平台进行回测时,如果希望模拟实际账户中已经存在的持仓(即设置底仓),可以使用 set_yesterday_position 函数。这在验证包含已有持仓的策略逻辑时非常有用。
1. 使用 set_yesterday_position 直接设置
该函数仅在回测模块可用,用于设置回测的初始底仓。它会使策略在初始化运行时就创建出持仓对象。
参数说明:
poslist:一个包含字典的列表(list[dict]),每个字典代表一只股票的持仓信息。
字典字段要求:
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):
# 策略运行第一天即可卖出底仓中的可用数量
order(g.security, -100)
2. 从 CSV 文件导入底仓
如果底仓股票较多,手动编写字典比较繁琐,PTrade 提供了 convert_position_from_csv 函数,可以从 CSV 文件中读取持仓信息并转换为 set_yesterday_position 所需的格式。
CSV 文件格式要求:
表头必须包含:sid,enable_amount,amount,cost_basis
例如 Poslist.csv 内容如下:
sid,enable_amount,amount,cost_basis
600570.SS,10000,10000,45
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 从上传到研究环境的 CSV 文件中读取底仓信息
poslist = convert_position_from_csv("Poslist.csv")
# 设置底仓
set_yesterday_position(poslist)
def handle_data(context, data):
order(g.security, -100)
注意事项:
set_yesterday_position只能在initialize函数中调用。- 使用 CSV 导入时,需要先将 CSV 文件上传到 PTrade 的研究环境中。
- 设置底仓后,回测开始时的初始资金(
capital_base)不会扣除底仓的市值,底仓是额外附加到账户中的资产。