概述
时间序列分析 (time series analysis) 是量化投资中的一门基本技术. 时间序列是指在一定时间内按时间顺序测量的某个变量的取值序列. 时间序列分析就是使用统计的手段对这个序列的过去进行分析. 以此对该变量的变化特征性建模, 并对未来进行预测.
平台
我们将继续使用 RiceQuant 的投资研究平台进行分析.
网址:https://www.ricequant.com/quant/notebook
具体的平台介绍可以参考: https://iamarookie.blog.csdn.net/article/details/114958524
没有看过的同学可以自行翻一下专栏别的文章:
https://blog.csdn.net/weixin_46274168/category_10961128.html
获取股票数据
需求
- 沪深300 (选10只)
- 分析区间 2019-01-01 到 2021-01-01
- 以时间为索引
- 绘制各个指标的走势情况
函数
index_components - 获取指数成分股列表
获取每一指数的股票构成列表, 也支持指数的历史构成查询。
index_components(order_book_id, date=None, start_date, end_date, market='cn')
参数:
参数 | 类型 | 说明 |
---|---|---|
order_book_id | str | 指数代码,传入 order_book_id,例如’000001.XSHG’。 |
date | str, datetime.date, datetime.datetime, pandas Timestamp | 查询日期,默认为最新记录日期 |
start_date | str, datetime.date, datetime.datetime, pandas Timestamp | 指定开始日期,不能和 date 同时指定 |
end_date | str, datetime.date, datetime.datetime, pandas Timestamp | 指定结束日期, 需和 start_date 同时指定并且应当不小于开始日期 |
market | str | 默认是中国市场(‘cn’),目前仅支持中国市场 |
返回:
构成该指数股票的 order_book_id list
get_price - 合约历史数据
获取指定合约或合约列表的历史行情(包含起止日期,日线或分钟线),不能在’handle_bar’函数中进行调用。
get_price(order_book_ids, start_date, end_date=None, frequency='1d', fields=None, adjust_type='pre', skip_suspended=False,expect_df=False)
参数:
参数 | 类型 | 说明 |
---|---|---|
order_book_ids | str OR str list | 合约代码,合约代码,可传入 order_book_id, order_book_id list |
start_date | str, datetime.date, datetime.datetime, pandasTimestamp | 开始日期,用户必须指定 |
end_date | str, datetime.date, datetime.datetime, pandasTimestamp | 结束日期,默认为策略当前日期前一天 |
frequency | str | 历史数据的频率。 现在支持日/分钟级别的历史数据,默认为’1d’。使用者可自由选取不同频率,例如’5m’代表 5 分钟线 |
fields | str OR str list | 返回字段名称 |
adjust_type | str | 权息修复方案。前复权 - pre,后复权 - post,不复权 - none。 |
skip_suspended | bool | 是否跳过停牌数据。默认为 False,不跳过,用停牌前数据进行补齐。True 则为跳过停牌期。注意,当设置为 True 时,函数 order_book_id 只支持单个合约传入 |
expect_df | bool | 默认返回原有的 Panel 数据结构。如果调为真,则返回 pandas dataframe |
代码
# 定义分析时间段
start_date = "2019-01-01" # 开始日期
end_date = "2021-01-01" # 结束日期
# 获取沪深300股票
stock_list = index_components("000300.XSHG")
# 取前10个
stock_list = stock_list[:10] # 切片
print(stock_list) # 调试输出
# 获取价格数据 (收盘价)
data = get_price(stock_list, start_date=start_date, end_date=end_date,fields="close")
print(data.head()) # 调试输出
# 绘制各个指标的走势情况
data.plot(figsize=(10, 12), subplots=True) # 子图
data.plot(figsize=(16, 12))
输出结果:
data.plot(figsize=(16, 12))
['601390.XSHG', '002958.XSHE', '300142.XSHE', '601788.XSHG', '600999.XSHG', '002179.XSHE', '002508.XSHE', '600031.XSHG', '002032.XSHE', '002456.XSHE']
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 25.9121 6.5340 19.0277 8.6610 7.7510
2019-01-03 26.2175 6.5815 18.9417 8.8392 7.6355
2019-01-04 26.3474 6.6671 19.4771 9.6410 7.7703
2019-01-07 27.3860 6.6956 19.6684 9.5915 7.8377
2019-01-08 27.4013 6.7052 19.7066 9.5816 7.7991
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 10.7152 NaN 50.1480 18.4021 9.1656
2019-01-03 10.8199 NaN 46.3313 17.8929 8.6963
2019-01-04 11.5364 NaN 48.2589 18.0527 8.8960
2019-01-07 11.3914 NaN 49.2035 18.6118 9.0158
2019-01-08 11.2787 NaN 49.1553 18.5819 9.0857
统计分析
需求
- 数据中各项指标统计结果 (保留两位小数)
- 使用 aggregate 方法将多种统计指标汇总
函数
aggregate:使用指定 axis 上的一个或多个操作聚合.
DataFrame.aggregate(func, axis=0, *args, **kwargs)
代码
print(data.info())
print(data.describe().round(2))
# 调试输出平均数
print(data.mean())
# 汇总
print(data.aggregate([min, max, np.mean, np.std, np.median]))
输出结果:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 487 entries, 2019-01-02 to 2020-12-31
Data columns (total 10 columns):
002179.XSHE 487 non-null float64
601390.XSHG 487 non-null float64
002508.XSHE 487 non-null float64
601788.XSHG 487 non-null float64
600031.XSHG 487 non-null float64
600999.XSHG 487 non-null float64
002958.XSHE 433 non-null float64
002032.XSHE 487 non-null float64
300142.XSHE 487 non-null float64
002456.XSHE 487 non-null float64
dtypes: float64(10)
memory usage: 41.9 KB
None
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
count 487.00 487.00 487.00 487.00 487.00
mean 39.81 5.82 30.88 14.13 17.15
std 9.31 0.56 5.64 4.64 6.00
min 25.91 4.85 18.94 8.66 7.64
25% 33.68 5.43 26.29 11.11 12.71
50% 38.27 5.67 30.68 11.71 15.61
75% 42.85 6.16 33.98 17.40 20.17
max 78.29 7.27 43.99 29.99 34.98
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
count 487.00 433.00 487.00 487.00 487.00
mean 15.81 5.83 70.01 35.89 13.81
std 3.56 1.15 7.57 14.24 3.54
min 10.72 3.97 46.33 17.89 7.59
25% 13.52 5.14 66.64 27.18 11.15
50% 14.30 5.69 70.66 30.14 14.44
75% 19.94 6.26 74.21 43.49 16.06
max 24.42 9.91 85.70 91.76 23.32
002179.XSHE 39.805091
601390.XSHG 5.823683
002508.XSHE 30.882818
601788.XSHG 14.125659
600031.XSHG 17.147733
600999.XSHG 15.812086
002958.XSHE 5.828605
002032.XSHE 70.010184
300142.XSHE 35.894527
002456.XSHE 13.811878
dtype: float64
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
min 25.912100 4.852000 18.941700 8.661000 7.635500
max 78.290000 7.266300 43.990000 29.987300 34.980000
mean 39.805091 5.823683 30.882818 14.125659 17.147733
std 9.306263 0.561201 5.644749 4.639231 6.002176
median 38.274500 5.667200 30.682500 11.713300 15.610100
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
min 10.715200 3.965400 46.331300 17.892900 7.588100
max 24.422700 9.909100 85.700000 91.764200 23.318700
mean 15.812086 5.828605 70.010184 35.894527 13.811878
std 3.556864 1.147390 7.565533 14.236502 3.538181
median 14.301800 5.690000 70.660000 30.138200 14.440000
序列变化情况计算
需求
- 计算每一天各项指标的差异值(后一天减去前一天结果)
- 计算pct_change:增长率也就是 (后一个值-前一个值)/前一个值)
- 计算平均计算pct_change指标
- 绘图观察哪个指标平均增长率最高
- 计算连续时间的增长率(其中需要计算今天价格和昨天价格的差异)
- 看看各个指标最初的1块钱相当于现在的多少
函数
pd.pct_change()
表示当前元素与先前元素的相差百分比. 指定 periods=n, 表示当前元素与先前 n 个元素的相差百分比.
DataFrame.pct_change(periods=1, fill_method=‘pad’, limit=None, freq=None, **kwargs)
pd.shift()
pd.shift() : 列进行平移变换 (shift).
DataFrame.shift(periods=1, freq=None, axis=0)
代码
# 1. 计算每一天的差异值 (后一天减去前一天结果)
print(data.diff().head())
# 2. 计算增长率
pct_change = data.pct_change()
print(pct_change.head().round(2))
# 3. 计算平均增长率
pct_change_mean = data.diff().mean()
print(pct_change_mean)
# 4. 绘图观察哪个指标平均增长率最高
data.pct_change().mean().plot(kind='bar',figsize=(10,6))
# 往后挪一位
data.shift(1).head()
# 5. 计算连续时间增长率
rets = np.log(data/data.shift(1))
print(rets.head().round(2))
# 6. 看看各个指标最初的1块钱相当于现在的多少
rets.cumsum().apply(np.exp).plot(figsize = (16, 12))
输出结果:
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.3054 0.0475 -0.0860 0.1782 -0.1155
2019-01-04 0.1299 0.0856 0.5354 0.8018 0.1348
2019-01-07 1.0386 0.0285 0.1913 -0.0495 0.0674
2019-01-08 0.0153 0.0096 0.0382 -0.0099 -0.0386
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.1047 NaN -3.8167 -0.5092 -0.4693
2019-01-04 0.7165 NaN 1.9276 0.1598 0.1997
2019-01-07 -0.1450 NaN 0.9446 0.5591 0.1198
2019-01-08 -0.1127 NaN -0.0482 -0.0299 0.0699
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 0.01 -0.00 0.02 -0.01
2019-01-04 0.00 0.01 0.03 0.09 0.02
2019-01-07 0.04 0.00 0.01 -0.01 0.01
2019-01-08 0.00 0.00 0.00 -0.00 -0.00
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 NaN -0.08 -0.03 -0.05
2019-01-04 0.07 NaN 0.04 0.01 0.02
2019-01-07 -0.01 NaN 0.02 0.03 0.01
2019-01-08 -0.01 NaN -0.00 -0.00 0.01
002179.XSHE 0.107773
601390.XSHG -0.002601
002508.XSHE 0.044758
601788.XSHG 0.020286
600031.XSHG 0.056027
600999.XSHG 0.025977
002958.XSHE -0.000729
002032.XSHE 0.057288
300142.XSHE 0.041477
002456.XSHE 0.008260
dtype: float64
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 0.01 -0.00 0.02 -0.02
2019-01-04 0.00 0.01 0.03 0.09 0.02
2019-01-07 0.04 0.00 0.01 -0.01 0.01
2019-01-08 0.00 0.00 0.00 -0.00 -0.00
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 NaN -0.08 -0.03 -0.05
2019-01-04 0.06 NaN 0.04 0.01 0.02
2019-01-07 -0.01 NaN 0.02 0.03 0.01
2019-01-08 -0.01 NaN -0.00 -0.00 0.01
转载:https://blog.csdn.net/weixin_46274168/article/details/115558690
查看评论