一个量化回测程序,就是通过在历史行情数据的基础上,定义一系列的买、卖规则进行交易的模拟,以分析策略的可行性分析。
那算法交易从何开始呢?
算法交易的基础,就是需要寻找经济上或者纯粹统计上的关系。这时候,需要一个平台提供完备的数据集,包括交易行情数据,基本面数据,宏观数据,甚至其实更多的另类因子等。
在quantopian平台,quantopian.research这个包提供了相关的研究函数,可以方便查看数据。quantopian提供了方便的notebook环境。
from quantopian.research import prices, symbols
import pandas as pd
aapl_close = prices(
assets=symbols('AAPL',),
start='2016-01-01',
end='2018-01-01',
)
#这里得到一个 苹果 公司2016年至2018年的收盘价,数据结构为pandas的Series
aapl_sma20 = aapl_close.rolling(20).mean()
aapl_sma50 = aapl_close.rolling(50).mean()
#得到两条均线
pd.DataFrame({
'AAPL': aapl_close,
'SMA20': aapl_sma20,
'SMA50': aapl_sma50
}).plot(
title='appl close and sma'
);
#组合到一个Dataframe里并使用plot绘图
接下来,我们查看一下苹果股价的2017年的收益率:
# 导入quantopian包
from quantopian.research import returns, symbols
# 选择2017年
period_start = '2017-01-01'
period_end = '2017-12-31'
#查询这段时间的收益率
aapl_returns = returns(
assets=symbols('AAPL'),
start=period_start,
end=period_end,
)
# 显示最前面10条记录
print(type(aapl_returns))
aapl_returns.head(10)
结果如下:
<class 'pandas.core.series.Series'>
Out[9]:
2017-01-03 00:00:00+00:00 0.002588 2017-01-04 00:00:00+00:00 -0.001032 2017-01-05 00:00:00+00:00 0.005088 2017-01-06 00:00:00+00:00 0.011145 2017-01-09 00:00:00+00:00 0.009246 2017-01-10 00:00:00+00:00 0.000922 2017-01-11 00:00:00+00:00 0.005289 2017-01-12 00:00:00+00:00 -0.004090 2017-01-13 00:00:00+00:00 -0.001764 2017-01-17 00:00:00+00:00 0.007981 Freq: C, Name: Equity(24 [AAPL]), dtype: float64
当然除了行情数据之外,quantopian还集成了很多其他的数据集,包括财报基本面,股票的情绪数据,宏观指标数据等等。一个比较有意思的数据集是twitter的股票情绪数据集。
可以通过pipline一次读取多种数据来源,然后按symbol筛选出来。
# 导入Pipeline
from quantopian.research import run_pipeline
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import Returns
from quantopian.pipeline.data.psychsignal import stocktwits
# Pipeline定义
def make_pipeline():
returns = Returns(window_length=2)
sentiment = stocktwits.bull_minus_bear.latest
msg_volume = stocktwits.total_scanned_messages.latest
return Pipeline(
columns={
'daily_returns': returns,
'sentiment': sentiment,
'msg_volume': msg_volume,
},
)
# 执行Pipeline
data_output = run_pipeline(
make_pipeline(),
start_date=period_start,
end_date=period_end
)
#data_output是一个Dataframe
print(data_output.head(10))
# 过滤结果
aapl_output = data_output.xs(
symbols('AAPL'),
level=1
)
print(aapl_output.head(10))
# 结果绘图
aapl_output.plot(subplots=True);
daily_returns msg_volume 2014-01-02 00:00:00+00:00 Equity(2 [ARNC]) 0.009497 6.0 Equity(21 [AAME]) 0.053846 1.0 Equity(24 [AAPL]) 0.012011 203.0 Equity(25 [ARNC_PR]) NaN NaN Equity(31 [ABAX]) -0.002990 1.0 Equity(39 [DDC]) 0.015570 NaN Equity(41 [ARCB]) -0.004728 NaN Equity(52 [ABM]) -0.007636 1.0 Equity(53 [ABMD]) -0.027303 1.0 Equity(62 [ABT]) -0.001562 1.0 sentiment 2014-01-02 00:00:00+00:00 Equity(2 [ARNC]) 0.00 Equity(21 [AAME]) 0.00 Equity(24 [AAPL]) -0.82 Equity(25 [ARNC_PR]) NaN Equity(31 [ABAX]) -2.22 Equity(39 [DDC]) NaN Equity(41 [ARCB]) NaN Equity(52 [ABM]) 1.90 Equity(53 [ABMD]) 0.00 Equity(62 [ABT]) 0.00 daily_returns msg_volume sentiment 2014-01-02 00:00:00+00:00 0.012011 203.0 -0.82 2014-01-03 00:00:00+00:00 -0.014131 1481.0 -0.04 2014-01-06 00:00:00+00:00 -0.022034 432.0 -0.10 2014-01-07 00:00:00+00:00 0.005377 2249.0 -0.05 2014-01-08 00:00:00+00:00 -0.007205 1835.0 -0.13 2014-01-09 00:00:00+00:00 0.006407 1227.0 -0.05 2014-01-10 00:00:00+00:00 -0.012861 1792.0 -0.26 2014-01-13 00:00:00+00:00 -0.006673 440.0 -0.11 2014-01-14 00:00:00+00:00 0.005048 1731.0 -0.17 2014-01-15 00:00:00+00:00 0.020127 1460.0 0.09
绘制的子图结果如下,把三个序列分开,但绘制在同一个图中:
在选股环节,对一堆股票做截面分析并排序打分是非常重要的,这时pipeline就很有用了。
# 导入Pipeline与数据集
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data import USEquityPricing
from quantopian.pipeline.data.psychsignal import stocktwits
# SMA指标计算
from quantopian.pipeline.factors import SimpleMovingAverage
# 内置的股票空间,这里是流动性强的
from quantopian.pipeline.filters import QTradableStocksUS
def make_pipeline():
# 流动性强的股票集
base_universe = QTradableStocksUS()
# 最近的收盘价
close_price = USEquityPricing.close.latest
# 牛熊得分3天的简单滑动平均
sentiment_score = SimpleMovingAverage(
inputs=[stocktwits.bull_minus_bear],
window_length=3,
)
#返回Pipeline
return Pipeline(
columns={
'close_price': close_price,
'sentiment_score': sentiment_score,
},
screen=base_universe
)
# 导入run_pipeline
from quantopian.research import run_pipeline
# 执行pipeline
pipeline_output = run_pipeline(
make_pipeline(),
start_date='2013-01-01',
end_date='2013-12-31'
)
# 数据呈现
pipeline_output.tail(10)
这样就得到在可流动的股票集合里,2013年最后一天的收盘价,情绪得分的3天SMA的数据:
close_price | sentiment_score | ||
---|---|---|---|
2013-12-31 00:00:00+00:00 | Equity(43721 [SCTY]) | 57.32 | -0.176667 |
Equity(43919 [LMCA]) | 146.22 | 0.000000 | |
Equity(43981 [NCLH]) | 35.25 | -0.700000 | |
Equity(44053 [TPH]) | 19.33 | 0.333333 | |
Equity(44060 [ZTS]) | 32.68 | 0.000000 | |
Equity(44089 [BCC]) | 29.66 | 1.000000 | |
Equity(44102 [XONE]) | 60.50 | 0.396667 | |
Equity(44158 [XOOM]) | 27.31 | -0.160000 | |
Equity(44249 [APAM]) | 64.53 | 0.000000 | |
Equity(44270 [SSNI]) | 21.05 | 0.423333 |
联系客服