Python基于粒子群优化(PSO)的投资组合优化研究

我今年的研究课题是使用粒子群优化(PSO)的货币进行交易组合优化。

由Kaizong Ye,Liao Bao撰写

在本文中,我将介绍投资组合优化并解释其重要性。其次,我将演示粒子群优化如何应用于投资组合优化。第三,我将解释套利交易组合,然后总结我的研究结果。

组合优化

投资组合包括资产和投资资本。投资组合优化涉及决定每项资产应投入多少资金。随着诸如多样化要求,最小和最大资产敞口,交易成本和外汇成本等限制因素的引入,我使用粒子群优化(PSO)算法。

投资组合优化的工作原理是预测投资组合中每种资产的预期风险和收益。该算法接受这些预测作为输入,并确定应在每个资产中投入多少资本,以使投资组合的风险调整收益最大化并满足约束。每种资产的预期风险和收益的预测需要尽可能准确,以使算法表现良好。存在各种方法,在本研究中,我研究了三种常用的方法。

×
PSO算法是基于群体的,根据对环境的适应度将群体中的个体移动到好的区域。然而它不对个体使用演化算子,而是将每个个体看作是D维搜索空间中的一个没有体积的微粒(点),在搜索空间中以一定的速度飞行,这个速度根据它本身的飞行经验和同伴的飞行经验来动态调整。第i个微粒表示为Xi= (xi1, xi2, …, xiD),它经历过的最好位置(有最好的适应值)记为Pi= (pi1, pi2, …, piD),也称为pbest。在群体所有微粒经历过的最好位置的索引号用符号g表示,即Pg,也称为gbest。微粒i的速度用Vi= (vi1, vi2, …, viD)表示。对每一代,它的第d维(1 ≤ d ≤ D)根据如下方程进行变化:
1
2
vid = w∙vid+c1∙rand()∙(pid-xid)+c2∙Rand()∙(pgd-xid)  (1a)      
xid = xid+vid                            (1b)
其中w为惯性权重(inertia weight),c1和c2为加速常数(acceleration constants),rand()和Rand()为两个在[0,1]范围里变化的随机值。
此外,微粒的速度Vi被一个最大速度Vmax所限制。如果当前对微粒的加速导致它的在某维的速度vid超过该维的最大速度vmax,d,则该维的速度被限制为该维最大速度vmax,d
对公式(1a),第一部分为微粒先前行为的惯性,第二部分为“认知(cognition)”部分,表示微粒本身的思考;第三部分为“社会(social)”部分,表示微粒间的信息共享与相互合作。
“认知”部分可以由Thorndike的效应法则(law of effect)所解释,即一个得到加强的随机行为在将来更有可能出现。这里的行为即“认知”,并假设获得正确的知识是得到加强的,这样的一个模型假定微粒被激励着去减小误差。
“社会”部分可以由Bandura的替代强化(vicarious reinforcement)所解释。根据该理论的预期,当观察者观察到一个模型在加强某一行为时,将增加它实行该行为的几率。即微粒本身的认知将被其它微粒所模仿。
PSO算法使用如下心理学假设:在寻求一致的认知过程中,个体往往记住自身的信念,并同时考虑同事们的信念。当其察觉同事的信念较好的时候,将进行适应性地调整。
标准PSO的算法流程如下:
  1. 初始化一群微粒(群体规模为m),包括随机的位置和速度;
  2. 评价每个微粒的适应度;
  3. 对每个微粒,将它的适应值和它经历过的最好位置pbest的作比较,如果较好,则将其作为当前的最好位置pbest;
  4. 对每个微粒,将它的适应值和全局所经历最好位置gbest的作比较,如果较好,则重新设置gbest的索引号;
  5. 根据方程(1)变化微粒的速度和位置;
  6. 如未达到结束条件(通常为足够好的适应值或达到一个预设最大代数Gmax),回到2)。



  1. 正态分布式收益- 在此方法中,创建历史资产值的分布并随机抽样以获得每个资产的未来值。该方法假设历史和未来值是正态分布的。
  2. 收益遵循布朗运动 – 在这种方法中,随着时间的推移生成每个资产的随机游走,表示每日收益。由此计算出投资组合的总体收益。这种方法假设未来的收益遵循随机游走。
  3. 收益遵循几何布朗运动 – 在这种方法中,再次生成随机游走,但根据每日方差和长期市场漂移进行标准化。该方法假设未来的收益遵循标准化的随机游走。

在我的研究中,我发现第三种方法是最准确的。

粒子群优化(PSO)

在PSO中,群中的每个粒子表示为向量。在投资组合优化的背景下,这是一个权重向量,表示每个资产的分配资本。矢量转换为多维搜索空间中的位置。每个粒子也会记住它最好的历史位置。对于PSO的每次迭代,找到全局最优位置。这是群体中最好的最优位置。一旦找到全局最优位置,每个粒子都会更接近其局部最优位置和全局最优位置。当在多次迭代中执行时,该过程产生一个解决该问题的良好解决方案,因为粒子会聚在近似最优解上。


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加


 
# 此类包含群中的粒子代码
class Particle:
    velocity = []
    pos = []
    pBest = []
 
    def __init__(self):
        for i in range(dimension):
            self.pos.append(random.random())
            self.velocity.append(0.01 * random.random())
            self.pBest.append(self.pos[i])
        return

该图描绘了粒子群优化算法相对于全局最优(蓝色)和局部最优位置(红色)如何更新群体中每个粒子的位置。

# 此类包含粒子群优化算法类粒子参数优化器
class ParticleSwarmOptimizer:
    solution = []
    swarm = []
 
    def __init__(self):
        for h in range(swarmSize):
            particle = Particle()
            self.swarm.append(particle)

PSO的表现受到权重的影响。探索描述了PSO探索搜索空间不同区域的能力。Exploitation描述了PSO将搜索集中在搜索空间的有前途区域的能力。为了增强PSO的探索和开发能力,应用了以下算法增强功能:

  • 聚合粒子的随机重新初始化 – 通过在粒子聚集在全局最优粒子上时重新启动粒子来改进探索。使用两个粒子(载体)之间的相似性函数测量收敛。

如果粒子在全局最优粒子附近会聚,但不如全局最优粒子合适,则在搜索空间的某处随机重新初始化。这提高了PSO的探索能力。


最优粒子的选择性突变 – 通过初始化邻近全局最优粒子的邻居来改进。如果邻居比全局最优粒子更好,则全局最优粒子被邻居取代。

# 此类包含群中粒子的代码
class Particle:
    velocity = []
    pos = []
    pBest = []
 
    def __init__(self):
        for i in range(dimension):
            self.pos.append(random.random())
            self.velocity.append(0.01 * random.random())
            self.pBest.append(self.pos[i])
        return
 
...
 
    def satisfyConstraints(self):
        #这是满足约束的地方
        return
 
# 此类包含粒子群优化算法
class ParticleSwarmOptimizer:
    solution = []
    swarm = []

    def optimize(self):
      #更新每个粒子的位置
            for k in range(swarmSize):
                self.swarm[k].updateVelocities(gBest)
          
            #更新每个粒子的位置
            for l in range(swarmSize):
                pBest = self.swarm[l].pBest

    def f(self, solution):
        #定义元启发式方法
        return  random.random()

对于算法的每次迭代,在全局最优粒子附近创建邻居。如果这些邻居中的任何一个优于全局最优粒子,则替换全局最优粒子。


使用粒子群优化的投资组合优化

PSO算法可用于优化投资组合。在投资组合优化的背景下,群中的每个粒子代表投资组合中资产之间的潜在资本分配。


Python计算股票投资组合的风险价值(VaR)

阅读文章


这些投资组合的相对适应性可以使用许多平衡风险和预期收益的金融效用函数之一来确定。

我使用夏普比率,因为这已成为行业认可的基准投资组合表现标准。考虑以下适用于由三个资产组成的投资组合的PSO图示,

使用粒子群优化(PSO)的投资组合优化的例证。灰色粒子正在更新。红色粒子是灰色粒子的局部最优位置,蓝色粒子是全局最优位置。

灰色粒子转换为向量(0.5,0.2,0.3),意味着投资组合资本的50%分配给资产1,20%分配给资产2,30%分配给资产3。该分配的预期夏普比率为0.38,小于局部最优位置(红色粒子)和全局最优位置(蓝色粒子)。这样,灰色粒子的位置被更新,使得它更接近全局最优粒子和局部最优粒子。

使用粒子群优化(PSO)的投资组合优化的例证。灰色粒子被更新,使其更接近全局最优,并且是局部最优的。得到的矢量比以前更好。

灰色粒子已移动,现在转换为矢量(0.3,0.3,0.4),其预期夏普比率为0.48。该值高于之前的局部最优位置,因此局部最优位置(红色粒子)将更新为当前位置。


随时关注您喜欢的主题


使用粒子群优化(PSO)的投资组合优化的例证。局部最优位置(红色粒子)现已更新为粒子的当前位置。

使用粒子群优化的真正挑战是确保满足投资组合优化的约束。如前所述,存在许多限制。最常见的限制因素首先是资产之间不再分配和不少于100%的可用资本(即权重向量必须加起来为1.0)。其次,不允许对资产进行负分配。最后,资本应该分配给投资组合中至少这么多资产。后者是基数约束。两种常用技术用于确保粒子满足约束条件,

  1. 修复不满足约束的粒子 – 对于不满足约束的每个粒子,应用一组规则来改变粒子的位置。
  2. 惩罚不满足约束的粒子的适应性 – 对于不满足约束的每个粒子,惩罚该粒子的夏普比率。

套利交易组合组合

对于我的研究,我将这种技术应用于套利交易组合。套利交易组合包括多个套利交易。 套利交易是一种交易策略,其中交易者卖出利率相对较低的货币,并使用这些资金购买不同的货币,从而产生更高的利率。使用此策略的交易者试图找到称为利率差异的利率之间的差异。


通过使多种货币的投资多样化,可以减轻外汇损失的风险,但不能消除。因此,套利交易的投资组合本身风险低于个别套利交易。在套利交易投资组合的背景下,投资组合优化的目标是进一步降低外汇损失的风险,同时提高投资组合实现的投资收益。

投资组合优化的目标是确定应为每笔交易分配多少资金以优化风险调整收益。

在我的研究中,我使用粒子群优化算法来确定一组套利交易之间的投资资本的最优分配。我的研究中的套利交易投资组合包括22种不同的货币。货币包括澳元,加拿大元,瑞士法郎,人民币等。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds