【量化】实战获取资产组合理论模型的数据源
作者:幻好
本文主要基于恒有数社区获取资产组合理论模型所需数据源的过程实践。
资产组合理论模型简介
1952年,一个叫马科维茨的芝加哥大学的博士生,发表了一篇论文,通过将概率论和运筹学结合起来回答投资者为什么要分散投资。他提出了著名的“均值-方差准则”,也就是使用投资组合收益的均值刻画投资者想要的东西(desirable thing),使用收益的方差刻画投资者不想要的东西(undesirable thing,即风险)。而这篇论文就是资产组合理论(Portfolio Theory),他因此获得了诺贝尔经济学奖。
数据来源 - 恒有数
恒有数金融数据社区(),源自恒生的金融数据开放和可视化社区,旨在为量化投资爱好者、金融从业人员、高校师生、政府机构和财经媒体等人群提供专业的金融数据服务,满足不同用户丰富多样的数据分析和投资研究需求。
恒有数提供涵盖股票、基金、债券、期权期货、港股等金融数据(数据目录见附录1)。提供在线预览、在线下载和在线调试等功能,简单高效的API接口(接口语言包括HTTP、Python、MATLAB、Java),丰富的接口文档与帮助文档,使得用户可以方便快捷地获取数据。
采集数据源过程
确定所需数据
根据需求,我们主要获取四只股票历史交易数据:三一重工600031、迈瑞医疗300760、比亚迪002594、贵州茅台600519
需要获取以下数据字段:
交易日期:交易日期
证券代码:股票的代码,上证股票以sh结尾,深证股票以sz结尾
开盘价:当日股票股票开盘价格
最高价:当日股票交易最高价格
最低价:当日股票交易最低价格
收盘价:股票收盘价格
涨跌幅:复权之后的真实准确涨跌幅
成交量:当日股票成交量
成交额:当日股票成交额
换手率:当日股票换手比例
是否跌停:本月股票最后一个交易日收盘是否跌停
数据接口
需要获取数据的接口如下:
1.1.2 交易日历 (https://udata.hs.net/datas/200/)
获取交易日时间
1.2.1 股票日行情(https://udata.hs.net/datas/332/)
获取沪深日行情,包含昨收价、开盘价、最高价、最低价、收盘价、成交量、成交金额等数据;
采集数据程序
数据部分程序代码如下:
import hs_udata as hs
import pandas as pd
import config.sys_config as config
# 获取从开始日期到目前日期的每个月的最后一个交易日
def get_trade_dates(token, start_date, end_date):
hs.set_token(token)
trade_date = hs.trading_calendar(secu_market='83',
if_trading_day='1',
start_date=start_date,
end_date=end_date)
return trade_date
# 获取股票交易信息
# 获取数据:证劵代码,交易日期,开盘价,最高价,收盘价,涨跌幅,成交数量,成交额,换手率,涨跌停状态,交易状态
stock_fields = "prod_code,trading_date,open_price,high_price,close_price,px_change_rate,business_amount,business_balance,turnover_ratio,up_down_status,turnover_status"
stock_data = hs.stock_quote_daily(en_prod_code=secu_code,
trading_date=trade_date,
adjust_way=2,
fields=stock_fields)
return stock_data
if __name__ == '__main__':
token = config.HsData().get_token()
loop = 0
# 获取交易日期
trade_date_list = get_trade_dates(token, "2020-05-16", "2021-11-11")
# 三一重工600031 迈瑞医疗300760 比亚迪002594 贵州茅台600519 构成一个投资组合
index_code_list = ['600031.SH', '300760.SZ', '002594.SZ', '600519.SH']
for code in index_code_list:
stock_data_list = get_stock_const(token, index_stock_code=code)
stock_code = ""
for code in index_code_list:
stock_code = code
res_data = pd.DataFrame()
for trade_date in trade_date_list["trading_date"]:
if res_data.size == 0:
res_data = get_stock_month_trade(token, stock_code, trade_date)
res_data.to_csv("temp/" + code + ".csv", mode='w', index=False, encoding="gbk")
else:
res_data = get_stock_month_trade(token, stock_code, trade_date)
res_data.to_csv("temp/" + code + ".csv", mode='a', index=False, header=False, encoding="gbk")
stock_code = ""
获取到以下数据源:

总结
通过恒有数获取股票等金融数据,操作上手十分简单,大大提升了金融数据分析等应用的效率下,赶快动手实践起来。