《股票量化回测》- Power Excel与VBA结合 (Power BI企业级分析与应用节选)
发布于 2021-04-04 17:35
本节我们向大家节选第三部书的综合示例部分——量化回测股票。
作品:《量化回测股票》
作品特色:作品通过对历史数据进行量化回测,洞察数据背后的变化规律,帮助决策者得出最好的交易策略。
技术特点:平均值计算、VBA
分析目的:
1.依据指定的N只股票和N个交易策略,回测所有股票与所有策略相交的回测结果。
2.创建度量”日均价格变化%、AbsAveDailyChange%(价格绝对值日均变化%)MaxDailyChange%(最大价格变动)、MinDailyChange%(最小价格变动)。
1
作品解析
首先是作品的思路,如下:
1. 明确分析目的
2. 从网上收集原始数据
3. 追加入模型、创建SMA、信号、创建筛选
4. 定义交易策略
5. 模拟交易过程
6. 展示交易量化结果
7. 依据指定度量,通过RANKX进行排名
解释:Power Excel是指Excel中使用了Power Query与Power Pivot功能后的增强性Excel应用。
下图为量化分析目的示意图,通过股票与策略的矩阵得出对应的年化率。这个作品的分析应用为Excel,是因为要实现事务性处理模拟,而Power BI仅为分析性处理应用,因此不适用。相反,在Excel中使用VBA变成可实现模拟过程。
2
数据获取
本示例是通过一个Excel Add-ins进行股票数据收集。除了Adds-in,也可以通过PowerQuery中的获取数据实现。
勾选图 4.4.4中相应的Power Pivot选项即可完成加载。
通过追加功能,将事实表合并到一张事实表中,见下图。
3
数据建模
事实表中创建新计算列SMA4、SMA9,见下图。
公式参考:
SMA4=AVERAGEX (
FILTER (
EVERYTHING,
EARLIER ( EVERYTHING[Symbol] ) = EVERYTHING[Symbol]
&& EARLIER ( EVERYTHING[Index] ) - 3 <= EVERYTHING[Index]
&& EVERYTHING[Index] <= EARLIER ( EVERYTHING[Index] )
),
EVERYTHING[close]
)
以下的公式为信号值,SMA4 – SMA 9 =1 表示4日均线大于9日均线,相反,表示负信号出现。
4-9=if(EVERYTHING[SMA 4]-EVERYTHING[SMA 9]>0,1,0)
将均线和信号放入Excel表格中,可见每日的平均价格与信号的变动,见下图。
接下来为分析报表添加筛选器,并且添加功能按钮,触发回测,见下图。
其实逻辑是通过股票仓位、现金、股票价值等等几个变量之间的关系得出的。例如,策略出现买入信号时,回测应用会模拟全仓买进,股票仓位数量为 (现金-佣金)/收盘价位,当信号消失时,回测应用则全部卖出股票,股票仓位为0,现金为股票卖出数量*收盘价格-佣金+现金(之前不足买入一股的现金)。如此这般在选定的时间区间内持续地按信号执行回测操作,直至得出最终的累积金额,最后再转化为年化回报率 。下图为模拟交易的过程。
4
动态波动排名
从价格波动的角度,我们希望对股票进行排名,示例中排名方式有四种。
首先计算价格变化%,公式为:平均值(今日收盘价-上个交易日收盘价)/今日收盘价。
为此,添加计算列:
上个交易日收盘价=AVERAGEX(FILTER(EVERYTHING,EARLIER(EVERYTHING[Symbol])=EVERYTHING[Symbol]&&EVERYTHING[Index]=EARLIER(EVERYTHING[Index])-1),EVERYTHING[close])
价格变化%=DIVIDE(EVERYTHING[close]-EVERYTHING[PreviousDayClosed],EVERYTHING[PreviousDayClosed],BLANK())
绝对价格变化%=ABS([DailyChange%])
度量值:
日均价格变化%:=AVERAGE([日价格变化%])
最大变化%:=MAX([日价格变化%])
最小变化%:=MIN([日价格变化%])
绝对值日均变化%:=AVERAGE([绝地值价格变化])
下一步是创建动态排名,用户可选择以上四种度量之一作为排序依据。首先创建两张内表作为参数表,见下图,将其导入模型中。
然后使用Switch语句创建“方式”,将排序度量与用户所选排序ID一一对应。
所选排序ID:=MIN('排序依据'[ID])
方式:=SWITCH([所选排序ID],1,[日均价格变化%],2,[绝对值日均变化%],3,[最大变化%],4,[最小变化%])
接下来添加一组度量,可以实现升序与降序功能。
升序排名:=IF(HASONEVALUE(EVERYTHING[Symbol]),RANKX(SUMMARIZE(ALLSELECTED('EVERYTHING') ,EVERYTHING[Symbol]),[方式], ,0, SKIP))
降序排名:=IF(HASONEVALUE(EVERYTHING[Symbol]),RANKX(SUMMARIZE(ALLSELECTED('EVERYTHING') ,EVERYTHING[Symbol]),[方式], ,1, SKIP))
排名:=if( HASONEVALUE(OrderBy[排序]) ,if(values(OrderBy[排序])="升序",'排序依据'[升序排名],'排序依据'[降序排名]),'排序依据'[降序排名])
创建新Excel表单,参照下图插入透视表与筛选器。
最后,为分析结果添加一个排名限制。创建以下一组度量,将所选排名数量与真实排名做判断,返回1或0。将“是否显示排名”添加至透视表中、“所选排名行数”添加至筛选器中,见下图。
所选排名行数:=MIN([显示排名])
是否显示排名:=if([排名]<=[所选排名行数],1,0)
提示:现代BI已经在事务型处理能力上进行了强化,事务处理与分析处理也不是完全泾渭分明。以上示例中,VBA负责事务型功能处理、PowerPivot负责分析型功能处理。Excel是作为二者共同的载体进行了集成。
特别声明:以上操作,纯属演示,不构成任何交易购买建议。
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材