我们一般用rolling+apply(fun,par)来进行滑动窗口处理某类序列,例如做量化交易时间序列,标的序列等等; 但如果apply函数有参数的话就需要注意。 apply的函数和参数实际上类似于指针的内存地址传递,也就是说滚动执行中参数par实际上是会变化的,如果要在fun中保存这个参数值就需要注意,不能用“=”来赋值,例如
def rolling_buy(code):
code_local=code
df_code=pd.DataFrame(df_tradePrice[int(code)])
df_code.reset_index(level=0, inplace=True)
df_code.set_index(['date'],inplace=True)
buy_price=df_code.loc[buy_date,'close']
......
.......
**trade=pd.Series({'code':code_local,'buy_date':buy_date,'sell_date':sell_date,'buy_price':buy_price,'sell_price':sell_price,'return':re},name=self.Number)**
self.d_result=self.d_result.append(trade)
return self.Number
**No=code_list.rolling(1).apply(rolling_buy,raw=True)**
上述函数对各个股票按code进行处理,然后汇总在d_result中,注意黑色部分code_local=code,“=”是内存赋值,所以结果表格d_result中,'code’就会出现乱数值。
因此这里要用值copy语句
code_local=code_local=copy.copy(code)
问题解决