策略分享

按照指定价格撮合成交

由qxiao创建,最终由qxiao 被浏览 40 用户

背景

现在有如下这样一张自定义的表,有买入信号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

\

标签

回测模块交易平台
{link}