C语言量化投资策略代码
时间: 2023-07-09 11:13:42 浏览: 52
以下是一个简单的 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` 来绘制图表。