Bug: 杠杆交易下目标池计算修正

This commit is contained in:
binz 2024-05-28 22:00:04 +08:00
parent 715b80cd63
commit 74612e5f6e
2 changed files with 33 additions and 19 deletions

View File

@ -36,6 +36,7 @@ class Spread_Backtest():
else: else:
bkt_end = rec_end bkt_end = rec_end
print(f'回测区间: {bkt_start} - {bkt_end}') print(f'回测区间: {bkt_start} - {bkt_end}')
start_time = time.time() start_time = time.time()
target_list = self.trader.signal[list(self.trader.signal.keys())[0]].loc[bkt_start:bkt_end].index target_list = self.trader.signal[list(self.trader.signal.keys())[0]].loc[bkt_start:bkt_end].index
for idx,date in enumerate(sorted(target_list), start=1): for idx,date in enumerate(sorted(target_list), start=1):

View File

@ -235,7 +235,8 @@ class Trader(Account):
stock_ipo_filter = stock_ipo_days.copy() stock_ipo_filter = stock_ipo_days.copy()
stock_ipo_filter.loc[:] = 0 stock_ipo_filter.loc[:] = 0
stock_ipo_filter.loc[stock_ipo_days > self.ipo_days] = 1 stock_ipo_filter.loc[stock_ipo_days > self.ipo_days] = 1
# 剔除列表 # 剔除列表 = ipo筛选 + 成交量筛选 + 额外剔除
# 其中额外提出会强制执行,因此单独保存一份强制执行的列表
exclude_stock = [] exclude_stock = []
for exclude in self.exclude_list: for exclude in self.exclude_list:
if exclude == 'abnormal': if exclude == 'abnormal':
@ -344,19 +345,36 @@ class Trader(Account):
normal_list = [] normal_list = []
margin_list = [] margin_list = []
for stock in last_position.index: # 获取历史融资融券池
if len(last_position) > 0:
last_margin_list = self.position.loc[self.position['margin_trade'] == 1, 'stock_code'].to_list()
else:
last_margin_list = []
# 获取历史非融资融券标的
if len(last_position) > 0:
last_normal_list = self.position.loc[self.position['margin_trade'] == 0, 'stock_code'].to_list()
else:
last_normal_list = []
for stock in last_margin_list:
# 如果停牌或者跌停继续持有 # 如果停牌或者跌停继续持有
if stock_status.loc[stock] in [0,2]: if stock_status.loc[stock] in [0,2]:
normal_list, margin_list = assign_stock(normal_list, margin_list, margin_needed, stock, is_margin.loc[stock]) margin_list.append(stock)
for stock in last_normal_list:
# 如果停牌或者跌停继续持有
if stock_status.loc[stock] in [0,2]:
normal_list.append(stock)
# 剔除过滤条件后 # 剔除过滤条件后
after_filter_list = list(set(factor.index) - set(exclude_stock)) after_filter_list = list(set(factor.index) - set(exclude_stock))
for stock in factor.loc[after_filter_list].dropna().sort_values(ascending=self.ascending).index.values: for stock in factor.loc[after_filter_list].dropna().sort_values(ascending=self.ascending).index.values:
if stock_amt_filter.loc[stock] != 1: if len(normal_list + margin_list) == self.num:
continue break
if self.with_st: if self.with_st:
if stock_status.loc[stock] in [0,2,5,7]: if stock_status.loc[stock] in [0,2,5,7]:
if stock in last_position.index: if stock in last_margin_list:
normal_list, margin_list = assign_stock(normal_list, margin_list, margin_needed, stock, is_margin.loc[stock]) margin_list.append(stock)
else:
normal_list.append(stock)
else: else:
normal_list, margin_list = assign_stock(normal_list, margin_list, margin_needed, stock, is_margin.loc[stock]) normal_list, margin_list = assign_stock(normal_list, margin_list, margin_needed, stock, is_margin.loc[stock])
else: else:
@ -366,24 +384,23 @@ class Trader(Account):
else: else:
# 如果停牌或者跌停继续持有 # 如果停牌或者跌停继续持有
if stock_status.loc[stock] in [0,2,7]: if stock_status.loc[stock] in [0,2,7]:
if stock in last_position.index: if stock in last_margin_list:
normal_list, margin_list = assign_stock(normal_list, margin_list, margin_needed, stock, is_margin.loc[stock]) margin_list.append(stock)
if len(normal_list + margin_list) == self.num: else:
break normal_list.append(stock)
margin_list = list(OrderedSet(margin_list))
normal_list = list(OrderedSet(normal_list))
target_list = normal_list + margin_list target_list = normal_list + margin_list
# ----- 卖出 ----- # ----- 卖出 -----
buy_list = [] buy_list = []
sell_list = [] sell_list = []
# 融资融券池的和非融资融券池的分开更新 # 融资融券池的和非融资融券池的分开更新
# 更新融资融券池 # 更新融资融券池
if len(last_position) > 0:
last_margin_list = self.position.loc[self.position['margin_trade'] == 1, 'stock_code'].to_list()
else:
last_margin_list = []
# 异常强制卖出 # 异常强制卖出
for stock in last_margin_list: for stock in last_margin_list:
if stock in force_exclude: if stock in force_exclude:
sell_list.append(stock) sell_list.append(stock)
force_sell_num = len(sell_list) force_sell_num = len(sell_list)
for stock in factor.loc[last_margin_list].sort_values(ascending=self.ascending).index.values[::-1]: for stock in factor.loc[last_margin_list].sort_values(ascending=self.ascending).index.values[::-1]:
if len(sell_list) >= int(max_sell_num * margin_ratio) + force_sell_num + 1: if len(sell_list) >= int(max_sell_num * margin_ratio) + force_sell_num + 1:
@ -398,10 +415,6 @@ class Trader(Account):
sell_list = list(set(sell_list)) sell_list = list(set(sell_list))
next_margin_list = list(set(last_margin_list) - set(sell_list)) next_margin_list = list(set(last_margin_list) - set(sell_list))
# 更新非融资融券池 # 更新非融资融券池
if len(last_position) > 0:
last_normal_list = self.position.loc[self.position['margin_trade'] == 0, 'stock_code'].to_list()
else:
last_normal_list = []
# 异常强制卖出 # 异常强制卖出
for stock in last_normal_list: for stock in last_normal_list:
if stock in force_exclude: if stock in force_exclude: