Ниже приведен ящик данных:
import datetime
import pandas as pd
import numpy as np
todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq='D')
data = pd.DataFrame(index=index)
data['Open'] = np.random.randint(20,40, size=len(data))
data['High'] = np.random.randint(40,50, size=len(data))
data['Low'] = np.random.randint(10,20, size=len(data))
data['Close'] = np.random.randint(10,20, size=len(data))
Вычисления, которые я хотел бы выполнить, следующие:
capital = 30000
data['Shares'] = (capital * 0.05 / data['Close'].shift(1) - data['Low'].shift(1)).round(0)
data['Open_price'] = data['Open'] + 0.5 * (data['High'] - data['Open'])
data['Floating_P/L'] = data['Shares'] * data['Close']
data['Close_price'] = data['Close'] - 0.5 * (data['Close'] - data['Low'])
data['Closed_P/L'] = data['Shares'].shift(1) * data['Close_price']
data['Closed_Balance'] = capital + data['Closed_P/L'].cumsum()
data['Equity'] = data['Closed_Balance'] + data['Floating_P/L']
capital = data['Equity'].shift(1)
Как вы можете видеть, Equity
рассчитывается с сегодняшнего дня Shares
номер, который рассчитывается от вчерашнего Equity
. Я хочу, чтобы capital
был начальным значением Equity
в первом индексе и вычислял Shares
на основе этого числа при первом индексе. Из второго индекса, Shares
должны быть рассчитаны из Equity
сдвинутого на одну строку вверх. Как я могу это сделать?
В коде, который вы указали выше, я вижу, что начальное значение Shares
и первых двух значений Equity
- это Nans
так как первое значение Shares
вычисляется с использованием сдвинутых столбцов Close
и Low
. Предполагая, что вы можете установить здесь некоторые значения,
попробуйте это сделать?
Создание пустых столбцов в данных для Equity and Shares
data['Equity']=''
data['Shares']=''
установить capital
как начальное значение Equity
. Поскольку вы указали начальную стоимость capital = 30000
capital= 30000
data['Equity'][0]= 30000
Вычислить начальное значение Shares
. Здесь попробуйте настроить значения вместо Nans
для Close and Low
data['Shares'][0]= (capital * 0.05 / data['Close'].shift(1)[0] - data['Low'].shift(1))[0].round(0)
затем используйте цикл for, который выполняет итерацию со второго индекса на длину данных.