赞
踩
金融知识(CAPM资产定价模型+β因子+α因子)+库安装+交易数据下载+展示
CAPM资产定价模型等,等学习cfa的portfolio后再补充
Anaconda安装
https://www.anaconda.com/
寻找免费的数据源,这里用的是歪枣网的数据
http://www.waizaowang.com/
wz_data.py
的代码如下(交易数据后续可以直接保存在本地,重复使用):
#coding=utf-8 import sys import requests import os import datetime import io import pandas as pd class wz_data(object): def __init__(self): self.TOKEN = 'xxxxxx' self.DATA_PATH = 'd:/python/data/' def get_stock_data_online(self, code, s_date, e_date=None): """在线接口,直接下载""" api = 'http://api.waizaowang.com/doc/getStockHSADayKLine?' params = {} start_date = s_date if not e_date: end_date = datetime.datetime.strftime(datetime.date.today(), '%Y-%m-%d') else: end_date = e_date params['code'] = code params['startDate'] = start_date params['endDate'] = end_date params['fq'] = '0' params['ktype'] = '101' params['fields'] = 'tdate,open,high,low,close,cjl,cje,hsl' params['export'] = '5' params['token'] = self.TOKEN r = requests.get(api, params=params).json() df = pd.DataFrame(data=r['data'], columns=r['zh']) return df
chap_1.py
的部分代码如下:
#codeing=utf-8 import numpy as np import pandas as pd import mplfinance as mpf from utils import wz_data if __name__ == '__main__': #单独实现了去wz网获取数据的接口 wz = wz_data() #股票代码,起始日期,结束日期,这里走的是未复权 data = wz.get_stock_data_online('601318', '2020-01-01','2020-03-18') #返回的直接是一个DataFrame对象 data.rename(columns={ '交易时间': 'Date', '开盘价': 'Open', '最高价': 'High', '最低价': 'Low', '收盘价': 'Close', '成交量': 'Volume', '成交额': 'Money', '换手率': 'Turnover' }, inplace = True) data.index = pd.DatetimeIndex(data['Date']) print(data.head()) #用.diff()方法来计算每日股价变化情况 data['diff'] = data['Close'].diff() print(data.head()) #绘制蜡烛图 #type='candle', type='line', type='renko', or type='pnf' mpf.plot(data.tail(30), type="candle", volume=True)
执行结果展示如下:
获取的数据:
加上diff分析后的数据:
绘制的蜡烛图数据:
我们可以设置一个最简单的交易策略:如果当日股价下跌,我们就在下一个交易日开盘前挂单买入;反之,如果当日股价上涨,我们就在下一个交易日开盘前挂单卖出。循环进行这个步骤,我们不就可以赚钱了吗?
要实现这个策略,首先我们来创建一个新的字段Signal(交易信号)。如果diff字段大于0,则Signal标记为1;如果diff字段小于或等于0,则Signal标记为0。输入代码如下:
#codeing=utf-8 import numpy as np import pandas as pd import matplotlib.pyplot as plt import mplfinance as mpf from utils import wz_data if __name__ == '__main__': #之前的代码略 print('----计算交易信号Signal数据------') #创建交易信号字段,命名为Signal #如果diff值大于0,则Signal为1,否则为0 data['Signal'] = np.where(data['diff'] > 0, 1, 0) #check print(data.head()) #简单交易策略 #·当日股价下跌,下一个交易日买入 #·当日股价上涨,下一个交易日卖出 #交易信号字段:Signal, diff > 0 Signal=1 卖出,否则Signal=0
解释:从上图中可以看到,使用np.where()可以让程序判断每日股价是上涨还是下跌:如果上涨,则交易信号为1,代表卖出;否则交易信号为0,代表买入。这样我们就得到了最简单的交易信号。
#codeing=utf-8 import numpy as np import pandas as pd import matplotlib.pyplot as plt import mplfinance as mpf from utils import wz_data if __name__ == '__main__': #之前的代码略 #绘图 画布尺寸10*5 plt.figure(figsize=(10, 5)) # 折线图绘制日K线 data['Close'].plot(linewidth=2, color='k', grid=True) # 卖出标志 x轴日期,y轴数值 卖出信号,倒三角 # matplotlib.pyplot.scatter(x, y, marker, size, color) plt.scatter(data['Close'].loc[data.Signal == 1].index, data['Close'][data.Signal == 1], marker = 'v', s=80, c='g') # 买入标志 正三角 plt.scatter(data['Close'].loc[data.Signal == 0].index, data['Close'][data.Signal == 0], marker='^', s=80, c='r') plt.show()
从图中可以看到,倒三角所处的位置是股票收盘价较上一个交易日上涨的时刻,代表卖出;正三角所处的位置是股票收
盘价较上一个交易日下跌的时刻,代表买入
np.where(condition, x, y)
满足条件(condition),输出x,不满足输出y
如果是一维数组,相当于[x_v if c else y_v for (c, x_v, y_v) in zip(condition,x,y)]
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a > 5, 1, -1)
array([-1, -1, -1, -1, -1, -1, 1, 1, 1, 1])
>>> np.where([[True, False], [True, True]], # 官网上的例子,多维
[[1, 2], [3, 4]],
[[9, 8], [7, 6]])
array([[1, 8],
[3, 4]])
上面这个例子的条件为[[True, False], [True, False]]
,分别对应最后输出结果的四个值。第一个值从[1, 9]
中选,因为条件为True,所以是选1。第二个值从[2, 8]
中选,因为条件为False,所以选8,后面以此类推。类似的问题可以再看个例子:
>>> a = 10
>>> np.where([[a > 5, a < 5], [a == 10,a == 7]],
[["chosen","not chosen"], ["chosen","not chosen"]],
[["not chosen","chosen"], ["not chosen","chosen"]])
array([['chosen', 'chosen'],
['chosen', 'chosen']], dtype='<U10')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。