📄 股票运动路径模拟.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double frand()
{
return (double)rand()/(RAND_MAX);
}
// 配极法产生正态分布, 一次产生两个独立变量
double normal()
{
double v1,v2,s, x1,x2;
do {
v1= frand()*2.0-1.0;
v2= frand()*2.0-1.0;
s= v1*v1+v2*v2;
} while(s>=1.0);
if (s==0)
x1=x2=0.0;
else{
x1= v1 * sqrt(-2.0 * log(s)/s);
x2= v2 * sqrt(-2.0 * log(s)/s);
}
return x1;
}
/*
Input: s0 - 起始价格
r - 预期无风险收益率
sigma - 波动率
t - 到期时间
n - 时间区间段数
fp - 数据保存的文件
*/
float run(float s0, float r, float sigma,
float t, int n, FILE *fp)
{
int i;
float dt, omega, s;
if (n < 1)
{
return 0;
}
dt = t/n;
fprintf(fp, "股票价格\t随机抽样值\t股票价值变化\n");
for (i=0; i<n; i++)
{
omega = normal();
s = s0;
s0 *= 1 + r*dt + sigma * sqrt(dt) * omega;
fprintf(fp, "%.4f\t\t%.4f\t\t%.4f\n", s, omega, s0-s);
}
return s0;
}
int main(int argc, char *argv[])
{
FILE *fp;
time_t tm;
float s0, r, sigma, t, res = 0;
int i, n, nn;
puts("股票价格模拟程序");
puts("----------------------------------");
printf("请输入起始价格:");
scanf("%f", &s0);
printf("请输入预期无风险收益率:");
scanf("%f", &r);
printf("请输入波动率:");
scanf("%f", &sigma);
printf("请输入到期时间(单位:月):");
scanf("%f", &t);
t /= 12;
printf("请输入时间区间段数:");
scanf("%d", &n);
printf("请输入模拟次数:");
scanf("%d", &nn);
printf("开始模拟...\n");
fp = fopen("data.txt", "w");
srand( (unsigned)time(&tm) );
fprintf(fp, "股票价格模拟结果\n");
for (i=0; i<nn; i++)
{
fprintf(fp, "------------------------------------------------\n");
res += run(s0, r, sigma, t, n, fp);
}
fprintf(fp, "------------------------------------------------\n");
fprintf(fp, "到期瞬时股票平均价格 %.4f\n", res/nn);
puts("模拟结束,结果保存在 data.txt 中");
fclose(fp);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -