python编程选股_随笔吧量化投资选股的python程序实践(附源码)
量化投资选股的python程序实践(附源码)
首先选取沪深股票市场,本人比较关注的12只股票:
000002 万科A,600566 济川药业,300051 三五互联,002039 黔源电力,600872 中炬高新,300324旋极信息,600885 宏发股份,600382 广东明珠,000732 泰和集团,002174 游族网络,000915 山大华特,002415 海康威视
备注:
如果是基金经理,则会有研究部门推荐的股票选择池
程序运行的得到结论如下:
1. 当投资组合的sharp值最大时,投资组合为:
41.2%的万科A,10.5%的广东明珠,38.2%的山大华特,10.1%的海康威视
该组合的未来预期年化收益为:21.4%
该组合的预期年化波动率为:29.5%
该组合的sharp指数为0.725
2. 当投资组合的波动最小时,投资组合为:
34.5%的万科A,17.9%的济川药业,24.6%的黔源电力,2%的旋极信息,1%的宏发股份,9.4%的泰和集团,0.8%的游族网络,9.8%的海康威视
该组合的未来预期年化收益为:3.7%
该组合的预期年化波动率为:22.6%
该组合的sharp指数为0.163
相关输出图表如下:
图1:关注的12只股票从2016-01-01到2016-12-01的归一化股价走势
图2:10万次蒙特卡洛模拟计算,得到各种投资组合以及相应收益率和波动率
图3:有效前沿、最优投资组合的图
#叉号:构成的曲线是有效前沿(efficient
frontier,目标收益率下最优的投资组合)
#红星:夏普值最大的投资组合
#黄星:方差最小的投资组合
程序源代码以及详细注释说明如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 8 01:26:52 2016
@author: Administrator
"""
import pandas as pd
import numpy as np
#import statsmodels.api as sm #统计运算
#import scipy.stats as scs #科学计算
import matplotlib.pyplot as plt #绘图
import pandas.io.data as web
#import tushare as ts
# 1.选取感兴趣的股票
# 000002 万科A,600566 济川药业,300051 三五互联,002039 黔源电力,600872 中炬高新,300324 旋极信息,600885 宏发股份,600382 广东明珠,000732 泰和集团,002174 游族网络,000915 山大华特,002415 海康威视
# 并比较一下数据(2016-01-01至2016-12-01)
symbols = ['000002.sz','600566.ss','300051.sz','002039.sz','600872.ss','300324.sz','600885.ss','600382.ss','000732.sz','002174.sz','000915.sz','002415.sz']
noa = len(symbols)
data = pd.DataFrame()
for sym in symbols:
data[sym] = web.DataReader(sym, data_source='yahoo',start='2016-01-01',
end='2016-12-01')['Adj Close']
data.columns = symbols
data.head(5)
(data / data.ix[0] * 100).plot(figsize=(16, 10), grid=True)
#2.计算不同证券的均值、协方差
#每年252个交易日,用每日收益得到年化收益。计算投资资产的协方差是构建资产组合过程的核心部分。运用pandas内置方法生产协方差矩阵。
returns = np.log(data / data.shift(1))
returns.mean()*252
returns.cov()*252
#3.给不同资产随机分配初始权重
#由于A股不允许建立空头头寸,所有的权重系数均在0-1之间
weights = np.random.random(noa)
weights /= np.sum(weights)
weights
# 4.计算预期组合年化收益、组合方差和组合标准差
np.sum(returns.mean()*weights)*252
np.dot(weights.T, np.dot(returns.cov()*252,weights))
np.sqrt(np.dot(weights.T, np.dot(returns.cov()* 252,weights)))
# 5.用蒙特卡洛模拟产生大量随机组合
#进行到此,我们最想知道的是给定的一个股票池(证券组合)如何找到风险和收益平衡的位置。
#下面通过一次蒙特卡洛模拟,产生大量随机的权重向量,并记录随机组合的预期收益和方差。
port_returns = []
port_variance = []
for p in range(100000):
weights = np.random.random(noa)
weights /=np.sum(weights)
port_returns.append(np.sum(returns.mean()*252*weights))
port_variance.append(np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252, weights))))
port_returns = np.array(port_returns)
port_variance = np.array(port_variance)
#无风险利率设定为3%
risk_free = 0.03
plt.figure(figsize = (16,8))
plt.scatter(port_variance, port_returns, c=(port_returns-risk_free)/port_variance, marker = 'o')
plt.grid(True)
plt.xlabel('excepted volatility')
plt.ylabel('expected return')
plt.colorbar(label = 'Sharpe ratio')
#6.投资组合优化1——sharpe最大
#建立statistics函数来记录重要的投资组合统计数据(收益,方差和夏普比)
#通过对约束最优问题的求解,得到最优解。其中约束是权重总和为1。
def statistics(weights):
weights = np.array(weights)
port_returns = np.sum(returns.mean()*weights)*252
port_variance = np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252,weights)))
return np.array([port_returns, port_variance, port_returns/port_variance])
#最优化投资组合的推导是一个约束最优化问题
import scipy.optimize as sco
#最小化夏普指数的负值
def min_sharpe(weights):
return -statistics(weights)[2]
#约束是所有参数(权重)的总和为1。这可以用minimize函数的约定表达如下
cons = ({'type':'eq', 'fun':lambda x: np.sum(x)-1})
#我们还将参数值(权重)限制在0和1之间。这些值以多个元组组成的一个元组形式提供给最小化函数
bnds = tuple((0,1) for x in range(noa))
#优化函数调用中忽略的唯一输入是起始参数列表(对权重的初始猜测)。我们简单的使用平均分布。
opts = sco.minimize(min_sharpe, noa*[1./noa,], method = 'SLSQP', bounds = bnds, constraints = cons)
opts
#得到的最优组合权重向量为:
opts['x'].round(3)
#sharpe最大的组合3个统计数据分别为:
#预期收益率、预期波动率、最优夏普指数
statistics(opts['x']).round(3)
#7.投资组合优化2——方差最小
#接下来,我们通过方差最小来选出最优投资组合。
#但是我们定义一个函数对 方差进行最小化
def min_variance(weights):
return statistics(weights)[1]
optv = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)
optv
#方差最小的最优组合权重向量及组合的统计数据分别为:
optv['x'].round(3)
#得到的预期收益率、波动率和夏普指数
statistics(optv['x']).round(3)
#8.组合的有效前沿
#有效前沿有既定的目标收益率下方差最小的投资组合构成。
#在最优化时采用两个约束,1.给定目标收益率,2.投资组合权重和为1。
def min_variance(weights):
return statistics(weights)[1]
#在不同目标收益率水平(target_returns)循环时,最小化的一个约束条件会变化。
target_returns = np.linspace(0.0,0.5,50)
target_variance = []
for tar in target_returns:
cons = ({'type':'eq','fun':lambda x:statistics(x)[0]-tar},{'type':'eq','fun':lambda x:np.sum(x)-1})
res = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)
target_variance.append(res['fun'])
target_variance = np.array(target_variance)
len(target_variance)
#下面是最优化结果的展示。
#叉号:构成的曲线是有效前沿(目标收益率下最优的投资组合)
#红星:sharpe最大的投资组合
#黄星:方差最小的投资组合
plt.figure(figsize = (16,8))
#圆圈:蒙特卡洛随机产生的组合分布
plt.scatter(port_variance, port_returns, c = port_returns/port_variance,marker = 'o')
#叉号:有效前沿
len(target_variance),len(target_returns)
plt.scatter(target_variance,target_returns, c = target_returns/target_variance, marker = 'x')
#红星:标记最高sharpe组合
plt.plot(statistics(opts['x'])[1], statistics(opts['x'])[0], 'r*', markersize = 15.0)
#黄星:标记最小方差组合
plt.plot(statistics(optv['x'])[1], statistics(optv['x'])[0], 'y*', markersize = 15.0)
plt.grid(True)
plt.xlabel('expected volatility')
plt.ylabel('expected return')
plt.colorbar(label = 'Sharpe ratio')
"""
#df = ts.get_hist_data(stock_set[0], '2016-01-01', '2016-12-01')['close']
#df.head(10)
df = [[]]*noa
data = [[]]*noa
# type(df)
for i in range(0, noa):
#print(stock_set[i])
df[i] = ts.get_hist_data(stock_set[i], '2016-01-01', '2016-12-01')
data[i] = df[i]['close']
df[0]['close'].head(10)
"""
python编程选股_随笔吧量化投资选股的python程序实践(附源码)相关推荐
- python bokeh教程_手把手教你用Bokeh进行可视化数据分析(附源码)
Bokeh与Python可视化领域中的流行库Matplotlib和Seaborn不同,它使用HTML和JavaScript渲染其图形,这使得它在构建基于Web的应用中成为一个非常理想的候选者.它对于探 ...
- Python爬虫鲁迅先生《经典语录》保存到Excel表格(附源码)
Python爬虫鲁迅先生<经典语录>保存到Excel表格(附源码) 前言 今天用Python 爬取鲁迅先生<经典语录>,直接开整~ 代码运行效果展示 开发工具 Python版本 ...
- python爬取小游戏_如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)...
简介: Python 是一门简单易学且功能强大的编程语言,无需繁琐的配置,掌握基本语法,了解基本库函数,就可以通过调用海量的现有工具包编写自己的程序,轻松实现批量自动化操作,可以极大提高办公和学习效率 ...
- 如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了
前言 最近调研了一下我做的项目受欢迎程度,大数据分析方向竟然排第一,尤其是这两年受疫情影响,大家都非常担心自家公司裁员或倒闭,都想着有没有其他副业搞搞或者炒炒股.投资点理财产品,未雨绸缪,所以不少小伙 ...
- Python实现抖音关键词热度搜索小程序(附源码)
今天给大家带来一个抖音热词小程序,废话不多说,直接上代码 import requests import json import urllib.parse import time headers = { ...
- 数字信号 fft c源码_如何制作一个简单的人体动态识别微信小程序(附源码)
知乎小白第一次写专栏,还请多指教. 先放成果. GitHub源码: lrioxh/HAR-applet-of-Wechatgithub.com b站演示视频: 居然不需要服务器?!如何制作一个简单的 ...
- 【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码
前言 有粉丝说要我出一期Python版本的斗兽棋,今天宠粉狂魔的我不就来啦!! 虽然是一个简单的小游戏,但是对于新手小伙伴来说还是有一定的小难度的哟!要是不理解都可以找到小编的哈!! 相关文件 关注小 ...
- Python爬虫实战,requests+tqdm模块,爬取漫画数据(附源码)
前言 今天给大家介绍的是Python爬取漫画数据,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本数据爬取 ...
- Python一键获取某排名第一的手游,所有英雄皮肤(附源码)
目录 最近总是有老妹喊我打王者带她们上分,但是我吧不经常玩,有哪些皮肤,叫什么名字,长啥样都不知道,万一妹妹问起来答不上岂不是很尴尬! 这不得先把功课做足了,于是我用Python把这些皮肤全部给爬下来 ...
最新文章
- SDN控制器部署相关工作—Vecloud
- 利用优先级队列实现堆栈
- Web Hacking 101 中文版 九、应用逻辑漏洞(一)
- 献策企业:制定优秀移动化企业七步骤
- iOS利用HealthKit框架从健康app中获取步数信息
- fastreport4打印预览
- Android Ble蓝牙中如何获取RawData ,UUID,Major,Minor,Measured power at 1 meter的数据。
- emouse思·睿—评论与观点整理之一
- Android截图功能
- html初始化调用js函数
- maven module 路径_解决maven项目中-Dmaven.multiModuleProjectDirectory报错问题
- 算法-经典趣题-爱因斯坦阶梯问题
- 微信小程序之登录注册界面的实现
- 【知识图谱问答】DBpedia介绍
- IDE和IDLE是什么
- Debain8 Tomcat8 JDK8 实现SSL双向验证
- 高速ad指标分析 matlab,高速ADC的动态性能参数和基于DSP技术的测试方法研究
- 计算机用户组连接打印机,工作组链接域内共享打印机的正确姿势
- ps国画效果案例制作教程和思路介绍
- Ubuntu下使用gcc和makefile编写c语言程序
热门文章
- UE4 Playercontroller和Actor的ower的思考
- 浅谈自媒体短视频配音、广告配音等行业的发展前景
- 常见IT电子术语解答
- mysql脑裂_如何防止HA集群的脑裂
- 店宝宝:干货集合,新手开网店常见问题解答
- ForkLift 保留FTP连接
- 炉石传说怎么修改服务器,云服务器 炉石传说
- 炉石传说 linux,wine 炉石传说出错
- PHP8.0新版再创奇迹,性能提升10%,URLOS为您提供PHP8.0一键安装方法
- 热敏打印计算机,58mm USB 热敏打印机(写字库源代码+字库软件+USB 电脑打印机模式等)...