问答交流

为什么获取的持仓信息无法及时更新?

由bqg2m3yl创建,最终由small_q 被浏览 25 用户

# 本代码由可视化策略环境自动生成 2023年11月21日 00:07
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
 
# 显式导入 BigQuant 相关 SDK 模块
from bigdatasource.api import DataSource
from bigdata.api.datareader import D
from biglearning.api import M
from biglearning.api import tools as T
from biglearning.module2.common.data import Outputs
 
import pandas as pd
import numpy as np
import math
import warnings
import datetime
 
from zipline.finance.commission import PerOrder
from zipline.api import get_open_orders
from zipline.api import symbol
 
from bigtrader.sdk import *
from bigtrader.utils.my_collections import NumPyDeque
from bigtrader.constant import OrderType
from bigtrader.constant import Direction

# 交易引擎:初始化函数,只执行一次
def m6_initialize_bigquant_run(context):
    # 加载预测数据
    context.ranker_prediction = context.options['data'].read_df()
    context.ranker_prediction.set_index('date',inplace=True)
    print(context.ranker_prediction)
# 交易引擎:每个单位时间开盘前调用一次。
def m6_before_trading_start_bigquant_run(context, data):
    # 盘前处理,订阅行情等
    pass

# 交易引擎:tick数据处理函数,每个tick执行一次
def m6_handle_tick_bigquant_run(context, tick):
    pass

# 交易引擎: bar数据处理函数,每个时间单位执行一次
def m6_handle_data_bigquant_run(context, data):
	remainder = context.trading_day_index % 3
	#如果没到调仓期直接结束运行
	if remainder != 0:
		return
		

	import datetime
	import pandas as pd
	import dai

	# 获取当前日期
	current_date = context.get_trading_day()
	account_pos = context.get_account_positions()  #获取持仓信息
	holding_list = list({key: value for key, value in account_pos.items() if value.avail_qty > 0}.keys())
	position_slot = 10 - len(holding_list)  # 目前空余仓位
	print('-' * 20, current_date,' 仓位剩余:', position_slot, '-' * 20)


	#初始化
	buy_list = [] #买入列表
	sell_list = [] #卖出列表
	
	#=============== 教据准备 ===============
	today = data.current_dt.strftime('%Y-%m-%d')
	time = data.current_dt
	account_pos = context.get_account_positions()
	holding_list = list({key: value for key, value in account_pos.items() if value.avail_qty > 0}.keys())
	holding_num = len(holding_list)
	
	#读取当日数据
	try:
		today_data = context.ranker_prediction.loc[today,:]
		today_data.reset_index(inplace=True)
	except:
		return
	
	#策略
	today_data=today_data[today_data['上市时间'] >= 365] #上市时间的过滤
	today_data=today_data[today_data['市盈率ttm'] >= 0] #财务数据过滤
	today_data=today_data[today_data['市盈率ttm'] < 100] #财务数据过滤
	today_data=today_data[today_data['换手排名'] <= 0.5]
	today_data=today_data[today_data['净值产收益率'] > 0.15]
	today_data.sort_values(by='市值',ascending=True, inplace=True) #市值排序
	
	#构建目标列表
	target_list = today_data.instrument.tolist()[:10]
	
	#构建卖出列表
	for ins in holding_list:
		if ins not in target_list:
			sell_list.append(ins)
	
	#构建买入列表
	for ins in target_list:
		if ins not in holding_list:
			buy_list.append(ins)
	
	#先卖
	for ins in sell_list:
		print('卖出', ins)
		context.order_target(ins,0)
	
	#等权买
	account_pos = context.get_account_positions()  #获取持仓信息
	holding_list = list({key: value for key, value in account_pos.items() if value.avail_qty > 0}.keys())
	position_slot = 10 - len(holding_list)  # 目前空余仓位
	print('仓位剩余:', position_slot)

	if position_slot > 0:
		position_money = 1 / position_slot
		for ins in buy_list:
			print('买入', ins)
			context.order_target_percent(ins, position_money)
			account_pos = context.get_account_positions()  #获取持仓信息
			holding_list = list({key: value for key, value in account_pos.items() if value.avail_qty > 0}.keys())
			position_slot = 10 - len(holding_list)  # 目前空余仓位
			print('仓位剩余:', position_slot)


# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m6_handle_trade_bigquant_run(context, trade):
    pass

# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m6_handle_order_bigquant_run(context, order):
    pass

# 交易引擎:盘后处理函数,每日盘后执行一次
def m6_after_trading_bigquant_run(context, data):
    pass


m1 = M.instruments.v2(
    start_date='2022-01-01',
    end_date='2022-01-15',
    market='CN_STOCK_A',
    instrument_list='',
    max_count=0
)

m2 = M.input_features.v1(
    features="""
# #号开始的表示注释,注释需单独一行
# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
净值产收益率=fs_roe_ttm_0
市盈率ttm=pe_ttm_0
换手排名=rank_turn_0
上市时间=list_days_0
市值=market_cap_0
成交量标准差=std(amount_0, 5)
"""
)

m3 = M.general_feature_extractor.v7(
    instruments=m1.data,
    features=m2.data,
    start_date='',
    end_date='',
    before_start_days=90
)

m4 = M.derived_feature_extractor.v3(
    input_data=m3.data,
    features=m2.data,
    date_col='date',
    instrument_col='instrument',
    drop_na=False,
    remove_extra_columns=True,
    user_functions={}
)

m5 = M.chinaa_stock_filter.v1(
    input_data=m4.data,
    index_constituent_cond=['全部'],
    board_cond=['上证主板', '深证主板', '创业板'],
    industry_cond=['全部'],
    st_cond=['正常'],
    delist_cond=['非退市'],
    output_left_data=False
)

m6 = M.hftrade.v2(
    instruments=m1.data,
    options_data=m5.data,
    start_date='',
    end_date='',
    initialize=m6_initialize_bigquant_run,
    before_trading_start=m6_before_trading_start_bigquant_run,
    handle_tick=m6_handle_tick_bigquant_run,
    handle_data=m6_handle_data_bigquant_run,
    handle_trade=m6_handle_trade_bigquant_run,
    handle_order=m6_handle_order_bigquant_run,
    after_trading=m6_after_trading_bigquant_run,
    capital_base=1000000,
    frequency='daily',
    price_type='真实价格',
    product_type='股票',
    before_start_days='0',
    volume_limit=1,
    order_price_field_buy='close',
    order_price_field_sell='open',
    benchmark='000300.HIX',
    plot_charts=True,
    disable_cache=False,
    replay_bdb=False,
    show_debug_info=False,
    backtest_only=False
)


我在每个买入命令后添加了持仓信息获取的代码,用来看可用的剩余仓位(最大10仓)

但是输出的信息却显示买入之后持有仓位数量还是没变化,显示的信息如下:

  • -------------------- 20220104 仓位剩余: 10 --------------------
  • 仓位剩余: 10
  • 买入 603029.SHA
  • 仓位剩余: 10
  • 买入 600520.SHA
  • 仓位剩余: 10
  • 买入 603269.SHA
  • 仓位剩余: 10
  • 买入 300717.SZA
  • 仓位剩余: 10
  • 买入 002890.SZA
  • 仓位剩余: 10
  • 买入 002800.SZA
  • 仓位剩余: 10
  • 买入 300557.SZA
  • 仓位剩余: 10
  • 买入 603286.SHA
  • 仓位剩余: 10
  • 买入 000586.SZA
  • 仓位剩余: 10
  • 买入 603320.SHA
  • 仓位剩余: 10
  • -------------------- 20220107 仓位剩余: 0 --------------------
  • 卖出 300717.SZA
  • 卖出 002890.SZA
  • 卖出 300557.SZA
  • 卖出 000586.SZA
  • 卖出 603320.SHA
  • 仓位剩余: 0
  • -------------------- 20220112 仓位剩余: 5 --------------------
  • 卖出 600520.SHA
  • 卖出 603269.SHA
  • 卖出 002800.SZA
  • 卖出 603286.SHA
  • 仓位剩余: 5
  • 买入 603860.SHA
  • 仓位剩余: 5
  • 买入 603316.SHA
  • 仓位剩余: 5
  • 买入 002836.SZA
  • 仓位剩余: 5
  • 买入 300654.SZA
  • 仓位剩余: 5
  • 买入 000586.SZA
  • 仓位剩余: 5
  • 买入 603320.SHA
  • 仓位剩余: 5
  • 买入 603041.SHA
  • 仓位剩余: 5
  • 买入 002295.SZA
  • 仓位剩余: 5
  • 买入 002893.SZA
  • 仓位剩余: 5


可见上述持仓获取函数获取到的信息完全没有更新过,比如第一天,每次买入之后,剩余仓位依然还是10,没有任何变化。1月7日,卖出之后剩余仓位也没有增加。

怎么才能让它及时更新?因为我想要卖出之后,根据剩下的仓位数量来判断买入多少个票。


另外请教一下,怎么设置日线回测的交易时间?比如我想要10:30分卖出,下午2:30分买入

经过测试设置除了open和close之外的twap或者vwap值都无法触发买卖。

标签

持仓
评论
  • 日线回测仓位信息每日更新一次,表示当天收盘时的持仓情况,你可以每卖出一只自己做个记录就可以了。
  • 另外wap回测,hftrade后续会支持,目前可以用trade做wap回测
{link}