Разработка программного продукта Delphi для моделирования логнормального распределения
Это обусловлено следующими причинами. Во-первых, нормальное распределение симметрично относительно ее центральной оси и может иметь как положительные, так и отрицательные значения; однако цена актива не может быть отрицательной. Во-вторых, нормальное распределение говорит о равной вероятности для значений переменной отклониться вверх или вниз. В то же время на практике, например, имеет место… Читать ещё >
Разработка программного продукта Delphi для моделирования логнормального распределения (реферат, курсовая, диплом, контрольная)
Министерство науки и образования Украины Харьковский Национальный Университет им. В. Н. Каразина Факультет компьютерных наук Кафедра моделирования систем и технологий
Разработка программного продукта Delphi для моделирования логнормального распределения
Курсовая работа по дисциплине
«Языки прикладного программирования»
Исполнитель
студент ******
Руководитель
Ст. преп
Харьков 2007
План
1. Введение
2. Проектирование
3. Особенности реализации
4. Отладка и тестирование
5. Описание работы программного продукта
6. Заключение
7. Список используемой литературы
В данной работе рассматривается логнормальное распределение, его связь с другими распределениями. В статистике так называемое логнормальное распределение применяется в том случае, когда начинает изменяться цена актива в будущем — а это случайный процесс, который в принципе должен описываться нормальным распределением. В то же время для целей вероятностной оценки стоимости актива в теории пользуются не нормальным, а логнормальным распределением.
Это обусловлено следующими причинами. Во-первых, нормальное распределение симметрично относительно ее центральной оси и может иметь как положительные, так и отрицательные значения; однако цена актива не может быть отрицательной. Во-вторых, нормальное распределение говорит о равной вероятности для значений переменной отклониться вверх или вниз. В то же время на практике, например, имеет место инфляция, которая оказывает давление на цены в сторону их повышения, а также сама временная сущность денег: стоимость денег сегодня меньше, чем стоимость денег вчера, но больше, чем стоимость денег завтра. Кривая логнормального распределения всегда положительна и имеет правостороннюю скошенность (асимметрично), т. е. она указывает на большую вероятность цены отклониться вверх. Поэтому если, допустим, цена актива составляет 50 долл., то кривая логнормального распределения свидетельствует о том, что опцион пут с ценой исполнения 45 долл. должен стоить меньше опциона колл с ценой исполнения 55 долл., в то время как в соответствии с нормальным распределением они должны были бы иметь одинаковую цену. Хотя нельзя надеяться, что приведенные исходные предположения в точности выполняются во всех реальных рыночных ситуациях, тем не менее принято считать, что логнормальное распределение достаточно хорошо как первое приближение в случае активов, которыми торгуют на конкурентных рынках аукционного типа для длинных рассматриваемых периодов.
Проектирование
Перед началом работы в среде Delphi мною, я разработал макет программного продукта в письменном варианте, где я зарисовал какая должна быть главная форма (внешний вид ее), сколько и какие компоненты должны быть на этой форме для удобной работы пользователя с данным продуктом. Также на этом макете я разработал план создания текста программы.
После того, как была проделана выше указанная работа, я перешел непосредственно к созданию программного продукта на компьютере. Сначала я создал главную форму, соответствующую макету (Рис.1). На ней находятся:
· 2 колонки выводов значений: Теоретически, Критерий согласия;
· в Теоретической колонке: sigma, mu, a, b;
· в Критерии согласия: метод Неймана и метод обратных функций;
· поля для вывода мат. ожидания и дисперсии;
· кнопки управления программой и режимом просмотра;
· меню «Help» которое содержит подменю «About me» и «About the program»;
· поле время выполнения;
· A также кнопки «Вывести графики и вычислить» при нажатии которой программа считает все значения и выводит график на экран, «Выход», для выхода из программы.
· A также кнопка Stop при нажатии которой программа считает значения, которые обработались до определенного момента.
Рис. 1
Особенности реализации
var
Form1: TForm1;
kk:Int64;
flag:boolean;
implementation
Плотность распределения
function TForm1. PL (x:double):double; //—density of distribution
begin
if x<>0 then
result := exp (-(ln (x)-mu)*(ln (x)-mu)/(2*sigma*sigma))/(x*sigma*Sqrt (2*Pi))
else
result := 0;
end;
function TForm1. LogNorm (): double; //—for a method of Neumann
var
y: real;
x: double;
begin
repeat
x := a+random*(b-a);
f := PL (x);
y := fmax*random;
until y
result := x;
end;
procedure TForm1. Clear; //——————clear array————-
const M=50;
var j: integer;
begin
for j:=0 to (M-1) do
begin
gist[j] := 0;
end;
end;
procedure TForm1. Panel1Click (Sender: TObject);
var
x, r, sr, h1, h2, Ob, g1, g2, chi2_N, chi212, chi2_if, sum, Z: double;
p, y, Mat, Mat2, Disp: real;
M, j: integer;
N, i, u: longint;
begin
flag:=false;
Gauge1.Progress:=0;
//———-**All fields must be filled!**————-
if (E1.Text='') or (E2.Text='') or (E3.Text='') or (E4.Text='') or
(E5.Text='') then
begin
with Application do
begin
NormalizeTopMosts;
MessageBox ('All of fields must be filled!', 'Error', MB_OK);
RestoreTopMosts;
end;
exit;
end;
//—————**initialization**———————
T := GetTime;
Clear;
Chart1.Series[0]. Clear;
Chart1.Series[1]. Clear;
Chart1.Series[2]. Clear;
sigma := StrToFloat (E1.Text);
mu := StrToFloat (E2.Text);
a := StrToFloat (E3.Text);
b := StrToFloat (E4.Text);
kk:=StrToint64(E5.Text);
if kk>2 000 000 000 then
begin
Showmessage ('Очень большое число, введите меньшее');
exit;
end;
N := StrToInt (E5.Text);
g1:=100/N;
g2:=0;
Randomize;
M := 50;
//———————-**theoretical method**—————————
for i:=1 to 100 do
begin
if (i mod 10) =0 then application. ProcessMessages;
x := a+i*(b-a)/100;
//p := PL (x);
if x<>0 then
p := exp (-(ln (x)-mu)*(ln (x)-mu)/(2*sigma*sigma))/(x*sigma*Sqrt (2*Pi))
else
p := 0;
Chart1.Series[0]. AddXY (x, p);
end; //—-theoretical
//***********************************************************
Метод Неймана
//———————-**method of Neumann**————————————
fmax :=Chart1.Series[0]. MaxYValue;
{for i:=1 to N do
begin
if (i mod 10) =0 then application. ProcessMessages;
x := a+i*(b-a)/N;
f := PL (x);
if (f>fmax)then
fmax := f;
end;} //max
//——————————————-;
Clear;
chi2_N:=0;
Mat:=0;
Mat2:=0;
Disp:=0;
i:=0;
Clear;
chi2_if := 0;
while true do
begin
if (i mod 10) =0 then application. ProcessMessages;
inc (i);
x := LogNorm ();
Mat := Mat+x; //expectation
Mat2 := Mat2 +sqr (x);
if (x>b) or (x continue; u := trunc ((x-a)/((b-a)/M)); gist[u] := gist[u]+1; h1 := random; h2 := random; Ob := sqrt (-2*ln (h1))*cos (2*Pi*h2); Ob := mu+Ob*sigma; x := exp (Ob); if (x>b) or (x continue; u := trunc ((x-a)/((b-a)/M)); gist1[u] := gist1[u]+1; g2:=g2+g1; Gauge1.Progress:=trunc (g2)+1; if i>N then break; if flag=true then begin N:=i; break; end; end; Mat := Mat/N; Mat2 := Mat2/N; Disp := Mat2 — sqr (Mat); for j:=0 to (M-1) do //———histogram begin sum := (Power (N*PL (a+(b-a)/M*(j+0.5))*(b-a)/M-gist[j], 2))/ (N*PL (a+(b-a)/M*(j+0.5))*(b-a)/M); chi2_N := chi2_N+sum; Chart1.Series[1]. AddXY ((a+(j+0.5)*(b-a)/M), gist[j]/N*M/(b-a)); end; E6.Text := FloatToStrF (chi2_N, fffixed, 4, 4);//—chi-square for a Neumann //**************************************************************** Метод обратной функции //———————**method of inverse function**————————- Clear; chi2_if := 0; {for i:=1 to N do begin h1 := random; h2 := random; Ob := sqrt (-2*ln (h1))*cos (2*Pi*h2); Ob := mu+Ob*sigma; x := exp (Ob); if (x>b) or (x continue; u := trunc ((x-a)/((b-a)/M)); gist[u] := gist[u]+1; end;} for j:=0 to (M-1) do //———histogram begin sum := (Power (N*PL (a+(b-a)/M*(j+0.5))*(b-a)/M-gist1[j], 2))/ (N*PL (a+(b-a)/M*(j+0.5))*(b-a)/M); chi2_if := chi2_if+sum; Chart1.Series[2]. AddXY ((a+(j+0.5)*(b-a)/M), gist1[j]/N*M/(b-a)); gist1[j]: =0; end; E8.Text := FloatToStrF (chi2_if, fffixed, 4, 4); //chi-sq for a inverse function E10.Text := FloatToStr (exp (mu+sqr (sigma)/2)); //—expectation (teor) E11.Text := FloatToStr (Mat); //—expectation (experim) E12.Text := FloatToStr ((exp (sqr (sigma))-1)*exp (2*mu+sqr (sigma))); E13.Text := FloatToStr (Disp); D := GetTime; Z := MilliSecondSpan (D, T); e5.Text:=IntTostr (N); Edit1.Text := FloatToStrF (Z, fffixed, 6, 6); //***************************************************************** end; procedure TForm1. Panel7Click (Sender: TObject); begin Close; end; procedure TForm1. E1KeyPress (Sender: TObject; var Key: Char); begin if (key='-') then begin if Pos ('-', (Sender as TEdit).Text)=0 then Begin (Sender as TEdit).SelStart:=0; key:='-'; end else key:=#0; end; if Sender is TEdit then begin if Not ((Key in ['0'.'9'])or (Key=Chr (vk_Back)) or (Key=DecimalSeparator) or (Key='-')) then Key:=#0 else begin if Key = DecimalSeparator then if Pos (DecimalSeparator,(Sender as TEdit).Text)>0 then Key:=#0; end; end; end; procedure TForm1. Aboutme1Click (Sender: TObject); begin AboutBox.Show; end; procedure TForm1. Timer1Timer (Sender: TObject); begin Panel19.Caption := TimeToStr (Time); end; procedure TForm1. E1KeyDown (Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssShift in Shift) then key:=0; end; procedure TForm1. Panel20Click (Sender: TObject); begin flag:=true; end; end. Отладка и тестирование программы В процессе отладки я вводил различные значения успешной вероятности и количество успехов и сравнивал форму полученного графика при разных значениях. Рис. 2 Так, же пробовал вводить другие значения, график при этом не сильно менялся Рис. 3 Пользователь может увидеть полученные графики в трехмерном и в двухмерном пространстве: для этого надо нажать кнопку 2D3D. Результат 3D графика можно увидеть на рис. 3 Функция для 3D2D записана так procedure TForm1. Panel12Click (Sender: TObject); begin Chart1.View3D:=Not Chart1. View3D; end; Рис. 4 Описание работы программного продукта При запуске программы перед пользователем открывается форма, на которой есть поля ввода параметров, поля вывода посчитанных значений, поле для вывода графика и кнопки, при нажатии на которые происходит то или иное событие. Справа в разделе «Теоретически пользователь может ввести значение sigma и mu, те значения которые он считает нужными; a и b это интервал в пределах которого меняется график. И значение N — (количество єксперементов) — в зависемости от того сколько раз мы будем проводить єксперемент. В зависимости от выбора данных параметров пользователь может получить различные формы графика плотности вероятности. В разделе «Критерий согласия» выводятся значения оценки Хи-квадрат для двух указанных методов. Ниже вывод математического ожидания и дисперсии, посчитанных теоретически и экспериментально. Справа внизу формы выводится системное время и время выполнения расчётов в миллисекундах. При нажатии на кнопку «Вывести графики и вычислить» слева выводятся график плотности логнормального распределения (построенный теоретически), гистограммы распределения случайной величины по логнормальному закону, смоделированные при помощи метода Неймана и метода обратной функции. При нажатии на кнопку «Стоп» программа прекращаются свою работу и начинает считывать значения которые обработались до определенного момента и записует значения в поля. При нажатии на кнопку «2D/3D» пользователь может наблюдать изменение графика из 2D в 3D и наоборот. При нажатии на кнопку «Выход» программа будет завершена. В закладке «About» пользователь может узнать о создателях данного программного продукта и краткое описание программного продукта. Заключение В данной курсовой работе была достигнута поставленная цель: я изучил и создал программный продукт, который представляет моделирование на компьютере логнормального распределения. Научился применять на практике свои знания полученные в процессе изучения Delphi. В данном программном продукте реализованы работа с графиками, с таблицами, таймерами, файлами, различными математическими функциями. Этот программный продукт, на мой взгляд, представляет собой законченную рабочую и отлаженную программу. Список используемой литературы 1. http://en.wikipedia.org 2. Шеффе Г. Дисперсионный анализ. — М.: Физматгиз, 1980. — 628 с. 3. «Delphi 2005: „Секреты программирования“», Михаил Фленов.