分享

美股回测入门-基于quantopian(一):数据探索

 AI量化实验室 2023-10-12 发布于北京

一个量化回测程序,就是通过在历史行情数据的基础上,定义一系列的买、卖规则进行交易的模拟,以分析策略的可行性分析。

那算法交易从何开始呢?

算法交易的基础,就是需要寻找经济上或者纯粹统计上的关系。这时候,需要一个平台提供完备的数据集,包括交易行情数据,基本面数据,宏观数据,甚至其实更多的另类因子等。

在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_pricesentiment_score
2013-12-31 00:00:00+00:00Equity(43721 [SCTY])57.32-0.176667
Equity(43919 [LMCA])146.220.000000
Equity(43981 [NCLH])35.25-0.700000
Equity(44053 [TPH])19.330.333333
Equity(44060 [ZTS])32.680.000000
Equity(44089 [BCC])29.661.000000
Equity(44102 [XONE])60.500.396667
Equity(44158 [XOOM])27.31-0.160000
Equity(44249 [APAM])64.530.000000
Equity(44270 [SSNI])21.050.423333

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多