Я хочу максимизировать sumproduct двух столбцов в кадре данных. Например, если я могу купить что-то, а затем продать это позже (т.е. я могу сохранить это), как бы я написал какой-нибудь код Python, чтобы решить это для меня?
Это очень простой пример. Если вы построите график цен, вы увидите, что они низкие летом, а высокие зимой. Если нет никаких ограничений, и я хочу купить 100 лотов, я бы купил все 100 в 9 июля, стоив мне 900 (так как это самый дешевый месяц). Тогда я буду хранить его до февраля (так как это самый дорогой месяц) и продавать его за 13,5, получая 1350, то есть прибыль 450.
Если по какой-то причине максимум я могу купить и продать за месяц 30 лотов, тогда я бы купил 30 в июне, июле и августе, затем 10 в сентябре. Я продал бы 10 в декабре, затем 30 в январе, феврале и марте. Я бы сделал все это для того, чтобы максимизировать общую сумму денег, которую я могу заработать [то есть сумму всей цены * продано минус сумма цены * (куплено)].
В общей строке показано, что я заработаю 450 или 362,5 в этих ситуациях. Я только что сделал это, просто глядя на это, поскольку это очень очевидно. Но как я могу заставить Python сделать это для меня? Я посмотрел на страницу оптимизации SciPy, но не зашел слишком далеко.
По сути, я хочу максимизировать общую строку, выделяя определенное количество покупок и продаж в каждом месяце - нацеливаясь на максимум, который я могу купить в самые дешевые месяцы с разливом в следующие самые дешевые месяцы и т. д. 1015 *, затем продажи по максимальным ценам, а затем распродажа в следующие самые дорогие месяцы и т. д. c.
Итак, если у меня будет 100 лотов покупай и цены меняются завтра, тогда как меняется моя стратегия. Например, если июнь достиг 8, я должен перенести максимальную покупку на июнь.
import datetime as dt
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
start_date = dt.datetime(2019, 4, 1)
end_date = dt.datetime(2020, 3, 1)
dates = pd.date_range(start_date, end_date, freq='MS')
df = pd.DataFrame([10.5, 10, 9.5, 9, 9.5, 10, 10.5, 12, 12.5, 13, 13.5, 12.75],
columns=['Price'],
index=dates)
df['No Constraints'] = [0, 0, 0, -100, 0, 0, 0, 0, 0, 0, 100, 0]
df['Money In (Out) No Constraints'] = df['Price'] * df['No Constraints']
df['Max 30'] = [0, 0, -30, -30, -30, -10, 0, 0, 10, 30, 30, 30]
df['Money In (Out) Max 30']= df['Price'] * df['Max 30']
df.loc['Total'] = df.sum(axis=0)