在上一篇中,我们学会了如何用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