声明
本 Chat 不是手把手教程系列,也不是告诉您如何盈利,只是基于 Python 进行量化分析介绍。自古失败者都会找别人的原因,如果您真的入市了,请记住投资有风险,本 Chat 只做参考之用,希望对你有帮助。当然如果您感兴趣欢迎沟通交流。
一、A 股股市入门与基本概念解读
如果你是标准的死工资一族,那么股市也许是你的另一收入重要来源。如果你不想冒太大的风险,只想像存银行那样有点利息就行,那么你就去各个银行的手机端选个货币型基金吧,下面内容也不必看了。如果喜欢风险与收益带来的惊喜。那么继续。
1. 股票性质
股票持有者凭股票定期从股份公司取得的收入是股息。股票只是对一个股份公司拥有的实际资本的所有权证书,只是代表取得收益的权利,是对未来收益的支取凭证,它本身不是实际资本,而只是间接地反映了实际资本运动的状况,从而表现为一种虚拟资本。
2. 股票的作用
- 股票是一种出资证明,当一个自然人或法人向股份有限公司参股投资时,便可获得股票作为出资的凭证;
- 股票的持有者凭借股票来证明自己的股东身份,参加股份公司的股东大会,对股份公司的经营发表意见;
- 股票持有者凭借股票参加股份发行企业的利润分配,也就是通常所说的分红,以此获得一定的经济利益。
3. 股票分类
根据上市地区
我国上市公司的股票有 A 股、B 股、H 股、N 股和 S 股等的区分。这一区分主要依据股票的上市地点和所面对的投资者而定。
A 股
A 股的正式名称是人民币普通股票。它是由我国境内的公司发行,供境内机构、组织或个人(不含台、港、澳投资者)以人民币认购和交易的普通股股票。
1990 年,我国 A 股股票一共仅有 10 只至 1997 年年底,A 股股票增加到 720 只,A 股总股本为 1646 亿股,总市值 17529 亿元人民币,与国内生产总值的比率为 22.7%。1997 年 A 股年成交量为 4471 亿股,年成交金额为 30295 亿元人民币,我国 A 股股票市场经过几年的快速发展,已经初具规模。
A 股主要有以下几个特点:
- 1. 在我国境内发行只许本国投资者以人民币认购的普通股。
- 2. 在公司发行的流通股中占最大比重的股票,也是流通性较好的股票,但多数公司的 A 股并不是公司发行最多的股票,因为目前我国的上市公司除了发行 A 股外,多数还有非流通的国家股或国有法人股等。
- 3. 被认为是一种只注重盈利分配权、不注重管理权的股票,这主要是因为在股票市场上参与 A 股交易的人士,更多地关注 A 股买卖的差价,对于其代表的其他权利则并不上心。
B 股
也称为人民币特种股票。是指那些在中国大陆注册、在中国大陆上市的特种股票。以人民币标明面值,只能以外币认购和交易。
H 股
也称为国企股,是指国有企业在香港(Hong Kong)上市的股票。
S 股
是指那些主要生产或者经营等核心业务在中国大陆、而企业的注册地在新加坡(Singapore)或者其他国家和地区, 但是在新加坡交易所上市挂牌的企业股票。
N 股
是指那些在中国大陆注册、在纽约(New York)上市的外资股。
本 Chat 介绍的是目前在上海、深圳证券交易所上市的 A 股。
4. 如何炒股
包括开立证券帐户、开立资金帐户、办理指定交易等。
股票开户流程
- 1. 到证券公司开户,办理上证或深证股东帐户卡、资金帐户、网上交易业务、电话交易业务等有关手续。然后,下载证券公司指定的网上交易软件。
- 2. 到银行开活期帐户,并开通银证转帐业务,把钱存入银行。
- 3. 通过网上交易系统或电话交易系统把钱从银行转入证券公司资金帐户。
- 4. 在网上交易系统里或电话交易系统可以买卖股票。
- 5. 一般有的有手续费(每家证券公司是不同的),但是目前貌似应该都是免费的了(时间过长请原谅)。
- 6. 买股票必须委托证券公司代理交易,所以,你必须找一家证券公司开户。 买股票的人是不可以直接到上海证券交易所买卖的。这跟二手房买卖一样,由中介公司代理的。
最直接的方法,下载一个炒股 App 软件(比如同花顺),里面都有这些流程,可以远程视频认证,不需要走来走去。
5. 股票的交易时间
股票交易时间为:
星期一至星期五上午九点半至十一点半,下午一点至三点。双休日和交易所公布的休市日休市。
上午 9:15~9:25 为集合竞价时间,投资人可以下单,委托价格限于前一个营业日收盘价的加减百分之十,即在当日的涨跌停板之间, 九点半前委托的单子,在上午九点半时撮合,由集合竞价得出的价格便是所谓“开盘价”。
万一你委托的价格无法在当个交易日成交的话,隔一个交易日则必须重新挂单。
6. 交易手续费
股票交易是有手续费的,股票买进加卖出都要收手续费。有印花税、佣金等(一直传言说要取消这取消那,还不知道哪天取消),相对来说只要你不频繁短线操作,这个点钱可忽略(万元资金以上账户)。
7. 股票基本名词
委比
是衡量某一时段买卖盘相对强度的指标。它的计算公式为
委比=(委买手数-委卖手数)/ 委买手数+委卖手数 ×100%
委比的取值范围从 100% 至 +100%。若“委比”为正值,说明场内买盘较强,且数值越大,买盘就越强劲。反之,若“委比”为负值,则说明市道较弱。
委差
某品种当前买量之和减去卖量之和。反映买卖双方的力量对比。正数为买方较强,负数为抛压较重。
量比
是一个衡量相对成交量的指标,它是开市后每分钟的平均成交量与过去 5 个交易日每分钟平均成交量之比。其公式为:
量比=现成交总手/(过去 5 日平均每分钟成交量 × 当日累计开市时间(分))
当量比大于 1 时,说明当日每分钟的平均成交量要大于过去 5 日的平均数值,交易比过去 5 日火爆;而当量比小于 1 时,说明现在的成交比不上过去 5 日的平均水平。
开盘价
上午 9:15~9:25 为集合竞价时间,在集合竞价期间内,交易所的自动撮合系统只储存而不撮合,当申报竞价时间一结束,撮合系统将根据集合竞价原则,产生该股票的当日开盘价。
按上海证券交易所规定,如开市后半小时内某证券无成交,则以前一天的收盘价为当日开盘价。有时某证券连续几天无成交,则由证券交易所根据客户对该证券买卖委托的价格走势,提出指导价格,促使其成交后作为开盘价。首日上市买卖的证券经上市前一日柜台转让平均价或平均发售价为开盘价。
收盘价
收盘价是指某种证券在证券交易所一天交易活动结束前最后一笔交易的成交价格。如当日没有成交,则采用最近一次的成交价格作为收盘价,因为收盘价是当日行情的标准,又是下一个交易日开盘价的依据,可据以预测未来证券市场行情;所以投资者对行情分析时,一般采用收盘价作为计算依据。
报价
报价是证券市场上交易者在某一时间内对某种证券报出的最高进价或最低出价,报价代表了买卖双方所愿意出的最高价格,进价为买者愿买进某种证券所出的价格,出价为卖者愿卖出的价格。报价的次序习惯上是报进价格在先,报出价格在后。
在证券交易所中,报价有四种:一是口喊,二是手势表示,三是申报纪录表上填明,四是输入电子计算机显示屏。
最高价
是指当日所成交的价格中的最高价位。有时最高价只有一笔,有时也不止一笔。
最低价
是指当日所成交的价格中的最低价位。有时最低价只有一笔,有时也不止一笔。
牛市
股票市场上买入者多于卖出者,股市行情看涨称为牛市。形成牛市的因素很多,主要包括以下几个方面:
- 经济因素:股份企业盈利增多、经济处于繁荣时期、利率下降、新兴产业发展、温和的通货膨胀等都可能推动股市价格上涨。
- 政治因素:政府政策、法令颁行、或发生了突变的政治事件都可引起股票价格上涨。
- 股票市场本身的因素:如发行抢购风潮、投机者的卖空交易、大户大量购进股票都可引发牛市发生。
熊市
熊市与牛市相反。股票市场上卖出者多于买入者,股市行情看跌称为熊市。引发熊市的因素与引发牛市的因素差不多,不过是向相反方向变动。
二、量化与 Python 模块
1. 关于量化投资
量化投资是指,通过数量化模型建立科学投资体系,以获取稳定收益。
以股票为例。量化投资是指以股票价格、日成交量、日成交额等大量投资相关数据为样本,通过数量化方式建立合适的数学模型与公式,运用计算机技术编写高效程序, 研究分析金融产品未来收益与风险, 判断各种行情走势发生概率,程序化发出买卖指令实现投资交易。
在海外的发展已有 30 多年的历史,其投资业绩稳定,市场规模和份额不断扩大、得到了越来越多投资者认可。在国内,量化投资不再是一个陌生的词汇,近几年得到了迅猛的发展。
2. Python 模块
基于 Python 的量化需要掌握:编程、数学、统计研究、制定策略、金融市场等量化相关的知识(具体我会在达人课中进行介绍)。这是一个循序渐进的过程,随着时间推移,不断优化自己的交易策略,菜鸟变老鸟指日可待。
三、Pandas 处理股票数据实战
读取股票代码为 600000 数据,即为浦发银行,具体股票信息可以以通过连接了解。
http://stockpage.10jqka.com.cn/600000/|
import pandas as pd df=pd.read_csv("20171207_20181207_600000.csv") df.head()
|
字段说明:
参数名称参数描述date交易所行情日期code证券代码open开盘价high最高价low最低价close收盘价preclose昨日收盘价volume成交量(累计 单位:股)amount成交额(单位:人民币元)adjustflag复权状态 (1:后复权, 2:前复权,3:不复权)turn换手率tradestatus交易状态 (1:正常交易 0:停牌)pctChg涨跌幅(百分比)peTTM动态市盈率pbMRQ市净率psTTM市销率pcfNcfTTM市现率isST是否 ST 股,1 是,0 否
1. 选择数据
对 DataFrame 进行选择,大抵从三个层次考虑行列、区域、单元格。详细操作可参见以下四点:
- 使用 []
- df.loc[]
- df.iloc[]
- df.ix[]
这里我们仅仅以目的为导向进行选取操作。
2. 通过下标选取数据
下标索引选取:df[0:3]
下标索引选取的是 DataFrame 的记录,与 List 相同 DataFrame 的下标也是从 0 开始,区间索引的话,为一个左闭右开的区间,即 [0:3] 选取的为 0~2 三条记录。
与此等价,还可以用起始的索引名称和结束索引名称选取数据,如:df[‘a’:‘b’]。有一点需要注意的是,使用起始索引名称和结束索引名称时,也会包含结束索引的数据。
结合字段选取:df[‘open’]、df.open
以上两个语句是等效的,都是返回 df 名称为 open 列的数据,返回的为一个 Series。
以上两种方式返回的都是 DataFrame。
选取一列数据:
df['open'].head()0 12.8146851 12.8443722 12.7849993 12.8344764 12.666253Name: open, dtype: float64
选取多列数据:
df[['open','close']].head() #注意这里的[]数量
openclose012.81468512.824581112.84437212.794894212.78499912.834476312.83447612.616775412.66625312.606880
选择多行:
df[0:3]
或者按 index 选取:
df[20:30]
3. 使用标签选取数据
df.loc[行标签, 列标签]df.loc[‘a’:‘b’] #选取 ab 两行数据df.loc[:,‘open’] #选取 open 列的数据
df.loc 的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是 DataFrame,否则为 Series。
PS:loc 为 location 的缩写。
df.loc[2,'open']12.78499892df.loc[:, 'open'].head()0 12.8146851 12.8443722 12.7849993 12.8344764 12.666253Name: open, dtype: float64
4. 使用位置选取数据
df.iloc[行位置, 列位置]df.iloc[1,1] #选取第二行,第二列的值,返回的为单个值df.iloc[[0,2],:] #选取第一行及第三行的数据df.iloc[0:2,:] #选取第一行到第三行(不包含)的数据df.iloc[:,1] #选取所有记录的第二列的值,返回的为一个 Seriesdf.iloc[1,:] #选取第一行数据,返回的为一个 Series
PS:iloc 则为 integer & location 的缩写。
df.iloc[1,1] # 选取第二行,第二列的值,返回的为单个值'sh.600000'df.iloc[[0,2],:] # 选取第一行及第三行的数据
df.iloc[0:2,:] # 选取第一行到第三行(不包含)的数据
df.iloc[:,1].head() # 选取所有记录的第二列的值,返回的为一个Series,并返回前5行0 sh.6000001 sh.6000002 sh.6000003 sh.6000004 sh.600000Name: code, dtype: objectdf.iloc[1,:] # 选取第二行数据,返回的为一个Seriesdate 2017-12-08code sh.600000open 12.8444high 12.8543low 12.7355close 12.7949preclose 12.8246volume 31296221amount 4.04412e+08adjustflag 2turn 0.11136tradestatus 1pctChg -0.231479peTTM 6.98821pbMRQ 0.979569psTTM 2.30528pcfNcfTTM -2.03862isST 0Name: 1, dtype: object
5. 通过逻辑指针进行数据切片
df[逻辑条件]df[df.one>= 2] #单个逻辑条件df[(df.one>=1 ) & (df.one < 3) ] #多个逻辑条件组合# 筛选出 open 小于 10 的数据,并统计总数df[df.open <10].count()[1]35# 筛选出 open 大于 10 的数据,并且 close 小于 10.5 的数据,并统计总数df[(df.open > 10) & (df.close < 10.5)].count()[1]55
使用条件来更改数据。
df[df>10.0].head()
观察可以发现,df 中小于 10 的数都变为 NaN。
下面我们就把大于 10 的数赋值为 0。
df[df['open'] > 10] = 0 ##这里要从新加载df数据df['open'].head()0 0.01 0.02 0.03 0.04 0.0Name: open, dtype: float64
如果后面要进行其他操作,请重新读取数据,具体如下:
df.head().T ##这里要从新加载df数据
01234date2017-12-072017-12-082017-12-112017-12-122017-12-13codesh.600000sh.600000sh.600000sh.600000sh.600000open12.814712.844412.78512.834512.6663high12.893812.854312.903712.834512.6761low12.775112.735512.715712.606912.498close12.824612.794912.834512.616812.6069preclose12.824612.824612.794912.834512.6168volume3480222931296221366499023037009719345338amount4.51234e+084.04412e+084.74567e+083.90113e+082.46331e+08adjustflag22222turn0.1238350.111360.1304090.1080640.068835tradestatus11111pctChg0-0.2314790.309358-1.69622-0.078433peTTM7.004426.988217.009826.890926.88552pbMRQ0.9818420.9795690.98260.9659330.965175psTTM2.310632.305282.312412.273182.2714pcfNcfTTM-2.04335-2.03862-2.04493-2.01024-2.00867isST00000
6. 对数据进行描述统计
df.describe()
7. 统计描述绘图
此方法比较简单,可以直接绘制图像,如果在 plot() 中不指定 kind,则默认是折线图。
df["close"].describe()[1:].plot(kind="bar")
从上面的分析结果来看,数据最大值与最小值之间差距不是很大,且方差 1.1,震动幅度有效,整体说没有出现大跌大涨的翻倍行情出现。
四、Seaborn 大学生就业分析实战
这里进行 Seaborn 大学生就业分析,通过大家最了解的大学生数据来了解数据可视化过程,并且选取的图形也均是与股票 K 线图比较相近的图形,方便大家后面的理解。
数据文件为 graduates.csv,文件包含了 1993 年至 2015 年间从美国学院毕业 11 年的学生信息。每一年、每一个毕业专业都有关于种族、就业状况、就业部门等方面的信息。
1. 数据清洗
## 导入所需模块import pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltdf = pd.read_csv('graduates.csv')df.head().T[:5] #查看数据胡前5行
01234Accounting/Finance/Contracts79388895346240410197407484716Applied Research3412386581017032768530239183Asians8449527531499843729583826Bachelors671374125883243247235237746586Basic Research224277253289522134892131348
#获取数据的基本信息df.info()<class 'pandas.core.frame.DataFrame'>RangeIndex: 517 entries, 0 to 516Data columns (total 50 columns): Accounting/Finance/Contracts 517 non-null int64 Applied Research 517 non-null int64 Asians 517 non-null int64 Bachelors 517 non-null int64 Basic Research 517 non-null int64 Business/Industry 517 non-null int64 Career Change 517 non-null int64 Computer Applications 517 non-null int64 Design 517 non-null int64 Development 517 non-null int64 Doctorates 517 non-null int64 Educational Institution 517 non-null int64 Employed 517 non-null int64 Family 517 non-null int64 Family-related 517 non-null int64 Females 517 non-null int64 Government 517 non-null int64 Highest 517 non-null float64 Human Resources 517 non-null int64 Job Location 517 non-null int64 Layoff 517 non-null int64 Lowest 517 non-null float64 Major 517 non-null object Males 517 non-null int64 Managing/Supervising People/Projects 517 non-null int64 Masters 517 non-null int64 Mean 517 non-null float64 Median 517 non-null float64 Minorities 517 non-null int64 No need/want 517 non-null int64 Not in Labor Force 517 non-null int64 Pay/Promotion 517 non-null int64 Productions/Operations/Maintenance 517 non-null int64 Professional Service 517 non-null int64 Professionals 517 non-null int64 Qualitity/Productivity Management 517 non-null int64 Quantity 517 non-null int64 Reason Working Outside Field.No Job Available 517 non-null int64 Reason Working Outside Field.Other 517 non-null int64 Reason for Not Working.No Job Available 517 non-null int64 Sales, Purchasing, Marketing 517 non-null int64 Standard Deviation 517 non-null float64 Student 517 non-null int64 Teaching 517 non-null int64 Total 517 non-null int64 Unemployed 517 non-null int64 Whites 517 non-null int64 Work Activity.Other 517 non-null int64 Working Conditions 517 non-null int64 Year 517 non-null int64 dtypes: float64(5), int64(44), object(1) memory usage: 202.0+ KB#选取取得专业学位的非亚洲人数=0数据,并去重new_majors = df['Major'][df['Asians'] == 0].unique() new_majorsarray(['Biochemistry and Biophysics', 'Anthropology and Archeology', 'Physiology, Human and Animal', 'Nutritional Science', 'Pharmacology, Human and Animal', 'Zoology, General', 'Information Services and Systems', 'Animal Sciences', 'Genetics, Animal and Plant', 'International Relations', 'Geology', 'Operations Research', 'Sociology', 'Oceanography', 'History of Science', 'Plant Sciences', 'Philosophy of Science', 'Agricultural Economics', 'OTHER Geological Sciences', 'Botany', 'Environmental Science Studies', 'Forestry Services', 'Earth Sciences', 'Criminology', 'Political and related sciences', 'Public Policy Studies', 'OTHER Physical and Related Sciences', 'Area and Ethnic Studies', 'Atmospheric Sciences and Meteorology', 'Food Sciences and Technology', 'Political Science and Government', 'Statistics', 'Linguistics', 'Geography', 'OTHER Agricultural Sciences', 'Management & Administration'], dtype=object)
以上是得到相关专业学位。
df = df[~df.Major.isin(new_majors)] df["Asians"].count()121
通过对比可以看出数据发生变化,原先是 517 条数据,现在是 121 条数据,剔除不满足条件的数据。
#根据major进行分组求和统计major_df = df.groupby(['Major']).sum().reset_index() major_df.head().T
01234MajorBiological SciencesChemical EngineeringChemistryCivil EngineeringComputer Science and MathAccounting/Finance/Contracts327137357556596964115252433094491Applied Research394976362530015540087439383098013Asians14231753483156644804802901898369Bachelors74425221212633220802723571668842608Basic Research291780032468310339034692592145030Business/Industry76591231480215260732620539448220826Career Change91898498848298992119154595133Computer Applications21168894924928542548633406743304Design157531979919980145213598063563296Development236218772079511815216746943211810Doctorates1053413182179842027105208555063Educational Institution29974231176928055271427281949325Employed1194203717092303742074296290011063404Family5531613557216440741029429642Family-related5855135498413874756310343571Females707930643601915909794438824518754Government1285490111321329223766229893254Highest4.4283e+064.4283e+065.2783e+064.4283e+064.4283e+06Human Resources341239251840199922410068352878185Job Location99776386624223279114621649206Layoff121619271116741553852229448Lowest49991599912999169994999Males74810691638550319841630774718631735Managing/Supervising People/Projects63687781092180208488621857415517585Masters3005206612419106283510300983498722Mean726509844958763052776793766257Median527039768200619000667689650000Minorities19329532118234651343542251603815No need/want5567685761119115294805507226Not in Labor Force22713403130879334564674861692456Pay/Promotion118044794007292847133962730602Productions/Operations/Maintenance17651634440726684603982651257030Professional Service566480828011811483927326581759250Professionals30592316733667650528875254093Qualitity/Productivity Management2953007631967104967111913152701923Quantity6654117877361662330457703Reason Working Outside Field.No Job Available7891327131217535883755501789Reason Working Outside Field.Other214362298167230233177182701Reason for Not Working.No Job Available2423003768210415557825243759Sales, Purchasing, Marketing333287651099889856710259032666647Standard Deviation748752610742687979566946645240Student731128236438967925410140934Teaching427591024218710955473891992722286Total1456037520745684789393352135413150490Unemployed3469955225211386490969394632Whites111982391514414365882926857269645830Work Activity.Other1127520141913332503308452941352Working Conditions108657286441243994116578658606Year2204022040220402204022040
根据原始数据的介绍,有一些专业在 2010 年之前是不存在,所以其他年份的值都是 0。为了保证数据分析的效果,这些专业被排除在分析之外。
2. 箱型图:分析专业
首先,我们来看看 1993 年至 2015 年间攻读某一专业的学生人数。从下面的箱线图可以看出,Psychology(心理学)是最受欢迎的专业,而 Chemical Engineering、Physics and Astronomy(化学工程、物理学和天文学)是最不受欢迎的专业。此外,心理、生物科学、计算机科学和数学专业(Biological Sciences and Computer Science and Math)毕业生的数量也逐年出现较大偏差。
plt.figure(figsize=(20,10)) g = sns.boxplot(x="Major", y="Total",data=df) g.set_xticklabels(g.get_xticklabels(),rotation=20) #注意这里的用法,二次运行设置label显示plt.title('Major v/s Number of Graduates') plt.show()
3. 条型图:观察失业情况
从下面的条形图中,我们可以看到,对于所有的专业来说,失业率都是从 2001 年到 2008 年(2003 年除外)以来最低的,但是在 2010 年之后失业率会上升。2003 年是所有专业突然出现失业高峰的一年。虽然这种激增的原因尚不清楚,但它与 2003 年美国失业率上升 5.8%、裁员 308000 人的事实是一致的。
心理学有大量失业的毕业生。那里失业的毕业生人数几乎是其他一些专业的两倍。
plt.figure(figsize=(20,10)) g = sns.factorplot(x="Major", y="Unemployed", data=df, size=12, kind="bar",hue = 'Year') g.set_xticklabels(rotation=20) plt.title('Number of unemployed graduates per major') plt.show()
4. 小提琴图:分析 2003 年前后就业率情况
#计算失业率Employment Ratedf['Employment Rate'] = df['Employed']/df['Total'] df.head()
5 rows × 51 columns
f = lambda x: 'new' if x.Year > 2003 else 'old' #以2003进行切割dfc = df.copy() #dataframe的拷贝方法dfc['old_new'] = dfc.apply(f, axis=1) #dfc.apply 对每一列进行lambda函数处理plt.figure(figsize=(20,10)) g = sns.violinplot(x="old_new", y="Employment Rate", data=dfc, hue = 'Major'); plt.legend(loc = 'lower left') plt.title('Distribution of Employment Rate pre and post 2003') plt.xlabel('Pre and Post 2003') plt.show()
从上图可以看出,2003 年后,就业中位数略低于 2003 年前。此外,2003 年以后,几乎所有专业,尤其是 Biological Sciences, Civil Engineering and Mechanical engineering(生物科学、土木工程和机械工程专业)的就业率都出现了较大的偏离。
五、以 A 股为例,认识技术指标与交易策略
1. K 线图
刚入股市朋友,可能对股市大概就是一张图的概念。
下图是周 K 线图:
K 线图(又称蜡烛图、阴阳图)最早是日本德川幕府时代大阪的米商用来记录当时一天、一周或一月中米价涨跌行情的图示法,后被引入股市。K线图有直观、立体感强、携带信息量大的特点,蕴涵着丰富的东方哲学思想,能充分显示股价趋势的强弱、买卖双方力量平衡的变化,预测后市走向较准确,是各类传播媒介、电脑实时分析系统应用较多的技术分析手段。
其记录方法如下图所示:
强大的 Python 也是可以绘制 K 线图的。比如下面就是 Python 绘制的 K 图,如果你使用 PyCharm 就可以自由拉动分析了。
此处绘制代码将在后面的其他课程中介绍。
2. K 线组合
K 线是股价随着时间反应真实交易的具体表现形式。单个 K 线可以展现单日的交易,组合则可展示一段时间内的交易变化。根据 K 线组合来研判,常见的有两根 K 线组合、三根 K 线组合、四根 K 线组合等。
一些典型的 K 线或 K 线组合,会不断地重复出现,如果你掌握了这些规律,将在很大程度上提高你的胜算。底部看涨 K 线组合出现时,告诉你股价很快就会上升,要赶快建仓;顶部看跌看 k 线组合出现时,告诉你风险已大,要及时获利了结。对于不懂 K 线语言的投资者,K 线就像一本天书,一些初学者学到了一些 K 线知识,但没有掌握其实质,也容易做出错误的判断。
一般认为 K 线的下影线长表示下档有支撑,但在不同的价位、不同的时间,表达的信息是不同的。
K 线组合方式多种多样,实战价值最高的有希望之星、黄昏之星、红三兵、黑三鸦、塔形顶、塔形底等经典组合,结合实战案例进行讲解,增强投资者的盘感,提升洞察盘面、捕捉交易信号的能力。
注意:K 线形态并没有严格定义,均是交易人员总结得到,可能会有个别细节出入。这也是一种投资的魅力。
3. 组合 K 线案例
刺穿线
形态
刺穿线特征
- 1. 阳线实体刺入到阴线实体 1/2 位置。
- 2. 刺穿线高位是卖出信号,低位是买入信号。
- 3. 高位与低位的判定是前期幅度是否上涨或下跌了 20%。
交易策略
- 1. 当刺穿线出现在下降趋势中,若阳线穿入阴线的幅度越大,出现反转的概率越大。
- 2. 高位刺穿线卖出宜速不宜缓,若低位阳线刺穿不够阴线实体的 1/2,则买入宜缓不宜速。
红三兵
形态
红三兵由三根小阳线组合而成,三根小阳线的收盘价每天必创新高,每一根小阳线的开盘价均略微低于前一根小阳线的收盘价,每一根小阳线低开高走,小阳线可以带有较短的上下影线。如果三根小阳线的收盘价几乎为光头小阳线,收盘价处于小阳线最高点或次高点收盘,又被称之为三个白色武士。红三兵和三个白色武士的 K 线组合变化图形见下图:
红三兵特征
- 1. 在股票运行过程中连续出现三根阳线,每天的收盘价高于前一天的收盘价。
- 2. 每天的开盘价在前一天阳线的实体之内。
- 3. 每天的收盘价在当天的最高点或接近最高点。
交易策略
红三兵在股价久跌之后的底部区域,或上升趋势初期的整理形态中出现较多,红三兵属于买入信号,后市看涨,红三兵的出现,表明多方正积蓄力量,准备发力上攻。如果红三兵能够温和放量,股价后市更容易反转走强,在红三兵出现之后,股价上冲时,成交量如再次能同步放大,说明多头力量强劲,后市继续上涨的可能性极大。因此,投资者见到红三兵,可以考虑适量买进一些筹码。
如红三兵三根 K 线上下影线较长,将失去原有的操作价值,另外投资者须注意的是,底部红三兵或上升整理形态中的红三兵 K 线组合,温和放量之后,第四根 K 线缩量收小阴线的概率较大。因此,市场出现红三兵 K 线组合之后,投资者可以不必急着买入,等股价缩量企稳,再次放量上攻时,大胆跟风买入。
白色武士与红三兵从 K 线形态上分析,三个白色武士收出的三根小阳线均为光头小阳线,代表股价走势凌厉,发出的买入信号与红三兵相比之下,买入信号更加强烈。因此,市场出现三个白色武士之后,投资者更应当密切关注。
注意:K 线组合具有操作策略指导意义,但其细节大家还是要牢牢把握,如上就是一个典型案例。
投资有风险,入行需谨慎。
六、机器学习实战:预测大盘涨跌
这里我们用到了一个机器学习库 scikit-learn。
scikit-learn 是一个开源的 Python 库,用于机器学习和数据挖掘。它自带 SVM 等算法,基于 NumPy 编写。它在 Python 中简称 sklearn。
把“机器学习”应用到量化投资领域,不同于以往的量化策略。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行分析的算法。
支持向量机,因其英文名为 Support Vector Machine,故一般简称 SVM。可用于回归和分类,一般多用于分类。
在 scikit-learn 下可以通过 from sklearn import svm 导入。这里使用的是 svm.svc,一种非线性分类器。
1. 获取数据
获取“20160101__20181201”期间的周线大盘数据,股票代码 000001。
import pandas as pd data=pd.read_csv("20160101__20181201_w_000001.csv") data.head()
周指标字段参数:
参数名称参数描述说明date交易所行情日期格式:YYYY-MM-DDcode证券代码格式:sh.600000。sh:上海,sz:深圳open今开盘价格精度:小数点后 4 位;单位:人民币元high最高价精度:小数点后 4 位;单位:人民币元low最低价精度:小数点后 4 位;单位:人民币元close今收盘价精度:小数点后 4 位;单位:人民币元volume成交数量单位:股amount成交金额精度:小数点后 4 位;单位:人民币元turn换手率精度:小数点后 6 位;单位:%pctChg涨跌幅(百分比)精度:小数点后 6 位
2. 数据预处理
# #k线形态data['k_type1']=(data['low']-data['open'])/data['close'] data['k_type2']=(data['high']-data['open'])/data['close'] data['k_type3']=(data['close']-data['open'])/(data['high']-data['low'])# #成交量倍数data['vol_time']=data['volume']/(data['volume'].shift(1)) data.loc[0,'vol_time'] = 1 data['vol_time'].plot()#定义涨为1,跌为0data["label"]=data["pctChg"].apply(lambda x: 1 if x >0 else 0)
3. 选取特征
#train对应的特征train=data.loc[:,['turn', 'k_type1', 'k_type2', 'k_type3', 'vol_time']]#预测label,即大盘涨跌test=data["label"]#分割训练集与测试集from sklearn.model_selection import train_test_split x_train,y_train,x_test,y_test=train_test_split(train,test,test_size=0.3,random_state=0)
4. 模型构建
from sklearn import svm#模型的构建model = svm.SVC() model.fit(x_train,x_test)
5. 预测评估
import numpy as np#训练与测试之间的评分score=np.mean(model.predict(x_train)==x_test),np.mean(model.predict(y_train)==y_test)print(score)
输出:
(0.941747572815534, 0.9111111111111111)#混淆矩阵from sklearn.metrics import confusion_matrix y_pred=model.predict(y_train) confusion_matrix(y_test, y_pred)
输出:
array([[23, 3], [ 1, 18]], dtype=int64)#分类报告from sklearn.metrics import classification_report target_names = ['class 0', 'class 1']print(classification_report(y_test, y_pred,target_names=target_names))
输出:
precision recall f1-score support class 0 0.96 0.88 0.92 26 class 1 0.86 0.95 0.90 19avg / total 0.92 0.91 0.91 45
从效果来看预测跌的效果要优于预测涨的,虽然模型的整体评价准确率达到 90% 以上,展现效果较好,但是很有可能存在过拟合, 希望对一定编程基础的人员,入门量化有一定帮助,如有不足希望大家见谅!
热门跟贴