在 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
]
所以组合数学的规则就像
- 对于每个市场状态,从最高到最低尝试现金需求
- 第一个如果语句是0.50那么下一个只能是0.5 - 0
- 其次如果语句让say是0.45,那么下一个只能是0.45 - 0
比如如果市场状态为0,我们需要50%的现金。然后它下降 5%,我们现在需要 40% 的现金。然后再降5%到-10%,我们只能要求40%到0%的现金。如果市场下跌只是为了保持不变或下跌,我们就无法增加所需的现金。这个想法是,市场打折越多,我们应该保留的现金就越少。所以我们应该越便宜就多投资,市场越高就少投资。整个模拟从 10,000 开始,每月向投资组合添加 1,000。
预先感谢所有花时间阅读本文的人 post 并 post 编辑了 link 一些文档或关于我如何着手的建议学习如何解决这个问题。
我没听懂问题,我想你已经熟悉这里的一些概念了。如果你能更简单、更简短地表达你的问题,它会帮助我帮助你。再说了,也可能只是我的无能吧。
我会尽力给你我的 2 美分,根据你从我可以理解的 post。
首先,我想指出您初始化列表的方式不是最优的。 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
因此,例如,您应该将 options_market_status 初始化替换为简单的 one-liner numpy 调用:np.arange(0.5, -0.02, -0.01)
.
现在,如果我理解你的主要问题,那就是如何迭代 options_market_status
和 options_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 和编码还是个新手,这次冒险才大约 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
]
所以组合数学的规则就像
- 对于每个市场状态,从最高到最低尝试现金需求
- 第一个如果语句是0.50那么下一个只能是0.5 - 0
- 其次如果语句让say是0.45,那么下一个只能是0.45 - 0
比如如果市场状态为0,我们需要50%的现金。然后它下降 5%,我们现在需要 40% 的现金。然后再降5%到-10%,我们只能要求40%到0%的现金。如果市场下跌只是为了保持不变或下跌,我们就无法增加所需的现金。这个想法是,市场打折越多,我们应该保留的现金就越少。所以我们应该越便宜就多投资,市场越高就少投资。整个模拟从 10,000 开始,每月向投资组合添加 1,000。
预先感谢所有花时间阅读本文的人 post 并 post 编辑了 link 一些文档或关于我如何着手的建议学习如何解决这个问题。
我没听懂问题,我想你已经熟悉这里的一些概念了。如果你能更简单、更简短地表达你的问题,它会帮助我帮助你。再说了,也可能只是我的无能吧。
我会尽力给你我的 2 美分,根据你从我可以理解的 post。
首先,我想指出您初始化列表的方式不是最优的。 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
因此,例如,您应该将 options_market_status 初始化替换为简单的 one-liner numpy 调用:np.arange(0.5, -0.02, -0.01)
.
现在,如果我理解你的主要问题,那就是如何迭代 options_market_status
和 options_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
我希望我理解正确你的问题,并没有解释你已经知道的事情。 祝你好运!