В этом примере показано, как оптимизировать стратегию корзины путем минимизации торговых издержек с помощью анализа операционных издержек от Kissell Research Group. Используя эту оптимизацию, вы определяете оптимальную стратегию разрезания порядка корзины на основе компромисса между торговыми издержками, риском и заданным уровнем нерасположенности к риску. Оптимизация минимизирует торговые издержки, сопоставленные с торговой торговой стратегией расписания и заданным параметром нерасположенности к риску Lambda. Минимизация торговых издержек описывается как
где торговые издержки являются влиянием на рынок MI, ценовая оценка PA, и синхронизирующий риск TR.
Чтобы получить доступ к примеру кода, введите edit KRGTradeOptimizationExample.m
в командной строке. В этом примере можно запуститься, этот код с помощью торговли планируют торговую стратегию или процент торговой стратегии объема. Этот пример показывает, что торговля планирует торговую стратегию. Показательная функция определяет оптимальное торговое расписание.
После выполнения кода в этом примере можно представить порядок для использования выполнения Bloomberg®, например.
Этот пример требует лицензии Optimization Toolbox™. Для справочной информации см. Обзор Теории Оптимизации (Optimization Toolbox).
Получите данные влияния на рынок от FTP-сайта Kissell Research Group. Соединитесь с FTP-сайтом с помощью ftp
функция с именем пользователя и паролем. Перейдите к MI_Parameters
папка и получает данные влияния на рынок в MI_Encrypted_Parameters.csv
файл. miData
содержит зашифрованную дату влияния на рынок, код и параметры.
f = ftp('ftp.kissellresearch.com','username','pwd'); mget(f,'MI_Encrypted_Parameters.csv'); close(f) miData = readtable('MI_Encrypted_Parameters.csv','delimiter', ... ',','ReadRowNames',false,'ReadVariableNames',true);
Создайте аналитический объект k
операционных издержек Kissell Research Group. Задайте начальные установки для даты, кода влияния на рынок и номера торговых дней.
k = krg(miData,datetime('today'),1,250);
Загрузите данные в качестве примера TradeDataTradeOpt
и данные о ковариации CovarianceTradeOpt
из файла KRGExampleData.mat
, который включен с Datafeed Toolbox™.
load KRGExampleData TradeDataTradeOpt CovarianceTradeOpt
Для описания данных в качестве примера смотрите Наборы данных Kissell Research Group.
Задайте начальные значения для риска, периодов торговли, стоимости портфеля и ковариационной матрицы. Преобразуйте в проблему только покупки. Установите первоначальное торговое расписание.
% Convert table to array CovarianceTradeOpt = table2array(CovarianceTradeOpt); % Use total trading time of 1 day with 13 trading periods totalDays = 1; periodsPerDay = 13; % Set risk aversion level Lambda = 0.5; % Set minimum and maximum percentage of volume minPOV = 0.00; maxPOV = 0.60; % total number of trading periods totalNumberPeriods = totalDays * periodsPerDay; % Portfolio Value PortfolioValue = TradeDataTradeOpt.Price'*TradeDataTradeOpt.Shares; % Number of stocks numberStocks = height(TradeDataTradeOpt); % Covariance matrix is annualized covariance matrix in decimals. % Convert to ($/Shares)^2 units for the trade period; this matrix is for a % two-sided portfolio, buys and sells or long and short. CC = diag(TradeDataTradeOpt.Price) * CovarianceTradeOpt * ... diag(TradeDataTradeOpt.Price); % Scale to one trading period CC = CC / periodsPerDay / k.TradeDaysInYear; % Convert to buy-only problem (e.g., one-sided problem) CC = TradeDataTradeOpt.SideIndicator * TradeDataTradeOpt.SideIndicator' .* CC; % Convert Alpha_bp from basis points per day to cents/share per period TradeDataTradeOpt.Alpha_bp = TradeDataTradeOpt.Alpha_bp / 1000 .* ... TradeDataTradeOpt.Price / totalNumberPeriods; % Set the initial trade schedule or POV values theta0 = rand(numberStocks,1);
Задайте опции оптимизации с помощью optimset
функция. Для получения дополнительной информации об этих опциях, смотрите Ссылку Опций Оптимизации (Optimization Toolbox).
optionsold = optimset; options = optimset(optionsold,'LargeScale','on','GradObj','off', ... 'DerivativeCheck','off','FinDiffType','central','FinDiffRelStep',1E-12, ... 'TolFun',10E-5,'TolX',10E-12,'TolCon',10E-12,'TolPCG',10E-12, ... 'MaxFunEvals',20000,'MaxIter',20000,'DiffMinChange',10E-04);
Задайте нижние и верхние границы долей, проданных на интервал за оптимизацию.
LB = zeros(numberStocks,1); UB = 100 * ones(numberStocks,1);
Минимизируйте торговые издержки для торговой стратегии расписания. fmincon
находит оптимальное значение для торговой стратегии торговли расписанием на основе значений нижней и верхней границы. Это делает это путем нахождения локального минимума для торговых издержек. Используйте целевую функцию optimizeTradingSchedule
. Чтобы получить доступ к коду для этой функции, введите edit KRGTradeOptimizationExample.m
.
[theta,fval,exitflag,output] = fmincon(@optimizeTradingSchedule,theta0,[], ... [],[],[],LB,UB,[],options,totalNumberPeriods,numberStocks,periodsPerDay, ... TradeDataTradeOpt,CC,Lambda,k);
Проверять ли fmincon
найденный локальным минимумом, отобразите причину почему остановленная функция.
exitflag
exitflag = 1.00
fmincon
возвращает 1
когда это находит локальный минимум. Для получения дополнительной информации смотрите exitflag
(Optimization Toolbox).
Вычислите доли, чтобы торговать, остаточные доли, ценовая оценка, и синхронизирующий риск. Затем вычислите средний процент уровня объема и торговое время.
numPeriods = 1:totalNumberPeriods; K_Matrix = repmat(numPeriods,numberStocks,1); Theta_Matrix = repmat(theta,1,totalNumberPeriods); Volume_Matrix = repmat(TradeDataTradeOpt.ADV/periodsPerDay,1, ... totalNumberPeriods); TradeDataTradeOpt.VolumeProfile = Volume_Matrix; Shares_Matrix = repmat(TradeDataTradeOpt.Shares,1,totalNumberPeriods); % X = Shares to trade in period i Xpct = (exp(-K_Matrix .* Theta_Matrix) .* (exp(Theta_Matrix)-1)) ./ ... (1 - exp(-totalNumberPeriods * Theta_Matrix)); X = repmat(TradeDataTradeOpt.Shares,1,totalNumberPeriods) .* Xpct; TradeDataTradeOpt.TradeSchedule = X; % R = Residual Shares at beginning of period i Rpct = (exp(-(K_Matrix-1).*Theta_Matrix) - exp(-totalNumberPeriods.*Theta_Matrix)) ./ ... (1-exp(-totalNumberPeriods.*Theta_Matrix)); R = repmat(TradeDataTradeOpt.Shares,1,totalNumberPeriods) .* Rpct; % Price Appreciations in Dollars PA = sum(R,2) .* TradeDataTradeOpt.Alpha_bp; % Market Impact in Dollars MI = marketImpact(k,TradeDataTradeOpt) .* TradeDataTradeOpt.Shares .* ... TradeDataTradeOpt.Price ./10000; % Timing Risk in Dollars TR = sqrt(sum(R.^2,2) .* diag(CC)); TR_bp = TR ./ (TradeDataTradeOpt.Shares .* TradeDataTradeOpt.Price) * 10000; % Avg POV Rate kTR = ((TR_bp/10000*1./TradeDataTradeOpt.Volatility).^2).*(k.TradeDaysInYear*3 ./ ... (TradeDataTradeOpt.Shares./TradeDataTradeOpt.ADV)); POV = 1./(1+kTR); POV = max(POV,TradeDataTradeOpt.Shares./(TradeDataTradeOpt.Shares+totalDays .* ... TradeDataTradeOpt.ADV)); % TradeTime TradeDataTradeOpt.TradeTime = TradeDataTradeOpt.Shares./TradeDataTradeOpt.ADV .* ... (1-POV)./POV;
Оцените общие торговые издержки с помощью оптимизированной торговой стратегии.
TotMI = sum(MI) / (TradeDataTradeOpt.Shares' * TradeDataTradeOpt.Price) ... .* 10000; % bp TotPA = sum(PA) / (TradeDataTradeOpt.Shares' * TradeDataTradeOpt.Price) ... .* 10000; % bp TotTR = sqrt(trace(R'*CC*R)) ./ (TradeDataTradeOpt.Shares' * ... TradeDataTradeOpt.Price) * 10000;
Отобразите общую стоимость влияния на рынок, ценовую оценку, и синхронизирующий риск.
totalcosts = [TotMI TotPA TotTR]
totalcosts = 38.2902 0 26.5900
Для получения дополнительной информации о предыдущих вычислениях, свяжитесь с Kissell Research Group.
[1] Kissell, Роберт. Наука об алгоритмической торговле и управлении портфелем. Кембридж, MA: нажатие Elsevier/Academic, 2013.
[2] Malamut, Роберто. “Методы оптимизации мультипериода для торгового планирования”. Представление на нью-йоркской конференции QWAFAFEW, апрель 2002.
[3] Kissell, Роберт и Мортон Глэнц. Оптимальные торговые стратегии. Нью-Йорк, Нью-Йорк: AMACOM, Inc., 2003.
krg
| marketImpact
| optimset
(Optimization Toolbox) | fmincon
(Optimization Toolbox) | priceAppreciation
| timingRisk