// 导出功能模块 // 导出为Excel(使用纯JS实现CSV导出) function exportToExcel(data, filename) { // 将数据转换为CSV格式 const csv = convertToCSV(data); // 创建Blob并下载 const blob = new Blob(['\ufeff' + csv], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); const url = URL.createObjectURL(blob); link.setAttribute('href', url); link.setAttribute('download', filename); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } function convertToCSV(data) { if (!data || data.length === 0) return ''; // 获取表头 const headers = Object.keys(data[0]); // 构建CSV内容 const csvContent = [ headers.join(','), // 表头行 ...data.map(row => headers.map(header => { let cell = row[header]; // 处理特殊字符 if (typeof cell === 'string' && (cell.includes(',') || cell.includes('"'))) { cell = `"${cell.replace(/"/g, '""')}"`; } return cell; }).join(',') ) ].join('\n'); return csvContent; } // 绑定导出按钮事件 document.addEventListener('DOMContentLoaded', function() { // 延迟绑定,确保元素已加载 setTimeout(() => { // 参数优化结果导出 const optExportBtn = document.getElementById('opt-export-btn'); if (optExportBtn) { optExportBtn.addEventListener('click', () => { if (currentOptData && currentOptData.data) { const filename = `参数优化结果_${new Date().toISOString().slice(0,10)}.csv`; exportToExcel(currentOptData.data, filename); } else { alert('请先加载数据'); } }); } // 交易明细导出 const tradesExportBtn = document.getElementById('trades-export-btn'); if (tradesExportBtn) { tradesExportBtn.addEventListener('click', () => { if (currentTradesData && currentTradesData.data) { const filename = `交易明细_${new Date().toISOString().slice(0,10)}.csv`; exportToExcel(currentTradesData.data, filename); } else { alert('请先加载数据'); } }); } }, 1000); }); // 生成完整报告(HTML格式) function generateFullReport() { if (!currentOptData && !currentTradesData && !currentEquityData) { alert('请先加载数据'); return; } let reportHTML = ` 回测报告

📊 A股回测报告

生成时间:${new Date().toLocaleString('zh-CN')}

`; // 添加优化结果部分 if (currentOptData) { reportHTML += `

参数优化结果

参数组合总数

${currentOptData.stats.total_combinations || 0}

最佳夏普比率

${currentOptData.stats.best_sharpe ? currentOptData.stats.best_sharpe.toFixed(4) : 'N/A'}

最佳总收益

${currentOptData.stats.best_return ? (currentOptData.stats.best_return * 100).toFixed(2) + '%' : 'N/A'}

`; currentOptData.data.slice(0, 10).forEach((row, index) => { reportHTML += ` `; }); reportHTML += `
排名 短期均线 长期均线 持有天数 总收益率 夏普比率 最大回撤
${index + 1} ${row.param_ma_short || '-'} ${row.param_ma_long || '-'} ${row.param_hold_days || '-'} ${(row.total_return * 100).toFixed(2)}% ${row.sharpe ? row.sharpe.toFixed(4) : '-'} ${(row.max_drawdown * 100).toFixed(2)}%
`; } // 添加交易明细部分 if (currentTradesData) { reportHTML += `

交易统计

总交易次数

${currentTradesData.stats.total_trades || 0}

胜率

${currentTradesData.stats.win_rate || '0%'}

总盈亏

¥${currentTradesData.stats.total_profit ? currentTradesData.stats.total_profit.toFixed(2) : '0'}

`; } reportHTML += `
`; // 下载HTML报告 const blob = new Blob([reportHTML], { type: 'text/html;charset=utf-8;' }); const link = document.createElement('a'); const url = URL.createObjectURL(blob); link.setAttribute('href', url); link.setAttribute('download', `回测报告_${new Date().toISOString().slice(0,10)}.html`); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); }