Python编写量化交易策略—基础教材-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 考研考博>>

考研

>>

Python编写量化交易策略—基础教材

Python编写量化交易策略—基础教材

发布:MindGo量化交易 | 分类:考研

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

经管之家新媒体交易平台

提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯"等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

提供微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

MINDGO量化平台推出策略编写教材,希望给哪些想要学习Python语言以及编写量化策略的小伙伴提供学习免费教材,详细教材登录MINDGO量化交易平台,点击策略库即可免费查看。如下图:https://bbs.pinggu.org/forum.php?mo ...
扫码加入金融交流群


MINDGO量化平台推出策略编写教材,希望给哪些想要学习Python语言以及编写量化策略的小伙伴提供学习免费教材,详细教材登录MINDGO量化交易平台,点击策略库即可免费查看。如下图:
https://bbs.pinggu.org/forum.php?mod=image&aid=2313937&size=300x300&key=b87c72181eed6567&nocache=yes&type=fixnone
除了一些学习教材,小伙伴还可以免费查看并且复制大师系列,分钟级量化策略的源代码,让你更快掌握Python编写策略的技巧。
以下是均值回归策略编写技巧----策略编写学习教材(四),里面包括了如果用好Python的字典功能,以及理解均值回归策略的核心。希望能给小伙伴们带来帮助!
'''
均值回归策略编写技巧----策略编写学习教材(四)
本章内容主要介绍了如何在MINDGO平台上快速学会编写均值回归策略,希望能给有需要的小伙伴带来一定帮助。
本文建立于动量策略编写技巧之上,因此需要完整地学习的同学可以先看教材(三)


均值回归策略逻辑
一、均值回归介绍
均值回归是金融学的一个重要概念,也是一种数学方法,市场中指的是:个股股价偏离其内在价值过高或者
过低时,就会改变原有趋势,而形成靠拢内在价值的趋势。酷似价值规律,如下图:
均值回归是否与动量效应冲突?从形式上看,动量效应认为趋势会延续,均值回归认为趋势会改变,但是从
内在逻辑上看,均值回归通过计算个股内在价值,从而研判个股内在趋势,但是动量效应与均值回归不同,它不
存在一个内在价值,或者说动量效应是研究价格的一种方式,而均值回归是研究价值的一种方式,因此两者形式
相冲,但内在逻辑不冲突。
均值回归的核心:准确计算出个股内在价值。均值回归之所以能经久不衰,靠的是价值这口气活着,如果投
资者在运用均值回归时,无法准确计算出个股的价值,那么其结果必定是惨烈的,不是在股价上涨时提前抛售,
就是在股价下跌时过早买入。
均值回归的价值计算方式:说实话,计算个股内在价值的方式有很多种,并且每个投资者都有自己的观点和
看法,因此本文为了演示策略,挑选了三种个股内在价值的计算方法:
第一种市盈率法,目前一年期的货币基金利率为3%,对应股市中的平均市盈率为33倍。
第二种市净率法,一般而言,市净率小于1,表明公司股价被严重低估,1-3是合理投资区间,超过3就表明公
司股价偏高。
第三种市销率,市销率越低,说明该公司股票目前的投资价值越大,一般情况下,市销率小于2,则股票具有
投资价值,超过10,则说明风险较大。
二、构建简单均值回归策略
根据上一节的内容,我们构建一个简单的均值回归策略:
第一步:
通过以上三种方法来判断其内在价值是否为低估,如果低估,则可能在一段时间内进行均值回归,也就是价格
上涨至价值区。其中市盈率,市销率,市净率是我们判断的指标,本策略采用经典打分法,也就是说,我们把单纯
的市盈率指标进行解剖,上文已经算出市盈率均值为33.因此将市盈率33以下的个股给予10分,反之则不给分。市
净率小于1的个股给予10分,在1至3区间的给予5分,反之不给分。市销率小于2的给予10分,在2-10区间的给予5分
,反之不给分。采用以上打分法,得分较高的个股说明其股价被低估的越严重,越有可能进行均值回复!
第二步:
确定调仓周期:一个月,确定最大持股数量:30只。
第三步:
设置风险措施,个股亏损超过10%,则进行止损。止盈为时间止盈,满一个月止盈。
策略框架
I.初始化函数,设置账户条件
II.交易函数,用于买卖个股
III.选股函数,用于选择相应股票列表
IV.风控函数,用于止损止盈
'''
#=====================================================================================================
#导包操作
from datetime import timedelta, date
import pandas as pd
#=====================================================================================================
#=====================================================================================================
#初始化函数,设置初始条件
def initialize(account):
account.n = 30
account.trade_date = range(1,13,1)
run_monthly(trade,date_rule=2)
get_iwencai('未停牌,上市时间超过2年')
#=====================================================================================================
#=====================================================================================================
#设置止损止盈,handle_data是每日(分钟/tick)运行
def handle_data(account,data):
if len(account.positions) > 0:
securities = list(account.positions)
for stock in securities:
price = data.attribute_history(stock, ['close'], 1, '1d', skip_paused=False, fq='pre')
if account.positions[stock].cost_basis /price['close'][0]-1 < -0.1:
order_target(stock, 0)
#=====================================================================================================
#=====================================================================================================
#选股函数
def stocks_jz(account,data):
date= get_last_datetime().strftime('%Y%m%d')
#获取时间,并将其转化成年月日
df = {'security': [], 1:[], 2:[], 3:[], 'score':[]}
#创建字典,一个5个键,对应5个值
stocks=account.iwencai_securities
#从问财的选股结果导入到stocks
for security in stocks:
q=query(profit.symbol,valuation.pe_ttm,valuation.pb,valuation.ps_ttm
).filter(profit.symbol==security)
yz = get_fundamentals(q, date=date).fillna(0)
#get_fundamentals,获取股票代码,市盈率,市销率,市净率数据,fillna(0)能将数据缺失值填充为0
df['security'].append(security)
if (not (yz['valuation_pe_ttm'].empty or yz['valuation_ps_ttm'].empty or yz['valuation_pb'].empty)):
#判断这些数据中是否有空值,如果存在则跳到101行,直接打0分
if yz['valuation_pe_ttm'][0]<33 :
#判断单个股票的市盈率因子,满足条件则加10分,不满足则不加分。
df[1].append(10)
else:
df[1].append(0)
if yz['valuation_ps_ttm'][0]<2.01:
df[2].append(10)
elif yz['valuation_ps_ttm'][0]<10.01 and yz['valuation_ps_ttm'][0]>2.01:
df[2].append(5)
else:
df[2].append(0)
if yz['valuation_pb'][0]<1.01:
df[3].append(10)
elif yz['valuation_pb'][0]<3.01 and yz['valuation_pb'][0]>1.01:
df[3].append(5)
else:
df[3].append(0)
else:
df[1].append(0)
df[2].append(0)
df[3].append(0)
for i in range(len(df['security'])):
s = (df[1]+df[2]+df[3])
#将三个因子的打分结果相加
df['score'].append(s)
#相加后的结果导入score键中
df = pd.DataFrame(df).sort_values(by ='score', ascending=False)
#将字典转化成DF格式,并以总分从大到小排序。
account.sample = df['security'][:30]
return account.sample
#=====================================================================================================
#=====================================================================================================
#交易函数
def trade(account, data):
date = get_datetime()
months = get_datetime().month
if months in account.trade_date:
jz_list = stocks_jz(account,data)
stock_list = list(set(jz_list))
if len(account.positions) > 0:
for stock in list(account.positions):
if stock not in stock_list:
order_target(stock, 0)
if len(stock_list) > 0:
for stock in stock_list:
if stock not in list(account.positions):
if len(account.positions) < account.n :
number = account.n- len(account.positions)
order_value(stock,account.cash/number)
else:
order_value(stock,account.cash)

else:
pass
#=====================================================================================================
#=====================================================================================================





「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-5946135-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。