c语言内部收益率,内部收益率 (C语言代码)

解题思路:

二分法求解近似值

注意事项:

参考代码:

#include

double cf[30];

int main()

{

int i,j,n;

double s,f,x,l,r,m;

while(scanf("%d",&n)!=EOF)

{

if(n==0)    //当输入值为0时退出循环运算

break;

scanf("%lf",&x);

for(i=0;i

scanf("%lf",&cf[i]);

l=-1.0;          //设置左区间

r=1e6;          //设置右区间

for(i=0;i<100;i++)

{

s=0;

f=1.0;

m=(l+r)/2;   //取中间值

for(j=0;j

{

f=f/(1+m);

s=s+cf[j]*f;

}

if(s>(-x))

l=m;        //近似值可能落入右区间

else

r=m;        //近似值可能落入左区间

}

printf("%.2lf\n",m);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C 量化投资策略代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define MAX_LEN 1024 // 定义股票结构体 typedef struct Stock { char date[MAX_LEN]; float open; float high; float low; float close; float volume; float adj_close; } Stock; int main() { // 获取股票数据 FILE *fp = fopen("data.csv", "r"); char line[MAX_LEN]; fgets(line, MAX_LEN, fp); // 跳过第一行标题 int num_stocks = 0; while (fgets(line, MAX_LEN, fp)) { num_stocks++; } rewind(fp); // 将文件指针重新移动到文件开头 fgets(line, MAX_LEN, fp); // 再次跳过第一行标题 Stock *stocks = (Stock*)malloc(num_stocks * sizeof(Stock)); int i = 0; while (fgets(line, MAX_LEN, fp)) { char *token = strtok(line, ","); strcpy(stocks[i].date, token); token = strtok(NULL, ","); stocks[i].open = atof(token); token = strtok(NULL, ","); stocks[i].high = atof(token); token = strtok(NULL, ","); stocks[i].low = atof(token); token = strtok(NULL, ","); stocks[i].close = atof(token); token = strtok(NULL, ","); stocks[i].volume = atof(token); token = strtok(NULL, ","); stocks[i].adj_close = atof(token); i++; } fclose(fp); // 计算收益率 float *returns = (float*)malloc(num_stocks * sizeof(float)); for (i = 1; i < num_stocks; i++) { returns[i] = (stocks[i].close - stocks[i - 1].close) / stocks[i - 1].close; } // 计算移动平均线 int window_size = 5; float *MA_5 = (float*)malloc(num_stocks * sizeof(float)); for (i = window_size - 1; i < num_stocks; i++) { float sum = 0.0; for (int j = i - window_size + 1; j <= i; j++) { sum += stocks[j].close; } MA_5[i] = sum / window_size; } window_size = 20; float *MA_20 = (float*)malloc(num_stocks * sizeof(float)); for (i = window_size - 1; i < num_stocks; i++) { float sum = 0.0; for (int j = i - window_size + 1; j <= i; j++) { sum += stocks[j].close; } MA_20[i] = sum / window_size; } // 生成交易信号 int *signals = (int*)malloc(num_stocks * sizeof(int)); for (i = window_size - 1; i < num_stocks; i++) { if (MA_5[i] > MA_20[i]) { signals[i] = 1; } else { signals[i] = -1; } } // 计算策略收益率 float *strategy_returns = (float*)malloc(num_stocks * sizeof(float)); for (i = window_size; i < num_stocks; i++) { strategy_returns[i] = signals[i - 1] * returns[i]; } // 计算累计收益率 float *cum_returns = (float*)malloc(num_stocks * sizeof(float)); cum_returns[0] = 0.0; for (i = 1; i < num_stocks; i++) { cum_returns[i] = cum_returns[i - 1] + strategy_returns[i]; } // 绘制累计收益率曲线 FILE *gp = popen("gnuplot -persist", "w"); fprintf(gp, "plot '-' with lines\n"); for (i = 0; i < num_stocks; i++) { fprintf(gp, "%d %f\n", i, cum_returns[i]); } fprintf(gp, "e\n"); fflush(gp); pclose(gp); // 释放内存 free(stocks); free(returns); free(MA_5); free(MA_20); free(signals); free(strategy_returns); free(cum_returns); return 0; } ``` 以上代码实现了一个简单的均线策略,根据股价的 5 日和 20 日移动平均线的交叉来生成交易信号,进而计算出策略收益率和累计收益率,并绘制出累计收益率曲线。需要注意的是,C 语言的绘图库较少,这里使用了 `gnuplot` 来绘制图表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值