#include #include #include // 関数の宣言 void QSort(double *dP1, long left, long right); //クイックソート int main(void){ FILE *fp; //ファイルポインタ long int date, time; //読み込みデータ(日付, 時間) double *rate; //読み込みデータ(為替レート) long int t,t1,t_end=87536,dt; //t_endはデータ数, dtは時間スケール double *dP,*dP1,box_size=0.01,box_x,box[101],box_sum; //レート差, レート差(ソート用), 分割サイズ, ,箱の中央値 ,箱, 全ての箱に入るデータ数 double ave,sigma; //平均値,標準偏差 long int *s,s_end=-1; //2値化したレート差, 2値化したレート差のデータ数 double Prob[2][5]; //条件付き確率 //*** メモリの確保 rate=(double*)malloc(sizeof(double)*(100000)); dP=(double*)malloc(sizeof(double)*(100000)); dP1=(double*)malloc(sizeof(double)*(100000)); s=(long*)malloc(sizeof(long)*(100000)); //*** データの読み込み fp=fopen("data2.txt", "r"); for(t=0;t<=t_end;t++) { fscanf(fp,"%ld,%ld,%lf",&date,&time,&rate[t]); } fclose(fp); //*** 初期化 for(t=0;t<=100;t++) box[t]=0; box_sum=0; ave=0; sigma=0; for(t=0;t<=4;t++){ Prob[0][t]=0; Prob[1][t]=0; } //******************* //*** 確率密度関数 for(t=0;t<=t_end-1;t++){ dP[t]=rate[t+1]-rate[t]; ave=ave+dP[t]; sigma=sigma+dP[t]*dP[t]; for(t1=0;t1<=100;t1++){ if(dP[t]>=((double)t1)*box_size-0.305 && dP[t]<((double)t1+1.0)*box_size-0.305){ box[t1]++; //ある幅に存在するレート変動の数をカウントする(ヒストグラム作成) box_sum++; break; } } } for(t1=0;t1<=100;t1++){ box[t1]=box[t1]/box_sum/box_size; //確率密度関数を計算 box_x=((double)t1)*box_size+0.5*box_size-0.305; //箱の中央値の値を算出 printf("%lf,%lf\n", box_x,box[t1]); } printf("\n"); //*** 平均と標準偏差 ave=ave/((double)t_end); //平均値 sigma=pow(sigma/((double)t_end)-ave*ave,0.5); //標準偏差 printf("%lf,%lf\n", ave,sigma); printf("\n"); //*** 横軸を標準偏差で見た確率密度関数 for(t1=0;t1<=100;t1++){ box[t1]=box[t1]*sigma; //レート差を標準偏差で割った値の確率密度関数 box_x=(((double)t1)*box_size+0.5*box_size-0.305-ave)/sigma; printf("%lf,%lf\n", box_x,box[t1]); } printf("\n"); //******************** //*** レート差の絶対値の累積確率密度関数 for(t=0;t<=t_end-1;t++) dP1[t]=fabs(dP[t]); QSort(dP1, 0, t_end-1); //クイックソートの関数を呼び出す for(t=0;t<=t_end-1;t++){ printf("%lf,%lf,%lf\n",dP1[t_end-1-t],dP1[t_end-1-t]/sigma,((double)(t+1))/((double)t_end)); //レート差、標準偏差で割ったレート差、そのレート差以上の値&その標準偏差で割ったレート差以上の値が発生する確率 } printf("\n"); //******************** //*** 条件付き確率 for(t=0;t<=t_end-1;t++){ if(rate[t+1]>rate[t]){ s_end++; s[s_end]=1; } if(rate[t+1]= j) break; // i >= j なら無限ループから抜ける temp = dP1[i]; // dP1[i] と dP1[j]を交換 dP1[i] = dP1[j]; dP1[j] = temp; i++; // 次のデータ j--; } if (left < i - 1) QSort(dP1, left, i - 1); // 基準値の左に 2 以上要素があれば左の配列を Q ソートする if (j + 1 < right) QSort(dP1, j + 1, right); // 基準値の右に 2 以上要素があれば右の配列を Q ソートする } //**********************************************************************************************************