首页 > 编程语言 >Python量化交易系统实战--设计交易策略:选股策略

Python量化交易系统实战--设计交易策略:选股策略

时间:2024-04-18 12:11:06浏览次数:30  
标签:index return Python shift param -- 选股 data concat

 作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

 

这一节主要是了解基于“动量因子”的选股策略。
动量因子指的是股票在一段周期内的涨跌幅度 ,其本质是追涨杀跌。而选股策略,指的是基于这个因子的表现进行股票筛选,以及买入、卖出的操作。

该文章的策略和方法非常简单。仅适用于入门了解。

一、筛选股票池

考虑到成交活跃以及买入卖出的顺畅,这里选择的是沪深300持有个股。

def get_index_list(index_symbol='000300.XSHG'):
    """
    获取指数成分股,指数代码查询:https://www.joinquant.com/indexData
    :param index_symbol: 指数的代码,默认沪深300
    :return: list,成分股代码
    """
    stocks = get_index_stocks(index_symbol, '2023-01-09')
    return stocks
def get_data(start_date, end_date, use_cols, index_symbol='000300.XSHG'):
    """
    获取股票收盘价数据,并拼接为一个df
    :param start_date: str
    :param end_date: str
    :param use_cols: list
    :param index_symbol: str
    :return data_concat: df,拼接后的数据表
    """
    # 获取股票列表代码:沪深300持有个股、创业板、上证
    stocks = st.get_index_list(index_symbol)
    # 拼接收盘价数据
    data_concat = pd.DataFrame()
    # 获取股票数据,这里为了测试方便取前10条
    for code in stocks[0:10]:
        data = st.get_csv_price(code, start_date, end_date, use_cols)
    return data

二、计算动量因子

1、计算策略

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

2、数据源

拼接股票池的数据为一张大表:

def get_data(start_date, end_date, use_cols, index_symbol='000300.XSHG'):
    """
    获取股票收盘价数据,并拼接为一个df
    :param start_date: str
    :param end_date: str
    :param use_cols: list
    :param index_symbol: str
    :return data_concat: df,拼接后的数据表
    """
    # 获取股票列表代码:沪深300持有个股、创业板、上证
    stocks = st.get_index_list(index_symbol)
    # 拼接收盘价数据
    data_concat = pd.DataFrame()
    # 获取股票数据,这里为了测试方便取前10条
    for code in stocks[0:10]:
        data = st.get_csv_price(code, start_date, end_date, use_cols)
        # 拼接多个股票的收盘价:日期 股票A收盘价 股票B收盘价 ...
        data.columns = [code]
        data_concat = pd.concat([data_concat, data], axis=1)
    # 预览股票数据
    # print(data_concat.tail())
    return data_concat

3、具体计算过程

  • 按月计算收益率。
  • 根据收益率生成交易信号(这里的策略简化为买入排名靠前的,卖出排名靠后的)。
  • 根据交易信号计算投资组合收益率。
  • 评估策略结果。
def momentum(data_concat, shift_n=1, top_n=4):
    """
    :param data_concat: df
    :param shift_n: int,表示业绩统计周期(单位:月)
    :return:
    """
    # 转换时间频率:日->月
    data_concat.index = pd.to_datetime(data_concat.index)
    data_month = data_concat.resample('ME').last()

    # 计算过去N个月的收益率 = 期末值/期初值 - 1 =(期末-期初)/ 期初
    shift_return = data_month / data_month.shift(shift_n) - 1
    # print(shift_return.head())
    # print(shift_return.shift(-1))

    # 生成交易信号:收益率排前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.head())

    # 计算投资组合收益率
    returns = base.caculate_portfolio_return(shift_return, signal, top_n * 2)
    print(returns.head())

    # 评估策略效果:总收益率、年化收益率、最大回撤、夏普比
    returns = base.evaluate_strategy(returns)

    # 数据预览
    # print(data_month.head())
    return returns

关键函数:

def caculate_portfolio_return(data, signal, n):
    """
    计算组合收益率
    :param data: dataframe
    :param signal: dataframe
    :param n: int
    :return returns: dataframe
    """
    returns = data.copy()
    # 投组收益率(等权重)= 收益率之和 / 股票个数
    # 信号发出的指令是针对的下一个月的指令,所以数据要后移
    returns['profit_pct'] = (signal * returns.shift(-1)).T.sum() / n
    returns = calculate_cum_prof(returns)

    return returns.shift(1)  # 匹配对应的交易月份

策略评估函数:

def evaluate_strategy(data):
    """
    评估策略收益表现
    :param data: dataframe, 包含单次收益率数据
    :return results: dict, 评估指标数据
    """
    # 评估策略效果:总收益率、年化收益率、最大回撤、夏普比
    data = calculate_cum_prof(data)

    # 获取总收益率
    total_return = data['cum_profit'].iloc[-1]
    # 计算年化收益率(每月开仓)
    annual_return = data['profit_pct'].mean() * 12

    # 计算近一年最大回撤
    data = caculate_max_drawdown(data, window=12)
    # print(data)
    # 获取近一年最大回撤
    max_drawdown = data['max_dd'].iloc[-1]

    # 计算夏普比率
    sharpe, annual_sharpe = calculate_sharpe(data)

    # 放到dict中
    results = {'总收益率': total_return, '年化收益率': annual_return,
               '最大回撤': max_drawdown, '夏普比率': annual_sharpe}

    # 打印评估指标
    for key, value in results.items():
        print(key, value)

    return data

 

 

标签:index,return,Python,shift,param,--,选股,data,concat
From: https://www.cnblogs.com/mazhiyong/p/18143255

相关文章

  • 实验5循环结构程序设计(while、do-while语句的应用)
    实验5循环结构程序设计(while、do-while语句的应用)一、实验目的1.熟练掌握三种循环语句并能正确运用;2.能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;3.进一步学习程序调试;4.了解中国算法,百钱买百鸡。二、实验硬、软件环境Windows计算机、Devc6.0三、实验内容及步骤项......
  • c语言程序实验——实验报告五
    c语言程序实验————实验报告五实验项目名称:实验报告5循环结构程序设计(while、dowhile语句的应用)实验项目类型:验证性实验日期:2024年4月11日一、实验目的1.熟练掌握三种循环语句并能正确运用;2.能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;3.进一步学习程......
  • 使用Python实时监控服务系统资源
    使用Python实时监控服务系统资源本文介绍如何使用Python的psutil库和matplotlib库来实时监控服务系统资源(CPU、内存、磁盘和网络),并将监控数据以图形化报表的形式展示。第一步:安装必需库首先,我们需要安装所需的库。可以通过pip安装psutil和matplotlib:pipinstallpsutilmatplo......
  • 获取AWS lightsail Windows server RDP密码
    场景创建lightsail的linuxserver时已经生成SSHkey,建立Windows的实例(Instance)时,并未提示输入管理员密码。登录时,找密码登录,提示“DecipheryourpasswordYouusedthe"keyname"keywhenyoucreatedthisinstance.Seetheinstructionstodecipherthepasswordfromthe......
  • 小程序管理平台建设的想法和见解
    继微信正式推出微信小程序后,各个大厂陆续发布了各自的小程序平台——支付宝小程序、百度小程序、头条小程序,各家不同的小程序标准一度让开发者们激情开骂,虽然目前跨平台的小程序开发可以通过taro、mpvue、kbone等跨平台开发框架来解决,但是不同平台的小程序管还是非常麻烦,每次在......
  • Unity Android 打包报错解决方案记录
    1.安卓版本过低报错提示PickedupJAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8D:\Develop\Unity\HRVTest\Library\Bee\Android\Prj\Mono2x\Gradle\unityLibrary\src\main\java\com\unity\androidnotifications\UnityNotificationManager.java:164:错误:找不到符号......
  • 一上午力所,仍是一地鸡毛。andorid 蓝牙
     packagecom.lingrui.btprint;importandroid.app.AlertDialog;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothSocket;importandroid.content.DialogInterface;importandroid.content.......
  • Python 解决控制台输出颜色时出现乱码的问题 (windows平台)
    简介在python开发的过程中,经常会遇到需要打印各种信息。海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性。这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了。当然了,控制台的展示效果有限,并不能像前段一样炫酷,只能做一些简单的设置。不......
  • 6.农芯科技面试
    1.SpringBoot注解我的回答:@SpringBootApplication,@EnableAutoConfiguration、RestController、@Mapper、@Repository、@Service、@Controller、@Autowired、@Resource标准回答:@SpringBootApplication包含@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan......
  • browserless 对于延迟加载图片的处理
    日常中大家为了提高web的性能基于可见区的图片加载基本常见,但是对于基于puppeteer的快照以及pdf生成就不太方便了,以下是一个解决方法,核心是过去内容的高度,基于代码进行滚动,模拟人的操作实现资源的加载参考实现constexpress=require("express");constpuppeteer=r......