第二章:金融市场与数据

做量化交易,说白了就是跟数据打交道。我见过太多人一上来就研究各种高大上的模型,结果连数据都没搞明白——嗯,这其实是个大坑。今天咱们就把这块地基打扎实。

2.1 三大主流市场:股票、期货、外汇

先聊聊这三个市场。我个人的习惯是,做策略之前先搞清楚市场脾气。

股票市场,大家最熟悉。A股、港股、美股,各有各的玩法。A股有个特点——T+1,你今天买了明天才能卖。这跟期货、外汇完全不一样。我在做A股策略时,就吃过这个亏,模型跑得挺漂亮,结果一实盘发现没法当天止损,那叫一个难受。

期货市场,带杠杆的。你想想看,10倍杠杆意味着行情波动1%,你的本金就波动10%。刺激是真刺激,风险也是真风险。期货还有个好处——可以做空,涨跌都能赚钱。但要注意,期货有交割日,不像股票可以一直拿着。

外汇市场,全球最大的金融市场。一天交易量6万亿美金,什么概念?比全球所有股票市场加起来还多。外汇是24小时交易的,从悉尼开盘到纽约收盘,你睡觉的时候行情也在动。我建议新手先别碰外汇,流动性太好,波动也大,容易上头。

核心区别一览:

市场 交易时间 杠杆 做空 交割
股票 4-6小时/天 无(融资除外) 需开通权限
期货 夜盘+日盘 5-20倍 支持 有交割日
外汇 24小时 50-500倍 支持 T+2

2.2 K线图与时间序列数据

K线图,做交易的人天天看。一根K线包含四个价格:开盘价、收盘价、最高价、最低价。为什么用K线不用折线图?因为信息密度大。一根K线就能看出多空博弈的结果。

我记得刚入行时,有个老交易员跟我说:「看K线要看实体和影线的比例。」实体长说明趋势强,影线长说明有阻力。后来我做量化策略时,还真把这个特征加进去了,效果不错。

时间序列数据,就是按时间顺序排列的数据点。股票的价格、成交量、换手率,这些都是时间序列。处理时间序列有个关键点——时间对齐。不同数据源的时间戳可能不一样,有的精确到秒,有的精确到天。我曾经因为时间没对齐,回测结果看起来年化50%,实盘直接亏成狗。

我的小技巧:拿到数据后,第一件事就是检查时间戳的连续性。用pandas的isna()看看有没有缺失值,用duplicated()看看有没有重复数据。这两步做完,能避免80%的坑。

2.3 数据源与数据获取

数据源这块,我踩过的坑比走过的路还多。给大家推荐几个靠谱的:

  • Yahoo Finance:免费,覆盖全球市场。用yfinance库就能拉数据,适合快速验证想法。但要注意,Yahoo的数据偶尔会有调整,回测时最好跟其他源交叉验证。
  • Tushare:国内数据源,A股数据很全。需要注册获取token,免费版有调用次数限制。我一般用Tushare拉日线数据,分钟级数据还是得付费。
  • Wind/Choice:机构用的多,数据质量高,但贵。个人做研究的话,前期用免费源就够了。

来个代码示例,看看怎么用Python拉数据:

import yfinance as yf
import pandas as pd

# 下载贵州茅台数据
ticker = "600519.SS"
data = yf.download(ticker, start="2023-01-01", end="2023-12-31")

# 看看数据长什么样
print(data.head())

# 保存到本地
data.to_csv("maotai_2023.csv")

这段代码很简单,但有个细节要注意——A股代码在Yahoo上要加后缀。上海交易所加.SS,深圳交易所加.SZ。我第一次用的时候不知道,查了半天数据都是空的,气得想砸电脑。

2.4 数据清洗与预处理

数据清洗,说白了就是「去脏」。真实世界的数据没有干净的,我敢说90%的量化策略失败,根源都在数据质量上。

常见的问题有:

  • 缺失值:停牌、节假日、数据源抽风,都会导致数据缺失。处理方法有删除、向前填充、插值等。我个人习惯用向前填充,因为金融数据有记忆性,昨天的价格对今天影响最大。
  • 异常值:比如某天涨了1000%,这明显是数据错误。可以用3σ原则或者IQR方法检测。
  • 复权处理:股票有分红送股,不复权的价格是失真的。前复权和后复权,我建议用前复权,这样历史价格看起来更连续。

避坑指南:我曾经用未复权的数据跑回测,结果发现策略在分红日附近表现特别好。一开始还以为发现了什么规律,后来才意识到是数据没处理干净。从那以后,我每次拿到数据第一件事就是复权。

来个清洗的代码示例:

import pandas as pd
import numpy as np

# 假设data是原始数据
def clean_data(df):
    # 1. 处理缺失值
    df = df.fillna(method='ffill')  # 向前填充
    
    # 2. 检测异常值(3σ原则)
    mean = df['Close'].mean()
    std = df['Close'].std()
    df = df[(df['Close'] > mean - 3*std) & 
            (df['Close'] < mean + 3*std)]
    
    # 3. 计算收益率
    df['Return'] = df['Close'].pct_change()
    
    # 4. 删除第一行(收益率是NaN)
    df = df.dropna()
    
    return df

cleaned = clean_data(data)
print(f"清洗前数据量: {len(data)}")
print(f"清洗后数据量: {len(cleaned)}")

数据清洗没有标准答案,关键是要理解你的数据是怎么产生的。比如期货数据要注意换月跳空,外汇数据要注意周末跳空。这些细节,做多了自然就有感觉了。

本章核心知识体系:

金融市场与数据 市场简介 K线图与时间序列 数据源与获取 数据清洗与预处理 股票 期货 外汇 开盘/收盘/最高/最低 时间对齐 Yahoo Finance Tushare Wind/Choice 缺失值处理 异常值检测 复权处理

好了,这一章的内容就到这。数据是量化交易的基石,这块花再多时间都值得。下一章咱们聊聊技术指标,到时候会用到今天讲的数据处理方法。

专注资料整理