在 python 中寻找有关组合学的一些指导

Looking for some guidance on combinatorics in python

对 python 和编码还是个新手,这次冒险才大约 6 周。我开始了一个金融项目,试图弄清楚投资组合中有多少百分比应该是现金,以及根据当前的市场表现应该投资多少。不知道这项研究是否有任何相关性,但它有助于坚持每一步并学习新事物。

对于任何感兴趣的人,这是 google collab Jupiter 笔记本 https://github.com/Jakub-MFP/My_FIRE_Project/blob/master/portfolio_management/cashposition_backtest.ipynb

在第 4 步中,我正在尝试 运行 进行组合数学模拟。我一直在阅读 https://docs.python.org/3/library/itertools.html,但对于我需要从哪里开始着手有点不知所措。只是寻找一些指导,比如我应该研究的术语或内容,以解决这个具体问题。

此外,看过并看到一个叫做 tpot 的东西对组合学很有用?

组合数学问题

目前,在第 3 步中,我为市场中的各种下跌做了一个预定义的循环。看起来像这样

   if (current_market_status == 0):  # all time high record
        current_cash_required_equity = 0.3
    elif (current_market_status < -0.05): #less than 5%
        current_cash_required_equity = 0.25
    elif (current_market_status < -0.10): #less than 10%
        current_cash_required_equity = 0.20 
    elif (current_market_status < -0.15): #less than 15%
        current_cash_required_equity = 0.15
    elif (current_market_status < -0.20): #less than 20%
        current_cash_required_equity = 0.10
    elif (current_market_status < -0.25): #less than 25%
        current_cash_required_equity = 0.05
    elif (current_market_status < -0.30): #less than 30%
        current_cash_required_equity = 0

现在我想做的是尝试 0.50 and -0.50 之间市场状态的每种组合,增加 0.01。对于每个市场状态尝试在 0.50 and 0.

之间的现金头寸

我是否应该像 5 elif 设置一样设置一个限制来尝试?或者有没有办法做一个更组合的方式?

我为选项设置了这个

options_market_status = [0.50,0.49,0.48,0.47,0.46,0.45,0.44,0.43,0.42,0.41,
                         0.40,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.32,0.31,
                         0.30,0.29,0.28,0.27,0.26,0.25,0.24,0.23,0.22,0.21,
                         0.20,0.19,0.18,0.17,0.16,0.15,0.14,0.13,0.12,0.11,
                         0.10,0.09,0.08,0.07,0.06,0.05,0.04,0.03,0.02,0.01,0,
                         -0.50,-0.49,-0.48,-0.47,-0.46,-0.45,-0.44,-0.43,-0.42,-0.41,
                         -0.40,-0.39,-0.38,-0.37,-0.36,-0.35,-0.34,-0.33,-0.32,-0.31,
                         -0.30,-0.29,-0.28,-0.27,-0.26,-0.25,-0.24,-0.23,-0.22,-0.21,
                         -0.20,-0.19,-0.18,-0.17,-0.16,-0.15,-0.14,-0.13,-0.12,-0.11,
                         -0.10,-0.09,-0.08,-0.07,-0.06,-0.05,-0.04,-0.03,-0.02,-0.01
                    ]


options_cash_req = [0.50,0.49,0.48,0.47,0.46,0.45,0.44,0.43,0.42,0.41,
                         0.40,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.32,0.31,
                         0.30,0.29,0.28,0.27,0.26,0.25,0.24,0.23,0.22,0.21,
                         0.20,0.19,0.18,0.17,0.16,0.15,0.14,0.13,0.12,0.11,
                         0.10,0.09,0.08,0.07,0.06,0.05,0.04,0.03,0.02,0.01,0
                    ]

所以组合数学的规则就像

  1. 对于每个市场状态,从最高到最低尝试现金需求
  2. 第一个如果语句是0.50那么下一个只能是0.5 - 0
  3. 其次如果语句让say是0.45,那么下一个只能是0.45 - 0

比如如果市场状态为0,我们需要50%的现金。然后它下降 5%,我们现在需要 40% 的现金。然后再降5%到-10%,我们只能要求40%到0%的现金。如果市场下跌只是为了保持不变或下跌,我们就无法增加所需的现金。这个想法是,市场打折越多,我们应该保留的现金就越少。所以我们应该越便宜就多投资,市场越高就少投资。整个模拟从 10,000 开始,每月向投资组合添加 1,000。

预先感谢所有花时间阅读本文的人 post 并 post 编辑了 link 一些文档或关于我如何着手的建议学习如何解决这个问题。

我没听懂问题,我想你已经熟悉这里的一些概念了。如果你能更简单、更简短地表达你的问题,它会帮助我帮助你。再说了,也可能只是我的无能吧。

我会尽力给你我的 2 美分,根据你从我可以理解的 post。

首先,我想指出您初始化列表的方式不是最优的。 Numpy有两个很重要的功能:

  1. np.linspace: https://numpy.org/doc/stable/reference/generated/numpy.linspace.html

  2. np.arange: https://numpy.org/doc/stable/reference/generated/numpy.arange.html

因此,例如,您应该将 options_market_status 初始化替换为简单的 one-liner numpy 调用:np.arange(0.5, -0.02, -0.01).

现在,如果我理解你的主要问题,那就是如何迭代 options_market_statusoptions_cash_req,使得 options_market_status 中的元素大于或等于 options_cash_req选项,对吧? 由于它们在您的问题中具有相同的值,因此我将给出一个通用的解决方案。如果给定一个数组 a,并希望在嵌套循环中对其进行迭代,一种解决方案可以是:

a = np.arange(0.5, -0.01, -0.01)
for i in range(len(a)):
    first_element = round(a[i], 2) # this is the 1st element, rounded to 2 digit
    for j in range(i, len(a)):
        second_element = round(a[j], 2) # same with 2nd element
        print(first_element, second_element) # you can replace this with your function

我希望我理解正确你的问题,并没有解释你已经知道的事情。 祝你好运!