JoinQuant-TWist 发布于2018-06-22
回复 513
浏览 107336
169
本文是[量化交易零基础入门教程](https://www.joinquant.com/post/13149)中的一篇,点击蓝字链接可查看该系列详情。
------
### 摘要
- 学习用list存储多个股票
- 学习使用for循环
- 学习写一个简单的多股票策略
- 自测与自学
---
- 我们继续以如下这个简单的策略为例进行学习在策略中操作多个股票。
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
### 用list数据类型存储多个股票
- 事实上,根据前面的所学我们是可以写多个股票的策略的,无非是把原来单个股票的操作类似地再写几遍,比如下面这个策略就在操作两个股票。
def initialize(context):
run_daily(period,time='every_bar')
g.security1 = '000001.XSHE'
g.security2 = '000002.XSHE'
def period(context):
order(g.security1, 100)
order(g.security2, 100)
- 显然的问题是,当股票比较多的时候,就要写很多遍,这样的写法就会很麻烦,看着也会比较乱。因此我们要学习其他的写法。首先我们先学习用list数据类型存储多个股票,如下:
def initialize(context):
run_daily(period,time='every_bar')
# 把两个股票代码作为list存入g.security中
g.security = ['000001.XSHE','000002.XSHE']
- list数据类型用法前文有讲过,特点是各个元素用逗号隔开后,用中括号把所以元素包起来,比较简单,有疑问不妨去回顾下。接下来是重点内容--循环语句,用它可以方便的批量操作多个股票。
### 循环语句
- for循环可以遍历任何序列的项目,比如一个list,一般用法如下:
# 含义是依次把序列中的元素赋值给for后的变量,并执行循环语句
for 变量 in 一个序列:
要循环的语句,也叫循环体
- 说起来略复杂,其实不难,来看个使用for的例子:
for k in ['大卫','查理曼','凯撒','亚历山大']:
print(k)
# 执行后日志如下:
# 大卫
# 查理曼
# 凯撒
# 亚历山大
# 可见,for语句的运行过程是,取出list中第一个元素'大卫'并将其赋值给k,然后执行print(k)即在日志中打印k,,此时k中是'大卫',之后,取出list中第二个元素'查理曼'并将其赋值给k,然后执行print(k)即在日志中打印k,此时k中是'查理曼',以此类推,直到'亚历山大'被打印。
- 使用for语句时有一个常见一起使用的语句range(),它的功能是生成等差数列的,用法如下:
range(首项,上限,步长)
# 首项 就是这个数列的第一项,可省略,省略后默认为0
# 步长 就是数列的公差、间隔,可省略,省略后默认为1
# 上限 是用来限制数列长度的,即数列不得大于或等于上限。不可省略。
# 另外,python2中range产生的是list,但python3中产生的不是list,但可以用list()这个语句把结果转成list类型,比如list(range(1,7,2))。我们策略编辑环境是python2。
# 一个例子
for j in range(1,7,2):
print(j)
print(range(1,7,2))
# 执行后日志如下:
# 1
# 3
# 5
# [1, 3, 5]
- continue与break是重要的修饰循环执行流程的语句,用法如下:
# break的作用是写在循环体中用来跳出当前的整个循环过程
# continue的作用是写在循环体中用来跳出当前的这一次的循环过程
# 通过一个例子应该就能明白两者的作用与区别
# 一个简单的循环例子
for t in range(4):
print(t)
# 执行的结果是
# 0
# 1
# 2
# 3
# 在例子中使用break。可以看到当循环到2的时候,打印omg后,执行break,终止了整个循环过程,不再继续循环3了,所以omg后就什么都没了。
for t in range(4):
if t == 2:
print('omg')
break
print(t)
# 执行的结果是
# 0
# 1
# omg
# 在例子中使用continue。可以看到当循环到2的时候,打印omg后,执行continue,跳过了当前正循环的t为2这个循环过程的余下部分,不在继续执行之后的语句(即print(t),此时t等于2),而继续循环3了,所以omg后有打印3。
for t in range(4):
if t == 2:
print('omg')
continue
print(t)
# 执行的结果是
# 0
# 1
# omg
# 3
### 写一个简单多股票策略
- 用刚学的知识把之前简单的策略例子改写成多股票版本,如下。
def initialize(context):
run_daily(period,time='every_bar')
# 把两个股票代码作为list存入g.security中
g.security = ['000001.XSHE','000002.XSHE']
def period(context):
# 每个股票买100股
for stk in g.security:
order(stk,100)
- 其实运用所学的知识已经可以进一步的加入很多东西了,比如在这个多股票的基础上在加入之前讲过的止损。不妨自己先尝试下再看下面的样例代码。样例代码如下。
def initialize(context):
run_daily(period,time='every_bar')
# 把两个股票代码作为list存入g.security中
g.security = ['000001.XSHE','000002.XSHE']
def period(context):
for stk in g.security:
order(stk,100)
# 获得股票持仓成本
cost=context.portfolio.positions[stk].avg_cost
# 获得股票现价
price=context.portfolio.positions[stk].price
# 计算收益率
ret=price/cost-1
# 如果收益率小于-0.01,即亏损达到1%则卖出股票,幅度可以自己调,一般10%
if ret<-0.01:
order_target(stk,0)
print('触发止损')
### 自测与自学
- 实践下本文中的例子
- 用for语句生成一个100项的平方数数列的list,即[1,4,9,16,...,10000]
- 用for语句计算100项的平方数数列的和,即1+4+9+16+...+10000的结果
- 以下代码输出结果是?(len之前提到过,不记得的直接百度下)
```
a = [4,2,1,9,6,5,3,8,7]
for i in range(len(a)):
for j in range(i+1,len(a)):
if a[j] > a[i]:
t=a[j]
a[j] = a[i]
a[i]=t
print(a)
```
---
[查看下一篇](https://joinquant.com/post/13396)
评论
借楼问一个问题啊。
我想输出数据到文件,但是默认的文件夹我找不到。所以就想重新建一个文件夹。但是怎么样都成功不了。求指导。
os.chdir('d:\book')
os.chdir(r'd:\book')
os.chdir('d:\\\book')
这三种都是错误的,应该怎么操作?
2018-06-25
交作业了
```
def period(context):
list = [x**2 for x in range(1,101,1)]
print(list)
sum = 0
for num in list:
sum+=num
print(sum)
```
2018-07-06
```
a = []
sum = 0
for i in range(1, 101):
a.append(i**2)
sum += i**2
print (a)
print (sum)
```
2018-07-19
```
#用for语句生成一个100项的平方数数列的list,即[1,4,9,16,...,10000]
list=[]
for t in range(101):
if t == 0:
continue
list.append(t*t)
print(list)
#用for语句计算100项的平方数数列的和,即1+4+9+16+...+10000的结果
#方法一,sum函数
print(sum(list))
#方法二,for函数
sum=0
for x in list:
sum+=x
print(sum)```
2018-08-02
1.用for语句生成一个100项的平方数数列的list,即[1,4,9,16,...,10000]
```
list1 = []
for i in range(1,101,1):
list1.append(i*i)
print(list1)
```
2.用for语句计算100项的平方数数列的和,即1+4+9+16+...+10000的结果
```
sum = 0
for i in range(1,101,1):
sum = sum+i*i
print sum
```
2018-09-04
list1 = []
for i in range(1,101):
result = i ** 2
list1.append(result)
print(list1)
2018-09-20
第二题:
sum1 = 0
list1 = []
for i in range(1,101):
result = i ** 2
sum1 = sum1+ result
print(sum1)
2018-09-20
a = [4,2,1,9,6,5,3,8,7]
for i in range(len(a)):
for j in range(i+1,len(a)):
if a[j] > a[i]:
t=a[j]
a[j] = a[i]
a[i]=t
print(a)
到if后面的内容就看不懂了,可以解释吗
2018-11-22
你好,我的ret=price/cost-1这个语句,一直在报错,ZeroDivisionError: integer division or modulo by zero,请问怎么解决啊~谢谢了~
def initialize(context):
run_daily(period, time='every_bar')
g.security = ['000001.XSHG','000005.XSHE']
def period(context):
for sk2 in g.security:
order(sk2,1500)
cost=context.portfolio.positions[sk2].avg_cost
price=context.portfolio.positions[sk2].price
ret=price/cost-1
if ret<-0.01:
order_target(sk2, 0)
print('触发止损')
2018-12-17
@梁大大 报错原因是把0作除数。原因是你的账户持仓为0,导致cost为0,而0是不能做除数的。
2018-12-17
@ryukin 但是按照代码,先执行了买入的命令了啊
2018-12-17
@梁大大 g.security = ['000001.XSHG','000005.XSHE']这句你写错了,你仔细看看错误提示,提示该000001.XSHG股票代码不存在,买入错误。应该是000001.XSHE
2018-12-17
@ryukin 啊啊 我试了试 行了 谢了哈
2018-12-17
@罗纳尔多豪 思考一下,i取1时,j 会遍历2到9,用ai 和aj的直来比较,把比ai大的值就赋给ai,每次ai和aj 的值相互交换,if后面实际就是在每次循环时把最大的值赋给ai,从而得到一个从大到小的顺序的列表
2018-12-23
a= [1]*100
for i in range(1,101):
a[i-1]=i*i
print a
totle =0
for j in a:
totle+=j
print totle
2019-01-07