美股量化交易 - pipeline 使用

2018-10-22 14:15:24 +08:00
 investguider

摘要: 最近在开始学习美股量化交易, 本篇着重介绍一下 pipeline 的使用; 如果你对量化交易感兴趣, 可以点击 [原文] 查看更多内容。

策略思路

运行环境

本代码运行 老虎证券 pc 端 量化交易环境, 运行前 可以注册老虎证券 使用模拟账号 进行运行量化代码。

代码

import pandas as pd
from tquant.pipeline import Pipeline
from tquant.pipeline.data import Fundamentals, USEquityPricing


# 策略初始化方法, 只在开始执行回测时运行一次
def initialize(context):
    print('初始化策略')
    # 使用 标普 500 ETF 作为策略基准
    set_benchmark(symbol('SPY'))
    # 设置策略的佣金规则:每股 0.01 美元, 最低 1 美元
    set_commission(commission.PerShare(cost=0.01, min_trade_cost=1))
    # 定义两个时区
    context.remote_time_zone = 'US/Eastern'
    context.local_time_zome = 'Asia/Chongqing'
    # 定时运行方法:
    # 设置『 month_start 』这个方法在每个月初的第一个交易日开盘时执行一次。
    schedule_function(month_start,
                    date_rule=date_rules.month_start(),
                    time_rule=time_rules.market_open())

    # 初始化 pipeline 对象
    pipe = Pipeline()
    # 向 pipeline 对象中添加两列数据:收盘价和总股本
    pipe.add(USEquityPricing.close.latest, 'close')
    pipe.add(Fundamentals.shares.latest, 'shares')
    # 添加一个筛选器:使用成交量最大的 200 只股票
    screener = (USEquityPricing.volume.latest.top(200))
    pipe.set_screen(screener)
    # 注册 pipeline 对象
    attach_pipeline(pipe, 'universe')


# 实现之前定义的 month_start 方法
def month_start(context, data):
    # 获取 pipeline 的数据,
    # universe 是一个 dataframe,index 是股票池,column 是数据列
    # index 每次计算时,交易量最大的 200 只股票
    universe = pipeline_output('universe')
    # 计算市值,市值=总股本*收盘价
    universe['market_cap'] = universe['close'] * universe['shares']
    # 去除其中收盘价小于 5 的股票, 并取市值最小的 10 只股票
    target_stock = universe[universe['close']>5].sort_values('market_cap', ascending=True)    ['market_cap'][:10]
    # 计算股票的目标调仓权重
    target_weight = target_stock/target_stock.sum()
    # 打印结果
    print('当前的日期是:', context.get_datetime(context.local_time_zome))
    print('目标调仓权重为:', target_weight)
    # 调仓
    reblance(context, target_weight)


def reblance(context, target_weight):
    # 取当前持仓的所有股票
    current_position = context.portfolio.positions.keys()
    # 计算当前持仓的股票与目标调仓股票的差集
    sell = set(current_position) - set(target_weight.index)
    # 卖出不在目标调仓中的股票
    for code in sell:
        order_target_percent(code, 0)

    # 按照目标权重, 使用市价单下单
    for code in target_weight.keys():
        order_target_percent(code, target_weight[code])
    log.info('调仓完成')

运行结果如下:

仓位调动日志明细

初始化策略
当前的日期是: 2018-01-03 05:00:00+08:00
目标调仓权重为: Equity(3407 [HMNY]) 0.000142
Equity(8742 [UNG]) 0.035254
Equity(10314 [RIOT]) 0.076770
Equity(5626 [PGNX]) 0.099965
Equity(7738 [WATT]) 0.103301
Equity(2948 [GCAP]) 0.107777
Equity(2848 [FTR]) 0.126808
Equity(8262 [ATRA]) 0.132405
Equity(4587 [MDR]) 0.148945
Equity(3778 [INSY]) 0.168632
Name: market_cap, dtype: float64
2018-01-02 16:00:00 reblance:72 INFO 调仓完成
当前的日期是: 2018-02-02 05:00:00+028:00
目标调仓权重为: Equity(8282 [BLCM]) 0.014110
Equity(8742 [UNG]) 0.042728
Equity(4587 [MDR]) 0.058059
Equity(3728 [IMGN]) 0.084797
Equity(235 [AKS]) 0.111286
Equity(2507 [EXTR]) 0.119066
Equity(3141 [GPOR]) 0.130049
Equity(1338 [CLF]) 0.141863
Equity(8743 [USO]) 0.146597
Equity(1761 [DBC]) 0.151445
Name: market_cap, dtype: float64
2018-02-01 16:00:00 reblance:72 INFO 调仓完成
当前的日期是: 2018-03-02 05:00:00+08:00
目标调仓权重为: Equity(5640 [PHH]) 0.029012
Equity(2100 [ECYT]) 0.033073
Equity(2848 [FTR]) 0.046434
Equity(1720 [CYH]) 0.048309
Equity(2266 [ENDP]) 0.118623
Equity(4763 [MNK]) 0.121333
Equity(3506 [HTZ]) 0.128298
Equity(235 [AKS]) 0.137047
Equity(8743 [USO]) 0.165894
Equity(5000 [NBR]) 0.171978
Name: market_cap, dtype: float64
2018-03-01 16:00:00 reblance:72 INFO 调仓完成
当前的日期是: 2018-04-03 04:00:00+08:00
目标调仓权重为: Equity(4587 [MDR]) 0.034007
Equity(788 [BKD]) 0.073548
Equity(3086 [GME]) 0.075315
Equity(10703 [DBX]) 0.098588
Equity(83 [ACXM]) 0.104958
Equity(2623 [FFBC]) 0.108441
Equity(1338 [CLF]) 0.121434
Equity(8743 [USO]) 0.122429
Equity(5000 [NBR]) 0.129578
Equity(7961 [XOP]) 0.131701
Name: market_cap, dtype: float64
2018-04-02 16:00:00 reblance:72 INFO 调仓完成
当前的日期是: 2018-05-02 04:00:00+08:00
目标调仓权重为: Equity(4587 [MDR]) 0.030825
Equity(8496 [FIT]) 0.057020
Equity(7852 [WPG]) 0.058974
Equity(5460 [P]) 0.070114
Equity(8743 [USO]) 0.107669
Equity(1338 [CLF]) 0.108268
Equity(2384 [ESV]) 0.121031
Equity(7961 [XOP]) 0.133455
Equity(6060 [RDN]) 0.151056
Equity(9671 [UAA]) 0.161588
Name: market_cap, dtype: float64
2018-05-01 16:00:00 reblance:72 INFO 调仓完成
当前的日期是: 2018-06-02 04:00:00+08:00
目标调仓权重为: Equity(8322 [VKTX]) 0.021032
Equity(8743 [USO]) 0.077514
Equity(6481 [SFUN]) 0.093043
Equity(1338 [CLF]) 0.104112
Equity(3062 [GLNG]) 0.108587
Equity(5000 [NBR]) 0.108815
Equity(2384 [ESV]) 0.117255
Equity(1886 [DKS]) 0.117884
Equity(1349 [CLNY]) 0.120782
Equity(7961 [XOP]) 0.130976
Name: market_cap, dtype: float64
2018-06-01 16:00:00 reblance:72 INFO 调仓完成
1790 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/499839

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX