全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7054 7
2009-03-07

各位大侠:

以下面为例,我有3次卖出,我希望得到每次卖出时股票的持有天数。

在先买入、先卖出(“先进先出”)情框下:

(1)第1次还比较简单,1000股4个月,3000股3个月;

(2)第2次就复杂了,需要对应到第2次交易;

(3)第3次就更复杂了。需要计算第3、5、7次交易。

(4)期间如果有送红股会更晕的!!!

  股票名称    交 易日期  交易类别  数量   当日末持有股数
1  深发展   2000年1月1日  买入   1,000    1,000 
2  深发展   2000年2月1日   买入    5,000    6,000 
3  深发展   2000年4月1日  买入   3,000    9,000 
4  深发展   2000年5月1日  卖出   4,000    5,000 
5  深发展   2000年6月1日  买入   1,000    6,000 
6  深发展   2000年7月1日  卖出   2,000    4,000 
7  深发展   2000年8月1日  买入   1,000    5,000 
8  深发展   2000年9月1日  卖出   5,000    0 

我的数据量比较大,不可能手工检查。

望大侠指点SAS下的实现方法。

谢了先!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-3-7 21:24:00
呵呵,本人也想知道
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-8 02:50:00
大概的思路是这样的:

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编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-8 11:52:00

data buy sell;
    input id exchange $ date:jdateymd16. transaction $ volume:comma6. holding:comma6.;
    if transaction = "买入" then output buy; else output sell;
    drop transaction;
datalines;
1  深发展   2000年1月1日  买入   1,000    1,000 
2  深发展   2000年2月1日   买入    5,000    6,000 
3  深发展   2000年4月1日  买入   3,000    9,000 
4  深发展   2000年5月1日  卖出   4,000    5,000 
5  深发展   2000年6月1日  买入   1,000    6,000 
6  深发展   2000年7月1日  卖出   2,000    4,000 
7  深发展   2000年8月1日  买入   1,000    5,000 
8  深发展   2000年9月1日  卖出   5,000    0 
;

proc sort data=buy;
    by date;
proc sort data=sell;
    by date;
data hold(keep=id solddt soldvol avginday);
    firstobs = 1;
    if 0 then set buy(keep=volume date) nobs=nobs;
    do until(eof);
        set sell(keep=id volume date rename=(volume=soldvol date=solddt)) end=eof;
        sum = 0;
        totvol = soldvol;
        do _n_=firstobs by 1 while(totvol>0 and _n_<=nobs);
            set buy(keep=volume date) point=_n_;
            if unsoldvol>0 then volume=unsoldvol;
            sum = sum+ifn(volume>=totvol, totvol, volume)*(solddt-date);
            unsoldvol = ifn(volume>totvol, volume-totvol, 0);
            totvol = ifn(volume>=totvol, 0, totvol-volume);
        end;
        if unsoldvol=0 then firstobs = _n_; else firstobs = _n_-1;
        avginday = sum/soldvol;
        output;
    end;
    stop;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-9 10:49:00

再次求教

非常感谢!

[此贴子已经被作者于2009-3-10 19:44:59编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-10 19:44:00
发贴心情
再次求教

2位高手!

你们提供的方法在只有一个客户买卖一只股票股票时非常好用。

我这里有多个客户买卖多只股票(如下例),将数据拆分为2组就不太方便。

请教2位提供一个处理多样本时的方法。

兄弟这里谢了先!

(目的:计算每只股票卖出时的持有时间)

客户 股票名称 交易日期 交易   数量
客户A 深发展 2000-01-01 买入 1,000
客户A 深发展 2000-02-01 买入 5,000
客户A 深发展 2000-04-01 买入 3,000
客户A 深发展 2000-05-01 卖出 4,000
客户A 深发展 2000-06-01 买入 1,000
客户A 深发展 2000-07-01 卖出 2,000
客户A 深发展 2000-08-01 买入 1,000
客户A 深发展 2000-09-01 卖出 5,000
客户A 万科A 2000-10-01 买入 2,000
客户A 万科A 2000-11-01 卖出 1,000
客户A 万科A 2000-12-01 买入 2,000
客户A 万科A 2001-01-01 买入 2,000
客户A 万科A 2001-02-01 买入 2,000
客户A 万科A 2001-03-01 卖出 6,000
客户A 万科A 2001-04-01 买入 1,000
客户A 万科A 2001-05-01 卖出 1,000
客户B 深发展 2000-01-01 买入 3,000
客户B 深发展 2000-02-01 买入 1,000
客户B 深发展 2000-04-01 买入 3,000
客户B 深发展 2000-05-01 卖出 6,000
客户B 深发展 2000-06-01 买入 5,000
客户B 深发展 2000-07-01 卖出 2,000
客户B 深发展 2000-08-01 卖出 1,000

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群