在下面的代码里,第42行的值可以更改成功,第74行的值却更改不成功,为什么呢?
文件在网盘[](链接:https://pan.baidu.com/s/1utmUzENRe_N0cGqseo9j-A?pwd=wipw
提取码:wipw
--来自百度网盘超级会员V4的分享)
import pandas as pd
pd.set_option('display.max_columns', None)#显示所有列
pd.set_option('mode.chained_assignment', None)
df = pd.read_excel(r'E:\BaiduSyncdisk\quant\短线研究\盘口\603767\0616\集合竞价成交未成交处理.xlsx')
df['成交数量'] = df['成交数量'].astype(str)#成交数量列改成字符串格式(一笔委托单可能分多次成交,需要插入多次)
# 盘中实时匹配计算
df_pz = df[(df['时间'] >= 93000000) & (df['时间'] < 145700000)] # 取集合竞价的数据
# 集合竞价中的数据整理
df_jh = df[df['时间'] < 93000000]
# 集合竞价(93000000之前)未成交买单
df_b_wcj = df_jh[(df_jh['委托类型'] == 'A')&(df_jh['委托代码'] == 'B') & (df_jh['未成交数量'] > 0)]
# 集合竞价(93000000之前)未成交卖单
df_s_wcj = df_jh[(df_jh['委托类型'] == 'A')&(df_jh['委托代码'] == 'S') & (df_jh['未成交数量'] > 0)]
#交易已完成订单(撤单完成和已成交订单)+交易类型为D(撤单类型)的订单
df_ywc = df_jh[(df_jh['未成交数量'] == 0) | (df_jh['委托类型'] == 'D')]
#对93000000-145700000之间的数据进行遍历处理
for i, row in df_pz.iterrows():
if i ==204:
break
# 如果遍历到的订单为AB买单
if (row['委托类型'] == 'A') & (row['委托代码'] == 'B'): # 遍历到的订单为买单
# 查找比该买单的委托价格低的未成交的卖单,为符合条件的卖单
df_s_wcj_match = df_s_wcj[df_s_wcj['委托价格'] <= row['委托价格']]
#对符合条件的卖单进行按委托价格和交易所委托号全部升序排序
df_s_wcj_match_sorted = df_s_wcj_match.sort_values(by=['委托价格', '交易所委托号'], ascending=[True, True])
if len(df_s_wcj_match) == 0: # 没有可成交的订单
row['未成交数量'] = row['委托数量'] # 未成交数量为委托数量
# 将该笔买单加入到未成交买单df里面
df_b_wcj = pd.concat([df_b_wcj, row.to_frame().T], ignore_index=True)
else:#存在可成交的卖单
num_wcj = 0
cumulative_sum_vol = 0
#对可成交的卖单进行排序后遍历
for j, r in df_s_wcj_match_sorted.iterrows():
# 从遍历到的该笔卖单向前总的未成交卖单数量之和
cumulative_sum_vol += r['未成交数量']
#如果遍历到的该笔卖单之前的总的未成交卖单数量之和小于买单的委托数量:
if cumulative_sum_vol < row['委托数量']: # 总的卖单未成交数量小于该行买单委托数量
# 卖单全部成交
r['成交数量']=str(r['成交数量'])+','+str(r['未成交数量'])
# r['成交数量']='00000'
r['成交时间'] =str(r['成交时间'])+','+ str(row['时间'])
r['未成交数量'] = 0
# 将成交完成的卖单放入到已完成的订单集合里面
df_ywc = pd.concat([df_ywc, r.to_frame().T], ignore_index=True) # 把数据加入到已完成的订单里面
#将卖单从未成交的卖单集合里面删除
df_s_wcj = df_s_wcj[df_s_wcj['交易所委托号'] != r['交易所委托号']] # 把数据从未成交的卖单里面删除
# 遍历到的买单部分成交
row['成交数量'] = str(cumulative_sum_vol)
row['成交时间'] = row['时间']
row['未成交数量'] = row['委托数量'] - cumulative_sum_vol
# 将未完全成交的买单放入未成交买单的集合中
df_b_wcj = pd.concat([df_b_wcj, row.to_frame().T], ignore_index=True)
elif cumulative_sum_vol == row['委托数量']:#总的卖单未成交数量等于该行买单委托数量
# 卖单全部成交
r['成交数量'] = str(r['成交数量'])+','+str(r['未成交数量'])
r['成交时间'] = str(r[ '成交时间'])+','+ str(row['时间'])
r['未成交数量'] = 0
# 将成交完成的卖单放入到已完成的订单集合里面
df_ywc = pd.concat([df_ywc, r.to_frame().T], ignore_index=True)
# 将卖单从未成交的卖单集合里面删除
df_s_wcj = df_s_wcj[df_s_wcj['交易所委托号'] != r['交易所委托号']]
# 遍历到的买单全部成交
row['成交数量'] = str(cumulative_sum_vol)
row['成交时间'] = row['时间']
row['未成交数量'] = 0
# 将成交完成的买单放入到已完成的订单集合里面
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True) # 把数据加入到已完成的订单里面
elif cumulative_sum_vol > row['委托数量']: # 总的卖单未成交数量大于该行买单委托数量
if num_wcj == 0: # 第一次遍历到大于0
# 未成交卖单部分成交
r['成交数量'] = str(r['成交数量'])+','+str(r[ '委托数量']-(cumulative_sum_vol-row['委托数量']))
r['成交时间'] = str(r[ '成交时间'])+','+ str(row['时间'])
r['未成交数量'] = cumulative_sum_vol - row['委托数量']
# 遍历到的买单全部成交
row['成交数量'] = str(row['委托数量'])
row['成交时间'] = row['时间']
row['未成交数量'] = 0
df_b_wcj = df_b_wcj[df_b_wcj['交易所委托号'] != row['交易所委托号']] # 把row数据从未成交的卖单里面删除
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True) # 把数据加入到已完成的订单里面
num_wcj += 1
elif (row['委托类型'] == 'A') & (row['委托代码'] == 'S'): # 遍历到的订单为卖单
# 查找比该卖单的委托价格高的未成交的买单
df_b_wcj_match = df_b_wcj[df_b_wcj['委托价格'] >= row['委托价格']]
df_b_wcj_match_sorted = df_b_wcj_match.sort_values(by=['委托价格', '交易所委托号'], ascending=[False, True])
if len(df_b_wcj_match) == 0: # 没有可成交的买单
row['未成交数量'] = row['委托数量'] # 未成交数量为委托数量
# 将该笔卖单加入到未成交卖单df_s_wcj里面
df_s_wcj = pd.concat([df_s_wcj, row.to_frame().T], ignore_index=True)
else:#存在可成交的买单
num_wcj = 0
cumulative_sum_vol = 0
for j, r in df_b_wcj_match_sorted.iterrows():
# 从该笔订单向前总的未成交数量之和
cumulative_sum_vol += r['未成交数量']
# print(cumulative_sum_vol)
if cumulative_sum_vol < row['委托数量']: # 总的卖单未成交数量小于等于该行买单委托数量
# 买单全部成交
r['成交数量']=str(r['成交数量'])+','+str(r['未成交数量'])
r['成交时间'] =str(r['成交时间'])+','+ str(row['时间'])
r['未成交数量'] = 0
# 将成交完成的买单放入到已完成的订单集合里面
df_ywc = pd.concat([df_ywc, r.to_frame().T], ignore_index=True) # 把数据加入到已完成的订单里面
#将买单从未成交的买单集合里面删除
df_b_wcj = df_b_wcj[df_b_wcj['交易所委托号'] != r['交易所委托号']] # 把数据从未成交的卖单里面删除
# 遍历到的卖单部分成交
row['成交数量'] = str(cumulative_sum_vol)
row['成交时间'] = row['时间']
row['未成交数量'] = row['委托数量'] - cumulative_sum_vol
# 将未完全成交的卖单放入未成交买单的集合中
df_s_wcj = pd.concat([df_s_wcj, row.to_frame().T], ignore_index=True)
elif cumulative_sum_vol == row['委托数量']:
# 买单全部成交
r['成交数量'] = str(r['成交数量']) + ',' + str(r['未成交数量'])
r['成交时间'] = str(r['成交时间']) + ',' + str(row['时间'])
r['未成交数量'] = 0
# 将成交完成的买单放入到已完成的订单集合里面
df_ywc = pd.concat([df_ywc, r.to_frame().T], ignore_index=True)
# 将买单从未成交的买单集合里面删除
df_b_wcj = df_b_wcj[df_b_wcj['交易所委托号'] != r['交易所委托号']]
# 遍历到的卖单全部成交
row['成交数量'] = str(cumulative_sum_vol)
row['成交时间'] = row['时间']
row['未成交数量'] = 0
# 将成交完成的买单放入到已完成的订单集合里面
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True) # 把数据加入到已完成的订单里面
elif cumulative_sum_vol > row['委托数量']: # 总的卖单未成交数量大于该行买单委托数量
if num_wcj == 0: # 第一次遍历到大于0
# 未成交买单部分成交
r['成交数量'] = str(r['成交数量'])+','+str(r[ '委托数量']-(cumulative_sum_vol-row['委托数量']))
r['成交时间'] = str(r[ '成交时间'])+','+ str(row['时间'])
r['未成交数量'] = cumulative_sum_vol - row['委托数量']
# 遍历到的卖单全部成交
row['成交数量'] = str(row['委托数量'])
row['成交时间'] = row['时间']
row['未成交数量'] = 0
df_s_wcj = df_s_wcj[df_s_wcj['交易所委托号'] != row['交易所委托号']] # 把row数据从未成交的卖单里面删除
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True) # 把数据加入到已完成的订单里面
num_wcj += 1
#遍历到的订单未DB撤买
elif (row['委托类型'] == 'D') & (row['委托代码'] == 'B'):
wt_num = row['交易所委托号'] # 提取撤单数据的交易所委托号
wt_num_a_data = df_b_wcj[df_b_wcj['交易所委托号'] == wt_num] # 找到交易所委托号相同的委托类型为AB的数据
diff_vol_ad = wt_num_a_data['委托数量'].values[0] - row['委托数量'] # 计算委托数量与撤单数量的差值
if diff_vol_ad > 0: # 如果差值大于0,未完全撤单
print(f'AB委托数量与DB委托数量之差大于0,已完成订单+1,其他不变' )
wt_num_a_data['委托数量'] = diff_vol_ad
wt_num_a_data['未成交数量'] = diff_vol_ad # 将差值赋值给委托类型为A,交易所委托号相同数据的委托数量
wt_num_a_data['撤单数量'] = row['委托数量'] #
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True)#将委托类型为D的订单,放到已完成的订单里面
elif diff_vol_ad == 0:
wt_num_a_data['未成交数量'] = 0
wt_num_a_data['撤单数量'] = row['委托数量'] #
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True)#将撤单数据放到已完成订单里面
df_b_wcj = df_b_wcj[df_b_wcj['交易所委托号'] != wt_num] # 如果差值等于0,则将wt_num相等的数据从未成交的数据里面删除,放到已完成的数据里面,如下
df_ywc = pd.concat([df_ywc, wt_num_a_data],ignore_index=True) # 如果差值等于0,则将该条委托类型为A的数据追加到df_ywc中
elif (row['委托类型'] == 'D') & (row['委托代码'] == 'S'):
wt_num_a_data = df_s_wcj[df_s_wcj['交易所委托号'] == row['交易所委托号']] # 找到交易所委托号相同的委托类型为AS的数据
diff_vol_ad = wt_num_a_data['委托数量'].values[0] - row['委托数量'] # 计算委托数量与撤单数量的差值
# print(diff_vol_ad)
if diff_vol_ad > 0: # 如果差值大于0
wt_num_a_data['委托数量'] = diff_vol_ad
wt_num_a_data['未成交数量'] = diff_vol_ad # 将差值赋值给委托类型为A,交易所委托号相同数据的委托数量
wt_num_a_data['撤单数量'] = row['委托数量'] #
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True)
elif diff_vol_ad == 0:
wt_num_a_data['未成交数量'] = 0
wt_num_a_data['撤单数量'] = row['委托数量'] #
df_ywc = pd.concat([df_ywc, row.to_frame().T], ignore_index=True)
df_s_wcj = df_s_wcj[df_s_wcj['交易所委托号'] != row['交易所委托号']] # 如果差值等于0,则将wt_num相等的数据从未成交的数据里面删除,放到已完成的数据里面,如下
df_ywc = pd.concat([df_ywc, wt_num_a_data],ignore_index=True) # 如果差值等于0,则将该条委托类型为A的数据追加到df_ywc中
#合并未成交买单、未成交卖单及已完成订单
merged_df = pd.concat([df_s_wcj, df_b_wcj,df_ywc])
merged_df = merged_df.sort_values(by = [ '时间','交易所委托号'], ascending=[True, True])
merged_df = merged_df.reset_index(drop=True)
merged_df.to_excel(r'E:\BaiduSyncdisk\quant\短线研究\盘口\603767\0616\盘中实时成交未成交处理2.xlsx', index=False)