python量化交易第五章

本文详细介绍了动量策略的概念、设计思路及实现步骤,包括选择股票池、设定业绩评价周期、计算收益率、排序并生成交易信号。通过获取沪深300指数成分股数据,计算过去N个月的收益率,然后筛选出涨跌幅最高的股票,形成买入和卖出策略。代码示例展示了如何使用特定库获取并处理股票数据,以及如何根据收益率生成交易信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是动量策略

1.1概念:
预先对股票收益和交易量设定过滤准则,当股票收益或股票收益和交易量同时满足过滤准则就买入(做多)或卖出(做空)股票的投资策略。
核心:以股票的历史收益率作为主要的交易原则
1.2动量策略的设计思路

正向策略:涨的还会涨,跌的还会跌,买入涨最多的,卖出跌最多的,利用市场对信息的反应不足。
反向策略:涨太多了会跌,跌太多了会涨,买入跌最多的,卖出涨最多的,市场对信息反应过度
1.3动量策略的实现步骤

  1. 确定交易对象:股票池,考虑流动性(沪深300,创业板)
  2. 选定业绩评价周期:过去1-12个月
  3. 计算形成期收益率:过去N个月的收益率
  4. 对收益率进行排序:最佳—赢家组合,最差~输家组合
  5. 确定持仓/换仓周期:1个月,可自定义测算
  6. 连续或间隔一段时间,不断重复2-5行为
  7. 计算动量/反向策略各持有期的回报率
  8. 计算t/p统计值,判断是否存在动量效应

二.动量策略:筛选股票池

  • 流动性:成交活跃,买入卖出顺畅
  • 基本面:行业,营收,盈利增速,现金流,负债
  • 标的价格: 1手起买起卖
import data.stock as st

def get_data(index_symbol='000300.XSHG'):
    # 获取股票列表代码:沪深300持有个股,创业板,上证
    stocks=st.get_index_list(index_symbol)
    # 获取股票数据
    for code in stocks:
        data=st.get_csv_price(code,'2019-01-01','2021-01-04')
    # 预览股票数据
        print("================",code)
        print(data.tail())
def momentum():
    return 0

if __name__=="__main__":
    get_data()
def get_index_list(index_symbol='000300.XSHG'):
    """
    获取指数成分股,指数代码查询
    :param index_symbol:https://www.joinquant.com/indexdata
    :return:list,成分股代码
    """
    stocks=get_index_stocks(index_symbol)
    return stocks

三.动量策略:计算动量因子

import pandas as pd

import data.stock as st

def get_data(start_date,end_date,use_cols,index_symbol='000300.XSHG'):
    """
    获取股票收盘价数据,并拼接为一个df
    :param start_date:
    :param end_date:
    :param use_cols:
    :param index_symbol:
    :return datac_concat:df,拼接后的数据
    """
    # 获取股票列表代码:沪深300持有个股,创业板,上证
    stocks=st.get_index_list(index_symbol)
    #拼接收盘价数据
    data_concat=pd.DataFrame()
    # 获取股票数据
    for code in stocks[0:10]:
        data=st.get_csv_price(start_date,end_date,use_cols,code)

        print("================",code)
        print(data.tail())
        #拼接多个股票的收盘价:日期 股票A收盘价 股票B收盘价...
        data.colimns=[code]
        pd.concat([data_concat,data],axis=1)
    # 预览股票数据
    # print(data_concat.tail())
    return data_concat

def momentum(data_concat,shift_n=1):
    """

    :param data_concat:
    :param shift_n:表示业绩统计周期(单位:月)
    :return:
    """
    #转换时间频率:日->月
    data_concat.index=pd.to_datetime(data_concat.index)
    data_month=data.concat.resample('M').last()
    #计算过去N个月的收益率=期末值/期初值-1=(期末-期初)/期初
    #optional:对数收益率=log(期末值/期初值)
    print(data_month.head())
    shift_return=data_month/data_month.shift(shift_n)-1
    print(data_month.head())
    return shift_return

if __name__=="__main__":
    data=get_data('2019-01-01','2021-01-04',['date','close'])
    momentum(data,shift_n=1)

三.动量策略:生成交易信号

import pandas as pd
import numpy as np
import data.stock as st

def get_data(start_date,end_date,use_cols,index_symbol='000300.XSHG'):
    """
    获取股票收盘价数据,并拼接为一个df
    :param start_date:
    :param end_date:
    :param use_cols:
    :param index_symbol:
    :return datac_concat:df,拼接后的数据
    """
    # 获取股票列表代码:沪深300持有个股,创业板,上证
    stocks=st.get_index_list(index_symbol)
    #拼接收盘价数据
    data_concat=pd.DataFrame()
    # 获取股票数据
    for code in stocks[0:10]:
        data=st.get_csv_price(start_date,end_date,use_cols,code)

        print("================",code)
        print(data.tail())
        #拼接多个股票的收盘价:日期 股票A收盘价 股票B收盘价...
        data.columns=[code]
        pd.concat([data_concat,data],axis=1)
    # 预览股票数据
    # print(data_concat.tail())
    return data_concat

def momentum(data_concat,shift_n=1,top_n=2):
    """

    :param data_concat:
    :param shift_n:表示业绩统计周期(单位:月)
    :return:
    """
    #转换时间频率:日->月
    data_concat.index=pd.to_datetime(data_concat.index)
    data_month=data.concat.resample('M').last()
    #计算过去N个月的收益率=期末值/期初值-1=(期末-期初)/期初
    #optional:对数收益率=log(期末值/期初值)
    shift_return=data_month/data_month.shift(shift_n)-1
    print(shift_return)
    #生成交易信号:收益率排前n的>赢家组合>买入1,排最后n个>输家>卖出-1
    buy_signal=get_top_stocks(shift_return,top_n)
    sell_signal=get_top_stocks(-1*shift_return,top_n)
    signal=buy_signal-sell_signal
    print(signal)
    exit()
    #数据预览
    # print(data_month.head())
    print(shift_return.head())
    return shift_return
def get_top_stocks(data,top_n):
    """
    找到前n位的极值,并转换为信号返回
    :param data:df
    :param top_n:int,表示要产生信号的个数
    :return signals:df,返回0-1信号数据表
    """
    signals=pd.DataFrame(index=data.index,columns=data.columns)
    #对data的每一行进行遍历,找出里面的最大值,并利用bool函数标注0或1信号
    for index,row in data.iterrows():
        print(row.isin(row.nlargest(top_n)).astype(np.int))
    return signals

if __name__=="__main__":
    data=get_data('2019-01-01','2021-01-04',['date','close'])
    momentum(data,shift_n=1)
## 讲师介绍: 近 5 年个人投资理财年化收益平均超 25%。如果你也想提升自己的睡后收入,轻松赚钱,那么这门课就是为你量身打造。课程基于一个完整真实的量化交易业务来讲授,并融入老师的理财经验以及使用编程技术辅助投资的技巧,让你面对各种复杂投资情况也能做到游刃有余。 ## 学习目标: 从不懂“理财”开始到实现自动交易,成为一个“技术流”理财高手 编程技术 + 核心量化策略 + 交易系统开发 + 讲师经验分享,学会用技术辅助理财 本课程从最基础的什么是量化开始讲起,即使对投资理财不了解同样可以学习,轻松入门无压力。 从如何获取数据开始,到实现实盘交易,课程对量化交易的每一步都进行细致讲解,为你铺开量化交易的每一个细节。 不仅仅只是教你学会使用某种工具,更会教给你量化交易的投资思想,让你面对各种情况都游刃有余。 ## 课程亮点: 设计适合自己并能适应市场交易策略,才是量化交易的灵魂 课程亲手带你设计并实现两种交易策略,快速培养你的策略思维能力 1. 择时策略:通过这个策略学会如何利用均线,创建择时策略,优化股票买入卖出的时间点。2. 选股策略:掌握选股策略的核心逻辑,并基于收益率创建动量选股策略,并验证其有效性。 手把手带你打造一个易扩展、更安、效率更高的量化交易系统 第三方平台大而,不易扩展,效率还差,信息安也是大问题,打造自己的交易平台才是更优解
动量因子是优化算法中的一个重要概念,它可以帮助优化算法更快地收敛到最优解。在介绍动量因子计算Python实现之前,先来简单了解一下梯度下降和优化算法的概念。 梯度下降是一种常用的优化算法,它通过不断地调整模型参数来最小化损失函数。具体来说,梯度下降算法会根据损失函数的梯度方向来更新模型参数,使得损失函数的值不断减小,直到达到最小值。 然而,梯度下降算法存在一些问题,比如容易陷入局部最优解、收敛速度慢等。为了解决这些问题,研究者们提出了一系列的优化算法,其中动量因子就是其中之一。 动量因子是一种在更新模型参数时考虑历史梯度信息的方法,它可以帮助优化算法更快地收敛到最优解。具体来说,动量因子会保留历史梯度的一部分信息,并将其与当前梯度相加,从而更加平滑地更新模型参数。 动量因子计算可以通过以下公式来实现: ``` v = beta * v + (1 - beta) * grad theta = theta - alpha * v ``` 其中,`v`表示历史梯度信息,`beta`表示动量因子的权重,`grad`表示当前梯度,`theta`表示模型参数,`alpha`表示学习率。 在Python中,可以通过以下代码来实现动量因子计算: ``` v = 0 beta = 0.9 alpha = 0.01 for i in range(num_iterations): grad = compute_gradient(X, y, theta) v = beta * v + (1 - beta) * grad theta = theta - alpha * v ``` 其中,`compute_gradient`函数用来计算当前梯度,`num_iterations`表示迭代次数,`X`和`y`表示训练数据,`theta`表示初始模型参数。 总之,动量因子是优化算法中的一个重要概念,它可以帮助优化算法更快地收敛到最优解。在Python中,可以通过简单的代码实现动量因子计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值