第 10 章 仓位管理----SPL量化编程课
本文介绍了量化交易中的两种仓位管理方法:固定金额法和固定比例法。固定金额法采用每次投入固定金额进行交易,操作简单但灵活性不足;固定比例法则按账户资金的固定比例投入,能随账户价值自动调整仓位。文章以MACD背离策略为例,详细展示了两种方法的代码实现过程,包括数据读取、买卖信号处理和收益统计等关键步骤。此外,还介绍了如何将策略信号导出为CSV文件,便于实际交易中参考使用。这些方法帮助交易者在不同市场环
量化交易中,仓位管理是平衡风险与收益的关键。如果仓位过重,一旦市场走势不利,可能遭受巨大损失。而仓位过轻,又可能错过盈利机会。合适的仓位能在风险和收益间找到平衡,使收益稳定增长。不同的市场环境对仓位管理要求不同。在牛市时,适当增加仓位可以获取更多收益。但在熊市或者震荡市时,就需要降低仓位来规避风险。
常用的仓位管理方法有:
固定金额法:在这种方法中,每次交易投入固定金额的资金。这种方法简单易行,但可能不够灵活,无法根据市场情况和交易者的风险承受能力进行调整。
固定比例法:每次交易投入账户总资金的固定百分比。这种方法使得随着账户价值的增长或减少,交易仓位大小也会相应调整。
凯利公式:凯利公式在仓位管理上很有名气,根据交易胜率和赔率比来确定每次交易的最佳仓位。通过使用凯利公式,交易者可以在最大化期望收益的同时控制风险。
其中凯利公式在理论上最优,它能够计算出一个利益最大化的投资比例,但是它的假设条件很严格,需要满足独立事件,并且精准估计胜率和盈亏,实操起来难度较高。而且凯利公式算出来的结果也是一个比例值,可以理解为固定比例法的一种。
因此,这里我们主要介绍前两种方法。
10.1 固定金额法
我们以多支股票的MACD背离策略为例,按照固定金额法管理仓位。
假设初始现金数CASH=100000,每次买入的固定金额为EACH=10000。
首先登记脚本,读取股票数据:
A | B | |
1 | >call("init.splx") | |
2 | 2023 | =date(A2,1,1) |
3 | =workday(B2, -100, HOLIDAY) | =date(A2,12,31) |
4 | [1,600690] | =Load@C(A4, A3,B3) |
然后循环每支股票,准备策略需要的指标和信息。
A | B | |
… | …… | …… |
6 | for B4.group(代码) | =A6.derive(:DVG) |
7 | =DVGMACD( B6, DVG, 收盘, 12, 26, 9 ) | |
8 | =Begin(B6) | |
9 | =@|B8.select( 日期>=B2) |
到这里为止,和前几章的代码都大致相同,读者应该已经很熟悉了。
下面重点来了。
在前八章的例子中,我们都是假设资金是无限的,各个股票的购买是独立的,因此在代码中按照股票来循环,单独计算每支股票最后汇总就可以了。但当我们增加了资金额限制这一因素时,各个股票之间的购买就不再独立了,有些交易可能会因为资金不足而无法买入。
所以在编写代码时就不能按股票去循环,而应该改为按日期循环,统计每日现金、仓值和收益情况最后汇总。
A | B | C | |
… | …… | …… | |
11 | =CASH=100000 | =EACH=10000 | |
12 | =B9.group(日期;~:K线) | ||
13 | for A12 | for K线 | =H=昨日.持仓 |
14 | =卖出=if(昨日.DVG==-1,SellOff(~, H) ) | ||
15 | =CASH+=C14.sum(卖额) | ||
16 | =if(CASH>=EACH && 昨日.DVG==1, 买入|=Buy(~, -EACH) ) | ||
17 | =CASH-=C16.买额 | ||
18 | =Loop() | ||
19 | =@|Yield(K线) | ||
20 | =Summary(B19) | =Display(A20) |
A11:B11 设置初始现金和每次购买现金数
A12 按照日期分组,取出每组成员,命名为K线,结果返回序表。
group分组函数,我们之前已经用过很多次了,用的最多的就是A.group(code)这样的形式,表示只分组不对组成员进行计算,结果返回序列。这里用的是group函数的另一种形式,表示按照分号前面的字段分组,然后按照分号后面的表达式对组成员进行计算,结果返回序表。这两种形式写法的区别主要就是看参数里有没有分号,再一个大的区别就是返回的结果一个是序列,一个是序表。比如这里=B9.group(日期;~:K线)就表示按照日期分组,然后取出每组成员,命名为K线。结果返回一个序表,日期和K线是它的两个字段。我们双击每条记录的K线字段,就会看到里面的内容是多支股票当天的K线数据。
A13 循环每天的数据。
B13:C18循环每天的K线,进行买卖计算,每交易一次就更新一次剩余现金值CASH,同时还要将交易信息记录到买入和卖出字段。
C13 取出昨日的持仓数据,赋给变量H。当循环多支股票时,是无法持仓[-1]这种形式取出昨天的数据,只能用昨日.持仓来提取。
C16 表示如果剩余现金数大于EACH且满足背离指标条件,就按照固定金额买入股票。buy函数在回测脚本里讲过,第二参数小于0时,表示按钱数购买。
C18 当天的买卖循环计算完成后,执行Loop函数,统计当天的持仓和收益情况。
B19 汇总每天的收益数据
A21 汇总回测指标
B21 纵向查看回测指标
10.2 固定比例法
固定比例法就是每次按照当前资金的固定比例来购买股票。
我们还是以多支股票的MACD背离策略为例,来写代码。
代码风格和固定金额法一致,就是将购买固定金额EACH改为固定比例R。对应的在购买函数buy()中用CASH*R计算出每次的购买金额。
代码编写如下:
A | B | C | |
1 | >call("init.splx") | ||
2 | 2023 | =date(A2,1,1) | |
3 | =workday(B2, -100, HOLIDAY) | =date(A2,12,31) | |
4 | [1,600690] | =Load@C(A4, A3,B3) | |
5 | |||
6 | for B4.group(代码) | =A6.derive(:DVG) | |
7 | =DVGMACD( B6, DVG, 收盘, 12, 26, 9 ) | ||
8 | =B6.run( 昨日=~[-1] ) | ||
9 | =@|B6.select( 日期>=B2) | ||
10 | |||
11 | =CASH=100000 | =R=0.05 | |
12 | =B9.group(日期;~:K线) | =Begin(A12) | |
13 | for A12 | for K线 | =H=昨日.持仓 |
14 | =卖出=if(昨日.DVG==-1,SellOff(~, H) ) | ||
15 | =CASH+=C14.sum(卖额) | ||
16 | =if(昨日.DVG==1, 买入|=Buy(~,-CASH*R)) | ||
17 | =CASH-=C16.买额 | ||
18 | =Loop() | ||
19 | =@|Yield(K线) | ||
20 | =Summary(B19) | =Display(A20) |
B12 设置每次购买比例R
B16 每次买入的金额为CASH*R
其他代码和固定金额法相同。
10.3 信号生成和实操
本小节来讲一下在实操时如何用策略来指导下单。这里所讲的策略都是离线策略,适用于低频交易。在离线策略中,可由程序计算出下单信号,然后人工操作下单买卖。这样我们只需在程序中根据策略计算出当天是否有下单信号就可以了。我们以MACD背离策略为例,编写程序生成下单信号并保存到csv文件中。
首先还是读取股票数据:
A | B | |
1 | >call("init.splx") | |
2 | 2023 | =date(A2,1,1) |
3 | =workday(B2, -100, HOLIDAY) | =date(A2,5,22) |
4 | [1,600690] | =Load@C(A4, A3,B3) |
这里为了方便看实验结果,我们假定当前日期为2023年5月22日,读取2023年1月1日到5月22日的数据。实操中B4应读取到当前日期,代码改为=Load@C(A4, A3) 即可,开始日期用户可以自己设定,满足策略中指标计算需求即可。
然后创建一个序表,保存下单信号:
A | |
... | …… |
6 | =create( 日期, 代码, 信号 ) |
接下来循环每支股票,计算背离指标,取最后一天数据执行背离策略判断是否下单,如果有下单信号就添加到A6序表中:
A | B | C | |
... | …… | …… | |
7 | for B4.group(代码 ) | =A7.derive(:DVG) | |
8 | =DVGMACD( B7, DVG, 收盘, 12, 26, 9 ) | ||
9 | =B7.m(-1) | ||
10 | if B9.DVG==1 || B9.DVG==-1 | =A6.insert(0, B3, A7.代码, B9.DVG ) |
最后将A6的计算结果导出到csv文件:
A | |
... | …… |
12 | >file("result.csv").export@ct(A6) |
A12 将A6的内容写出到result.csv文件中。函数f.export()用来将结果导出到文件。
这段代码执行完之后,在主路经下会看到生成了文件result.csv。打开文件,可以看到在 2023 年 5 月 22 这天,股票 600690 有买入信号。
更多推荐
所有评论(0)