一个量化回测程序,就是通过在历史行情数据的基础上,定义一系列的买、卖规则进行交易的模拟,以分析策略的可行性分析。 那算法交易从何开始呢? 算法交易的基础,就是需要寻找经济上或者纯粹统计上的关系。这时候,需要一个平台提供完备的数据集,包括交易行情数据,基本面数据,宏观数据,甚至其实更多的另类因子等。 在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的数据:
|
|