我正在制作一个pandas Financial系列数据框,并在行中迭代以测试停靠点和目标。对于大型数据集,这需要太长时间。我遇到的主要问题是数据['Signal']仅在存在边界条件时才会触发。在没有触及目标和停止的情况下,将“锁定”信号保持为1(通过向前填充)将是很好的。目前我检查每一行并填写位置值以执行我的计算。
使用数据更新:
Date Time Open High Low Close boundry1 boundry2 L1 S1 Signal exit_type exit_price Sreturn position
578 20120831 10:56:00 1272.50 1274.00 1272.50 1274.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
579 20120831 10:57:00 1274.00 1275.25 1274.00 1274.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
580 20120831 10:59:00 1274.25 1274.75 1274.25 1274.75 1274.5 1271.25 1277.75 1268.0 1 NaN NaN 0 0
581 20120831 11:00:00 1274.75 1274.75 1274.75 1274.75 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
582 20120831 11:01:00 1275.00 1275.00 1275.00 1275.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
583 20120831 11:02:00 1275.75 1275.75 1275.25 1275.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
584 20120831 11:03:00 1276.25 1276.25 1276.25 1276.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
585 20120831 11:04:00 1277.00 1277.00 1277.00 1277.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
586 20120831 11:05:00 1275.75 1275.75 1274.75 1274.75 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
587 20120831 11:06:00 1275.50 1275.50 1275.25 1275.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
588 20120831 11:07:00 1275.25 1275.25 1274.75 1274.75 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
589 20120831 11:09:00 1274.75 1275.00 1274.75 1275.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
590 20120831 11:10:00 1275.25 1275.25 1275.25 1275.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
591 20120831 11:11:00 1275.50 1275.50 1275.50 1275.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
592 20120831 11:12:00 1275.00 1275.00 1275.00 1275.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
593 20120831 11:16:00 1274.75 1275.00 1274.75 1275.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
594 20120831 11:17:00 1275.25 1275.25 1275.25 1275.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
595 20120831 11:19:00 1274.75 1275.00 1274.75 1275.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
596 20120831 11:21:00 1275.25 1275.25 1275.25 1275.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
597 20120831 11:24:00 1276.25 1276.25 1276.25 1276.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
598 20120831 11:29:00 1274.50 1274.50 1274.50 1274.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
599 20120831 11:31:00 1274.50 1274.50 1274.50 1274.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
600 20120831 11:32:00 1274.25 1274.25 1274.25 1274.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
601 20120831 11:33:00 1274.25 1274.25 1274.25 1274.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
602 20120831 11:34:00 1273.75 1274.00 1273.75 1274.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
603 20120831 11:39:00 1274.50 1274.50 1274.50 1274.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
604 20120831 11:41:00 1274.50 1274.50 1274.50 1274.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
605 20120831 11:47:00 1273.75 1273.75 1273.50 1273.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
606 20120831 11:48:00 1274.00 1274.00 1274.00 1274.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
607 20120831 11:49:00 1273.75 1274.00 1273.75 1274.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
608 20120831 11:50:00 1273.25 1273.75 1273.25 1273.75 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
609 20120831 11:53:00 1274.50 1274.50 1274.50 1274.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
610 20120831 11:56:00 1274.00 1274.00 1273.50 1273.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
611 20120831 11:59:00 1273.75 1273.75 1273.75 1273.75 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
612 20120831 12:00:00 1273.50 1273.50 1273.50 1273.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
613 20120831 12:05:00 1273.50 1273.50 1273.50 1273.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
614 20120831 12:07:00 1273.00 1273.00 1273.00 1273.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
615 20120831 12:08:00 1272.75 1272.75 1270.50 1270.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
616 20120831 12:09:00 1270.75 1270.75 1270.50 1270.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
617 20120831 12:10:00 1270.25 1270.25 1269.50 1269.50 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
618 20120831 12:12:00 1268.00 1268.00 1268.00 1268.00 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
619 20120831 12:13:00 1267.75 1268.25 1267.75 1268.25 1274.5 1271.25 1277.75 1268.0 0 NaN NaN 0 0
有更多的pythonic方式吗?谢谢,节日快乐! 编辑:我在这里做的是使用active_position锁定为1,直到其中一个退出条件被命中 如果启动信号并且未超过boundry2和L1条件,那么最好是对“信号”列进行条件填充。一旦超过这些条件。然后它会减少active_position-1 ..
active_position=0
for i, row in data.iterrows():
data.loc[i,'position']=active_position
if row.Signal==1 and active_position==0:
active_position=1
data.loc[i, 'exit_type'] = None
elif active_position>0:
if data.loc[i,'High']<data.loc[i,'L1']:
if data.loc[i,'Low']<=data.loc[i,'boundry2']:
data.loc[i, 'exit_type'] = 'stop'
active_position=0
bars_since_signal=0
data.loc[i,'Sreturn']=(data.boundry2.loc[i]-data.Close.loc[i-1])*active_position
else:
data.loc[i, 'exit_type'] = None
data.loc[i,'position']=active_position
data.loc[i,'Sreturn']=(data.Close.loc[i]-data.Close.loc[i-1])*active_position
else:
data.loc[i, 'exit_type'] = 'Target1'
active_position=0
bars_since_signal=0
data.loc[i,'Sreturn']=(data['L1'].loc[i]-data.Close.loc[i-1])*active_position