一.什么是特征工程?
什么是特征?比如你要预估房价,那么与房价的相关因素,比如面积大小,地理位置,周边环境等就是决定房价的相关因素,这些就是特征。特征处理在机器学习处理中尤为重要,如果你的特征与要预测的目标之间毫无关联或者关联甚少,则后续如何处理都得不到满意的结论。比如你要预测房价,特征却是从天气信息,娱乐八卦,星象相术等数据处理而来,当然是南辕北辙。
在算法交易中,交易策略由信号驱动,这些信息指示何时买入或卖出资产,以获得相对于基准(如指数,国债)更高的回报。在金融领域,由市场因素带来的回报率称为贝塔,高于市场回报的部分称为阿尔法。比如上证指数一年上涨6%,而算法交易获得20%回报,则阿尔法值为14%。贝塔的意思就是我买入被动型的指数基金(比如上证指数ETF),涨跌全看市场大环境,风险小,但收益也小。阿尔法就是我不满足于指数的涨跌回报,通过在交易中关于对买卖时机的把握和持有头寸选择的技巧,自由买卖股票,来获得超越指数的收益。
如何获得超额收益呢? 有两类阿尔法模型: 理论驱动型和数据驱动型。
理论驱动型:通过观察市场行为,寻找可能用来解释这些行为的普适性理论,再依据市场数据来检验该理论是否可以有效解释市场行为。
数据驱动型:通过合理使用正确的技术性手段,人们可以识别出隐藏在数据中的模式或规律。
二. Alpha因子
阿尔法因子是对原始数据的转换,旨在预测资产价格走势。它使用简单的算术转换,例如变量随时间的绝对或相对变化,数据之间的比率或时间窗口内的聚合,如简单或指数移动平均线。还包括从价格和交易量模式的技术分析中出现的指标,例如相对强弱指数以及基本面分析中的众多指标。下面简单回顾下金融研究和交易应用中的几个关键因素类别:
2.1 基于价格数据的交易策略
通常分为以下两种现象:1.已有的趋势是否会延续;2.目前的趋势是否会反转。 前者称为趋势跟随策略或动量策略,后者称为反趋势策略或均值回复策略。
趋势跟随通俗来说就是在涨的股票后续会继续上涨,延续其上涨趋势。通常的打板策略或龙头战法,就是跟随其上涨趋势。
反趋势策略通俗来说就是下跌到一定程度,已经严重低估了,会出现超跌反弹,获取反弹收益。
2.2 依托基本面数据的策略
通常所说的价值投资,通过基本面数据与资产价格的比率,如市盈率,市净率等,或者每年收益率增长,产品是否有竞争力等因素来衡量公司的股票价值是否被低估。
以下是talib库中的因子分类:
三.实践:基于Talib获取因子
TA-Lib是一个用c++编写的开源库,带有Python接口,被算法交易开发人员广泛使用。它包含200多个常用技术分析指标的标准化实施;也就是说,这些指标只使用市场数据,即价格和交易量信息。
TA-Lib与pandas和NumPy兼容,使其使用非常简单。下面我们使用talib在之前获取的股票数据上计算出相关的因子。
1.安装talib库
#安装talib库()
pip install TA-Lib
windows下需要下载源码进行编译;
2.导入库,封装函数接口
import talib
#调用talib的相关接口,传入data的相关数据和时间周期
def ADX(data):
return talib.ADX(data.high, data.low, data.close, timeperiod=14)
def ADRX(data):
return talib.ADXR(data.high, data.low, data.close, timeperiod=14)
def APO(data):
return talib.APO(data.close, fastperiod=12, slowperiod=26, matype=0)
...
3.使用groupby,以股票代码为key进行分组,然后apply应用上述函数,即可计算出相关指标
#data为之前从tushare读取的股票DataFrame
# 索引先排序
data = data.sort_index()
data['RSI'] = data.groupby(level='ts_code', group_keys=False).apply(RSI)
data['ADX'] = data.groupby(level='ts_code', group_keys=False).apply(ADX)
data['APO'] = data.groupby(level='ts_code', group_keys=False).apply(APO)
#... 还有其他特征不一一列举;按照上述方式调用talib接口生成即可
print(data.info())
处理后结果如下:
#结果显示如下:
[56924 rows x 37 columns]
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 56934 entries, ('600010.SH', Timestamp('2017-10-09 00:00:00')) to ('603799.SH', Timestamp('2023-09-28 00:00:00'))
Data columns (total 37 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 open 56714 non-null float64
1 high 56714 non-null float64
2 low 56714 non-null float64
3 close 56714 non-null float64
4 pre_close 56714 non-null float64
5 change 56714 non-null float64
6 pct_chg 56714 non-null float64
7 volume 56714 non-null float64
8 amount 56714 non-null float64
9 adj_factor 56714 non-null float64
10 0 220 non-null object
11 r01 56895 non-null float64
12 r05 56739 non-null float64
13 r21 56115 non-null float64
14 r01_fwd 56895 non-null float64
15 r05_fwd 56739 non-null float64
16 r21_fwd 56115 non-null float64
17 RSI 56168 non-null float64
18 ADX 55661 non-null float64
19 APO 55739 non-null float64
20 BOP 56714 non-null float64
21 CCI 56207 non-null float64
22 CMO 56168 non-null float64
23 DX 56168 non-null float64
24 MACD 55427 non-null float64
25 MFI 56388 non-null float64
26 PPO 55739 non-null float64
27 ROC 56324 non-null float64
28 WILLR 56207 non-null float64
29 AD 56934 non-null float64
30 ATR 56168 non-null float64
31 NATR 56168 non-null float64
32 AVGPRICE 56714 non-null float64
33 DEMA 54452 non-null float64
34 EMA 55583 non-null float64
35 MA 55583 non-null float64
36 WMA 55583 non-null float64
dtypes: float64(36), object(1)
memory usage: 16.3+ MB
部分数据如下所示:
共计算出二十个特征列,后续基于这些特征,结合机器学习模型进行预测。