股票数据根据信息来源和分析方法的不同,可以分为技术面数据和基本面数据。
1.技术面数据
技术面数据是通过股票的历史价格和交易量等市场数据进行计算和分析得出的指标。它的核心观点是市场行为会在价格上留下痕迹,通过这些痕迹可以预测未来的价格走势。技术面数据主要关注股票价格的变动和市场趋势。
技术面分析认为市场上已有的信息都会反映在股票价格中,因此通过分析股票价格图表和技术指标,可以尽可能准确地判断价格的走势和市场趋势。
1.1 移动平均线(MA)
移动平均线是通过计算一段时间内的股票平均价格来平滑价格波动
分为简单移动平均线和指数移动平均线(对近期数据加权)
交叉信号:移动平均线的交叉可以提供买入或卖出的信号。例如,当短期移动平均线从下方穿过长期移动平均线时,被称为“黄金交叉”,可能暗示着价格上涨的趋势。相反,当短期移动平均线从上方穿过长期移动平均线时,被称为“死亡交叉”,可能暗示着价格下跌的趋势
1.2 相对强弱指数(RSI)
RSI 是一种用于衡量股票价格变动强度和速度的技术指标。它可帮助投资者判断股票市场的超买和超卖情况,以及价格的反转和确认信号。 RS = (14个交易周期内涨幅平均值) / (14个交易周期内跌幅平均值); RSI = 100 - (100 / (1 + RS))
RSI在0到30之间:表示股票市场被超卖,可能存在价格反弹的机会。
RSI在70到100之间:表示股票市场被超买,可能存在价格下跌的机会。
RSI在30到70之间:表示股票市场相对平稳,没有明显的超买或超卖信号。
RSI 是一种短期的指标,对价格的反应较为敏感。因此,投资者在使用RSI时应该结合其他技术指标和基本面分析,以获得更全面准确的市场判断和交易决策。
1.3 随机指标
随机指标的计算基于一段时间内的收盘价与最高价和最低价的关系。该指标通常使用 %K 线和 %D 线两条线,并结合超买区和超卖区进行解读。
计算步骤:首先,计算一定时间段(常见为14个交易日)内的最高价和最低价;计算当前收盘价与该时间段内最低价的差值(收盘价-最低价),并除以最高价和最低价的差值(最高价-最低 价)。 %K = (收盘价 - 最低价)/ (最高价 - 最低价) * 100; 计算%K的移动平均值作为%D线的值,通常使用3日平均。 %D = %K的3日简单移动平均线
当 %K 线从下方穿越%D线时,被视为买入信号,可能预示着价格的反转和上涨。
当 %K 线从上方穿越%D线时,被视为卖出信号,可能预示着价格的反转和下跌。
当 %K 线位于高位(一般超过80)时,表示市场可能超买,价格的下跌风险增加。
当 %K 线位于低位(一般低于20)时,表示市场可能超卖,价格的上涨机会增加。
1.4成交量指标
成交量指标衡量了股票交易的活跃程度。当股票价格上涨时,成交量增加可以视为价格上涨的确认,而当股票价格下跌时,成交量增加可能表示价格下跌的确认。
1.5 MACD指标
DIF 线:是短期指数移动平均线(如12日 EMA)减去长期指数移动平均线(如26日 EMA)得到的差值线。DIF 线可以较为敏感地反应价格的短期波动。
DEA 线:是对 DIF 线进行平滑处理,一般使用DIF线的9日移动平均线得到。DEA 线可以平滑 DIF 线的波动,更好地体现价格的中期趋势。
MACD 柱:是 DIF 线与 DEA 线的差值,可将价格的快速波动变化显示为柱状图。柱状图的红色柱代表 DIF 线在 DEA 线上方,表示价格可能上涨;绿色柱代表 DIF 线在 DEA 线下方,表示价格可能下跌。
MACD 指标的应用主要包括以下几个方面:
趋势判断:当 DIF 线与 DEA 线发生金叉(DIF 线向上穿过 DEA 线)时,表示价格可能出现上涨趋势;当 DIF 线与 DEA 线发生死叉(DIF 线向下穿过 DEA线)时,表示价格可能出现下跌趋势。
买卖信号:当 MACD 柱由负值转为正值时,被视为买入信号;当 MACD 柱由正值转为负值时,被视为卖出信号。这些转折点可能表示价格快速波动的转变。
背离信号:观察价格和 MACD 指标的背离情况。例如,当价格创新高而 MACD 指标未能创新高时,可能表示价格上涨动能下降,可能出现价格回调。
MACD指标是一种相对较慢的指标,较长时间的移动平均线会导致滞后性。因此,投资者通常会结合其他技术指标和图表形态来进行综合分析和判断。同时,使用MACD指标时也要关注交易量以及价格走势的配合,以提高准确性和可靠性。
2. 基本面数据
基本面数据是通过分析公司的财务状况、业绩表现、竞争力等基本信息得出的评估。基本面分析认为股票的价格是与公司的基本面因素相关的,包括公司的营业收入、盈利能力、资产负债情况、市场份额、竞争优势等。基本面分析的目标是评估公司的内在价值,并基于这些评估来判断股票的投资潜力。
基本面数据通常需要通过公司公开的财务报告和公告来获取。
2.1 每股收益
用于衡量公司每股可供股东分配的净利润,即每股盈利能力。每股收益的计算公式为:EPS = 净利润 / 流通股本
每股收益作为一个单一的指标,不能完全评估公司的业绩和潜力。投资者还需要结合其他指标和信息,如市盈率(PE ratio)、市净率(PB ratio)、行业对比等,进行全面分析和判断。此外,每股收益数据也需要结合公司的财务报表和公告信息核实,以确保数据的准确性和可靠性。
2.2 市净率
也称为股价净资产比,是一种用于衡量股票当前市场价格与公司每股净资产之间关系的指标。它是用来评估公司的市场估值是否低估或高估的重要指标。
市净率的计算公式为:市净率 = 公司总市值 / 公司净资产;公司总市值是指公司所有已发行股票的市值之和,而公司净资产是指公司的总资产减去总负债
市净率低于1:通常表示公司的市场价值低于其净资产,股票可能被低估。
市净率约等于1:表示公司的市场价值大致等于其净资产,股票被市场公平估价。
市净率高于1:通常表示公司的市场价值高于其净资产,股票可能被高估。
2.3股息收益率
用于衡量股票派发的股息相对于股票的价格的比率。股息是公司利润的一部分,以现金或股票形式派发给股东。
股息收益率 = 每股股息 / 股票价格;每股股息是指公司每股派发的股息金额,股票价格是股票在市场上的交易价格。
2.4 净利润
净利润用于衡量一家公司在特定会计期间内实际获得的净收益,即扣除各项费用和税后利润。净利润是评估公司盈利能力和基本经营状况的重要指标。
净利润 = 总收入 - 总成本 - 税收 - 其他费用
2.5 负债与资产比率
负债与资产比率用于衡量公司的资本结构和债务风险水平。该比率反映了公司负债占总资产的比例(财务杠杆),可以帮助投资者了解公司负债情况以及对负债承受能力的评估。
负债与资产比率 = 总负债 / 总资产
3.BaoStock技术面数据
3.1 历史A股K线数据
历史A股K线数据是指中国A股市场中股票价格在一段时间内的开盘价、收盘价、最高价和最低价等信息,通常以图表的形式展示。
3.2 日线使用示例
import baostock as bs
import pandas as pd
from IPython.display import display
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
#frequency:数据类型,默认为d,日k线;d=日k线、w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据,不区分大小写
#adjustflag:复权类型,“涨跌幅复权法的”优点:可以计算出资金收益率,确保初始投入的资金运用率为100%,既不会因为分红而导致投资减少,也不会因为配股导致投资增加。
rs = bs.query_history_k_data_plus("sh.600000",
"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
start_date='2024-07-01', end_date='2024-07-31',
frequency="d", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("./history_A_stock_k_data.csv", index=False)
display(result)
#### 登出系统 ####
bs.logout()
其他api与使用示例:http://baostock.com/baostock/index.php/%E9%A6%96%E9%A1%B5
4. BaoStock基本面数据
5. pandas常见指标的数据清洗
5.1 series与indexes
与字典相似,series以序号值形式存在,字典以键值对形式存在
# ----------------------------------------------------------------------------
# The dates and prices lists
# ----------------------------------------------------------------------------
dates = [ '2020-01-02', '2020-01-03','2020-01-06','2020-01-07','2020-01-08','2020-01-09','2020-01-10','2020-01-13','2020-01-14','2020-01-15' ]
# Close price
prices = [ 7.1600, 7.1900,7.0000,7.1000,6.8600,6.9500,7.0000,7.0200,7.1100,7.0400]
ser = pd.Series(data=prices, index=dates)
print(ser)
ary = ser.array #ary:[7.16, 7.19, 7.0, 7.1, 6.86, 6.95, 7.0, 7.02, 7.11, 7.04]
the_index = ser.index
#the_index:Index(['2020-01-02', '2020-01-03', '2020-01-06', '2020-01-07', '2020-01-08','2020-01-09', '2020-01-10', '2020-01-13', '2020-01-14', '2020-01-15'], dtype='object')
5.3 dataframes
Pandas的DataFrame是一个类似于电子表格的对象,其中包含了列和索引的集合。和电子表格一样,DataFrame对象也有三种类型的信息:数据(即列的集合)、列索引(即列标签)和行索引(即行标签)。我们可以将DataFrame看作是一组Series,其中每个Series都具有相同的行标签(即相同的索引)。DataFrame中的列索引将每个Series与其列标签相关联,而行索引则标识了DataFrame中任何Series中的元素。可以通过属性索引来访问这个公共的行索引。
bday = ['1', '2','3','4','5','6','7','8','9','10',]
prc_ser = pd.Series(data=prices, index=dates)
# Series with trading day
bday_ser = pd.Series(data=bday, index=dates)
df = pd.DataFrame({'Close': prc_ser, 'Bday': bday_ser})
print(df)
other_dates = ['2020-01-06','2020-01-07','2020-01-08','2020-01-09','2020-01-10','2020-01-13','2020-01-14','2020-01-15','2020-01-16','2020-01-17',]
other_bday = [3,4,5,6,7,8,9,10,11,12,]
new_bday_ser = pd.Series(data=other_bday, index=other_dates)
new_df = pd.DataFrame({'Close': prc_ser, 'Bday': new_bday_ser})
print(new_df)
Series 和 DataFrame 按照索引排序是一种良好的做法。 对于 DataFrame,这意味着行索引已排序,而不是列已排序。
# Create a series with an unsorted index
new_ser = pd.Series(data=[1,0,2], index=['a', 'c', 'b'])
# This will return 'False'
print(new_ser.is_monotonic_increasing)
sorted_ser = new_ser.sort_index()
print(sorted_ser)
x = sorted_ser['a':'b'] # --> only first two rows
print(x)
5.4 pandas索引
.loc:仅通过标签进行索引(基于标签的索引)
.iloc:仅通过整数位置进行索引(位置索引)
[ ]:结合了基于标签和位置的索引。
参考:
https://datawhalechina.github.io/whale-quant/#/./ch03_%E8%82%A1%E7%A5%A8%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96/ch03_%E8%82%A1%E7%A5%A8%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96