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

标签 python numpy combinatorics

仍然是 Python 和编码的新手,这次冒险只有大约 6 周。我开始了一个金融项目,试图弄清楚投资组合的现金比例应该是多少,以及应该根据当前的市场表现投资多少。不知道这项研究是否有任何相关性,但它有助于坚持每一步并学习新事物。
对于任何感兴趣的人,这是 google collab Jupiter notebook
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
                    ]
所以组合数学的规则是这样的
  • 对于每个市场状态,从最高到最低尝试现金需求
  • 首先如果语句是 0.50 那么下一个只能是 0.5 - 0
  • 其次,如果语句可以说是 0.45,那么下一个只能是 0.45 - 0

  • 就像如果市场状态为 0,我们需要 50% 的现金。然后它下降了 5%,我们现在需要 40% 的现金。然后再下降 5% 到下降 -10%,我们只能需要 40% 到 0% 的现金。如果市场下跌只是为了保持不变或下跌,我们就不能增加所需的现金。这个想法是市场打折得越多,我们应该保留的现金就越少。所以市场越便宜我们应该越投资,市场越高越投资越少。整个模拟从 10,000 开始,每个月都有 1,000 添加到投资组合中。
    提前感谢任何花时间阅读这篇文章并发布了一些文档的链接或关于我如何开始学习如何解决这个问题的建议。

    最佳答案

    我不明白这个问题,我想你假设熟悉这里的一些概念。如果你能更简单、更简短地表达你的问题,它会帮助我帮助你。再说一次,这可能只是我的无能为力。
    我会尽量给你我的 2 美分,根据你我从帖子中了解到的。
    首先,我想指出您初始化列表的方式不是最佳的。 Numpy 有两个非常重要的功能:

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

  • 因此,例如,您应该用简单的单行 numpy 调用替换 options_market_status 初始化: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
    
    我希望我正确理解了你的问题,还没有解释你已经知道的事情。
    祝你好运!

    关于python - 在 python 中寻找一些关于组合学的指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64086085/

    相关文章:

    python - 在函数中生成坐标的二元素元组

    algorithm - OEIS A002845 : Number of distinct values taken by 2^2^. ..^2(以所有可能的方式插入 n 个 2 和括号)

    algorithm - 内存受限的硬币可更改多达 10 亿的数字

    python - 如何在 Python (Mac) 中将扫描的 PDF 转换为可搜索的 PDF?例如OCRMYPDF模块

    python - 在 SQL 查询中使用字典键作为字段名称

    python ,numpy : Setting the values for an entire 2D plane of a 3D array

    python - NumPy:使用 ndarray 对函数值求和

    比较数字排序然后得到中值

    python - 如何从 URL 播放 mp3

    python - 从文件导入 numpy 数组时,如何将两个字段合并为一个?