我有每日利润数据,我正在尝试找到两种资产的最佳组合,从而获得最高的利润。我需要买入一种资产做多并做空另一种资产,并在一个时间窗口内找到表现最好的货币对。
我可以通过搜索所有排列来实现这一点,但它非常慢。(这并不奇怪)我认为这可能是适合使用像 PuLP 这样的库进行线性优化的问题类型。
这是详尽解决问题的示例。我有意保持数据简单,但我需要搜索 1000 个资产。完成我在下面概述的低效手动方法大约需要 45 分钟。
注意:因为做多“Alpha”和做空“Bravo”与做多“Bravo”和做空“Alpha”不同,所以我使用的是排列,而不是组合。
编辑:如果有些人不熟悉做空和做空,我试图将最高利润与最低利润配对(做空,我赚的利润越多,价值越负)
逻辑将如下所示:
对于节点的所有排列,将节点一利润与节点二利润的倒数相加得到总利润。找出总利润最高的货币对。
这是我非常低效(但有效)的实现:
# Sample data
profits = [
('2019-11-18', 'Alpha', -79.629698),
('2019-11-19', 'Alpha', -17.452517),
('2019-11-20', 'Alpha', -19.069558),
('2019-11-21', 'Alpha', -66.061564),
('2019-11-18', 'Bravo', -87.698670),
('2019-11-19', 'Bravo', -73.812616),
('2019-11-20', 'Bravo', 198.513246),
('2019-11-21', 'Bravo', -69.579466),
('2019-11-18', 'Charlie', 66.302287),
('2019-11-19', 'Charlie', -16.132065),
('2019-11-20', 'Charlie', -123.735898),
('2019-11-21', 'Charlie', -30.046416),
('2019-11-18', 'Delta', -131.682322),
('2019-11-19', 'Delta', 13.296473),
('2019-11-20', 'Delta', 23.595053),
('2019-11-21', 'Delta', 14.103027),
]
profits_df = pd.DataFrame(profits, columns=('Date','Node','Profit')).sort_values('Date')
profits_df看起来像这样:
+----+------------+---------+-------------+
| | Date | Node | Profit |
+----+------------+---------+-------------+
| 0 | 2019-11-18 | Alpha | -79.629698 |
| 4 | 2019-11-18 | Bravo | -87.698670 |
| 8 | 2019-11-18 | Charlie | 66.302287 |
| 12 | 2019-11-18 | Delta | -131.682322 |
| 1 | 2019-11-19 | Alpha | -17.452517 |
+----+------------+---------+-------------+
我确信有一种更有效的方法可以解决这个问题。我不了解优化的复杂性,但我知道它足以知道它是一个可能的解决方案。我不明白线性优化和非线性之间的区别,所以如果我弄错了命名法,我深表歉意。
谁能建议我应该尝试的方法?
慕莱坞森
慕姐4208626
相关分类