按照指定价格撮合成交
由qxiao创建,最终由qxiao 被浏览 74 用户
背景
现在有如下这样一张自定义的表,有买入信号buy_signal,卖出信号sell_signal,而且还有自己定义的想成交的价格price列,那如何在平台实现自定义信号买卖和自定义价格成交?
\
实现原理
1、利用bigtrader回测模块的自定义数据回测功能来实现。需要把回测的历史数据通过第三个口传入,即回测引擎就会使用我们传入的行情价格来撮合,而不是平台默认的行情数据。
2、自定义的回测历史数据对列有要求,必须至少含有date,instrument,open,close,volume 5列。
3、把我们需要成交的价格列名设置为open,然后在回测模块的设置中买入点和卖出点都选择open即可。
4、由于回测逻辑是前一天下单,第二日成交,所以buy_signal和sell_signal的数据需要向前偏移一天
实现样例
1、我们以000001.SZ为例,把其真实开盘价减1,作为我们的自定义的需要成交的价格
df = dai.query("""
SELECT date, instrument,
open/adjust_factor-1 as open,
close/adjust_factor as close,
volume
FROM cn_stock_prefactors
WHERE instrument = '000001.SZ'
ORDER BY date
""", filters={"date": ["2024-01-01", "2024-02-08"]}).df().head(10)
2、增加两列信号buy_signal和sell_signal,并进行初始化和信号偏移
# 初始化信号
df['buy_signal'] = 0
df['sell_signal'] = 0
# 设置样例买卖信号
df.loc[1,['buy_signal']] = 1
df.loc[3,['sell_signal']] = 1
# 由于是前一天下单,所以信号需要向前偏移一天
df['buy_signal'] = df['buy_signal'].shift(-1)
df['sell_signal'] = df['sell_signal'].shift(-1)
# 填充空信号为0
df['buy_signal'].fillna(0,inplace=True)
df['sell_signal'].fillna(0,inplace=True)
df
3、把自定义的数据写入表中,方便回测使用
# 数据写入平台
def write_data(df,table_name):
return dai.DataSource.write_bdb(
data=df,
# datasource id是全局唯一的,支持小写字母、数字、下划线,以字母开始
id=table_name,
# 可选,数据插入时,根据unique_together如果有重复的,会去重.如果有分区,则需要传入索引参数indexes
unique_together=["date", "instrument"],
# 可选,指定索引,跟分区相对应,用于数据访问加速
indexes=["date"],
)
table_name = 'test_0816'
write_data(df,table_name)
4、使用如下三个模块构建策略。主要是把自定义的数据传给回测模块
5、核对一下成交记录中的成交价格是否是我们期望的
样例策略源码
https://bigquant.com/codesharev3/3f7f46ba-7741-4a55-addf-36bae2f60853
\