V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
LittleUqeer
V2EX  ›  Python

『Python 金融应用』技术分析入门

  •  
  •   LittleUqeer · 2016-12-23 12:25:59 +08:00 · 3632 次点击
    这是一个创建于 2897 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文将演示如何通过程序去实现常见的技术指标。


    技术分析是指以市场行为为研究对象,以判断市场趋势并跟随趋势的周期性变化来进行股票及其他金融衍生物交易决策的方法的总和。技术分析认为市场行为包容消化一切信息、价格以趋势方式波动、历史会重演,常用的有 MACD 、 BOLL 、 RSI 等。


    下面举个简单的栗子,双均线。技术分析中通常会用一条近期的移动平均线和远期移动平均线的相对价格趋势来体现股票近期的价格趋势。

    例如当近期均线由下向上突破远期均线时(金叉),通常代表股票近期较为强势可以作为买入信号。

    相反当近期均线由上向下击穿远期均线时(死叉),通常代表股票近期较为疲软作为卖出信号。

    接下来在看如何通过程序去实现这个简单的逻辑(选用 5 个交易日的平均价作为近日均线、选用 60 个交易日的平均价作为远期均线)


    首先确定一下策略的回测时间(想看策略在哪一阶段的表现)
    start = '2012-05-28' #回测开始时间
    end = '2016-08-08' # 回测结束时间

    然后确定策略选股的股票池及标的(策略适用于哪些股票,想看策略相对谁的表现情况)
    secID = '601318.XSHG' #中国平安
    benchmark = secID # 策略对标标的(这里选取的是中国平安)
    universe = [secID] # 股票池,支持股票和基金 (选取的是中国平安)

    其他需要的信息(策略的起始资金、按天进行判断还在用分钟线进行判断、策略调仓频率)
    capital_base = 100000 #起始资金
    freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
    refresh_rate = 1 # 调仓频率,表示执行 handle_data 的时间间隔,若 freq = 'd'时间间隔的单位为交易日,若 freq = 'm'时间间隔为分钟
    max_history_window = 100 #设定调取历史价格区间最大为 100 个交易日
    def initialize(account): # 初始化虚拟账户状态,类似于去券商开户
    pass

    策略逻辑部分


    局部变量定义:
    def handle_data(account): # 每个交易日的买入卖出指令
    hist1 = account.get_attribute_history('closePrice', 5) #获取过去 5 个交易日的收盘价
    hist2 = account.get_attribute_history('closePrice', 60) #获取过去 60 个交易日的收盘价
    for s in account.universe: #所有股票池中的股票
    MA5 = hist1[s].mean()
    MA60 = hist2[s].mean() #计算过去 5 个交易日及过去 60 个交易日的均价, mean ()是 python 自带的计算平均值的函数

    买入判断:
    if MA5 > MA60 and s not in account.security_position: #“金叉”而且当前持仓中没有持有要买入的股票时买入
    amount = int(account.cash / account.referencePrice[s] / 100) * 100
    order(s, amount) #为了让买入的数量是整数(现金 /要买入上一个交易日的价格)

    卖出判断:
    elif MA5 < MA60 and s in account.security_position: #“死叉”时而且所卖证券在持仓中时卖出
    order_to(s, 0)

    接着就可以看到策略在历史区间的表现

    年化收益率 16.4% 基准年化收益率 13.7% 阿尔法 7% 贝塔 0.59 夏普比率 0.49 收益波动率 26.7% 信息比率 -0.01 最大回撤 18.9% 换手率 14.43

    不管收益如何,但看胜率的话比抛硬币强~~~

    7 条回复    2016-12-23 15:36:58 +08:00
    mushroom8201
        1
    mushroom8201  
       2016-12-23 12:56:53 +08:00
    这个是 python 几?
    LittleUqeer
        2
    LittleUqeer  
    OP
       2016-12-23 13:03:36 +08:00
    @mushroom8201 应该是 python 2.7 ,我在一个叫优矿的量化平台上做的 https://uqer.io/community/list
    mushroom8201
        3
    mushroom8201  
       2016-12-23 13:11:46 +08:00
    不错不错,看明白啥是技术分析了。感谢支持,自己对金融这块感兴趣,业余学习下
    lixuda
        4
    lixuda  
       2016-12-23 13:24:00 +08:00
    天天软文
    LittleUqeer
        5
    LittleUqeer  
    OP
       2016-12-23 13:36:47 +08:00
    @lixuda 爬数据的 tushare ,做交易的 vn.py 都是 python 写的,跟大家分享下使用心得。
    lixuda
        6
    lixuda  
       2016-12-23 14:30:42 +08:00
    @LittleUqeer 文章里面哪里是用了你说的那 2 个
    LittleUqeer
        7
    LittleUqeer  
    OP
       2016-12-23 15:36:58 +08:00
    @lixuda 我也没说文章中用了,贴了我自己用过的 python 工具。您有想法,咱们可以多交流。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1046 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:42 · PVG 05:42 · LAX 13:42 · JFK 16:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.