返回介绍

第一部分 新手入门

第二部分 股票量化相关

第三部分 基金、利率互换、固定收益类

第四部分 衍生品相关

最经典的Momentum和Contrarian在中国市场的测试

发布于 2022-02-20 22:26:16 字数 5284 浏览 775 评论 0 收藏 0

Momentum

策略思路

  • Momentum:业绩好的股票会继续保持其上涨的势头,业绩差的股票会保持其下跌的势头

策略实现

  • Momentum:每次调仓将股票按照前一段时间的累计收益率排序并分组,买入历史累计收益 最高 的那一组
start = datetime(2011, 1, 1)                # 回测起始时间
end   = datetime(2014, 8, 1)                # 回测结束时间
benchmark = 'HS300'                            # 使用沪深 300 作为参考标准
universe = set_universe('SH50')             # 股票池,上证50
capital_base = 100000                       # 起始资金
refresh_rate = 10
window = 20

def initialize(account):                    # 初始化虚拟账户状态
    account.amount = 300
    account.universe = universe
    add_history('hist', window)

def handle_data(account, data):                # 每个交易日的买入卖出指令
    momentum = {'symbol':[], 'c_ret':[]}
    for stk in account.hist:
        if 'closePrice' in account.hist[stk].columns:
            momentum['symbol'].append(stk)
            momentum['c_ret'].append(account.hist[stk].iloc[window-1,:]['closePrice']/account.hist[stk].iloc[0,:]['closePrice'])
    momentum = pd.DataFrame(momentum).sort(columns='c_ret').reset_index()
    momentum = momentum[len(momentum)*4/5:len(momentum)]
    buylist = momentum['symbol'].tolist()
    for stk in account.position.stkpos:
        if (stk not in buylist) and (account.position.stkpos[stk]>0):
            order_to(stk, 0)
    for stk in buylist:
        if account.position.stkpos.get(stk, 0)==0:
            order_to(stk, account.amount)

Contrarian

策略思路

  • Contrarian:股票在经过一段时间的上涨之后会出现回落,一段时间的下跌之后会出现反弹

策略实现

  • Contrarian:每次调仓将股票按照前一段时间的累计收益率排序并分组,买入历史累计收益 最低 的那一组
start = datetime(2011, 1, 1)                # 回测起始时间
end   = datetime(2014, 8, 1)                # 回测结束时间
benchmark = 'HS300'                            # 使用沪深 300 作为参考标准
universe = set_universe('SH50')             # 股票池,上证50
capital_base = 100000                       # 起始资金
refresh_rate = 10
window = 20

def initialize(account):                    # 初始化虚拟账户状态
    account.amount = 300
    account.universe = universe
    add_history('hist', window)

def handle_data(account, data):                # 每个交易日的买入卖出指令
    contrarian = {'symbol':[], 'c_ret':[]}
    for stk in account.hist:
        if 'closePrice' in account.hist[stk].columns:
            contrarian['symbol'].append(stk)
            contrarian['c_ret'].append(account.hist[stk].iloc[window-1,:]['closePrice']/account.hist[stk].iloc[0,:]['closePrice'])
    contrarian = pd.DataFrame(contrarian).sort(columns='c_ret').reset_index()
    contrarian = contrarian[:len(contrarian)/5]
    buylist = contrarian['symbol'].tolist()
    for stk in account.position.stkpos:
        if (stk not in buylist) and (account.position.stkpos[stk]>0):
            order_to(stk, 0)
    for stk in buylist:
        if account.position.stkpos.get(stk, 0)==0:
            order_to(stk, account.amount)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文