第二章:开发环境搭建

说实话,搭建开发环境这事儿,看着简单,但坑是真不少。我见过太多人花了一整天装环境,结果还没开始写代码就心态崩了。今天咱们一步步来,把这事儿理顺。

2.1 Python虚拟环境配置

为什么要用虚拟环境?说白了,就是防止不同项目之间的包打架。你想想看,项目A需要pandas 1.0,项目B需要pandas 2.0,要是装在一个环境里,那不乱套了?

我个人习惯用 venv,Python 3.3以上自带,不用额外装东西。操作起来也很简单:

# 创建虚拟环境
python -m venv hk_quant_env

# 激活虚拟环境(Windows)
hk_quant_env\Scripts\activate

# 激活虚拟环境(Mac/Linux)
source hk_quant_env/bin/activate

# 退出虚拟环境
deactivate
小技巧: 我习惯在项目根目录下建一个 .venv 文件夹,这样一眼就能看出来这是个虚拟环境。很多IDE(比如VS Code)也会自动识别。

激活后,你会看到终端前面多了个 (hk_quant_env) 的标识。嗯,看到这个就说明环境已经切过来了。

接下来装几个必备包:

pip install pandas numpy matplotlib
pip install yfinance  # 雅虎财经数据源
pip install requests beautifulsoup4  # 爬取新浪财经用
pip install sqlalchemy pymysql  # 数据库连接
注意: 我曾经遇到过pip下载特别慢的情况,后来发现是没换国内镜像。建议用清华源:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名

2.2 港股数据源API申请

做量化交易,数据就是命根子。港股数据源我主要用两个:Yahoo Finance 和 新浪财经。各有各的优缺点,我分别说说。

2.2.1 Yahoo Finance

Yahoo Finance 的好处是免费、数据全、接口稳定。港股代码格式是 XXXX.HK,比如腾讯是 0700.HK

import yfinance as yf

# 获取腾讯控股的历史数据
ticker = yf.Ticker("0700.HK")
hist = ticker.history(period="1y")  # 过去一年数据
print(hist.head())

这里有个坑——Yahoo Finance 有时候会返回空数据。我遇到过好几次,后来发现是因为网络问题。解决办法很简单:加个重试机制。

import time
from functools import wraps

def retry(func, max_retries=3, delay=2):
    @wraps(func)
    def wrapper(*args, **kwargs):
        for i in range(max_retries):
            try:
                return func(*args, **kwargs)
            except Exception as e:
                print(f"第{i+1}次尝试失败: {e}")
                time.sleep(delay)
        raise Exception("重试次数用完了")
    return wrapper

@retry
def get_stock_data(ticker_str):
    ticker = yf.Ticker(ticker_str)
    return ticker.history(period="1mo")

data = get_stock_data("0700.HK")

2.2.2 新浪财经

新浪财经的实时数据比Yahoo快,但历史数据没那么全。我一般用新浪拿实时行情,用Yahoo拿历史数据。

import requests
import json

def get_sina_realtime(symbol):
    """获取新浪财经实时行情"""
    url = f"http://hq.sinajs.cn/list=hk{symbol}"
    headers = {
        "Referer": "https://finance.sina.com.cn",
        "User-Agent": "Mozilla/5.0"
    }
    resp = requests.get(url, headers=headers)
    # 返回格式:var hq_str_hk00700="腾讯控股,380.000,382.000,..."
    return resp.text

# 获取腾讯实时行情
data = get_sina_realtime("00700")
print(data)
避坑指南: 新浪财经的港股代码不需要加 .HK 后缀,直接用数字代码就行。而且要注意,新浪的接口有频率限制,我建议每次请求间隔至少1秒。

2.3 数据库安装与配置

数据存哪儿?小打小闹用CSV文件也行,但要做正经的量化系统,还是得上数据库。我个人推荐MySQL,社区活跃、文档多、坑少。

2.3.1 MySQL安装

Windows用户直接去官网下载安装包,一路下一步就行。Mac用户用Homebrew:

brew install mysql
brew services start mysql

安装完后,记得设置root密码:

mysql_secure_installation

2.3.2 创建数据库和表

-- 创建数据库
CREATE DATABASE hk_quant DEFAULT CHARACTER SET utf8mb4;

-- 创建股票日线数据表
CREATE TABLE daily_data (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(10) NOT NULL COMMENT '股票代码',
    trade_date DATE NOT NULL COMMENT '交易日期',
    open_price DECIMAL(10,3) COMMENT '开盘价',
    high_price DECIMAL(10,3) COMMENT '最高价',
    low_price DECIMAL(10,3) COMMENT '最低价',
    close_price DECIMAL(10,3) COMMENT '收盘价',
    volume BIGINT COMMENT '成交量',
    amount DECIMAL(20,2) COMMENT '成交额',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_code_date (code, trade_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
为什么用DECIMAL不用FLOAT? 金融数据对精度要求高,FLOAT会有精度丢失。我吃过这个亏,算出来的收益率差了几个点,排查了半天才发现是数据类型的问题。

2.3.3 Python连接数据库

from sqlalchemy import create_engine
import pandas as pd

# 连接数据库
engine = create_engine(
    "mysql+pymysql://root:你的密码@localhost:3306/hk_quant",
    echo=False
)

# 将DataFrame写入数据库
df = get_stock_data("0700.HK")
df.to_sql(
    name="daily_data",
    con=engine,
    if_exists="append",
    index=True
)

# 从数据库读取数据
query = "SELECT * FROM daily_data WHERE code = '0700.HK'"
result = pd.read_sql(query, con=engine)
print(result.head())

2.4 本章知识体系

下面这张图把整个开发环境的结构梳理了一下,你看一眼就能明白各个组件之间的关系:

开发环境架构图 Python虚拟环境 (hk_quant_env) pandas | numpy | yfinance | requests | sqlalchemy 数据源 Yahoo Finance (历史数据) 新浪财经 (实时行情) 代码格式: 0700.HK / 00700 数据库 MySQL / PostgreSQL 表结构: daily_data 字段: code, date, price... 数据流向 API获取 → 清洗处理 → 存入数据库 → 策略回测 图2-1 开发环境组件关系图

这张图把咱们今天搭建的三个部分串起来了。Python环境是核心,数据源和数据库是两翼。数据从API来,经过清洗,存到数据库,最后供策略调用。

总结一下今天的重点:
  • 虚拟环境用 venv,简单可靠
  • Yahoo Finance 拿历史数据,新浪财经拿实时数据
  • 数据库用MySQL,注意字段类型选DECIMAL
  • 所有代码都加上异常处理和重试机制

环境搭好了,后面写策略、做回测就顺手多了。记住,磨刀不误砍柴工,环境这块儿花点时间,后面能省不少事。


公众号:蓝海资料掘金营,微信deep3321