量化交易零基础入门教程
初识量化交易
- 量化交易是指借助现代统计学和数学的方法,利用计算机技术来进行交易的证券投资方式。便于理解的说,量化交易主要是做这样的事:
量化交易的价值何在?
- 可以利用大量历史数据检验策略,效率提升百倍
- 更科学更客观的衡量交易策略的效果
- 全市场实时捕捉交易机会
- 更多的盈利机会
做量化交易需要什么?
- 要有各种数据。
- 还要有一套量化交易的系统,
量化交易策略基本框架
从一个非常简单的交易策略开始
- 先看一个非常简单的交易策略:
每天买100股的平安银行。
- 为了让这个策略能让计算机执行,首先,要使策略符合“初始化+周期循环”框架,像这样:
初始化:选定要交易的股票为平安银行
每天循环:买100股的平安银行
常用的下单函数
- order(security,amount),刚刚细讲过,含义是买卖一定数量的(单位:股)股票。security是股票代码,amount是数量,amount为负数时就是代表卖出了,需要知道的是,国内股票买入最小单位是1手即100股。例子如下:
# 买入100股平安银行
order("000001.XSHE",100)
# 卖出100股平安银行
order("000001.XSHE",-100)
- order_target(security,amount),含义是通过买卖,将股票仓位调整至一定数量(单位:股)。security是股票代码,amount是数量。例子如下:
# 调整平安银行的持股数量至1000股
# 即,如果目前平安银行的持股数量低于1000股就买入,高于就是卖出,不高不低就不动。
order_target("000001.XSHE",1000)
- order_value(security,value),含义是买卖一定价值量(单位:元)股票。security是股票代码,value是价值量。value为负数时就是代表卖出了。例子如下:
# 买入10000元的平安银行
# 如果当前股票市价是10元,则代表买入1000股
# 如果除不开系统会自动调整成相近的合理数量。卖出时也会。
order_value("000001.XSHE",10000)
# 卖出10000元的平安银行
# 如果当前股票市价是100元,则代表卖出100股
order_value("000001.XSHE",-10000)
- order_target_value(security,value),通过买卖,将股票仓位调整至一定价值量(单位:元)。security是股票代码,value是价值量。例子如下:
# 调整平安银行的持股价值量至10000元
# 即,如果目前平安银行的持股价值量(按股票市价算)低于10000元就买入,高于就是卖出,不高不低就不动。
order_target_value("000001.XSHE",10000)
读取context中的数据与条件
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
止损
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
# 买入股票
order(g.security, 100)
# 获得股票持仓成本
cost=context.portfolio.positions['000001.XSHE'].avg_cost
# 获得股票现价
price=context.portfolio.positions['000001.XSHE'].price
# 计算收益率
ret=price/cost-1
# 打印日志
print('成本价:%s' % cost)
print('现价:%s' % price)
print('收益率:%s' % ret)
# 如果收益率小于-0.01,即亏损达到1%则卖出股票,幅度可以自己调,一般10%
if ret<-0.01:
order_target('000001.XSHE',0)
print('触发止损')
小任务
- 闰年代码实现:
from datetime import datatime
def run_year(date):
run_year = []
both = []
neither = []
for dates in date:
time = datetime.strptime.strptime(str(dates),"Y").year
if time % 4==0:
if time%100==0:
print("%s既是闰年,又是世纪年"%dates)
else:
print("%s是闰年"%dates)
run_year.append(dates)
else:
neither.apend(dates)
return tun_year, both, neither
小任务
from jqdata import *
def initialize(context):
#购买比亚迪股票
g.security = '002594.XSHE'
g.buy_time = '2018-03-01'
g.sell_time = '2018-03-21'
run_daily(period,time = 'every_bar')
def period(context):
date = context.current_dt.strftime('%Y-%m-%d')
if date == g.buy_time:
order(g.security,100)
print('买一手比亚迪')
elif date == g.sell_time:
order_target(g.security,0)
print("溜了")
else:
print("wait")
部分代码转至:https://www.joinquant.com/view/community/detail/7570870ccf37ba48007261992d2e543a