当前位置:

首页 > 编程开发 > 使用Python进行交易策略和投资组合分析

使用Python进行交易策略和投资组合分析

我们将在本文中衡量交易策略的表现。并将开发一个简单的动量交易策略,它将使用四种资产类别:债券、股票和房地产。这些资产类别的相关性很低,这使得它们成为了极佳的风险平衡选择。动量交易策略这个策略是基于动量的的,因为交易者和投资者早就意识到动量的影响,这可以在广泛的市场和时间框架中看到。所以我们称之为动量策略。趋势跟踪或时间序列动量(TSM)是在单一工具上使用这些策略的另一个名称。我们将创建一个基本的动量策略并在TCS上对其进行测试以查看其性能。TSM策略分析首先,我们将导入一些库importnump

本文目录

    我们将在本文中衡量交易策略的表现。并将开发一个简单的动量交易策略,它将使用四种资产类别:债券、股票和房地产。这些资产类别的相关性很低,这使得它们成为了极佳的风险平衡选择。

    使用Python进行交易策略和投资组合分析

    动量交易策略

    这个策略是基于动量的的,因为交易者和投资者早就意识到动量的影响,这可以在广泛的市场和时间框架中看到。所以我们称之为动量策略。趋势跟踪或时间序列动量 (TSM) 是在单一工具上使用这些策略的另一个名称。我们将创建一个基本的动量策略并在 TCS 上对其进行测试以查看其性能。

    TSM策略分析

    首先,我们将导入一些库

    import numpy as np
     import pandas as pd
     import matplotlib.pyplot as plt
     import yfinance as yf
     import ffn
     %matplotlib inline

    我们构建基本的动量策略函数TSMStrategy。函数将通过时间序列的对数回报、感兴趣的时间段以及是否允许做空的布尔变量的布尔变量来返回预期表现。

    def TSMStrategy(returns, period=1, shorts=False):
    if shorts:
    position = returns.rolling(period).mean().map(
    lambda x: -1 if x <= 0 else 1)
    else:
    position = returns.rolling(period).mean().map(
    lambda x: 0 if x <= 0 else 1)
    performance = position.shift(1) * returns
    return performance
     ticker = 'TCS'
     yftcs = yf.Ticker(ticker)
     data = yftcs.history(start='2005-01-01', end='2021-12-31')
     returns = np.log(data['Close'] / data['Close'].shift(1)).dropna()
     performance = TSMStrategy(returns, period=1, shorts=False).dropna()
     years = (performance.index.max() - performance.index.min()).days / 365
     perf_cum = np.exp(performance.cumsum())
     tot = perf_cum[-1] - 1
     ann = perf_cum[-1] ** (1 / years) - 1
     vol = performance.std() * np.sqrt(252)
     rfr = 0.02
     sharpe = (ann - rfr) / vol
     print(f"1-day TSM Strategy yields:" +
    f"nt{tot*100:.2f}% total returns" +
    f"nt{ann*100:.2f}% annual returns" +
    f"nt{sharpe:.2f} Sharpe Ratio")
     tcs_ret = np.exp(returns.cumsum())
     b_tot = tcs_ret[-1] - 1
     b_ann = tcs_ret[-1] ** (1 / years) - 1
     b_vol = returns.std() * np.sqrt(252)
     b_sharpe = (b_ann - rfr) / b_vol
     print(f"Baseline Buy-and-Hold Strategy yields:" +
    f"nt{b_tot*100:.2f}% total returns" +
    f"nt{b_ann*100:.2f}% annual returns" +
    f"nt{b_sharpe:.2f} Sharpe Ratio")

    函数输出如下:

    1-day TSM Strategy yields:
     -45.15% total returns
     -7.10% annual returns
     -0.17 Sharpe Ratio
     Baseline Buy-and-Hold Strategy yields:
     -70.15% total returns
     -13.78% annual returns
     -0.22 Sharpe Ratio

    在合理的年化回报上,1日TSM策略优于买入并持有策略。因为 1 天的回顾可能包含许多错误趋势,所以我们尝试不同的时间段来查看它们的比较情况。这里将循环运行模型 3、5、15、30 和 90 天。

     import matplotlib.gridspec as gridspec
     periods = [3, 5, 15, 30, 90]
     fig = plt.figure(figsize=(12, 10))
     gs = fig.add_gridspec(4, 4)
     ax0 = fig.add_subplot(gs[:2, :4])
     ax1 = fig.add_subplot(gs[2:, :2])
     ax2 = fig.add_subplot(gs[2:, 2:])
     ax0.plot((np.exp(returns.cumsum()) - 1) * 100, label=ticker, linestyle='-')
     perf_dict = {'tot_ret': {'buy_and_hold': (np.exp(returns.sum()) - 1)}}
     perf_dict['ann_ret'] = {'buy_and_hold': b_ann}
     perf_dict['sharpe'] = {'buy_and_hold': b_sharpe}
     for p in periods:
    log_perf = TSMStrategy(returns, period=p, shorts=False)
    perf = np.exp(log_perf.cumsum())
    perf_dict['tot_ret'][p] = (perf[-1] - 1)
    ann = (perf[-1] ** (1/years) - 1)
    perf_dict['ann_ret'][p] = ann
    vol = log_perf.std() * np.sqrt(252)
    perf_dict['sharpe'][p] = (ann - rfr) / vol
    ax0.plot((perf - 1) * 100, label=f'{p}-Day Mean')
     
     ax0.set_ylabel('Returns (%)')
     ax0.set_xlabel('Date')
     ax0.set_title('Cumulative Returns')
     ax0.grid()
     ax0.legend()
     _ = [ax1.bar(i, v * 100) for i, v in enumerate(perf_dict['ann_ret'].values())]
     ax1.set_xticks([i for i, k in enumerate(perf_dict['ann_ret'])])
     ax1.set_xticklabels([f'{k}-Day Mean'
    if type(k) is int else ticker for
    k in perf_dict['ann_ret'].keys()],
    rotation=45)
     ax1.grid()
     ax1.set_ylabel('Returns (%)')
     ax1.set_xlabel('Strategy')
     ax1.set_title('Annual Returns')
     _ = [ax2.bar(i, v) for i, v in enumerate(perf_dict['sharpe'].values())]
     ax2.set_xticks([i for i, k in enumerate(perf_dict['sharpe'])])
     ax2.set_xticklabels([f'{k}-Day Mean'
    if type(k) is int else ticker for
    k in perf_dict['sharpe'].keys()],
    rotation=45)
     ax2.grid()
     ax2.set_ylabel('Sharpe Ratio')
     ax2.set_xlabel('Strategy')
     ax2.set_title('Sharpe Ratio')
     plt.tight_layout()
     plt.show()

    使用Python进行交易策略和投资组合分析

    通过图表的结果,我们可以看到15天的动量指标提供了最好的结果。但是,其他时间周期的结果是五花八门的。这表明我们这个策略并不可靠。所以我们还可以通过在接近顶部时使用止损或追踪止损来退出交易,而不是在15日线图下跌或持平时再进行操作。

    投资组合分析

    到目前为止,我们已经用Python创建了一个交易策略。下面我们将度量并绘制常见的投资组合特征方便我们进行观察分析。

    投资组合分析

    首先,我们将导入一些重要的库,并观察数据执行情况。

    import pandas_datareader.data as web
     stocks = ['SPY','GLD','TLT','HYG']
     
     data = web.DataReader(stocks,data_source='yahoo',start='01/01/2019')['Adj Close']
     data.sort_index(ascending=True,inplace=True)
     perf = data.calc_stats()
     perf.plot()

    使用Python进行交易策略和投资组合分析

    对数回报

    对数回报用于计算指数增长率。我们不计算每个子时期的价格变化百分比,而是计算那段时间的自然增长指数。首先创建一个df,其中包含数据中每个股票价格的对数回报,然后我们为每个对数回报创建一个直方图。

     returns = data.to_log_returns().dropna()
     print(returns.head())
     
     
     Symbols SPY GLD TLT HYG
     Date
     2019-01-03 -0.024152 0.009025 0.011315 0.000494
     2019-01-04 0.032947 -0.008119 -0.011642 0.016644
     2019-01-07 0.007854 0.003453 -0.002953 0.009663
     2019-01-08 0.009351 -0.002712 -0.002631 0.006470
     2019-01-09 0.004663 0.006398 -0.001566 0.001193

    直方图如下:

    ax = returns.hist(figsize=(20, 10),bins=30)

    使用Python进行交易策略和投资组合分析

    所有四个资产类别都显示正态分布的直方图。具有正态分布的样本具有算术平均值和高于和低于平均值的均等分布(正态分布也称为高斯分布是对称的) 。如果回报呈正态分布,预计超过 99% 的回报将落在平均值的三个标准差范围内。这些钟形正态分布特征使分析师和投资者能够对股票的预期收益和风险进行更好的统计推断。具有钟形曲线的股票通常是波动率低且可预测的蓝筹股(Blue Chips)。

    最大回撤率  DRAWDOWN

    DRAWDOWN是指价值下降到一个相对的低谷。这是投资者需要考虑的一个重要风险因素。让我们画一个递减策略的可视化表示。

    ffn.to_drawdown_series(data).plot(figsize=(15,10))

    使用Python进行交易策略和投资组合分析

    这四种资产在2020年上半年都出现了下降,其中SPY的降幅最大,为0.5%。随后,在2020年上半年,所有资产立即复苏。这表明资产回收率很高。这些资产在2020年7月前后见顶。按照这种趋势,一旦复苏达到顶峰,所有资产类别都出现小幅下跌。根据结果TLT将在2022年下半年经历最大的0.5%的下降,然后在2023年初之前恢复。

    MARKOWITZ 均值-方差优化

    1952年,马科维茨(MARKOWITZ)提出均值-方差投资组合理论,又称现代投资组合理论。投资者可以使用这些概念来构建基于给定风险水平的最大化预期回报的投资组合。基于马科维茨方法,我们可以生成“最优投资组合”。

    returns.calc_mean_var_weights().as_format('.2%')
     #结果
     SPY 46.60%
     GLD 53.40%
     TLT 0.00%
     HYG 0.00%
     dtype: object

    相关性统计

    相关性是一种统计方法,用来衡量证券之间的相互关系。最好使用热图来查看这些信息。热图可以让我们看到证券之间的相关性。

    returns.plot_corr_heatmap()

    使用Python进行交易策略和投资组合分析

    最好在你的投资组合中拥有相关性较低的资产。除了SPY与HYG,这四个资产类别的相关性都很低,这对我们的投资组合是不利的:因为如果拥有高度相关的不同资产组,即使你将风险分散在它们之间,从投资组合构建的角度来看,收益也会很少。

    总结

    通过分析和绘制的所有数据进行资产配置,可以建立一个投资组合,极大地改变基础投资的风险特征。还有很多我没有提到的,但可以帮助我们确定交易策略价值的起点。我们将在后续文章中添加更多的技术性能指标。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。