在上一篇中,我们学会了如何用Tushare获取单只股票的数据并做基础可视化。但量化分析的核心,在于从数据中找规律、把规律变成策略、然后用数据验证策略的可行性。

今天我们更进一步,学习多股票数据获取、指标计算、策略构建和数据存储——这将是量化投资中日常打交道最多的几个环节。

一、批量获取多股票行情

实际分析中,往往需要同时处理多只股票的数据。下面这段代码可以批量获取某个时间区间内全部A股的日线数据:

python

import tushare as ts
import pandas as pd
from tqdm import tqdm

# 先获取全部股票列表
pro = ts.pro_api('/你的Token/')
stock_list = pro.stock_basic(exchange='', list_status='L')[['ts_code', 'name']]

# 批量获取日线数据
def fetch_stock_data_batch(ts_code_list, start_date, end_date):
    data_dict = {}
    for ts_code in tqdm(ts_code_list, desc="正在获取数据"):
        try:
            df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
            if not df.empty:
                data_dict[ts_code] = df.sort_values('trade_date')
        except Exception as e:
            print(f"获取{ts_code}失败: {e}")
    return data_dict

注意:免费版每日调用次数有限,建议根据自己的需求合理安排采集范围和频率,避免超限。

二、构建双均线策略

双均线策略是量化投资最经典的入门策略之一。当短期均线上穿长期均线时,我们认为趋势向好,给出买入信号;当短期均线下穿长期均线时,给出卖出信号。

python

def dual_ma_strategy(df, fast_period=5, slow_period=20):
    df = df.copy()
    df['fast_ma'] = df['close'].rolling(window=fast_period).mean()
    df['slow_ma'] = df['close'].rolling(window=slow_period).mean()
    
    # 生成交易信号:快线上穿慢线时买入(1),下穿时卖出(-1)
    df['signal'] = 0
    df['signal'] = np.where(df['fast_ma'] > df['slow_ma'], 1, 0)
    df['position'] = df['signal'].diff()
    
    return df

# 对茅台数据应用策略
result = dual_ma_strategy(df)
result[['close', 'fast_ma', 'slow_ma', 'signal', 'position']].tail(20)

得到position列:1表示买入,-1表示卖出。这个简单的框架,就是量化策略最底层的逻辑骨架。

三、策略可视化

python

fig, axes = plt.subplots(2, 1, figsize=(16, 12), sharex=True)

# 价格与均线
ax1 = axes[0]
ax1.plot(df.index, df['close'], label='收盘价', color='blue', alpha=0.6)
ax1.plot(df.index, result['fast_ma'], label='5日均线', color='orange', linewidth=1.5)
ax1.plot(df.index, result['slow_ma'], label='20日均线', color='green', linewidth=1.5)
ax1.set_title('双均线策略 - 价格与均线', fontsize=14)
ax1.set_ylabel('价格')
ax1.legend()

# 买卖信号
ax2 = axes[1]
buy_signals = result[result['position'] == 1]
sell_signals = result[result['position'] == -1]
ax2.plot(df.index, df['close'], color='gray', alpha=0.5, label='收盘价')
ax2.scatter(buy_signals.index, buy_signals['close'], marker='^', 
            color='red', s=100, label='买入信号', zorder=5)
ax2.scatter(sell_signals.index, sell_signals['close'], marker='v', 
            color='green', s=100, label='卖出信号', zorder=5)
ax2.set_title('买卖信号标注', fontsize=14)
ax2.set_ylabel('价格')
ax2.legend()

plt.tight_layout()
plt.show()

四、数据存储到本地数据库

量化分析需要大量历史数据,每次都从API拿并不现实。建议采用三级存储架构:

  • 热数据层:Redis缓存最近数据

  • 温数据层:PostgreSQL存储1-5年数据

  • 冷数据层:HDFS/本地文件存储全量历史

即便是初学者,也推荐至少将数据存入本地SQLite数据库:

python

# 使用to_sql存入本地数据库
from sqlalchemy import create_engine

engine = create_engine('sqlite:///stock_data.db')
df_basic = pro.stock_basic(exchange='', list_status='L')
df_basic.to_sql('stock_basic', engine, if_exists='replace', index=False)
print("✓ 数据已存入本地数据库")

# 从本地数据库读取
df = pd.read_sql("SELECT * FROM stock_basic WHERE industry IS NOT NULL", engine)

小结:今天我们从单只股票跨越到了多股票分析,从简单可视化跨越到了策略构建,还学会了将数据存入本地。这些都是量化投资日常工作中最实用的技能。下一篇,我们将迈向真正的高阶领域——多因子模型和机器学习预测。

推荐阅读:上一篇请戳这里https://blog.csdn.net/ted_hou/article/details/160868971

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐