zoukankan      html  css  js  c++  java
  • 【Python量化投资】基于技术分析研究股票市场

    金融专业人士以及对金融感兴趣的业余人士感兴趣的一类就是历史价格进行的技术分析。维基百科中定义如下,金融学中,技术分析是通过对过去市场数据(主要是价格和成交量)的研究预测价格方向的证券分析方法。

    下面,我们着重对事后验证过去市场数据的研究,而不是过多低关注对未来股价变动的预测。我们选取的研究目标是标准普尔(S&P)500指数,这是美国股票市场有代表性的指标,包括了许多著名公司的股票,代表着高额的市场资本,而且,该指数也具有高流动性的期货和期权市场。

    我们将从Web数据来源读取历史指数水平信息,并未一个基于趋势信号的交易系统实现简单的事后验证。但是,首先需要数据才能开始工资,这里我们主要靠pandas库,因为NumPy库比较常用,所以还是把该库导入。

    (PS:除NumPy和SciPy,pandas也是Python的重要库之一)

    这里DataReader函数来自pandas.io.data,可以用来从不同数据来源,尤其是雅虎财经网站上获取金融数据。

    这里我们读取了从2000年的第一个交易日到结束日期的S&P500指数事件序列数据,而且自动地用TimeStamp对象生成一个时间索引。

    收盘价的时间序列图如下:

    所以先在pandas DataFrame对象上添加一个新列,用于两个趋势之间的差值。

    此处的趋势策略是基于两个月(42个交易日)和一年(252个交易日)的趋势(也就是两种期间指数水平的移动平均数)。Pandas可以高效地生成各个时间序列。

    首先先生成趋势数据:

    现在数据已经已经完整,开始设计一条规则来生成趋势信号。规则如下:

    买入信号(多头):

    42天趋势第一次高于252天趋势SD点。

    等待(持币):

    42天趋势在252天趋势的+/-SD点范围内。

    卖出信号(空头):

    42天信号第一次低于252天趋势SD点。

    Pandas数值运算通常以向量方式进行,这样可以取两列的全部差值:

    在最后一个可用交易日上,42日趋势线远远高于252趋势线。尽管两个趋势列中的项目数量不相等,pandas通过在相应的指数位置放入NaN处理这种情况:

    现在生成我们的投资机制,此处假定信号阈值为50:

    即在1489个交易日中,42日趋势线高于252日趋势线SD个点以上,1232个交易日中,42日趋势线低于252日趋势线SD个点以上。所以,如果短期趋势线与长期趋势线交叉,它很可能在持续一段时间,即所谓的投资机制。图形如下:

    至此,测试基于信号投资策略所需的数据都已准备就绪。为简化,假定投资者可以直接投资于指数或者直接做空指数,现实中要通过指数基金、交易所交易基金或者指数期货完成。这也会造成一些交易成本。因为不打算频繁交易,所以此处忽略交易成本。

    根据投资机制,投资者可以选择做空、做多市场指数,或者持币观望。这种简化策略使我们只注意市场收益。当投资者做多时形成市场收益(1),做空时形成负的市场收益(-1),持币时不行成任何市场收益(0)。所以,需要先计算对数收益率。其中,shift方法按照所需指数输入项数量移动时间序列----这里,每移动一个交易日,就能得到每日的对数收益率:

    而基于趋势的投资策略的收益,将Regime列乘以下一天的Returns列(用“昨天”的头寸得出今天的收益):

    所以比较指数累计持续收益和我们所用策略的累积持续收益即可:

  • 相关阅读:
    [Spring开发]获取上下文对象
    [Dubbo开发]Dubbo日志插件实现(打包)
    [Dubbo开发]Dubbo日志插件实现(未打包)
    [Java开发]打印当前路径到控制台
    [Dubbo开发]Dubbo拦截器(Filter)初探
    [Dubbo开发]配置简单的生产者和消费者
    [Dubbo开发]Zookeeper配置
    [Dubbo开发]Maven安装与配置
    EL表达式的特性
    oracle中rownum的使用
  • 原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9951786.html
Copyright © 2011-2022 走看看