使用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"\n\t{tot*100:.2f}% total returns" + 
       f"\n\t{ann*100:.2f}% annual returns" +
       f"\n\t{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"\n\t{b_tot*100:.2f}% total returns" + 
       f"\n\t{b_ann*100:.2f}% annual returns" +
       f"\n\t{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()

通过图表的结果,我们可以看到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()

对数回报

对数回报用于计算指数增长率。我们不计算每个子时期的价格变化百分比,而是计算那段时间的自然增长指数。首先创建一个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)

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

最大回撤率 DRAWDOWN

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

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

这四种资产在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()

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

总结

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

本文的代码:

https://github.com/MphoLukhele/Trading-Strategy-And-Investment-Portfolio-Analysis/blob/60c6380ad3d016eaf00c23173f79ddfaa15f91e9/Trading%20Strategy%20Analysis

作者:Mpho Lukhele

本文转载于网络 如有侵权请联系删除

相关文章

  • 在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题…

    是按照以下步骤检查的除了ACCESS_TOKEN没有缓存其他都可以如果是invalidsignature签名错误。建议按如下顺序检查:1.确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign页面工具进行校验。2.确认config中nonceStr(js中驼峰标准大写S),timestamp与用以签名中的对应noncestr,timestamp一致。3.确认url是页面完整的url(请在当前页面alert(location.href.split(‘#’)[0])确认),包括’http(s)://’部分,以及’?’后面的GET参数部分,但不包括’#’hash后面的部分。4.确认config中的appid与用来获取jsapi_ticket的appid一致。5.确保一定缓存access_token和jsapi_ticket。这个是重点: 确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去

  • GC

    staticStringstr0="0123456789"; staticStringstr1="0123456789"; Stringstr2=str1.substring(5); Stringstr3=newString(str2); Stringstr4=newString(str3.toCharArray()); str0=null; 假定str0,...,str4后序代码都是只读引用。 Java7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen(永久代))保留的字符数为(15)复制解释一: 这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。 堆区分为三个区:年轻代(YoungGeneration)、年老代(OldGeneration)、永久代(PermanentGeneration,也就是方法区)。 年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的MinorGC(针对年轻代的内存回收

  • 热点话题:关于研发效能的几点思考分享!

    研发效能提升是最近比较热门的一个话题,根据这几年的工作心得,做了一些思考总结,暂且抛转引入。三要素任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减少消耗。工具,即道具、器械,对应“器”。选对工具很重要,趁手的工具往往能起到事半功倍的效果。详细解释见下图:第一个要素:人思想的深度决定了生产力的高度。按照敏捷宣言,个体和交互胜过流程和工具,人的因素是最重要的,但人的思想在短期内又无法提升,需要长期不断投入。我们可以从两个方面着手,逐渐改进:工程素养做事方法工程素养做事方法研发同学要形成PDCA的思维,任何事情都要有始有终,形成闭环乔梁在《持续交付2.0》中提出的持续交付双环模型,我觉得是PDCA环的发展,可以应用到很多领域,比如流程改进持续交付双环在流程改进中的应用第二个要素:流程流程的引入并不是为了给团队增加束缚,而是提高研发效能,即必须起到减少浪费,促进价值产生的作用减少浪费按照

  • c++中endl操作符以及它的兄弟们

    说明一下,我用的是g++7.1.0编译器,标准库源代码也是这个版本的。一直以来,我们每次使用cout输出数据的时候,如果要换行,都知道使用形如cout<<endl;这样的形式,那么endl到底是什么呢,它是怎么样实现输出一个换行符的功能的,以前我没有思考过,但现在我想弄懂它,下面就一起看一下吧。1.endl操作符的实现在标准库头文件<ostream>中,我找到了endl的操作符重载函数,如下:template<typename_CharT,typename_Traits> inlinebasic_ostream<_CharT,_Traits>& endl(basic_ostream<_CharT,_Traits>&__os) {returnflush(__os.put(__os.widen('\n')));} 复制它是一个内联的函数模板,是一个全局的函数模板,endl正是它的函数名,它的作用是往缓冲区写入一个换行符并且立即从缓冲区刷新到外部设备中。那么endl是怎么与<<操作符关

  • 使用websocket做视频直播

    最近在做的一个小项目需要用到相关技术,找到这篇文章貌似不错,于是就翻译转载上来了。 RecentlyI’minterestinginthesetechnologiesandI’mworkingonaprojectrelatedtoit.I’vefoundthisusefularticlesoItranslatedandpostedithere. 原文地址/Originalpost: HTML5LiveVideoStreamingviaWebSockets–PhobosLab 笔者之前做一个实时监控应用的时候,曾搜索过一些将iPhone的摄像头拍摄的画面实时传输到浏览器的方案,一个都没有。就HTML5来说,视频(实时)直播是一个很悲催的活,HTML5视频目前还没有一个正式的流式传输支持,Safari支持很蹩脚的HTTPLiveStreaming并且也即将有MediaSourceExtension规范和MPEG-DASH。但所有这些方案都是将视频分成小片,由浏览器单独下载,因此会产生最小五秒钟的延迟。下面是一个完全不同的方案,可以支持所有现代浏览器:Firefox、Chrome、Safa

  • linux命令notfound处理汇总

    在实际操作linux系统特别是最小化安装或者是全新系统时,经常会碰到-bash:ssh-copy-id:commandnotfound此类的报错。。。那么咱们应该安装哪些包才能让系统包含这些命令呢?#ssh-copy-idyuminstallopenssh-clients*复制#ifconfigyuminstallnet-tools复制#make&&makeinstallyum-yinstallgcc-c++复制

  • LCS 最长公共子序列

    参考:http://www.cnblogs.com/liyukuneed/archive/2013/05/22/3090597.html 最长公共子序列是一个很经典的动态规划问题。 动态规划,众所周知,第一步就是找子问题,也就是把一个大的问题分解成子问题。这里我们设两个字符串A和B,A="a0,a1,a2,...,am-1",B="b0,b1,b2,...,bn-1"。 (1)如果am-1==bn-1,则当前最长公共子序列为"a0,a1,...,am-2"与"b0,b1,...,bn-2"的最长公共子序列与am-1的和。长度为"a0,a1,...,am-2"与"b0,b1,...,bn-2"的最长公共子序列的长度+1。 (2)如果am-1!=bn-1,则最长公共子序列为max("a0,a1,...,am-2"与"b0,b1,...,bn-1"的公共子序列,"a0,a1,...,am-1"与"b0,b1,...,bn-2"的公共子序列) 如果上述描述用数学公式表示,则引入一个二维数组c[][],其中c[i][j]记录X[i]与Y[j]的LCS长度,再用一个二维数组b[i][j]记录c[i

  • 安装单机版redis

    mkdir-p/data/application---创建工作目录 wgethttp://download.redis.io/releases/redis-4.0.9.tar.gz---下载redis tarxzfredis-4.0.9.tar.gz-C/data/application/---解压 cd/data/application/ mvredis-4.0.9/redis cdredis/ yuminstall-ygccmake#安装编译工具 make 注:如果报错请将刚才解压的安装包删除掉,再次重新解压并进行make安装即可复制 修改配置 cpredis.confredis.conf.bak vimredis.conf---修改如下 bind192.168.246.202  #只监听内网IP daemonizeyes     #开启后台模式将on改为yes port6379#端口号 dir/data/application/redis/data  #本地数据库存放持久化数据的目录该目录-----需要存在创建存放数据的目录 mkdir/data/application/re

  • centOS Linux下用yum安装mysql

    centOSLinux下用yum安装mysql     第一篇:安装和配置MySQL  第一步:安装MySQL   [root@192local]#yum-yinstallmysql-server ←安装MySQL   [root@192local]#yum-yinstallphp-mysql  ←安装php-mysql    第二步:配置MySQL   [root@192local]#vim/etc/my.cnf       ←编辑MySQL的配置文件   [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock #Defaulttousingoldpasswordformatforcompatibilitywithmysql3.x #clients(thoseusingthemysqlclient10compatibilitypackage).

  • union 和 case

    UNION指令的目的是将两个SQL语句的结果合并起来,可以查看你要的查询结果.  CASE更多的是一种判断分类,就想其他语言的case一样   1.CASEWHEN表达式有两种形式   --简单Case函数CASEsexWHEN'1'THEN'男'WHEN'2'THEN'女'ELSE'其他'END--Case搜索函数CASEWHENsex='1'THEN'男'WHENsex='2'THEN'女'ELSE'其他'END复制       2.CASEWHEN在语句中不同位置的用法   2.1 SELECT CASEWHEN用法   SELECTgrade,COUNT(CASEWHENsex=1THEN1/*sex1为男生,2位女生*/ELSENULLEND)男生数,COUNT(CASEWHENsex=2THEN1ELSENULLEND)女生数FROMstudentsGROUPBYgrade;复制       2.3 WHERE 

  • Ubuntu 20.04下源码编译安装ROS 2 Foxy Fitzroy

        ROS2FoxyFitzroy(以下简称Foxy)于2020年6月5日正式发布了,是LTS版本,支持到2023年5月。本文主要根据官方的编译安装教程[1]完成,并记录编译过程中遇到的问题。 1.系统要求 在官方给出的Foxy目标系统中,UbuntuLinux-FocalFossa(20.04)64位是首选,本文也选择Ubuntu20.0464位,其他还包括DebianLinux-Buster(10)、Fedora32、ArchLinux、OpenEmbedded/webOSOSE,但Foxy还没有充分测试,不推荐使用。   2.系统设置 (1)设置locale 确保系统locale支持UTF-8,在终端运行locale查看。 如果不支持UTF-8,运行以下代码 sudolocale-genen_USen_US.UTF-8sudoupdate-localeLC_ALL=en_US.UTF-8LANG=en_US.UTF-8exportLANG=en_US.UTF-8 (2)添加ROS2apt仓库 1)用apt命

  • 操作RDS文档说明

                                                                                                                                                    操作RD

  • 17倍

    题目描述 学习程序设计的Lanlan记得老师给她布置的第一个任务是:输入一个数N,然后输出17*N的值。当然这个任务非常简单,经过一段时间的学习,兰兰有了一些的进步,老师又布置了一个类似的任务,只是变更了一个条件,输入的N是一个二进制数,输出的值也要是二进制表示的。 现在请帮助Lanlan完成这个任务。   输入 一个二进制表示的数N。   输出 二进制表示的17*N。   样例输入 样例数据 10110111 复制 样例输出 110000100111 复制   提示 10110111相当于十进制的183,于是183*17=3111,二进制形式是110000100111。 30%的数据N的位数小于25位 50%的数据N的位数小于50位 100%的数据N的位数小于1000位   分析:看到这个1000位,就知道要直接用数解决这个题是不可能了,所以运用数组存这些数,然后再通过二进制数的乘法,即每位数都乘一次17,最后每一位对二取余并存入另一个数组,最后输出即可. #include<iostream

  • MongoDB笔记1:Windows下安装MongoDB

    Windows下安装MongoDB非常简单。若是32位的操作系统,要安装32位的MongoDB;若是64位的系统,要安装64位的MongoDB。这里以64位为例。具体步骤为:一、下载MongoDB最新或较新版,这里下的是mongodb-win32-x86_64-2008plus-ssl-3.2.0-signed.msi二、安装1双击mongodb-win32-x86_64-2008plus-ssl-3.2.0-signed.msi,启动安装向导界面。选“Next”按纽2接受协议,Next3Complete的安装路径默认为C:\ProgramFiles\MongoDB,若想自定义安装路径,应选Custom。这里选Custom4把安装位置由默认的C:\ProgramFiles\MongoDB\Server\3.2\改为D:\ProgramFiles\MongoDB\Server\3.2\选“下一步”5选Install6选Finish三、创建数据文件存放目录e:\db四、启动MongoDB服务以管理员身份打开cmd控制台,进入D:\ProgramFiles\MongoDB\Server\3.

  • 【高级系统架构师】第十一章 设计模式

    本章节 一般只出现在上午题目中。 有1-2分   重点知识: 1:错误:软件开发过程    缺陷:针对软件产品   错误是导致缺陷的原因, 缺陷是错误的表现形式。 2:测试阶段: 单元测试、集成测试、系统测试 1)单元测试:模块测试,主要在编程阶段 2)集成测试:组装测试,主要为非渐增式和渐增式, 是对各个模块组装而成的程序进行测试 3) 系统测试: 最后的、最完整的测试,全局来考察软件系统的功能和性能要求。   a: 确认测试,主要依旧软件需求说明书检查软件的功能、性能及其他特征是否与用户的需求一致。  b:验收测试: ALPHA和BEAT两周。 3:白盒测试:结构测试,主要用于单元测试阶段    黑盒测试:功能测试,主要用户与集成测试和确认测试阶段。 4:软件需求评审、概要设计评审、详细设计评审、软件验证和确认评审 功能检查 物理检查

  • 好书清单

    邹振东《弱传播》 史蒂夫·斯托加茨《微积分的力量》

  • 多对象的内存管理

    p.p1{margin:0;font:11pxMenlo;color:rgba(0,132,0,1);background-color:rgba(255,255,255,1)}  1>当你想占有某个对象时,就应该让对象的引用计数器+1(让对象做一次retain操作)  2>当你不占有某个对象时,让对象的引用计数器-1(让对象做一次release操作)  3>谁retain,谁release  4>谁alloc,谁release  5>当引用计数为0,就会调用对象的dealloc  6>[superdealloc];写到最后   1#import<Foundation/Foundation.h> 2#import"Book.h" 3#import"Person.h" 4intmain(intargc,constchar*argv[]){ 5 6//当引用计数为0,就会调用对象的dealloc 7 8//b=1b=1 9Book*b=[[Bookalloc]init];

  • 软件架构的认识

        这学期学习学习软件架构,对架构的概念还不是很了解。刚开始以为架构就是项目的框架、结构,这样概括其实是不全面的。架构不仅是结构,架构的产生源于人与人之间的合作交流,每个人的能力、时间和精力都是有限,但是他们要完成的项目却是复杂、精确的,这就要求从架构的角度来提高项目的质量,提高个人的时间效率。因此架构对提高生产力是有帮助的,可以缩短项目的时间,并会提高项目的质量。事实上项目的架构就是在长期进行这些活动后,积累下来的实践。可以说架构是人类发展过程中,由懵懵懂懂的,被动的去认识这个世界,变成主动的去认识,并以更高的效率去改造这个世界的方法。    架构准确的定义就是:根据要解决的问题,对目标系统的边界进行界定。并对目标系统按某个原则的进行切分。切分的原则,要便于不同的角色,对切分出来的部分,并行或串行开展工作,一般并行才能减少时间。并对这些切分出来的部分,设立沟通机制。使得这些部分之间能够进行有机的联系,合并组装成为一个整体,完成目标系统的所有工作。    软件架构是架构的一个分支,它

  • [转]AVALONDOCK 2.0入门指南第一部分

    AvalonDock 2.0可以用来为WPF创建一个类似VisualStudio的界面,深入理解如何使用AvalonDock进行开发是很重要的。 在这个入门指南里,我将演示如何开始使用AvalonDock,下面的文章都是基于2.0版本的。并且不能用于早期的版本。 AvalonDock是一个组合的布局模型,很多的控件都在视图上显示,一个DockingManager类也显示在停靠区,用于可以拖拽文档和工具。 从下面这个截图中我们可以理解AvalonDock组件 DockingManager 这是AvalonDock中的核心控件,它将包含的窗格排序,处理飞出的窗格,还有浮动的窗口。在上面这个图中,DockingManager对象包含了所有空间(WPF控件),从顶部的工具栏到底部的状态栏都算。同时。DockingManager也可以处理保存和恢复布局。 LayoutPanel 这个面板用来管理在一个方向上的子窗口(通过Orientation属性来选择方向),并且在它们之间添加了一个大小调节控件,在一个Orientation属性是Horizontal(水平)的Lay

  • RabbitMQ的安装(linux版)

    原文地址:https://blog.csdn.net/jiguquan3839/article/details/91346261 注意:在web管理页面登录提示“Usercanonlyloginvialocalhost”,原因是rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问 解决办法: vim/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.15/ebin/rabbit.app复制 修改  重启后即可解决

  • 一元函数积分学——第一类换元法

    目录写在前面凑微分法原理几种基本形式1、ex型2、三角函数型3、1/x型4、xu型例题(千万不要跳过啊) 写在前面 昨天讲到了不定积分,属于积分学的入门,如果感到困难也没关系。可以买习题书多练练题。总之基本积分公式是基础。这一步走好了剩下的都不会太难。那么今天说说会了这些公式我们又该学习什么?显然考研数学不可能只从基本公式里出题,还会涉及一些变化,那么我来讲讲第一点——凑微分法。也叫第一类换元积分法。 凑微分法原理 在学习凑微分法之前我们得先明白其内在原理。 凑微分法其实就是复合函数求导的逆过程,复合函数求导后会产生两个部分 外部函数f(...)的导数(外部函数是指原函数的最外层函数) 中间变量g(x)的导数 凑微分法做的就是找出被积函数的中间变量g(x)和外部函数f(...),再把g(x)放到微分符号里面,函数部分只留下f(...)的导数,这样凑微分法就完成了。 看不懂可以看看图,还是看不懂也没关系,接下来我会带大家看看实际的题,抽象理论不好懂,但是到了题中会好很多。 几种基本形式 1、ex型 这是最简单的一种类型,在这一类型中, e...就代表外部函数f(...)求导后

相关推荐

推荐阅读