在Python中学习组合数学,需要一些指导。

5

我对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到-0.50之间以0.01为增量。针对每个市场状态,尝试设置现金头寸在0.50和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. 其次,如果语句是0.45,则下一个语句只能是0.45-0
例如,如果市场状况为0,并且我们需要50%的现金。然后它下降了5%,现在我们需要40%的现金。然后再下降5%,跌至-10%,我们只能要求保持在40%和0%之间的现金。如果市场仅下降以使其保持不变或下降,则不能增加所需的现金。想法是市场打折越多,我们应该保留的现金就越少。因此,我们应该在市场便宜时投资更多,在市场上涨时投资更少。整个模拟从10,000开始,并每月向组合中添加1,000美元。
提前感谢任何花时间阅读帖子并发布一些文档链接或建议的人。
1个回答

1
我不理解这个问题,我认为你在这里假设了一些概念的熟悉度。如果您能更简单、更简洁地表达您的问题,那么这将有助于我帮助您。但可能只是我的无能。
根据您在帖子中提到的内容,我将尽力给出我的意见。
首先,我想指出您初始化列表的方式并不是最优的。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 因此,例如,您应该用简单的一行 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

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


非常感谢您详细的回复!我认为您通过那段代码解决了我的问题,我今天会进行实验。再次感谢! - Jakub
非常感谢您再次的帮助!等这个程序运行完后,我会将最终结果上传至Github。看起来可能需要几个小时,哈哈。 - Jakub
1
顺便说一句,如果运行时间不应该超过几个小时,您可能需要上传另一个问题,您可能会发现编写算法的更好方法 :) - yonatansc97
啊,非常好的建议,我会这样做的 :) 再次感谢您的所有帮助。 - Jakub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接