sas求多只股票的收益率

2025-10-04 6:35:27 股票 yurongpawn

朋友们,今天来聊点干货,但保证不闷场。你是不是也想用 SAS 一口气把多只股票的收益率算清楚,然后用图表把钱包的风向给看明白?别急,我们一步步来,像逛菜市场一样把数据挑干净、把计算做透彻、把结果讲得像段子一样好懂。反正投资这事儿,等你把收益率算清楚了,心情就像看到行情弹幕里说“牛市来临”的网友一样积极啊,吕布也得点赞。

先把核心概念抛开神秘面纱:收益率通常指单位投资在某一时点的回报,简单地说就是价格变动带来的增值再加上分红。对多只股票而言,我们通常关心两类收益率:逐日或逐日段的日收益率,以及累积收益率(累计回报)。在 SAS 里,我们要做的是把日期、股票代码、收盘价和分红等要素合并成一个统一的粒度,然后对每只股票逐一计算,再把结果汇总成多只股票的视图。整个过程像做饭:先买好食材(数据),再切配(清洗和对齐),再煮汤(计算回报),最后上桌(输出和分析)。

数据准备看起来简单,但坑其实不少:日期的对齐、假日与交易日的错位、分红或拆股的影响、不同数据源的字段命名不一致等。处理这类问题,最稳妥的办法是把数据统一成三列结构:date、ticker、close,另外如果有分红信息也放在 dividend 列。若你手头没有分红数据,也可以先以价格收益率为主,后续再补充分红项。接下来我们进入 SAS 的具体实现环节,目标是把多只股票的收益率一次性计算出来,并且能按日期或按股票维度查看。

第一步,数据导入与清洗。假设你有一个名为 prices 的数据集,字段包括 date、ticker、close,若有 dividend 列也一并保留。先按 ticker、date 排序,确保时间序序正确,以便后续分组计算。下面这段伪代码式的思路,放在数据步里执行即可:data prices_sorted; set prices; by ticker date; if first.ticker then lag_close = .; retain lag_close; ret = (close - lag_close) / lag_close; if not missing(lag_close); lag_close = close; format ret 8.4; keep date ticker close ret; run。要点是为每个 ticker 维护一个前一日的收盘价(lag),一旦进入新股票就重置,这样就不会把不同股票的价格拼错。你也可以把 dividend 纳入公式:ret = (close - lag_close + dividend) / lag_close,前提是 dividend 持有的是同一天的现金分红。

第二步,整合多只股票的收益率。为了让后续聚合更方便,我们把同一日期下所有股票的收益率放在同一行,或保留两种视图:一、按日期聚合的跨股票横截面收益率,二、按股票维度的序列收益率。若采用横截面视图,常见做法是用 PROC SQL 将同一天的 ticker 的 ret 汇聚到一列,或者通过数据步中的数组把多支股票的 ret 值整合成一张收益率矩阵。要点是日期对齐要严格,缺失数据要明确处理,比如用前瞻填充、或在统计口径中剔除缺失点,避免把整行数据拉下水。

第三步,常用的 SAS 计算方法。你可以选择数据步直接计算、也可以用 PROC SQL 做聚合,或者两者结合。典型的路径是:先用数据步获得每支股票的日收益率(ret),再用 PROC MEANS、PROC SUMMARY 或 PROC UNIVARIATE 计算跨股票的描述性统计(均值、标准差、分位数等),最后用 PROC SGPLOT 绘制时间序列趋势或分布图。具体要点包括:1) 对多支股票做按日期的分组聚合时,确保 by 语句和 sort 的顺序正确;2) 计算跨股票的平均收益率时,决定是等权重还是市值加权,默认大多数场景是等权重;3) 如果想看某段时间的表现,可以加一个日期区间过滤条件,避免被极端行情拉偏。

sas求多只股票的收益率

下面给出一个更具体的 SAS 写法要点,便于你照着跑,当然你可以按自己数据结构℡☎联系:调。数据排序后,按 ticker 逐日计算收益率,并将结果保留成一个新数据集 returns:proc sort data=prices_sorted; by ticker date; run; data returns; set prices_sorted; by ticker; retain lag_close; if first.ticker then lag_close = .; ret = (close - lag_close) / lag_close; if not missing(lag_close); lag_close = close; keep date ticker ret close; run。若需要把分红考虑进去,确保 dividend 字段存在并在表达式中加上 dividend:ret = (close - lag_close + dividend) / lag_close; 这样你就把价格收益率和分红收益率合在一起了。

跨股票的聚合,可以使用一个简洁的办法:把同一天的所有股票的 ret 汇总到一个数据集,随后对该数据集进行均值/中位数等描述性统计。你可以写成:proc sql; create table cross_section as select date, mean(ret) as avg_ret, std(ret) as sd_ret, median(ret) as med_ret from returns group by date; quit; 这一步能给你直观的“全市场日均收益率”和波动性。若你更关心分布形态,可以再做直方图或密度图,使用 proc univariate 和 proc sgplot 组合。直方图能帮助你看到收益率分布是否偏态,是否存在极端点。

在实践中,很多新手会被“多股票怎么对齐日期、怎么合并两个数据集”这几个问题卡住。一个稳妥的做法是把所有数据源统一成一个统一的日期粒度表,再用左连接把价格、分红、以及其他信息拼接到这个日期表上,避免缺失导致的错配。具体做法可用 PROC SQL 的左连接实现:select a.date, a.ticker, a.close, b.dividend from prices as a left join dividends as b on a.date = b.date and a.ticker = b.ticker;再把结果带回到收益率计算中。若你手头有交易日历表,可以先把日历表与价格表做一次左连接,确保每个交易日都被正确对齐。

接下来是更实用的两种视角:一是“若干股票的同日收益率分布”,二是“按股票的累计收益率曲线”。第一种适合做横截面分析,第二种适合评估个体股票的表现。对于横截面分析,你可以把每个日期的 avg_ret 作为当日的市场收益率,以此来衡量个别股票相对市场的表现;对于累计收益率,先把日收益率转化为日累计因子,然后对每支股票求出自起点以来的累积回报(cumulative return),再用 PROC SGPLOT 做时间序列图,观察不同股票在同一时间段内的相对表现。这样,你就有了一个多股票收益率的全景视图,像在股票园区里逛了一圈,发现每个摊位的风味都不一样。

在实操过程中,还要注意几个小细节。第一,数据缺失的处理。金融数据往往会因为节假日或数据源不完整而出现缺失,直接把缺失点留着会让计算结果偏离。你可以在引入数据时先做一个缺失筛选,或在计算中用前一日价格填充、或对缺失天数剔除。第二,分红和拆股的处理。若要严格衡量总回报,别忘了将分红纳入收益率的分子,拆股则需要把历史价格做相应的调整,否则“价格变动”会被人为地放大或缩小。第三,权重设置。若要做多只股票的组合收益率,决定是等权还是按市值加权很关键。等权可以平衡个股影响,市值加权更贴近真实投资组合的资金分布。第四,时间单位的统一。不同数据源可能给出日频、周频,确保你最终计算的是一致的时间粒度,否则跨股票比较就会像把尺子和圆规混用,越画越乱。最后,测试和验证很重要。你可以用一小部分样本做对照,验证返回值与直观预期的一致性,再把代码放大到全量数据。就像调味一样,味道要先试试,别直接一个锅下去。

如果你是自媒体风格的读者,想要的往往不是死板的代码,而是能落地的洞察。于是这段话就变成一句话的行动指令:拿到数据、确认字段、用数据步计算日收益率、用 SQL/汇总做横截面统计、用 SGPLOT 做图表,一步步把“多只股票的收益率”变成可视的、可分享的成果。你会看到,SAS 不仅能算出数字,还能把结果讲得有趣、像段子一样好记。你把结果发到朋友圈,朋友们点赞的背后,是对你把复杂问题拆解、把数据变成故事的认可。就算股市忽上忽下,这份清晰的收益率分析,依然能给你稳稳的底气。到底谁的收益率最稳、谁的回撤最小,数据会给出答案。最后的问题是,今天你要让哪只股票成为主角,哪几只成为陪衬?

脑海里突然冒出一个问题:如果把收益率想象成天气预报,哪一天的风向才真正决定你的“钱包天气”?

免责声明
           本站所有信息均来自互联网搜集
1.与产品相关信息的真实性准确性均由发布单位及个人负责,
2.拒绝任何人以任何形式在本站发表与中华人民共和国法律相抵触的言论
3.请大家仔细辨认!并不代表本站观点,本站对此不承担任何相关法律责任!
4.如果发现本网站有任何文章侵犯你的权益,请立刻联系本站站长[QQ:775191930],通知给予删除
网站分类
标签列表
最新留言

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 96633168 bytes) in /www/wwwroot/yurongpawn.com/zb_users/plugin/dyspider/include.php on line 39