请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3365818 新帖:25

python实用语句集

舞蹈家2发表于:5 月 10 日 04:47回复(1)

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.

全部回复

0/140

量化课程

    移动端课程