共计 2414 个字符,预计需要花费 7 分钟才能阅读完成。
量化交易基础与 skill 语言优势
量化交易是通过数学模型和计算机程序执行投资决策的过程。相比主观交易,量化策略具有可回溯、可复现、可规模化的特点。skill 语言作为金融行业标准脚本语言,在量化领域有三大优势:

- 原生金融函数库:内置 OHLCV 数据处理、技术指标计算等专业函数
- 低延迟执行:直接对接券商交易系统,避免 API 层延迟
- 开发效率高:类 Lisp 语法简洁,支持快速策略迭代
新手常见痛点分析
根据社区调研,90% 的量化新手会在三个月内遇到以下问题:
- 数据质量问题:
- 复权错误导致价格断层
- 停牌期间产生异常成交量
-
集合竞价数据缺失
-
策略过拟合:
- 在特定时间段表现优异
- 参数敏感度过高
-
样本外测试效果骤降
-
执行延迟:
- 行情推送与策略触发不同步
- 大单冲击成本显著
- 滑点吞噬预期收益
MA 均线策略完整实现
数据预处理模块
; 获取日线数据并复权
(setq bars (getBars "600036.SH" 'day 100))
(setq adjBars (adjustBars bars 'dividend))
; 排除停牌日
(setq tradingDays (filter (lambda (bar) (> (volume bar) 0)) adjBars))
关键函数说明:
– adjustBars:自动处理分红送股复权
– filter:用成交量 >0 过滤有效交易日
信号生成逻辑
; 计算 5 日 /20 日均线
(setq ma5 (sma (mapcar 'close tradingDays) 5))
(setq ma20 (sma (mapcar 'close tradingDays) 20))
; 生成交易信号
(setq signals (mapcar (lambda (p5 p20)
(cond ((> p5 p20) 'buy)
((< p5 p20) 'sell)
(t 'hold)))
ma5 ma20))
注意事项:
– 使用 mapcar 实现向量化计算
– 条件判断避免未来函数(如不用明日收盘价)
订单管理模块
; 模拟交易执行
(let ((position 0))
(dotimes (i (length signals))
(case (nth i signals)
('buy (when (= position 0)
(setq position 1)
(logTrade (nth i tradingDays) 'open-long)))
('sell (when (> position 0)
(setq position 0)
(logTrade (nth i tradingDays) 'close-long))))))
避坑指南
数据验证四步法
- 检查时间连续性:确认无日期断层
- 验证极端值:单日涨跌幅不超过 20%
- 成交量校核:停牌日应为零成交量
- 复权一致性:比较不同数据源复权后价格
未来函数防范
- 禁用
futureBar类函数 - 策略逻辑仅使用已发生数据
- 回测时引入 1Tick 延迟模拟实盘
滑点处理方案
- 固定滑点:每笔交易扣除 0.1%
- 比例滑点:大单按成交量比例增加
- TWAP 算法:大单分时执行
性能优化技巧
向量化计算
将循环操作改为矩阵运算:
; 传统循环方式
(setq returns ())
(dolist (bar tradingDays)
(push (/ (- (close bar) (open bar)) (open bar)) returns))
; 向量化改进
(setq returns (/ (- (mapcar 'close tradingDays)
(mapcar 'open tradingDays))
(mapcar 'open tradingDays)))
多时间帧处理
; 同时读取日线和 60 分钟线
(setq daily (getBars "000001.SZ" 'day 100))
(setq hourly (getBars "000001.SZ" 'hour60 100))
; 时间对齐函数
(defun syncBars (primary secondary)
(remove-if-not
(lambda (bar)
(find (date bar) secondary :key 'date :test'equal))
primary))
完整策略代码
;; 参数定义
(defparameter *symbol* "600519.SH")
(defparameter *fastPeriod* 5) ; 快线周期
(defparameter *slowPeriod* 20) ; 慢线周期
(defparameter *commission* 0.0003) ; 手续费率
;; 主策略函数
(defun maStrategy ()
(let* ((bars (getBars *symbol* 'day 100))
(adjBars (adjustBars bars 'dividend))
(validBars (filter (lambda (b) (> (volume b) 0)) adjBars))
(closes (mapcar 'close validBars))
(maFast (sma closes *fastPeriod*))
(maSlow (sma closes *slowPeriod*))
(position 0)
(pnl 0))
;; 信号生成与执行
(dotimes (i (length maFast))
(when (> i *slowPeriod*)
(cond ((and (> (nth i maFast) (nth i maSlow))
(= position 0))
(setq position 1)
(decf pnl (* (nth i closes) *commission*)))
((and (< (nth i maFast) (nth i maSlow))
(> position 0))
(setq position 0)
(incf pnl (- (nth i closes) (nth (1- i) closes)))))))
;; 输出业绩指标
(format t "累计收益:~5$%\n" (* 100 pnl (/ 1 (nth 0 closes))))))
进阶思考方向
- 如何动态调整参数避免参数固化?可考虑引入自适应均线周期
- 怎样处理涨停板无法买入的情况?需要引入订单状态监控
- 多品种策略中如何控制相关性风险?建议使用 PCA 降维分析
正文完
