搭建一套量化交易系统涉及多个模块和组件的协同工作,包括数据采集、量化策略、可视化模块、数据处理、回测评估、自动交易等等,本文重点介绍数据采集。
要做量化分析,首先是获取数据,量化交易系统的数据获取和处理通常包括以下步骤:
1. 数据源选择:选择合适的数据源,可以是交易所提供的实时数据、历史数据供应商、财经新闻网站等。
2. 数据下载:从数据源获取数据,可以使用API、数据下载工具或网络爬虫。
3. 数据清洗:对获取的数据进行清洗,包括处理缺失值、异常值和重复数据,确保数据质量。
4. 数据存储:将数据存储在适当的数据存储介质中,如数据库、CSV文件或数据框架。
量化交易中,数据对我们来说非常的主要,尤其在我们实时自动化交易中,实时数据对我们来说非常的主要,数据获取我们可以通过网络爬虫,从东方财富,新浪财经,腾讯财经,同花顺财经获取数据,包括实时股票数据,我们也可以通过金融数据库比如akshare,tushare,baostock调用金融数据接口,以下是
baostock获取数据方法。
import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import mplfinance as mpf
import datetime
def login_baostock():
# 登录系统
lg = bs.login()
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
def get_info(code, start_date, end_date, frequency="d", adjustflag="3"):
# 获取历史K线数据
if frequency == 'd': # 非日频数据只记录每个时间段末的价格,w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟
fields = "date,open,high,low,close,preclose,volume,amount,turn,pctChg,peTTM,pbMRQ"
else:
fields = "date,close,volume,amount,turn,pctChg"
rs = bs.query_history_k_data_plus(code=code,
fields=fields,
start_date=start_date, end_date=end_date,
frequency=frequency, adjustflag=adjustflag)
# adjustflag 复权类型,默认不复权:3;后复权;1;前复权:2
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
return rs
def get_profit_info(code, year, quarter):
# 获取个股季频盈利能力数据(还可获取季频营运和偿债能力等各类数据,在这里不重复列举)
profit_list = []
rs_profit = bs.query_profit_data(code=code, year=year, quarter=quarter)
while (rs_profit.error_code == '0') & rs_profit.next():
profit_list.append(rs_profit.get_row_data())
result_profit = pd.DataFrame(profit_list, columns=rs_profit.fields)
return result_profit
def get_result(rs):
# 打印数据结果
data_list = []
while (rs.error_code == '0') & rs.next():
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
return result
def get_fig(result, im_type='candle'):
# 绘制可视化图表
data_kline = result.loc[:,('date','open','high','low','close','volume')]
data_kline.columns = ['Date','Open','High','Low','Close','Volume']
data_kline.index = pd.DatetimeIndex(data_kline['Date'])
data_kline[['Open','High','Low','Close','Volume']] = data_kline[['Open','High','Low','Close','Volume']].apply(pd.to_numeric)
if im_type == 'candle':
mpf.plot(data_kline, type='candle', volume=True, style='yahoo', mav= (5, 10, 20,30))
elif im_type == 'line':
mpf.plot(data_kline, type='line')
def save_to_csv(result, code, frequency, path="D:\\Dataset\\baostocks\\"):
# 将获取的个股K线数据保存到本地
if frequency == 'd':
freq = 'day'
elif frequency == 'w':
freq = 'week'
else:
freq = 'month'
name = code[-6:] + '_' + freq + '_kline_info.csv'
result.to_csv(path + name, index=False)
def save_profit_to_csv(result_profit, path="D:\\Dataset\\baostocks\\"):
# 保存季频指标
name = code[-6:] + '_profit_info.csv'
result_profit.to_csv(path + name, encoding="gbk", index=False)
def logout_baostock():
# 退出登录
bs.logout()
if __name__ == '__main__' :
# 参数设置
code = "sz.002415" # 以海康为例
start_date = '2022-01-01'
date_today = datetime.datetime.now().strftime('%Y-%m-%d') # 当前日期2023年8月13日
end_date = date_today
freq = "d"
ending_year = 2023
login_baostock()
# 获取股票基本数据
rs1 = get_info(code, start_date, end_date, frequency=freq)
result_kline = get_result(rs1)
# 获取企业各类季频数据(以季频盈利能力数据为例,获取从设置日期开始往前5年的数据)
result_profit = get_profit_info(code, ending_year, 4)
result_profit = result_profit.drop(index=result_profit.index)
for i in range(5):
for j in range(4):
temp = get_profit_info(code, ending_year-i, 4-j)
result_profit = pd.concat([result_profit,temp])
save_to_csv(result_kline, code, frequency=freq) # 保存个股基本数据
save_profit_to_csv(result_profit, path="D:\\Dataset\\baostocks\\") # 保存季度盈利数据
get_fig(result_kline)
这个脚本初步实现了数据获取的功能,目前还不太完善,图像不太容易根据需要调整,也暂未包含市盈率等常用技术指标,未来会进一步优化,最终将它集成到整个量化分析代码中。
如果需要详细了解,可以关注微信公众号:老年程序员俱乐部,或加微信号:HUBANG-ClUB