首页 > 解决方案 > 使用时间序列数据计算收益时如何避免缺失值

问题描述

我有一个每日收盘价的时间序列数据集。数据格式如下:

     +---------------------+
     |      date     close |
     |---------------------|
  1. | 01sep2008   9210.15 |
  2. | 02sep2008   9229.51 |
  3. | 03sep2008   9239.15 |
  4. | 04sep2008   9239.26 |
  5. | 05sep2008   9342.19 |
     |---------------------|
  6. | 08sep2008   9296.23 |
  7. | 09sep2008   9279.62 |
  8. | 10sep2008   9315.68 |
  9. | 11sep2008   9263.39 |
 10. | 12sep2008   9253.92 |
     +---------------------+

由于周末的原因,整个星期都不会进行交易,甚至一周内也可能不会交易股票。因此,时间序列中的间隙是不可避免的。

我需要使用以下公式来生成回报:

gen returns = ln(close/l.close)

但是,由于时间序列的差距,会产生许多缺失值。

我该如何解决这个问题?

l.close应为收盘价的前值,与日期无关。

下面的输出给出了我想要什么的想法(我首先生成了一个滞后变量):

     +-------------------------------+
     |      date     close       lag |
     |-------------------------------|
  1. | 01sep2008   9210.15         . |
  2. | 02sep2008   9229.51   9210.15 |
  3. | 03sep2008   9239.15   9229.51 |
  4. | 04sep2008   9239.26   9239.15 |
  5. | 05sep2008   9342.19   9239.26 |
     |-------------------------------|
  6. | 08sep2008   9296.23   9342.19 |
  7. | 09sep2008   9279.62   9296.23 |
  8. | 10sep2008   9315.68   9279.62 |
  9. | 11sep2008   9263.39   9315.68 |
 10. | 12sep2008   9253.92   9263.39 |
     +-------------------------------+

相反,我得到以下信息:

     +-------------------------------+
     |      date     close       lag |
     |-------------------------------|
  1. | 01sep2008   9210.15         . |
  2. | 02sep2008   9229.51   9210.15 |
  3. | 03sep2008   9239.15   9229.51 |
  4. | 04sep2008   9239.26   9239.15 |
  5. | 05sep2008   9342.19   9239.26 |
     |-------------------------------|
  6. | 08sep2008   9296.23         . |
  7. | 09sep2008   9279.62   9296.23 |
  8. | 10sep2008   9315.68   9279.62 |
  9. | 11sep2008   9263.39   9315.68 |
 10. | 12sep2008   9253.92   9263.39 |
     +-------------------------------+

08sep2008缺少at 的值,但此处05sep2008应取 的值。

示例数据:

* Example generated by -dataex-. To install: ssc install dataex
clear
 input float(date close)
  17776 9210.15
  17777 9229.51
  17778 9239.15
  17779 9239.26
  17780 9342.19
  17783 9296.23
  17784 9279.62
  17785 9315.68
  17786 9263.39
  17787 9253.92
  17790 9233.21
  17791 9223.77
  17792 9216.23
  17793 9202.31
  17794  9200.6
  17797 9200.22
  17798 9199.51
  17799 9190.75
  17800 9184.15
  17804  9182.8
  17805 9179.68
  17811 9178.97
  17812 9181.48
  17813 9178.73
  17814 9181.35
  17815 9181.35
  17818 9184.24
  17819 9184.24
  17820 9184.24
  17821 9184.24
  17822 9184.24
  17825 9184.75
  17826  9186.9
  17827 9183.74
  17828 9182.88
  17829 9182.88
  17832 9182.88
  17833 9182.88
  17834 9182.88
  17835 9182.88
  end
  format %td date

标签: time-seriesstata

解决方案


以下对我有用:

sort date

generate lag = close[_n-1]
generate returns = ln(close / close[_n-1])

list in 1/10

     +-------------------------------------------+
     |      date     close       lag     returns |
     |-------------------------------------------|
  1. | 01sep2008   9210.15         .           . |
  2. | 02sep2008   9229.51   9210.15    .0020998 |
  3. | 03sep2008   9239.15   9229.51     .001044 |
  4. | 04sep2008   9239.26   9239.15    .0000118 |
  5. | 05sep2008   9342.19   9239.26     .011079 |
     |-------------------------------------------|
  6. | 08sep2008   9296.23   9342.19   -.0049318 |
  7. | 09sep2008   9279.62   9296.23   -.0017884 |
  8. | 10sep2008   9315.68   9279.62    .0038784 |
  9. | 11sep2008   9263.39   9315.68   -.0056289 |
 10. | 12sep2008   9253.92   9263.39   -.0010228 |
     +-------------------------------------------+

推荐阅读