python实用语句集
学完python基础教程后感觉写策略还是有些吃力,许多基本的东西都不会。特开此贴,记录一下看帖子过程中觉得有用的代码。
1.如何在策略里去除上市不到30天的股票?
for stock in stock_list:
days_public=(context.current_dt.date() - get_security_info(stock).start_date).days
if days_public<30:
stock_list.remove(stock)
stocks = get_all_securities(['stock'])
stocks = stocks[(context.current_dt.date() - stocks.start_date) > datetime.timedelta(30)]
2.如何根据股票代码取对应的中文名称?
get_security_info 取到的是最新的, 而 data[stock].name 在回测里可以得到当时的名称
3.如何判断历史上的某一天是否交易日?
from jqdata import *
#获取所有交易日, 不需要传入参数, 返回一个包含所有交易日的 list, 每个元素为一个 datetime.date 类型.
trade_days = get_all_trade_days()
然后判断你的日期是否在 trade_days 列表中。如果我要获取1月1日至4月1日的交易日,get_all_trade_days()括号里的格式是怎样的?
用另一个API 函数 get_trade_days:
jqdata.get_trade_days - 获取指定范围交易日
jqdata.get_trade_days(start_date=None, end_date=None, count=None)
获取指定日期范围内的所有交易日, 返回 numpy.ndarray, 包含指定的 start_date 和 end_date, 默认返回至 datatime.date.today() 的所有交易日
注: 需导入 jqdata 模块,即在策略或研究起始位置加入import jqdata
参数
start_date: 开始日期, 与 count 二选一, 不可同时使用. str/datetime.date/datetime.datetime 对象
end_date: 结束日期, str/datetime.date/datetime.datetime 对象, 默认为 datetime.date.today()
count: 数量, 与 start_date 二选一, 不可同时使用, 必须大于 0. 表示取 end_date 往前的 count 个交易日,包含 end_date 当天。
4.初级股票列表循环
for i in stock_list:
h = attribute_history(i, 60, "1d", fields=['close', 'high_limit'] ,skip_paused=True, df=True, fq='pre')
high_limit_days = h[h.close==h.high_limit].close.count()
stock_list1 = []
if high_limit_days > 0:
stock_list1.append(i)
print(stock_list1)
5.如何找出过去30 天的最高价格?
#获取最近30天的收盘价,最高价,最低价的表格
close_data = attribute_history(security, 30, '1d', ['close', 'high', 'low'])
# 获取30天的最高价。
high_30 = close_data['high'].max()
6.怎么获得股票指标(如市盈率)的全市场排名和行业排名?
import numpy as np
import tushare as ts
from pandas import Series, DataFrame
import pandas as pd
df2=ts.get_stock_basics()
df2=df2.sort(columns='pe')
print(df2.insert(4, 'pe全市场排名', Series(np.arange(1,len(df2) 1), index=df2.index)))#获得pe全市场排名
df2
s1=df2.groupby('industry').size()
df2=df2.sort(columns=['industry','pe'])
count = 0
s=[]
while (count < len(s1)):
s = s list(np.arange(1,s1[count] 1))
count = count 1
s=Series(s)
s.index=df2.index
print(df2.insert(5, 'pe行业排名', s))#获得pe行业排名
df2
后来发现有专门用于排名的函数rank
import tushare as ts
df=ts.get_stock_basics()
df=df[['name','industry','pe','gpr']]
print(df.insert(3,'pe全市场排名', df['pe'].rank(method='first')))#获得pe全市场排名
print(df.insert(4,'pe行业排名', df.groupby('industry')['pe'].rank(method='first')))#获得pe行业排名
print(df.insert(6,'毛利率行业排名', df.groupby('industry')['gpr'].rank(method='first', ascending=False)))#获得毛利率行业排名
print(df.insert(6,'毛利率全市场排名', df['gpr'].rank(method='first', ascending=False)))#获得毛利率全市场排名
df['综合排名']=df['pe全市场排名'] df['毛利率全市场排名']
#可以使用以下语句查看排序是否正确
df=df.sort(columns=['pe','pe全市场排名'])
df
df=df.sort(columns=['industry','pe','pe行业排名'])
df
df=df.sort(columns=['industry','gpr','毛利率行业排名'],ascending=[True, False, True])
df
df=df.sort(columns=['gpr','毛利率全市场排名'],ascending=[False, True])
df
df=df.sort(columns='综合排名')
df
7.怎么获取创业板所有股票的财务数据?
是类SQL语法,不是类字符串操作语法
query(valuation.code).filter(valuation.code.like('300%'))
就算是python的字符串语法,也是
'abcd'.startswith('a')
valuation.code.startwith("300")
8.如何快速获得年度财务数据?
写了个根据年获得当年数据的方法,方便使用。
def get_year_fundamentals(query_object, stat_year):
quarter_fundamentals = [get_fundamentals(query_object, statDate=str(stat_year) 'q' str(i)) for i in range(1,5)]
concat_quarter_fundamentals = pd.concat(quarter_fundamentals)
result = concat_quarter_fundamentals.groupby('code').sum()
return result
9.任何类似下面代码形式的for循环:摘自http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/
new_things = []
for ITEM in old_things:
if condition_based_on(ITEM):
new_things.append("something with " ITEM)
都可以被改写为下面这种列表解析式:
new_things = ["something with " ITEM for ITEM in old_things if condition_based_on(ITEM)]
10.Python合并字典的方式:摘自http://treyhunner.com/2016/02/how-to-merge-dictionaries-in-python/
我们有两个字典user和defaults。我们想将这两个字典合并到新字典context中。有以下合并要求:
1)如果键key重复的话,user的值应该覆盖defaults的值。
2)defaults和user中的键可以是任何有效的键
3)defaults和user中的值可以是任何有效值
4)在创建context期间defaults和user不应该更改
5)对context做出的更新不会改变defaults或user
user = {'name': "Trey", 'website': "http://treyhunner.com"}
defaults = {'name': "Anonymous User", 'page_name': "Profile Page"}
context = merge_dicts(defaults, user) # magical merge function
context
{'website': 'http://treyhunner.com', 'name': 'Trey', 'page_name': 'Profile Page'}
a.多次更新
context = {}
context.update(defaults)
context.update(user)
b.复制并更新
context = defaults.copy()
context.update(user)
c.Python 3.5中合并字典的新方式。
context = {**defaults, **user}
11.在Python中如何使用索引进行循环:摘自http://treyhunner.com/2016/04/how-to-loop-with-indexes-in-python/
如果只需要循环单个列表,使用for-in循环就好
for n in numbers:
print(n)
colors = ["red", "green", "blue", "purple"]
for color in colors:
print(color)
使用zip同时循环多个列表
for header, rows in zip(headers, columns):
print("{}: {}".format(header, ", ".join(rows)))
colors = ["red", "green", "blue", "purple"]
ratios = [0.2, 0.3, 0.1, 0.4]
for color, ratio in zip(colors, ratios):
print("{}% {}".format(ratio * 100, color))
如果需要循环一个列表并且需要项目索引,则使用enumerate
for num, line in enumerate(lines):
print("{0:03d}: {}".format(num, line))
colors = ["red", "green", "blue", "purple"]
ratios = [0.2, 0.3, 0.1, 0.4]
for i, color in enumerate(colors):
ratio = ratios[i]
print("{}% {}".format(ratio * 100, color))
12.在Python中检查所有项目是否都符合某个条件:摘自http://treyhunner.com/2016/11/check-whether-all-items-match-a-condition-in-python/
def is_prime(candidate):
for n in range(2, candidate):
if candidate % n == 0:
return False
return True
转换成生成器表达式传递给all函数
def is_prime(candidate):
return all(
candidate % n != 0
for n in range(2, candidate)
)
if all(condition(item) for item in iterable):
message = "All good"
else:
message = "Bad value found"
任何时候看到像这样的代码
all_good = True
for item in iterable:
if not condition(item):
all_good = False
break
都可以将该代码替换为
all_good = all(
condition(item)
for item in iterable
)
任何时候看到像这样的代码
any_good = False
for item in iterable:
if condition(item):
any_good = True
break
都可以将该代码替换为
ny_good = any(
condition(item)
for item in iterable
)
便条:any(item == 'something' for item in iterable)与'something' in iterable相同。
13.使用get_all_securities获取所有股票信息后,如何再从中选择几个特定股票?但还是想保留这个DataFrame结构
df=get_all_securities()
df[df.index.isin(['601628.XSHG', '000001.XSHE', '600030.XSHG'])]
14.如何通过股票代码返回股票名称?
def get_stock_display_name(stock):
return get_security_info(stock).display_name
def handle_data(context, data):
current_data = get_current_data()
print current_data['000001.XSHE'].name
15.如何通过股票名称获取股票代码?
scu0 = get_all_securities()
scu1 = [code for code in scu0.index if scu0['display_name'][code]=='平安银行']#通过股票名称获取股票代码
scu1
16.如何获得深证综指和深证成指的真实成交额数据(单位亿元)?
df=get_price(security=['399106.XSHE','399001.XSHE'],start_date='2017-01-01',end_date='2017-05-11', frequency='daily', fields='money', skip_paused=False, fq='pre')
df.money = df.money.applymap(lambda x: '%.2f亿' % (x/1e8))
df.money
17.如何获得某只股票最近20日的成交量并比较今天收盘的成交量是否是20日最低成交量?
stock='600685.XSHG'
#选择测试的时间段
start_date='2017-03-01'
end_date='2017-05-17'
his=get_price(stock,start_date,end_date,'daily',['volume'],True,'pre')
his.ix[-1,'volume']==np.min(his.ix[-20:-1,'volume'])
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...