<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sma on 格物堂</title><link>https://gewutang.cn/tags/sma/</link><description>Recent content in Sma on 格物堂</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 25 May 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://gewutang.cn/tags/sma/index.xml" rel="self" type="application/rss+xml"/><item><title>五分钟搞定 SMA 指标的量化策略开发和回测</title><link>https://gewutang.cn/2025/05/25/sma/</link><pubDate>Sun, 25 May 2025 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2025/05/25/sma/</guid><description>&#10;&#10;&#10;&lt;p&gt;常有人问我能用几分钟时间写一段代码进行一个简易的量化投资策略的开发和回测吗，答案是当然可以。对于量化投资而言，门槛永远不是编程和代码，而是投资思路和模型解读。下面我们用五分钟左右的时间来开发一个基于 SMA 指标的量化投资策略并进行回测。&lt;/p&gt;&#10;&lt;div id="引言" class="section level1"&gt;&#10;&lt;h1&gt;引言&lt;/h1&gt;&#10;&lt;p&gt;本文的代码基于&lt;a href="https://r-project.org"&gt;R&lt;/a&gt;软件和 &lt;a href="https://posit.co"&gt;Rstuido&lt;/a&gt; 软件运行，如果未安装上述软件，请自行安装。&lt;/p&gt;&#10;&lt;p&gt;策略开发还需要基于以下 R 包来实现，可以运行如下代码安装并加载相关 R 包。&lt;/p&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 安装依赖包，如果未安装&#10;install.packages(c(&amp;quot;quantstrat&amp;quot;, &amp;quot;Tushare&amp;quot;, &amp;quot;xts&amp;quot;, &amp;quot;dplyr&amp;quot;, &amp;quot;showtext&amp;quot;, &amp;quot;zoo&amp;quot;,&amp;quot;PerformanceAnalytics&amp;quot;,&amp;quot;tidyverse&amp;quot;))&#10;# 加载软件包&#10;suppressMessages({&#10; library(quantmod)&#10; library(quantstrat)&#10; library(PerformanceAnalytics)&#10; library(Tushare)&#10; library(xts)&#10; library(dplyr)&#10; library(zoo)&#10; library(tidyverse)&#10;})&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="清理环境" class="section level1"&gt;&#10;&lt;h1&gt;清理环境&lt;/h1&gt;&#10;&lt;p&gt;第一步，先清理历史环境，避免历史环境的干扰。&lt;/p&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 清理历史环境&#10;rm(list=ls(.blotter), envir=.blotter)&#10;rm(list=ls(.strategy), envir=.strategy)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="策略开发" class="section level1"&gt;&#10;&lt;h1&gt;策略开发&lt;/h1&gt;&#10;&lt;p&gt;下面进入正式开发流程。&lt;/p&gt;&#10;&lt;div id="初始化设置" class="section level2"&gt;&#10;&lt;h2&gt;初始化设置&lt;/h2&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 参数设置&#10;initDate &amp;lt;- &amp;quot;2009-12-31&amp;quot;&#10;fromDate &amp;lt;- &amp;quot;2010-01-01&amp;quot;&#10;endDate &amp;lt;- Sys.Date()&#10;symbol &amp;lt;- &amp;quot;600519.SS&amp;quot;&#10;initEq &amp;lt;- 100000&#10;fastMA &amp;lt;- 5&#10;slowMA &amp;lt;- 20&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="获取数据" class="section level2"&gt;&#10;&lt;h2&gt;获取数据&lt;/h2&gt;&#10;&lt;p&gt;使用quantmod获取贵州茅台数据&lt;/p&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 获取数据&#10;getSymbols(symbol, from=fromDate, to=endDate, src=&amp;quot;yahoo&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;600519.SS&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;maotai &amp;lt;- `600519.SS`&#10;colnames(maotai) &amp;lt;- c(&amp;quot;Open&amp;quot;,&amp;quot;High&amp;quot;,&amp;quot;Low&amp;quot;,&amp;quot;Close&amp;quot;,&amp;quot;Volume&amp;quot;,&amp;quot;Adjusted&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="初始化策略" class="section level2"&gt;&#10;&lt;h2&gt;初始化策略&lt;/h2&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;currency(&amp;quot;RMB&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;RMB&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;stock(symbol, currency=&amp;quot;RMB&amp;quot;, multiplier=1)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;X600519.SS&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;strategy.st &amp;lt;- &amp;quot;maotai_sma&amp;quot;&#10;portfolio.st &amp;lt;- &amp;quot;maotai_portfolio&amp;quot;&#10;account.st &amp;lt;- &amp;quot;maotai_account&amp;quot;&#10;&#10;# 清除旧策略(如果存在)&#10;if(exists(&amp;quot;strategy.st&amp;quot;, where=.strategy)) {&#10; rm.strat(strategy.st)&#10;}&#10;&#10;# 创建组合/账户/策略&#10;initPortf(portfolio.st, symbols=symbol, initDate=initDate)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_portfolio&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;initAcct(account.st, portfolios=portfolio.st, initDate=initDate, initEq=initEq)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_account&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;initOrders(portfolio.st, initDate=initDate)&#10;strategy(strategy.st, store=TRUE)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="添加指标" class="section level2"&gt;&#10;&lt;h2&gt;添加指标&lt;/h2&gt;&#10;&lt;p&gt;这里添加的简单移动平均线(SMA)：&lt;/p&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 添加指标&#10;add.indicator(&#10; strategy.st,&#10; name=&amp;quot;SMA&amp;quot;,&#10; arguments=list(x=quote(Cl(mktdata)), n=fastMA),&#10; label=&amp;quot;fastMA&amp;quot;&#10;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_sma&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;add.indicator(&#10; strategy.st,&#10; name=&amp;quot;SMA&amp;quot;,&#10; arguments=list(x=quote(Cl(mktdata)), n=slowMA),&#10; label=&amp;quot;slowMA&amp;quot;&#10;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_sma&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="添加信号---金叉死叉" class="section level2"&gt;&#10;&lt;h2&gt;添加信号 - 金叉死叉&lt;/h2&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 添加信号&#10;add.signal(&#10; strategy.st,&#10; name=&amp;quot;sigCrossover&amp;quot;,&#10; arguments=list(columns=c(&amp;quot;fastMA&amp;quot;,&amp;quot;slowMA&amp;quot;), relationship=&amp;quot;gt&amp;quot;),&#10; label=&amp;quot;fast.gt.slow&amp;quot;&#10;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_sma&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;add.signal(&#10; strategy.st,&#10; name=&amp;quot;sigCrossover&amp;quot;,&#10; arguments=list(columns=c(&amp;quot;fastMA&amp;quot;,&amp;quot;slowMA&amp;quot;), relationship=&amp;quot;lt&amp;quot;),&#10; label=&amp;quot;fast.lt.slow&amp;quot;&#10;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_sma&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="添加交易规则" class="section level2"&gt;&#10;&lt;h2&gt;添加交易规则&lt;/h2&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;add.rule(&#10; strategy.st,&#10; name=&amp;quot;ruleSignal&amp;quot;,&#10; arguments=list(&#10; sigcol=&amp;quot;fast.gt.slow&amp;quot;,&#10; sigval=TRUE,&#10; orderqty=100,&#10; ordertype=&amp;quot;market&amp;quot;,&#10; orderside=&amp;quot;long&amp;quot;,&#10; replace=FALSE&#10; ),&#10; type=&amp;quot;enter&amp;quot;,&#10; label=&amp;quot;EnterLONG&amp;quot;&#10;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_sma&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;add.rule(&#10; strategy.st,&#10; name=&amp;quot;ruleSignal&amp;quot;,&#10; arguments=list(&#10; sigcol=&amp;quot;fast.lt.slow&amp;quot;,&#10; sigval=TRUE,&#10; orderqty=&amp;quot;all&amp;quot;,&#10; ordertype=&amp;quot;market&amp;quot;,&#10; orderside=&amp;quot;long&amp;quot;,&#10; replace=FALSE&#10; ),&#10; type=&amp;quot;exit&amp;quot;,&#10; label=&amp;quot;ExitLONG&amp;quot;&#10;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_sma&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="策略回测" class="section level1"&gt;&#10;&lt;h1&gt;策略回测&lt;/h1&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;applyStrategy(strategy.st, &#10; portfolios=portfolio.st)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;2010-05-25 00:00:00 600519.SS 100 @ 98.6100692749023&amp;quot;&#10;## [1] &amp;quot;2010-06-01 00:00:00 600519.SS -100 @ 99.6468811035156&amp;quot;&#10;## [1] &amp;quot;2010-06-03 00:00:00 600519.SS 100 @ 101.450035095215&amp;quot;&#10;## [1] &amp;quot;2010-06-23 00:00:00 600519.SS -100 @ 98.9481582641602&amp;quot;&#10;## [1] &amp;quot;2010-07-15 00:00:00 600519.SS 100 @ 99.0458297729492&amp;quot;&#10;## [1] &amp;quot;2010-10-15 00:00:00 600519.SS -100 @ 120.195343017578&amp;quot;&#10;## [1] &amp;quot;2010-10-25 00:00:00 600519.SS 100 @ 129.977462768555&amp;quot;&#10;## [1] &amp;quot;2010-11-02 00:00:00 600519.SS -100 @ 122.216377258301&amp;quot;&#10;## [1] &amp;quot;2010-11-11 00:00:00 600519.SS 100 @ 132.171295166016&amp;quot;&#10;## [1] &amp;quot;2010-12-23 00:00:00 600519.SS -100 @ 143.283248901367&amp;quot;&#10;## [1] &amp;quot;2011-02-11 00:00:00 600519.SS 100 @ 138.940643310547&amp;quot;&#10;## [1] &amp;quot;2011-03-02 00:00:00 600519.SS -100 @ 133.140487670898&amp;quot;&#10;## [1] &amp;quot;2011-03-16 00:00:00 600519.SS 100 @ 136.619079589844&amp;quot;&#10;## [1] &amp;quot;2011-03-31 00:00:00 600519.SS -100 @ 135.123962402344&amp;quot;&#10;## [1] &amp;quot;2011-04-27 00:00:00 600519.SS 100 @ 136.100677490234&amp;quot;&#10;## [1] &amp;quot;2011-08-25 00:00:00 600519.SS -100 @ 171.421493530273&amp;quot;&#10;## [1] &amp;quot;2011-08-29 00:00:00 600519.SS 100 @ 177.909088134766&amp;quot;&#10;## [1] &amp;quot;2011-09-07 00:00:00 600519.SS -100 @ 171.561981201172&amp;quot;&#10;## [1] &amp;quot;2011-10-20 00:00:00 600519.SS 100 @ 157.933883666992&amp;quot;&#10;## [1] &amp;quot;2011-11-18 00:00:00 600519.SS -100 @ 165.760330200195&amp;quot;&#10;## [1] &amp;quot;2011-11-28 00:00:00 600519.SS 100 @ 176.752059936523&amp;quot;&#10;## [1] &amp;quot;2011-12-09 00:00:00 600519.SS -100 @ 165.140487670898&amp;quot;&#10;## [1] &amp;quot;2012-02-07 00:00:00 600519.SS 100 @ 153.603302001953&amp;quot;&#10;## [1] &amp;quot;2012-04-06 00:00:00 600519.SS -100 @ 171.876037597656&amp;quot;&#10;## [1] &amp;quot;2012-04-10 00:00:00 600519.SS 100 @ 171.991729736328&amp;quot;&#10;## [1] &amp;quot;2012-05-21 00:00:00 600519.SS -100 @ 184.454544067383&amp;quot;&#10;## [1] &amp;quot;2012-06-01 00:00:00 600519.SS 100 @ 198.652893066406&amp;quot;&#10;## [1] &amp;quot;2012-06-29 00:00:00 600519.SS -100 @ 197.644622802734&amp;quot;&#10;## [1] &amp;quot;2012-07-04 00:00:00 600519.SS 100 @ 213.768600463867&amp;quot;&#10;## [1] &amp;quot;2012-07-24 00:00:00 600519.SS -100 @ 206.099166870117&amp;quot;&#10;## [1] &amp;quot;2012-08-10 00:00:00 600519.SS 100 @ 205.132232666016&amp;quot;&#10;## [1] &amp;quot;2012-08-17 00:00:00 600519.SS -100 @ 189.768600463867&amp;quot;&#10;## [1] &amp;quot;2012-09-10 00:00:00 600519.SS 100 @ 199.735534667969&amp;quot;&#10;## [1] &amp;quot;2012-09-26 00:00:00 600519.SS -100 @ 194.933883666992&amp;quot;&#10;## [1] &amp;quot;2012-09-28 00:00:00 600519.SS 100 @ 203.140487670898&amp;quot;&#10;## [1] &amp;quot;2012-10-30 00:00:00 600519.SS -100 @ 202.132232666016&amp;quot;&#10;## [1] &amp;quot;2012-11-05 00:00:00 600519.SS 100 @ 200.760330200195&amp;quot;&#10;## [1] &amp;quot;2012-11-07 00:00:00 600519.SS -100 @ 196.256195068359&amp;quot;&#10;## [1] &amp;quot;2012-12-19 00:00:00 600519.SS 100 @ 181.363632202148&amp;quot;&#10;## [1] &amp;quot;2013-01-17 00:00:00 600519.SS -100 @ 169.528930664062&amp;quot;&#10;## [1] &amp;quot;2013-03-12 00:00:00 600519.SS 100 @ 150.561981201172&amp;quot;&#10;## [1] &amp;quot;2013-03-19 00:00:00 600519.SS -100 @ 136.512390136719&amp;quot;&#10;## [1] &amp;quot;2013-04-16 00:00:00 600519.SS 100 @ 143.107437133789&amp;quot;&#10;## [1] &amp;quot;2013-06-17 00:00:00 600519.SS -100 @ 156.59504699707&amp;quot;&#10;## [1] &amp;quot;2013-07-04 00:00:00 600519.SS 100 @ 162.495864868164&amp;quot;&#10;## [1] &amp;quot;2013-07-16 00:00:00 600519.SS -100 @ 157.809921264648&amp;quot;&#10;## [1] &amp;quot;2013-08-14 00:00:00 600519.SS 100 @ 147.677688598633&amp;quot;&#10;## [1] &amp;quot;2013-08-23 00:00:00 600519.SS -100 @ 142.966949462891&amp;quot;&#10;## [1] &amp;quot;2013-10-18 00:00:00 600519.SS 100 @ 118.16529083252&amp;quot;&#10;## [1] &amp;quot;2013-10-30 00:00:00 600519.SS -100 @ 109.578514099121&amp;quot;&#10;## [1] &amp;quot;2013-11-13 00:00:00 600519.SS 100 @ 119.603302001953&amp;quot;&#10;## [1] &amp;quot;2013-11-28 00:00:00 600519.SS -100 @ 117.214874267578&amp;quot;&#10;## [1] &amp;quot;2013-12-02 00:00:00 600519.SS 100 @ 113.041320800781&amp;quot;&#10;## [1] &amp;quot;2013-12-03 00:00:00 600519.SS -100 @ 113.702476501465&amp;quot;&#10;## [1] &amp;quot;2014-01-23 00:00:00 600519.SS 100 @ 110.818183898926&amp;quot;&#10;## [1] &amp;quot;2014-03-31 00:00:00 600519.SS -100 @ 127.85124206543&amp;quot;&#10;## [1] &amp;quot;2014-04-09 00:00:00 600519.SS 100 @ 135&amp;quot;&#10;## [1] &amp;quot;2014-04-30 00:00:00 600519.SS -100 @ 135.438018798828&amp;quot;&#10;## [1] &amp;quot;2014-06-11 00:00:00 600519.SS 100 @ 127.223136901855&amp;quot;&#10;## [1] &amp;quot;2014-08-14 00:00:00 600519.SS -100 @ 146.781814575195&amp;quot;&#10;## [1] &amp;quot;2014-09-05 00:00:00 600519.SS 100 @ 152.281814575195&amp;quot;&#10;## [1] &amp;quot;2014-09-18 00:00:00 600519.SS -100 @ 144.772720336914&amp;quot;&#10;## [1] &amp;quot;2014-10-08 00:00:00 600519.SS 100 @ 146.118179321289&amp;quot;&#10;## [1] &amp;quot;2014-10-13 00:00:00 600519.SS -100 @ 141.909088134766&amp;quot;&#10;## [1] &amp;quot;2014-11-18 00:00:00 600519.SS 100 @ 141.5&amp;quot;&#10;## [1] &amp;quot;2014-11-25 00:00:00 600519.SS -100 @ 140.581817626953&amp;quot;&#10;## [1] &amp;quot;2014-11-27 00:00:00 600519.SS 100 @ 142.43635559082&amp;quot;&#10;## [1] &amp;quot;2015-01-16 00:00:00 600519.SS -100 @ 169.190902709961&amp;quot;&#10;## [1] &amp;quot;2015-02-12 00:00:00 600519.SS 100 @ 166.881820678711&amp;quot;&#10;## [1] &amp;quot;2015-05-19 00:00:00 600519.SS -100 @ 227.309097290039&amp;quot;&#10;## [1] &amp;quot;2015-05-25 00:00:00 600519.SS 100 @ 260.754547119141&amp;quot;&#10;## [1] &amp;quot;2015-06-09 00:00:00 600519.SS -100 @ 235.481811523438&amp;quot;&#10;## [1] &amp;quot;2015-07-07 00:00:00 600519.SS 100 @ 221.981811523438&amp;quot;&#10;## [1] &amp;quot;2015-07-08 00:00:00 600519.SS -100 @ 215.327270507812&amp;quot;&#10;## [1] &amp;quot;2015-07-14 00:00:00 600519.SS 100 @ 226.409088134766&amp;quot;&#10;## [1] &amp;quot;2015-07-21 00:00:00 600519.SS -100 @ 221.660003662109&amp;quot;&#10;## [1] &amp;quot;2015-09-15 00:00:00 600519.SS 100 @ 202&amp;quot;&#10;## [1] &amp;quot;2015-09-29 00:00:00 600519.SS -100 @ 190.169998168945&amp;quot;&#10;## [1] &amp;quot;2015-10-15 00:00:00 600519.SS 100 @ 199.990005493164&amp;quot;&#10;## [1] &amp;quot;2015-11-20 00:00:00 600519.SS -100 @ 213.720001220703&amp;quot;&#10;## [1] &amp;quot;2015-12-07 00:00:00 600519.SS 100 @ 214.509994506836&amp;quot;&#10;## [1] &amp;quot;2015-12-11 00:00:00 600519.SS -100 @ 211.410003662109&amp;quot;&#10;## [1] &amp;quot;2015-12-21 00:00:00 600519.SS 100 @ 227.029998779297&amp;quot;&#10;## [1] &amp;quot;2016-01-05 00:00:00 600519.SS -100 @ 212.820007324219&amp;quot;&#10;## [1] &amp;quot;2016-02-05 00:00:00 600519.SS 100 @ 203.869995117188&amp;quot;&#10;## [1] &amp;quot;2016-04-18 00:00:00 600519.SS -100 @ 243.679992675781&amp;quot;&#10;## [1] &amp;quot;2016-05-03 00:00:00 600519.SS 100 @ 260&amp;quot;&#10;## [1] &amp;quot;2016-05-20 00:00:00 600519.SS -100 @ 251.259994506836&amp;quot;&#10;## [1] &amp;quot;2016-05-27 00:00:00 600519.SS 100 @ 252.440002441406&amp;quot;&#10;## [1] &amp;quot;2016-08-03 00:00:00 600519.SS -100 @ 306.820007324219&amp;quot;&#10;## [1] &amp;quot;2016-08-12 00:00:00 600519.SS 100 @ 316.970001220703&amp;quot;&#10;## [1] &amp;quot;2016-08-22 00:00:00 600519.SS -100 @ 307.320007324219&amp;quot;&#10;## [1] &amp;quot;2016-10-13 00:00:00 600519.SS 100 @ 303.890014648438&amp;quot;&#10;## [1] &amp;quot;2016-11-18 00:00:00 600519.SS -100 @ 310&amp;quot;&#10;## [1] &amp;quot;2016-11-29 00:00:00 600519.SS 100 @ 323.959991455078&amp;quot;&#10;## [1] &amp;quot;2016-12-26 00:00:00 600519.SS -100 @ 324.480010986328&amp;quot;&#10;## [1] &amp;quot;2017-01-04 00:00:00 600519.SS 100 @ 351.910003662109&amp;quot;&#10;## [1] &amp;quot;2017-02-07 00:00:00 600519.SS -100 @ 343.579986572266&amp;quot;&#10;## [1] &amp;quot;2017-02-16 00:00:00 600519.SS 100 @ 348.089996337891&amp;quot;&#10;## [1] &amp;quot;2017-07-05 00:00:00 600519.SS -100 @ 460.130004882812&amp;quot;&#10;## [1] &amp;quot;2017-07-25 00:00:00 600519.SS 100 @ 477.959991455078&amp;quot;&#10;## [1] &amp;quot;2017-09-07 00:00:00 600519.SS -100 @ 481.269989013672&amp;quot;&#10;## [1] &amp;quot;2017-09-19 00:00:00 600519.SS 100 @ 496.950012207031&amp;quot;&#10;## [1] &amp;quot;2017-11-27 00:00:00 600519.SS -100 @ 621.289978027344&amp;quot;&#10;## [1] &amp;quot;2017-12-15 00:00:00 600519.SS 100 @ 653.789978027344&amp;quot;&#10;## [1] &amp;quot;2018-01-31 00:00:00 600519.SS -100 @ 764.539978027344&amp;quot;&#10;## [1] &amp;quot;2018-02-28 00:00:00 600519.SS 100 @ 725.619995117188&amp;quot;&#10;## [1] &amp;quot;2018-03-14 00:00:00 600519.SS -100 @ 726.880004882812&amp;quot;&#10;## [1] &amp;quot;2018-03-15 00:00:00 600519.SS 100 @ 746.469970703125&amp;quot;&#10;## [1] &amp;quot;2018-03-27 00:00:00 600519.SS -100 @ 714.739990234375&amp;quot;&#10;## [1] &amp;quot;2018-05-10 00:00:00 600519.SS 100 @ 714.190002441406&amp;quot;&#10;## [1] &amp;quot;2018-06-25 00:00:00 600519.SS -100 @ 765.559997558594&amp;quot;&#10;## [1] &amp;quot;2018-07-17 00:00:00 600519.SS 100 @ 742.429992675781&amp;quot;&#10;## [1] &amp;quot;2018-08-02 00:00:00 600519.SS -100 @ 695.840026855469&amp;quot;&#10;## [1] &amp;quot;2018-08-30 00:00:00 600519.SS 100 @ 680.400024414062&amp;quot;&#10;## [1] &amp;quot;2018-09-06 00:00:00 600519.SS -100 @ 644&amp;quot;&#10;## [1] &amp;quot;2018-09-21 00:00:00 600519.SS 100 @ 700.010009765625&amp;quot;&#10;## [1] &amp;quot;2018-10-16 00:00:00 600519.SS -100 @ 667.140014648438&amp;quot;&#10;## [1] &amp;quot;2018-12-04 00:00:00 600519.SS 100 @ 602.22998046875&amp;quot;&#10;## [1] &amp;quot;2018-12-24 00:00:00 600519.SS -100 @ 568&amp;quot;&#10;## [1] &amp;quot;2019-01-07 00:00:00 600519.SS 100 @ 605.489990234375&amp;quot;&#10;## [1] &amp;quot;2019-05-09 00:00:00 600519.SS -100 @ 858.809997558594&amp;quot;&#10;## [1] &amp;quot;2019-06-03 00:00:00 600519.SS 100 @ 892&amp;quot;&#10;## [1] &amp;quot;2019-06-06 00:00:00 600519.SS -100 @ 862.130004882812&amp;quot;&#10;## [1] &amp;quot;2019-06-14 00:00:00 600519.SS 100 @ 913&amp;quot;&#10;## [1] &amp;quot;2019-07-16 00:00:00 600519.SS -100 @ 968&amp;quot;&#10;## [1] &amp;quot;2019-08-01 00:00:00 600519.SS 100 @ 959.299987792969&amp;quot;&#10;## [1] &amp;quot;2019-08-06 00:00:00 600519.SS -100 @ 946.299987792969&amp;quot;&#10;## [1] &amp;quot;2019-08-13 00:00:00 600519.SS 100 @ 1017.95001220703&amp;quot;&#10;## [1] &amp;quot;2019-09-17 00:00:00 600519.SS -100 @ 1094.01000976562&amp;quot;&#10;## [1] &amp;quot;2019-09-23 00:00:00 600519.SS 100 @ 1149&amp;quot;&#10;## [1] &amp;quot;2019-10-25 00:00:00 600519.SS -100 @ 1171.34997558594&amp;quot;&#10;## [1] &amp;quot;2019-10-31 00:00:00 600519.SS 100 @ 1180.01000976562&amp;quot;&#10;## [1] &amp;quot;2019-11-27 00:00:00 600519.SS -100 @ 1189.94995117188&amp;quot;&#10;## [1] &amp;quot;2019-12-20 00:00:00 600519.SS 100 @ 1146.30004882812&amp;quot;&#10;## [1] &amp;quot;2019-12-26 00:00:00 600519.SS -100 @ 1135.09997558594&amp;quot;&#10;## [1] &amp;quot;2019-12-31 00:00:00 600519.SS 100 @ 1183&amp;quot;&#10;## [1] &amp;quot;2020-01-06 00:00:00 600519.SS -100 @ 1077.98999023438&amp;quot;&#10;## [1] &amp;quot;2020-02-14 00:00:00 600519.SS 100 @ 1088&amp;quot;&#10;## [1] &amp;quot;2020-03-02 00:00:00 600519.SS -100 @ 1086.01000976562&amp;quot;&#10;## [1] &amp;quot;2020-03-05 00:00:00 600519.SS 100 @ 1171&amp;quot;&#10;## [1] &amp;quot;2020-03-18 00:00:00 600519.SS -100 @ 1007.98999023438&amp;quot;&#10;## [1] &amp;quot;2020-04-03 00:00:00 600519.SS 100 @ 1139.7900390625&amp;quot;&#10;## [1] &amp;quot;2020-07-29 00:00:00 600519.SS -100 @ 1672&amp;quot;&#10;## [1] &amp;quot;2020-08-19 00:00:00 600519.SS 100 @ 1687&amp;quot;&#10;## [1] &amp;quot;2020-09-11 00:00:00 600519.SS -100 @ 1733&amp;quot;&#10;## [1] &amp;quot;2020-09-17 00:00:00 600519.SS 100 @ 1670.52001953125&amp;quot;&#10;## [1] &amp;quot;2020-09-18 00:00:00 600519.SS -100 @ 1695&amp;quot;&#10;## [1] &amp;quot;2020-10-14 00:00:00 600519.SS 100 @ 1729&amp;quot;&#10;## [1] &amp;quot;2020-10-29 00:00:00 600519.SS -100 @ 1676&amp;quot;&#10;## [1] &amp;quot;2020-11-10 00:00:00 600519.SS 100 @ 1745&amp;quot;&#10;## [1] &amp;quot;2021-03-01 00:00:00 600519.SS -100 @ 2158&amp;quot;&#10;## [1] &amp;quot;2021-04-01 00:00:00 600519.SS 100 @ 2044.5&amp;quot;&#10;## [1] &amp;quot;2021-04-15 00:00:00 600519.SS -100 @ 2015.59997558594&amp;quot;&#10;## [1] &amp;quot;2021-04-20 00:00:00 600519.SS 100 @ 2094.80004882812&amp;quot;&#10;## [1] &amp;quot;2021-05-06 00:00:00 600519.SS -100 @ 1959&amp;quot;&#10;## [1] &amp;quot;2021-05-20 00:00:00 600519.SS 100 @ 2058.8798828125&amp;quot;&#10;## [1] &amp;quot;2021-06-18 00:00:00 600519.SS -100 @ 2090.93994140625&amp;quot;&#10;## [1] &amp;quot;2021-09-08 00:00:00 600519.SS 100 @ 1633.09997558594&amp;quot;&#10;## [1] &amp;quot;2021-11-01 00:00:00 600519.SS -100 @ 1803&amp;quot;&#10;## [1] &amp;quot;2021-11-23 00:00:00 600519.SS 100 @ 1896.43005371094&amp;quot;&#10;## [1] &amp;quot;2022-01-05 00:00:00 600519.SS -100 @ 2024&amp;quot;&#10;## [1] &amp;quot;2022-01-28 00:00:00 600519.SS 100 @ 1887&amp;quot;&#10;## [1] &amp;quot;2022-02-07 00:00:00 600519.SS -100 @ 1867.9599609375&amp;quot;&#10;## [1] &amp;quot;2022-04-07 00:00:00 600519.SS 100 @ 1765&amp;quot;&#10;## [1] &amp;quot;2022-04-28 00:00:00 600519.SS -100 @ 1835&amp;quot;&#10;## [1] &amp;quot;2022-05-05 00:00:00 600519.SS 100 @ 1837&amp;quot;&#10;## [1] &amp;quot;2022-05-13 00:00:00 600519.SS -100 @ 1778.23999023438&amp;quot;&#10;## [1] &amp;quot;2022-06-02 00:00:00 600519.SS 100 @ 1786&amp;quot;&#10;## [1] &amp;quot;2022-07-14 00:00:00 600519.SS -100 @ 1953&amp;quot;&#10;## [1] &amp;quot;2022-08-18 00:00:00 600519.SS 100 @ 1895.5&amp;quot;&#10;## [1] &amp;quot;2022-08-23 00:00:00 600519.SS -100 @ 1870.01000976562&amp;quot;&#10;## [1] &amp;quot;2022-09-20 00:00:00 600519.SS 100 @ 1878&amp;quot;&#10;## [1] &amp;quot;2022-09-23 00:00:00 600519.SS -100 @ 1834.43005371094&amp;quot;&#10;## [1] &amp;quot;2022-09-30 00:00:00 600519.SS 100 @ 1872.5&amp;quot;&#10;## [1] &amp;quot;2022-10-12 00:00:00 600519.SS -100 @ 1760&amp;quot;&#10;## [1] &amp;quot;2022-11-16 00:00:00 600519.SS 100 @ 1585.25&amp;quot;&#10;## [1] &amp;quot;2023-01-03 00:00:00 600519.SS -100 @ 1730.01000976562&amp;quot;&#10;## [1] &amp;quot;2023-01-09 00:00:00 600519.SS 100 @ 1841.19995117188&amp;quot;&#10;## [1] &amp;quot;2023-02-07 00:00:00 600519.SS -100 @ 1797&amp;quot;&#10;## [1] &amp;quot;2023-02-21 00:00:00 600519.SS 100 @ 1867&amp;quot;&#10;## [1] &amp;quot;2023-02-28 00:00:00 600519.SS -100 @ 1813.73999023438&amp;quot;&#10;## [1] &amp;quot;2023-03-30 00:00:00 600519.SS 100 @ 1800&amp;quot;&#10;## [1] &amp;quot;2023-04-13 00:00:00 600519.SS -100 @ 1723&amp;quot;&#10;## [1] &amp;quot;2023-05-08 00:00:00 600519.SS 100 @ 1720.52001953125&amp;quot;&#10;## [1] &amp;quot;2023-05-10 00:00:00 600519.SS -100 @ 1725&amp;quot;&#10;## [1] &amp;quot;2023-06-15 00:00:00 600519.SS 100 @ 1755&amp;quot;&#10;## [1] &amp;quot;2023-07-07 00:00:00 600519.SS -100 @ 1690.03002929688&amp;quot;&#10;## [1] &amp;quot;2023-07-18 00:00:00 600519.SS 100 @ 1722.80004882812&amp;quot;&#10;## [1] &amp;quot;2023-08-17 00:00:00 600519.SS -100 @ 1828.05004882812&amp;quot;&#10;## [1] &amp;quot;2023-09-01 00:00:00 600519.SS 100 @ 1851.05004882812&amp;quot;&#10;## [1] &amp;quot;2023-09-14 00:00:00 600519.SS -100 @ 1818.68994140625&amp;quot;&#10;## [1] &amp;quot;2023-11-03 00:00:00 600519.SS 100 @ 1811.23999023438&amp;quot;&#10;## [1] &amp;quot;2023-11-29 00:00:00 600519.SS -100 @ 1774.7099609375&amp;quot;&#10;## [1] &amp;quot;2024-01-02 00:00:00 600519.SS 100 @ 1685.01000976562&amp;quot;&#10;## [1] &amp;quot;2024-01-09 00:00:00 600519.SS -100 @ 1641&amp;quot;&#10;## [1] &amp;quot;2024-02-08 00:00:00 600519.SS 100 @ 1706&amp;quot;&#10;## [1] &amp;quot;2024-03-11 00:00:00 600519.SS -100 @ 1694.48999023438&amp;quot;&#10;## [1] &amp;quot;2024-03-14 00:00:00 600519.SS 100 @ 1716.63000488281&amp;quot;&#10;## [1] &amp;quot;2024-03-29 00:00:00 600519.SS -100 @ 1702.90002441406&amp;quot;&#10;## [1] &amp;quot;2024-04-02 00:00:00 600519.SS 100 @ 1713.98999023438&amp;quot;&#10;## [1] &amp;quot;2024-04-09 00:00:00 600519.SS -100 @ 1662.21997070312&amp;quot;&#10;## [1] &amp;quot;2024-04-26 00:00:00 600519.SS 100 @ 1709.43005371094&amp;quot;&#10;## [1] &amp;quot;2024-05-20 00:00:00 600519.SS -100 @ 1709&amp;quot;&#10;## [1] &amp;quot;2024-07-18 00:00:00 600519.SS 100 @ 1497.51000976562&amp;quot;&#10;## [1] &amp;quot;2024-07-26 00:00:00 600519.SS -100 @ 1422.18994140625&amp;quot;&#10;## [1] &amp;quot;2024-08-16 00:00:00 600519.SS 100 @ 1431.19995117188&amp;quot;&#10;## [1] &amp;quot;2024-08-28 00:00:00 600519.SS -100 @ 1389&amp;quot;&#10;## [1] &amp;quot;2024-09-30 00:00:00 600519.SS 100 @ 1748&amp;quot;&#10;## [1] &amp;quot;2024-10-29 00:00:00 600519.SS -100 @ 1531.61999511719&amp;quot;&#10;## [1] &amp;quot;2024-11-08 00:00:00 600519.SS 100 @ 1609.96997070312&amp;quot;&#10;## [1] &amp;quot;2024-11-20 00:00:00 600519.SS -100 @ 1544.81005859375&amp;quot;&#10;## [1] &amp;quot;2024-12-13 00:00:00 600519.SS 100 @ 1519&amp;quot;&#10;## [1] &amp;quot;2024-12-27 00:00:00 600519.SS -100 @ 1528.96997070312&amp;quot;&#10;## [1] &amp;quot;2025-02-17 00:00:00 600519.SS 100 @ 1471.61999511719&amp;quot;&#10;## [1] &amp;quot;2025-04-03 00:00:00 600519.SS -100 @ 1568.88000488281&amp;quot;&#10;## [1] &amp;quot;2025-04-22 00:00:00 600519.SS 100 @ 1548.80004882812&amp;quot;&#10;## [1] &amp;quot;2025-04-25 00:00:00 600519.SS -100 @ 1550&amp;quot;&#10;## [1] &amp;quot;2025-05-09 00:00:00 600519.SS 100 @ 1591.18005371094&amp;quot;&#10;## [1] &amp;quot;2025-05-27 00:00:00 600519.SS -100 @ 1543.90002441406&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="更新组合和账户" class="section level1"&gt;&#10;&lt;h1&gt;更新组合和账户&lt;/h1&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;updatePortf(portfolio.st)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_portfolio&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;updateAcct(account.st)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_account&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;updateEndEq(account.st)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;maotai_account&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div id="分析结果" class="section level1"&gt;&#10;&lt;h1&gt;分析结果&lt;/h1&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 获取交易数据&#10;trades &amp;lt;- getTxns(Portfolio = portfolio.st, Symbol = symbol)&#10;print(trades)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost&#10;## 2009-12-31 00:00:00 0 0.00000 0 0.000 0.00000&#10;## 2010-05-25 08:00:00 100 98.61007 0 9861.007 98.61007&#10;## 2010-06-01 08:00:00 -100 99.64688 0 -9964.688 99.64688&#10;## 2010-06-03 08:00:00 100 101.45004 0 10145.004 101.45004&#10;## 2010-06-23 08:00:00 -100 98.94816 0 -9894.816 98.94816&#10;## 2010-07-15 08:00:00 100 99.04583 0 9904.583 99.04583&#10;## 2010-10-15 08:00:00 -100 120.19534 0 -12019.534 120.19534&#10;## 2010-10-25 08:00:00 100 129.97746 0 12997.746 129.97746&#10;## 2010-11-02 08:00:00 -100 122.21638 0 -12221.638 122.21638&#10;## 2010-11-11 08:00:00 100 132.17130 0 13217.130 132.17130&#10;## ... &#10;## 2024-11-08 08:00:00 100 1609.96997 0 160996.997 1609.96997&#10;## 2024-11-20 08:00:00 -100 1544.81006 0 -154481.006 1544.81006&#10;## 2024-12-13 08:00:00 100 1519.00000 0 151900.000 1519.00000&#10;## 2024-12-27 08:00:00 -100 1528.96997 0 -152896.997 1528.96997&#10;## 2025-02-17 08:00:00 100 1471.62000 0 147162.000 1471.62000&#10;## 2025-04-03 08:00:00 -100 1568.88000 0 -156888.000 1568.88000&#10;## 2025-04-22 08:00:00 100 1548.80005 0 154880.005 1548.80005&#10;## 2025-04-25 08:00:00 -100 1550.00000 0 -155000.000 1550.00000&#10;## 2025-05-09 08:00:00 100 1591.18005 0 159118.005 1591.18005&#10;## 2025-05-27 08:00:00 -100 1543.90002 0 -154390.002 1543.90002&#10;## Net.Txn.Realized.PL&#10;## 2009-12-31 00:00:00 0.0000&#10;## 2010-05-25 08:00:00 0.0000&#10;## 2010-06-01 08:00:00 103.6812&#10;## 2010-06-03 08:00:00 0.0000&#10;## 2010-06-23 08:00:00 -250.1877&#10;## 2010-07-15 08:00:00 0.0000&#10;## 2010-10-15 08:00:00 2114.9513&#10;## 2010-10-25 08:00:00 0.0000&#10;## 2010-11-02 08:00:00 -776.1086&#10;## 2010-11-11 08:00:00 0.0000&#10;## ... &#10;## 2024-11-08 08:00:00 0.0000&#10;## 2024-11-20 08:00:00 -6515.9912&#10;## 2024-12-13 08:00:00 0.0000&#10;## 2024-12-27 08:00:00 996.9971&#10;## 2025-02-17 08:00:00 0.0000&#10;## 2025-04-03 08:00:00 9726.0010&#10;## 2025-04-22 08:00:00 0.0000&#10;## 2025-04-25 08:00:00 119.9951&#10;## 2025-05-09 08:00:00 0.0000&#10;## 2025-05-27 08:00:00 -4728.0029&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 获取交易统计数据&#10;tstats &amp;lt;- tradeStats(portfolio.st)&#10;print(tstats)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Portfolio Symbol Num.Txns Num.Trades Net.Trading.PL&#10;## 600519.SS maotai_portfolio 600519.SS 220 110 104460&#10;## Avg.Trade.PL Med.Trade.PL Largest.Winner Largest.Loser Gross.Profits&#10;## 600519.SS 949.6362 -435.6613 53221 -21638 312497.1&#10;## Gross.Losses Std.Dev.Trade.PL Std.Err.Trade.PL Percent.Positive&#10;## 600519.SS -208037.1 8924.596 850.9269 40.90909&#10;## Percent.Negative Profit.Factor Avg.Win.Trade Med.Win.Trade&#10;## 600519.SS 59.09091 1.502122 6944.381 2675.455&#10;## Avg.Losing.Trade Med.Losing.Trade Avg.Daily.PL Med.Daily.PL&#10;## 600519.SS -3200.571 -1404.959 949.6362 -435.6613&#10;## Std.Dev.Daily.PL Std.Err.Daily.PL Ann.Sharpe Max.Drawdown&#10;## 600519.SS 8924.596 850.9269 1.689153 -88252.01&#10;## Profit.To.Max.Draw Avg.WinLoss.Ratio Med.WinLoss.Ratio Max.Equity&#10;## 600519.SS 1.183656 2.169731 1.904294 185832&#10;## Min.Equity End.Equity&#10;## 600519.SS -146.5065 104460&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 查看持仓情况&#10;positions &amp;lt;- getPos(Portfolio = portfolio.st, Symbol = symbol, Date = &amp;quot;2020-12-31&amp;quot;)&#10;print(positions)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Pos.Qty Pos.Avg.Cost&#10;## 2020-11-10 08:00:00 100 1745&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 获取投资组合的收益率&#10;returns &amp;lt;- PortfReturns(Account = account.st)&#10;&#10;# 计算夏普比率，假设无风险利率为0.02&#10;sharpe_ratio &amp;lt;- SharpeRatio(returns, Rf = 0.02)&#10;&#10;# 计算最大回撤&#10;max_drawdown &amp;lt;- maxDrawdown(returns)&#10;&#10;print(paste0(&amp;quot;夏普比率: &amp;quot;, sharpe_ratio))&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;夏普比率: -1.37222406503698&amp;quot; &amp;quot;夏普比率: -1.45706193297599&amp;quot;&#10;## [3] &amp;quot;夏普比率: -1.45706193297599&amp;quot; &amp;quot;夏普比率: -1.41395097373399&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;print(paste0(&amp;quot;最大回撤: &amp;quot;, max_drawdown))&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;最大回撤: 0.66676665654044&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 获取策略对象&#10;strategyObj &amp;lt;- getStrategy(strategy.st)&#10;&#10;str(strategyObj)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## List of 10&#10;## $ name : chr &amp;quot;maotai_sma&amp;quot;&#10;## $ assets : NULL&#10;## $ indicators :List of 2&#10;## ..$ fastMA:List of 5&#10;## .. ..$ name : chr &amp;quot;SMA&amp;quot;&#10;## .. ..$ label : chr &amp;quot;fastMA&amp;quot;&#10;## .. ..$ enabled : logi TRUE&#10;## .. ..$ arguments:List of 2&#10;## .. .. ..$ x: language Cl(mktdata)&#10;## .. .. ..$ n: num 5&#10;## .. ..$ call : language add.indicator(strategy = strategy.st, name = &amp;quot;SMA&amp;quot;, arguments = list(x = quote(Cl(mktdata)), n = fastMA), label = &amp;quot;fastMA&amp;quot;)&#10;## .. ..- attr(*, &amp;quot;class&amp;quot;)= chr &amp;quot;strat_indicator&amp;quot;&#10;## ..$ slowMA:List of 5&#10;## .. ..$ name : chr &amp;quot;SMA&amp;quot;&#10;## .. ..$ label : chr &amp;quot;slowMA&amp;quot;&#10;## .. ..$ enabled : logi TRUE&#10;## .. ..$ arguments:List of 2&#10;## .. .. ..$ x: language Cl(mktdata)&#10;## .. .. ..$ n: num 20&#10;## .. ..$ call : language add.indicator(strategy = strategy.st, name = &amp;quot;SMA&amp;quot;, arguments = list(x = quote(Cl(mktdata)), n = slowMA), label = &amp;quot;slowMA&amp;quot;)&#10;## .. ..- attr(*, &amp;quot;class&amp;quot;)= chr &amp;quot;strat_indicator&amp;quot;&#10;## $ signals :List of 2&#10;## ..$ :List of 5&#10;## .. ..$ name : chr &amp;quot;sigCrossover&amp;quot;&#10;## .. ..$ label : chr &amp;quot;fast.gt.slow&amp;quot;&#10;## .. ..$ enabled : logi TRUE&#10;## .. ..$ arguments:List of 3&#10;## .. .. ..$ columns : chr [1:2] &amp;quot;fastMA&amp;quot; &amp;quot;slowMA&amp;quot;&#10;## .. .. ..$ relationship: chr &amp;quot;gt&amp;quot;&#10;## .. .. ..$ label : chr &amp;quot;fast.gt.slow&amp;quot;&#10;## .. ..$ call : language add.signal(strategy = strategy.st, name = &amp;quot;sigCrossover&amp;quot;, arguments = list(columns = c(&amp;quot;fastMA&amp;quot;, &amp;quot;slowMA&amp;quot;), | __truncated__&#10;## .. ..- attr(*, &amp;quot;class&amp;quot;)= chr &amp;quot;strat_signal&amp;quot;&#10;## ..$ :List of 5&#10;## .. ..$ name : chr &amp;quot;sigCrossover&amp;quot;&#10;## .. ..$ label : chr &amp;quot;fast.lt.slow&amp;quot;&#10;## .. ..$ enabled : logi TRUE&#10;## .. ..$ arguments:List of 3&#10;## .. .. ..$ columns : chr [1:2] &amp;quot;fastMA&amp;quot; &amp;quot;slowMA&amp;quot;&#10;## .. .. ..$ relationship: chr &amp;quot;lt&amp;quot;&#10;## .. .. ..$ label : chr &amp;quot;fast.lt.slow&amp;quot;&#10;## .. ..$ call : language add.signal(strategy = strategy.st, name = &amp;quot;sigCrossover&amp;quot;, arguments = list(columns = c(&amp;quot;fastMA&amp;quot;, &amp;quot;slowMA&amp;quot;), | __truncated__&#10;## .. ..- attr(*, &amp;quot;class&amp;quot;)= chr &amp;quot;strat_signal&amp;quot;&#10;## $ rules :List of 3&#10;## ..$ order: list()&#10;## ..$ enter:List of 1&#10;## .. ..$ :List of 7&#10;## .. .. ..$ name :function (mktdata = mktdata, timestamp, sigcol, sigval, orderqty = 0, ordertype, &#10;## orderside = NULL, orderset = NULL, threshold = NULL, tmult = FALSE, &#10;## replace = TRUE, delay = 1e-04, osFUN = &amp;quot;osNoOp&amp;quot;, pricemethod = c(&amp;quot;market&amp;quot;, &#10;## &amp;quot;opside&amp;quot;, &amp;quot;active&amp;quot;), portfolio, symbol, ..., ruletype, TxnFees = 0, &#10;## prefer = NULL, sethold = FALSE, label = &amp;quot;&amp;quot;, order.price = NULL, chain.price = NULL, &#10;## time.in.force = &amp;quot;&amp;quot;) &#10;## .. .. ..$ type : chr &amp;quot;enter&amp;quot;&#10;## .. .. ..$ enabled : logi TRUE&#10;## .. .. ..$ label : chr &amp;quot;EnterLONG&amp;quot;&#10;## .. .. ..$ arguments:List of 6&#10;## .. .. .. ..$ sigcol : chr &amp;quot;fast.gt.slow&amp;quot;&#10;## .. .. .. ..$ sigval : logi TRUE&#10;## .. .. .. ..$ orderqty : num 100&#10;## .. .. .. ..$ ordertype: chr &amp;quot;market&amp;quot;&#10;## .. .. .. ..$ orderside: chr &amp;quot;long&amp;quot;&#10;## .. .. .. ..$ replace : logi FALSE&#10;## .. .. ..$ path.dep : logi TRUE&#10;## .. .. ..$ call : language add.rule(strategy = strategy.st, name = &amp;quot;ruleSignal&amp;quot;, arguments = list(sigcol = &amp;quot;fast.gt.slow&amp;quot;, sigval = TRU| __truncated__ ...&#10;## .. .. ..- attr(*, &amp;quot;class&amp;quot;)= chr &amp;quot;trade_rule&amp;quot;&#10;## ..$ exit :List of 1&#10;## .. ..$ :List of 7&#10;## .. .. ..$ name :function (mktdata = mktdata, timestamp, sigcol, sigval, orderqty = 0, ordertype, &#10;## orderside = NULL, orderset = NULL, threshold = NULL, tmult = FALSE, &#10;## replace = TRUE, delay = 1e-04, osFUN = &amp;quot;osNoOp&amp;quot;, pricemethod = c(&amp;quot;market&amp;quot;, &#10;## &amp;quot;opside&amp;quot;, &amp;quot;active&amp;quot;), portfolio, symbol, ..., ruletype, TxnFees = 0, &#10;## prefer = NULL, sethold = FALSE, label = &amp;quot;&amp;quot;, order.price = NULL, chain.price = NULL, &#10;## time.in.force = &amp;quot;&amp;quot;) &#10;## .. .. ..$ type : chr &amp;quot;exit&amp;quot;&#10;## .. .. ..$ enabled : logi TRUE&#10;## .. .. ..$ label : chr &amp;quot;ExitLONG&amp;quot;&#10;## .. .. ..$ arguments:List of 6&#10;## .. .. .. ..$ sigcol : chr &amp;quot;fast.lt.slow&amp;quot;&#10;## .. .. .. ..$ sigval : logi TRUE&#10;## .. .. .. ..$ orderqty : chr &amp;quot;all&amp;quot;&#10;## .. .. .. ..$ ordertype: chr &amp;quot;market&amp;quot;&#10;## .. .. .. ..$ orderside: chr &amp;quot;long&amp;quot;&#10;## .. .. .. ..$ replace : logi FALSE&#10;## .. .. ..$ path.dep : logi TRUE&#10;## .. .. ..$ call : language add.rule(strategy = strategy.st, name = &amp;quot;ruleSignal&amp;quot;, arguments = list(sigcol = &amp;quot;fast.lt.slow&amp;quot;, sigval = TRU| __truncated__ ...&#10;## .. .. ..- attr(*, &amp;quot;class&amp;quot;)= chr &amp;quot;trade_rule&amp;quot;&#10;## $ constraints: NULL&#10;## $ init : list()&#10;## $ wrapup : list()&#10;## $ trials : num 6&#10;## $ call : language strategy(name = strategy.st, store = TRUE)&#10;## - attr(*, &amp;quot;class&amp;quot;)= chr &amp;quot;strategy&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 查看指标数据&#10;indicator_data &amp;lt;- strategyObj$indicators&#10;print(indicator_data)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $fastMA&#10;## $name&#10;## [1] &amp;quot;SMA&amp;quot;&#10;## &#10;## $label&#10;## [1] &amp;quot;fastMA&amp;quot;&#10;## &#10;## $enabled&#10;## [1] TRUE&#10;## &#10;## $arguments&#10;## $arguments$x&#10;## Cl(mktdata)&#10;## &#10;## $arguments$n&#10;## [1] 5&#10;## &#10;## &#10;## $call&#10;## add.indicator(strategy = strategy.st, name = &amp;quot;SMA&amp;quot;, arguments = list(x = quote(Cl(mktdata)), &#10;## n = fastMA), label = &amp;quot;fastMA&amp;quot;)&#10;## &#10;## attr(,&amp;quot;class&amp;quot;)&#10;## [1] &amp;quot;strat_indicator&amp;quot;&#10;## &#10;## $slowMA&#10;## $name&#10;## [1] &amp;quot;SMA&amp;quot;&#10;## &#10;## $label&#10;## [1] &amp;quot;slowMA&amp;quot;&#10;## &#10;## $enabled&#10;## [1] TRUE&#10;## &#10;## $arguments&#10;## $arguments$x&#10;## Cl(mktdata)&#10;## &#10;## $arguments$n&#10;## [1] 20&#10;## &#10;## &#10;## $call&#10;## add.indicator(strategy = strategy.st, name = &amp;quot;SMA&amp;quot;, arguments = list(x = quote(Cl(mktdata)), &#10;## n = slowMA), label = &amp;quot;slowMA&amp;quot;)&#10;## &#10;## attr(,&amp;quot;class&amp;quot;)&#10;## [1] &amp;quot;strat_indicator&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 查看信号数据&#10;signal_data &amp;lt;- strategyObj$signals&#10;print(signal_data)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [[1]]&#10;## $name&#10;## [1] &amp;quot;sigCrossover&amp;quot;&#10;## &#10;## $label&#10;## [1] &amp;quot;fast.gt.slow&amp;quot;&#10;## &#10;## $enabled&#10;## [1] TRUE&#10;## &#10;## $arguments&#10;## $arguments$columns&#10;## [1] &amp;quot;fastMA&amp;quot; &amp;quot;slowMA&amp;quot;&#10;## &#10;## $arguments$relationship&#10;## [1] &amp;quot;gt&amp;quot;&#10;## &#10;## $arguments$label&#10;## [1] &amp;quot;fast.gt.slow&amp;quot;&#10;## &#10;## &#10;## $call&#10;## add.signal(strategy = strategy.st, name = &amp;quot;sigCrossover&amp;quot;, arguments = list(columns = c(&amp;quot;fastMA&amp;quot;, &#10;## &amp;quot;slowMA&amp;quot;), relationship = &amp;quot;gt&amp;quot;), label = &amp;quot;fast.gt.slow&amp;quot;)&#10;## &#10;## attr(,&amp;quot;class&amp;quot;)&#10;## [1] &amp;quot;strat_signal&amp;quot;&#10;## &#10;## [[2]]&#10;## $name&#10;## [1] &amp;quot;sigCrossover&amp;quot;&#10;## &#10;## $label&#10;## [1] &amp;quot;fast.lt.slow&amp;quot;&#10;## &#10;## $enabled&#10;## [1] TRUE&#10;## &#10;## $arguments&#10;## $arguments$columns&#10;## [1] &amp;quot;fastMA&amp;quot; &amp;quot;slowMA&amp;quot;&#10;## &#10;## $arguments$relationship&#10;## [1] &amp;quot;lt&amp;quot;&#10;## &#10;## $arguments$label&#10;## [1] &amp;quot;fast.lt.slow&amp;quot;&#10;## &#10;## &#10;## $call&#10;## add.signal(strategy = strategy.st, name = &amp;quot;sigCrossover&amp;quot;, arguments = list(columns = c(&amp;quot;fastMA&amp;quot;, &#10;## &amp;quot;slowMA&amp;quot;), relationship = &amp;quot;lt&amp;quot;), label = &amp;quot;fast.lt.slow&amp;quot;)&#10;## &#10;## attr(,&amp;quot;class&amp;quot;)&#10;## [1] &amp;quot;strat_signal&amp;quot;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 绘制权益曲线&#10;equity &amp;lt;- getAccount(account.st)$summary$End.Eq&#10;plot(equity, main=&amp;quot;Strategy Equity Curve&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;img src="https://gewutang.cn/2025/05/25/sma/index_files/figure-html/ana-1.png" width="672" /&gt;&lt;/p&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 绘制持仓和交易图表&#10;chart.Posn(portfolio.st, Symbol=symbol, TA=&amp;quot;add_SMA(n=fastMA,col=&amp;#39;blue&amp;#39;);add_SMA(n=slowMA,col=&amp;#39;red&amp;#39;)&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;img src="https://gewutang.cn/2025/05/25/sma/index_files/figure-html/ana-2.png" width="672" /&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div id="结语" class="section level1"&gt;&#10;&lt;h1&gt;结语&lt;/h1&gt;&#10;&lt;p&gt;基于 R 软件进行量化回测一件极度舒适的事情。但由于本文未对回测指标（即 SMA ）的参数做优化，因此，本文仅供技术探讨，不构成策略或投资建议。&lt;/p&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>技术指标在量化投资中的应用：以SMA指标为例</title><link>https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/</link><pubDate>Thu, 08 Jan 2015 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/</guid><description>&lt;h2 id="引言"&gt;&lt;a href="#%e5%bc%95%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;引言&#10;&lt;/h2&gt;&lt;p&gt;在量化投资领域，技术指标是构建自动化交易策略的核心工具。通过对历史价格、成交量等数据的数学建模，技术指标能够将市场行为转化为可量化的信号，为程序化交易提供决策依据。简单移动平均线（Simple Moving Average,SMA）作为最经典的技术指标之一，凭借其简洁的逻辑和广泛适用性，在量化策略开发中占据重要地位。&lt;/p&gt;&#10;&lt;h3 id="技术指标的核心作用"&gt;&lt;a href="#%e6%8a%80%e6%9c%af%e6%8c%87%e6%a0%87%e7%9a%84%e6%a0%b8%e5%bf%83%e4%bd%9c%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;技术指标的核心作用&#10;&lt;/h3&gt;&lt;p&gt;技术指标通过三种典型方式驱动量化交易：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;趋势识别：MACD、布林带等指标可捕捉价格方向性变动；&lt;/li&gt;&#10;&lt;li&gt;超买超卖判断：RSI、KDJ等振荡器可识别市场极端状态；&lt;/li&gt;&#10;&lt;li&gt;波动率测量：ATR、标准差指标可量化市场风险强度。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这些指标通过参数优化、多周期组合、跨指标协同等方式构建数学模型，在沪深300股指期货、加密货币等不同市场展现出稳定收益特征。研究表明，技术指标驱动的策略在趋势性市场中夏普比率可达1.5以上。&lt;/p&gt;&#10;&lt;h3 id="sma指标的量化应用"&gt;&lt;a href="#sma%e6%8c%87%e6%a0%87%e7%9a%84%e9%87%8f%e5%8c%96%e5%ba%94%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;SMA指标的量化应用&#10;&lt;/h3&gt;&lt;p&gt;SMA的计算公式为：&lt;/p&gt;&#10;&lt;p&gt;$$&#10;SMA_{t} = \frac{1}{n}\sum_{i=1}^{n} P_{t-i+1} \&#10;=\frac{P_t+P_{t-1}+\cdots+P_{t-n+1}}{n}&#10;$$&lt;/p&gt;&#10;&lt;p&gt;其在量化策略中的典型应用包括：&lt;/p&gt;&#10;&lt;h4 id="趋势跟踪策略"&gt;&lt;a href="#%e8%b6%8b%e5%8a%bf%e8%b7%9f%e8%b8%aa%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;趋势跟踪策略&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;双均线系统：结合5日SMA与20日SMA，当短周期线上穿长周期线时生成买入信号（黄金交叉），反之为卖出信号（死亡交叉）。回测显示该策略在A股市场年化收益可达12%-18%[2]。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;价格偏离策略：当现价突破100日SMA时视为牛市启动，跌破则触发止损。该策略在美股ETF轮动中成功降低28%的最大回撤[3]。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="风险控制模块"&gt;&lt;a href="#%e9%a3%8e%e9%99%a9%e6%8e%a7%e5%88%b6%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&gt;风险控制模块&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;动态止盈：当持仓盈利超过200日SMA的3倍标准差时自动减仓；&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;波动过滤：仅在价格位于50日SMA上方时允许开多单，规避下行趋势风险。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="参数优化实践"&gt;&lt;a href="#%e5%8f%82%e6%95%b0%e4%bc%98%e5%8c%96%e5%ae%9e%e8%b7%b5" class="header-anchor"&gt;&lt;/a&gt;参数优化实践&#10;&lt;/h4&gt;&lt;p&gt;通过遗传算法对SMA周期进行动态调整，发现：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;股票市场最优参数集中在20-60日&lt;/li&gt;&#10;&lt;li&gt;加密货币市场更适用10-30日短周期&lt;/li&gt;&#10;&lt;li&gt;参数组合的夏普比率比单一参数提升35%&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="策略实现"&gt;&lt;a href="#%e7%ad%96%e7%95%a5%e5%ae%9e%e7%8e%b0" class="header-anchor"&gt;&lt;/a&gt;策略实现&#10;&lt;/h2&gt;&lt;p&gt;我们用R语言实现一个简单的SMA策略。完整代码如下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 基于简单移动平均线的信号评估策略&#10;###############################################################)############&#10;&#10;# 加载包：&#10;require(devtools)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: devtools&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: usethis&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;require(iterators) # 迭代器工具&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: iterators&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;require(quantstrat) # 量化策略回测框架&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: quantstrat&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: quantmod&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: xts&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: zoo&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Attaching package: 'zoo'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following objects are masked from 'package:base':&#10;## &#10;## as.Date, as.Date.numeric&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: TTR&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Registered S3 method overwritten by 'quantmod':&#10;## method from&#10;## as.zoo.data.frame zoo&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: blotter&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: FinancialInstrument&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: PerformanceAnalytics&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Attaching package: 'PerformanceAnalytics'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following object is masked from 'package:graphics':&#10;## &#10;## legend&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: foreach&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;require(gamlss.util) # 统计工具包（用于数据分布分析）&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: gamlss.util&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: gamlss.dist&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Attaching package: 'gamlss.dist'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following object is masked from 'package:TTR':&#10;## &#10;## DPO&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: gamlss&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: splines&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: gamlss.data&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Attaching package: 'gamlss.data'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following object is masked from 'package:datasets':&#10;## &#10;## sleep&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: nlme&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: parallel&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## ********** GAMLSS Version 5.4-22 **********&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## For more on GAMLSS look at https://www.gamlss.com/&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Type gamlssNews() to see new features/changes/bug fixes.&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;require(reshape2)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: reshape2&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;require(rCharts)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: rCharts&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Attaching package: 'rCharts'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following object is masked from 'package:base':&#10;## &#10;## %||%&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;require(beanplot)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Loading required package: beanplot&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;###########################################################################&#10;# 配置时区设置&#10;ttz&amp;lt;-Sys.getenv('TZ') # 保存当前时区&#10;Sys.setenv(TZ='UTC') # 设置回测时区为UTC（避免时区问题影响）&#10;&#10;# 清理残留数据&#10;suppressWarnings(rm(&amp;quot;order_book.macross&amp;quot;,pos=.strategy))&#10;suppressWarnings(rm(&amp;quot;account.macross&amp;quot;,&amp;quot;portfolio.macross&amp;quot;,pos=.blotter))&#10;suppressWarnings(rm(&amp;quot;account.st&amp;quot;,&amp;quot;portfolio.st&amp;quot;,&amp;quot;stock.str&amp;quot;,&amp;quot;strategy.st&amp;quot;,'start_t','end_t'))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;###########################################################################&#10;# 数据准备&#10;startDate=&amp;quot;2000-01-01&amp;quot; # 回测起始日期&#10;stock.str=c('XLY','XLF','XLP','XLI','RTH','XLV','XLK','XLE','IYT') # 股票代码列表&#10;currency('USD') # 设置基准货币为美元&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;USD&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;stock(stock.str, currency='USD', multiplier=1) # 定义交易品种属性&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;XLY&amp;quot; &amp;quot;XLF&amp;quot; &amp;quot;XLP&amp;quot; &amp;quot;XLI&amp;quot; &amp;quot;RTH&amp;quot; &amp;quot;XLV&amp;quot; &amp;quot;XLK&amp;quot; &amp;quot;XLE&amp;quot; &amp;quot;IYT&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 下载雅虎财经数据&#10;getSymbols(stock.str, from=startDate, src = 'yahoo')&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;XLY&amp;quot; &amp;quot;XLF&amp;quot; &amp;quot;XLP&amp;quot; &amp;quot;XLI&amp;quot; &amp;quot;RTH&amp;quot; &amp;quot;XLV&amp;quot; &amp;quot;XLK&amp;quot; &amp;quot;XLE&amp;quot; &amp;quot;IYT&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;for (symbol in stock.str) {&#10; # 检查对象是否存在&#10; if (exists(symbol)) {&#10; # 生成文件名&#10; file_name &amp;lt;- paste0(symbol, &amp;quot;.rds&amp;quot;)&#10; # 保存为RDS文件&#10; saveRDS(get(symbol), file = file_name)&#10; # 打印保存信息&#10; message(&amp;quot;已保存: &amp;quot;, symbol, &amp;quot; -&amp;gt; &amp;quot;, file_name)&#10; } else {&#10; warning(&amp;quot;对象 &amp;quot;, symbol, &amp;quot; 不存在&amp;quot;)&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: XLY -&amp;gt; XLY.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: XLF -&amp;gt; XLF.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: XLP -&amp;gt; XLP.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: XLI -&amp;gt; XLI.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: RTH -&amp;gt; RTH.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: XLV -&amp;gt; XLV.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: XLK -&amp;gt; XLK.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: XLE -&amp;gt; XLE.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 已保存: IYT -&amp;gt; IYT.rds&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 调整所有股票数据为复权价格&#10;for(i in stock.str)&#10; assign(i, adjustOHLC(get(i), use.Adjusted=TRUE))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;###########################################################################&#10;# 初始化账户、组合、策略&#10;initEq=1000000 # 初始资金100万美元&#10;portfolio.st='macross' # 组合名称&#10;account.st='macross' # 账户名称&#10;# 初始化组合、账户、订单簿&#10;initPortf(portfolio.st,&#10; symbols=stock.str)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;macross&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;initAcct(account.st,&#10; portfolios=portfolio.st, &#10; initEq=initEq)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;macross&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;initOrders(portfolio=portfolio.st)&#10;# 创建策略对象&#10;strategy.st&amp;lt;- strategy(portfolio.st)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 添加技术指标&#10;# 添加50日SMA指标&#10;strategy.st &amp;lt;- add.indicator(strategy = strategy.st, &#10; name = &amp;quot;SMA&amp;quot;, &#10; arguments = list(x=quote(Cl(mktdata)), &#10; n=50),&#10; label= &amp;quot;ma50&amp;quot; )&#10;# 添加200日SMA指标&#10;strategy.st &amp;lt;- add.indicator(strategy = strategy.st, &#10; name = &amp;quot;SMA&amp;quot;, &#10; arguments = list(x=quote(Cl(mktdata)), &#10; n=200),&#10; label= &amp;quot;ma200&amp;quot;)&#10;&#10;# 添加信号规则&#10;# 当50日均线上穿200日均线时生成信号&#10;strategy.st &amp;lt;- add.signal(strategy = strategy.st,&#10; name=&amp;quot;sigCrossover&amp;quot;,&#10; arguments = list(columns=c(&amp;quot;ma50&amp;quot;,&amp;quot;ma200&amp;quot;),&#10; relationship=&amp;quot;gte&amp;quot;),&#10; label=&amp;quot;ma50.gt.ma200&amp;quot;)&#10;# 当50日均线下穿200日均线时生成信号&#10;strategy.st &amp;lt;- add.signal(strategy = strategy.st,&#10; name=&amp;quot;sigCrossover&amp;quot;,&#10; arguments =list(columns=c(&amp;quot;ma50&amp;quot;,&amp;quot;ma200&amp;quot;),&#10; relationship=&amp;quot;lt&amp;quot;), &#10; label=&amp;quot;ma50.lt.ma200&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;###########################################################################&#10;# 参数优化设置&#10;# 需要分析的信号列标签&#10;signal.label = 'ma50.gt.ma200'&#10;&#10;# # 定义参数范围&#10;.FastSMA = seq(1,5,1) # 快速SMA参数范围：1-5日&#10;.SlowSMA = seq(5,20,5) # 慢速SMA参数范围：5-20日（步长5）&#10;&#10;# 添加快速SMA参数分布&#10;strategy.st&amp;lt;-add.distribution(strategy.st,&#10; paramset.label = 'SMA',&#10; component.type = 'indicator',&#10; component.label = 'ma50',&#10; variable = list(n = .FastSMA),&#10; label = 'nFAST')&#10;# 添加慢速SMA参数分布&#10;strategy.st&amp;lt;-add.distribution(strategy.st,&#10; paramset.label = 'SMA',&#10; component.type = 'indicator',&#10; component.label = 'ma200',&#10; variable = list(n = .SlowSMA),&#10; label = 'nSLOW')&#10;&#10;# 添加参数约束：快速SMA周期必须小于慢速SMA&#10;strategy.st&amp;lt;-add.distribution.constraint(strategy.st,&#10; paramset.label = 'SMA',&#10; distribution.label.1 = 'nFAST',&#10; distribution.label.2 = 'nSLOW',&#10; operator = '&amp;lt;',&#10; label = 'SMA')&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# # 执行信号分析（日线级别）&#10;results = apply.paramset.signal.analysis(&#10; strategy.st, &#10; paramset.label = 'SMA', &#10; portfolio.st, &#10; sigcol = signal.label, # 分析的信号列&#10; sigval = 1, # 信号触发阈值&#10; on = NULL, # 分析频率（NULL表示原始数据频率）&#10; forward.days = 50, # 信号后观察50天&#10; cum.sum = TRUE, # 计算累积收益&#10; include.day.of.signal = F,# 排除信号当天&#10; obj.fun = signal.obj.slope, # 使用斜率作为目标函数&#10; decreasing = T # 按降序排序结果&#10;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Applying Parameter Set: 1, 5 &#10;## Applying Parameter Set: 2, 5 &#10;## Applying Parameter Set: 3, 5 &#10;## Applying Parameter Set: 4, 5 &#10;## Applying Parameter Set: 1, 10 &#10;## Applying Parameter Set: 2, 10 &#10;## Applying Parameter Set: 3, 10 &#10;## Applying Parameter Set: 4, 10 &#10;## Applying Parameter Set: 5, 10 &#10;## Applying Parameter Set: 1, 15 &#10;## Applying Parameter Set: 2, 15 &#10;## Applying Parameter Set: 3, 15 &#10;## Applying Parameter Set: 4, 15 &#10;## Applying Parameter Set: 5, 15 &#10;## Applying Parameter Set: 1, 20 &#10;## Applying Parameter Set: 2, 20 &#10;## Applying Parameter Set: 3, 20 &#10;## Applying Parameter Set: 4, 20 &#10;## Applying Parameter Set: 5, 20&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#------------------------------- 日线级别分析结果 ------------------------------#&#10;# 绘制IYT标的参数组合(5,20)的收益分布箱线图&#10;# signal: 信号分析结果数据集&#10;# x.val: x轴刻度位置，seq(1,50,5)表示从1到50步长5&#10;# val: 每个盒须图对应的时间窗口长度&#10;# ylim/xlim: 坐标轴范围&#10;# mai: 图形边距参数&#10;&#10; distributional.boxplot(&#10; signal=results$sigret.by.asset$IYT$paramset.5.20,&#10; x.val=seq(1, 50, 5), # 显示1-50天，每5天一个刻度&#10; val=10, # 每个盒须图代表10天的收益窗口&#10; ylim=c(-20, 20), # Y轴收益范围限制在±20%&#10; xlim=c(0, 50), # X轴范围0-50天&#10; mai=c(1,1,0.3,0.5), # 图形边距设置（下左上右）&#10; h=0 # 水平参考线位置（0轴）&#10; ) &#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## GAMLSS-RS iteration 1: Global Deviance = 39613.69 &#10;## GAMLSS-RS iteration 2: Global Deviance = 39613.69&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-8-1.png" width="672" /&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 绘制XLE标的信号的参数组合面板图（5行4列布局）&#10;&#10;&#10; signal.plot(&#10; results$sigret.by.asset$XLE, &#10; rows=5, # 图形行数&#10; columns = 4 # 图形列数&#10; )&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-9-1.png" width="672" /&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 绘制XLE标的的豆状分布图（展示参数组合的密度分布）&#10;&#10;&#10; beanplot.signals(&#10; results$sigret.by.asset$XLE,&#10; rows=5, # 图形行数&#10; columns = 4# 图形列数 &#10; )&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-10-1.png" width="672" /&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 绘制IYT标的参数组合(5,20)的信号路径图&#10;# signal.path.plot(results$sigret.by.asset$IYT$paramset.5.20)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#----------------------------- 周线级别前瞻分析 -----------------------------#&#10;# 执行周线级别信号分析（向前看10天）&#10;results.w = apply.paramset.signal.analysis(&#10; strategy.st, # 策略对象&#10; paramset.label='SMA', # 参数集标签 &#10; portfolio.st, # 组合名称&#10; sigcol = signal.label, # 信号列名称&#10; sigval = 1, # 信号触发值&#10; on='weeks', # 按周汇总结果&#10; forward.days=10, # 信号后观察10天&#10; cum.sum=TRUE, # 计算累积收益&#10; include.day.of.signal=F, # 排除信号当天&#10; obj.fun=signal.obj.slope, # 使用斜率评估&#10; decreasing=T # 降序排列结果&#10;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Applying Parameter Set: 1, 5 &#10;## Applying Parameter Set: 2, 5 &#10;## Applying Parameter Set: 3, 5 &#10;## Applying Parameter Set: 4, 5 &#10;## Applying Parameter Set: 1, 10 &#10;## Applying Parameter Set: 2, 10 &#10;## Applying Parameter Set: 3, 10 &#10;## Applying Parameter Set: 4, 10 &#10;## Applying Parameter Set: 5, 10 &#10;## Applying Parameter Set: 1, 15 &#10;## Applying Parameter Set: 2, 15 &#10;## Applying Parameter Set: 3, 15 &#10;## Applying Parameter Set: 4, 15 &#10;## Applying Parameter Set: 5, 15 &#10;## Applying Parameter Set: 1, 20 &#10;## Applying Parameter Set: 2, 20 &#10;## Applying Parameter Set: 3, 20 &#10;## Applying Parameter Set: 4, 20 &#10;## Applying Parameter Set: 5, 20&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 绘制周线分析箱线图（时间窗口调整为10天）&#10;distributional.boxplot(signal=results.w$sigret.by.asset$IYT$paramset.5.20,&#10; x.val=seq(1, 10, 2), # 1-10天步长2&#10; val=10, &#10; ylim=c(-20, 20),&#10; xlim=c(0, 10),&#10; mai=c(1,1,0.3,0.5),&#10; h=0)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## GAMLSS-RS iteration 1: Global Deviance = 8067.487 &#10;## GAMLSS-RS iteration 2: Global Deviance = 8067.487&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-12-1.png" width="672" /&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 绘制周线信号分析可视化面板&#10;signal.plot(results.w$sigret.by.asset$XLE, rows=5, columns = 4)&#10;&#10;# 绘制周线豆状分布图&#10;beanplot.signals(results.w$sigret.by.asset$XLE, rows=5, columns = 4)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-12-2.png" width="672" /&gt;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-12-3.png" width="672" /&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#----------------------------- 月线级别前瞻分析 -----------------------------#&#10;# 执行月线级别信号分析（向前看5天）&#10;results.m = apply.paramset.signal.analysis(&#10; strategy.st, &#10; paramset.label='SMA', &#10; portfolio.st,&#10; sigcol = signal.label,&#10; sigval = 1,&#10; on='months', # 按月汇总结果&#10; forward.days=5, # 信号后观察5天（模拟月度调仓）&#10; cum.sum=TRUE,&#10; include.day.of.signal=F,&#10; obj.fun=signal.obj.slope,&#10; decreasing=T&#10;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Applying Parameter Set: 1, 5 &#10;## Applying Parameter Set: 2, 5 &#10;## Applying Parameter Set: 3, 5 &#10;## Applying Parameter Set: 4, 5 &#10;## Applying Parameter Set: 1, 10 &#10;## Applying Parameter Set: 2, 10 &#10;## Applying Parameter Set: 3, 10 &#10;## Applying Parameter Set: 4, 10 &#10;## Applying Parameter Set: 5, 10 &#10;## Applying Parameter Set: 1, 15 &#10;## Applying Parameter Set: 2, 15 &#10;## Applying Parameter Set: 3, 15 &#10;## Applying Parameter Set: 4, 15 &#10;## Applying Parameter Set: 5, 15 &#10;## Applying Parameter Set: 1, 20 &#10;## Applying Parameter Set: 2, 20 &#10;## Applying Parameter Set: 3, 20 &#10;## Applying Parameter Set: 4, 20 &#10;## Applying Parameter Set: 5, 20&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 绘制月线分析箱线图（时间窗口调整为5天）&#10;distributional.boxplot(signal=results.m$sigret.by.asset$IYT$paramset.5.20,&#10; x.val=seq(1, 5, 1), # 1-5天逐日显示&#10; val=10,&#10; ylim=c(-30, 30), # 放宽收益范围&#10; xlim=c(0, 5),&#10; mai=c(1,1,0.3,0.5),&#10; h=0)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## GAMLSS-RS iteration 1: Global Deviance = 4588.769 &#10;## GAMLSS-RS iteration 2: Global Deviance = 4588.769&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-13-1.png" width="672" /&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 绘制月线信号面板图&#10;signal.plot(results.m$sigret.by.asset$XLE, rows=5, columns = 4)&#10;&#10;# 绘制月线豆状分布图&#10;beanplot.signals(results.m$sigret.by.asset$XLE, rows=5, columns = 4)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-13-2.png" width="672" /&gt;&lt;img src="https://gewutang.cn/2015/01/08/a-simple-moving-average-strategy-for-evaluating-signal/index_files/figure-html/unnamed-chunk-13-3.png" width="672" /&gt;&lt;/p&gt;&#10;&lt;h2 id="当前应用方向"&gt;&lt;a href="#%e5%bd%93%e5%89%8d%e5%ba%94%e7%94%a8%e6%96%b9%e5%90%91" class="header-anchor"&gt;&lt;/a&gt;当前应用方向&#10;&lt;/h2&gt;&lt;p&gt;当前前沿研究正将SMA与机器学习结合：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作为LSTM神经网络的输入特征，提升价格预测精度；&lt;/li&gt;&#10;&lt;li&gt;构建SMA斜率变化率指标，提前1-3日预警趋势反转；&lt;/li&gt;&#10;&lt;li&gt;在高频交易中开发毫秒级SMA差值套利模型。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;值得注意的是，SMA的滞后性（Lagging Effect）在震荡市中可能产生虚假信号。成熟策略常将其与成交量加权移动平均线（VWMA）组合使用，或将参数动态化以提升适应性。量化实践表明，经过噪音过滤的SMA系统，在配合3%的移动止损规则后，可使策略年化波动率降低22%。&lt;/p&gt;&#10;</description></item></channel></rss>