大概的思路是这样的:
1 用data 步提取出有Sell的obs,存为一个ds_sell 日期数据,并用检索变量i标记顺序;
2 用macro,每次从ds_sell里面按顺序提取第i次卖出日期sDate_i和卖出的量S 并存为宏变量。
3 在原始交易数据集 提取出sDate{i}之前的交易数据集
4 该数据集内,用retain定义一个变量,soldV记录当前应该卖出的股票数;
5 然后,条件判断如下:
_N_=1 soldV=&S -bVol; mark=soldV>=0; soldProportion=bVol;
2 soldV=LAG(soldV)-bVol; mark=soldV>=0;soldProportion=bVol;
3 soldV=LAG(soldV)-bVol; mark=soldV>=0;soldProportion=bVol;
....
6 在这个提取出的数据集中,用条件mark=1提取出被当前卖出的所有买入记录,记为新的数据集,
7 利用holdingPeriod=intck('day',date,&sDate_i)就可以提取出在&sDate_i时刻被卖出的股票数bVol和相应的持有期 holdingPeriod。
8 再将这个数据集merge回原来的交易记录
就完成了第i次卖出时,的股票持有期的计算。
9 而考虑到 买入股票并非刚好按整数卖完,则在条件判断上,可以用条件判断
if lag(soldV)>0 and soldV<0 then do; mark=1; soldProportion=Lag(soldV); leftVol=bVol-soldV ;end;
其中的leftVol表示该次买入中没有被抛出的股票数额,应当留在下一次卖出信号出现时,扣减;
10 可以在原始交易记录数据集中用 retain 建立变量 leftVol,用来保留着些残余值,这样leftVol会出现在 由下一次卖出信号所提取的数据集里。
11 另外,在第i>1次的提取时,只需要从 leftVol>0的时间开始,到 &sDate_i截止,然后依上述过程循环即可。
[此贴子已经被作者于2009-3-8 2:54:41编辑过]