问题来源
julia的代码文件里如何嵌入python代码(除了pycall 的pyimport外)?
如何定义python函数?
如何引用第三方的python包?如何释放第三方包中的函数给julia使用?
如何逐步调试嵌入的python代码?
如何在用julia来完成主要业务处理,如何调用你定义的python函数,如何引用你定义的python变量?
前言
之前使用某量化接口获取数据,只有python的接口,当时在jupyter中开发。
后来因为回测时计算任务比较大,于是把【回测模块】和【数据下载】分开,回测模块用julia来写,数据下载依旧用python调用人家的量化接口。
后来随着代码增多,不好在jupyter里面组织,于是我改用juno【当时也安装了vscode】,发现更喜欢juno。
juno中可以分块执行,跟jupyter的cell一模一样的玩法,但是juno还提供了其他代码管理的功能,现在我基本迁移到juno里面了。
迁到juno后,以前用python写的数据下载模块,不能直接迁移,导致两地存放代码,不好管理。于是想到PyCall,我用PyCall引入量化接口的包,这样也倒蛮好,但是第三方包返回的有些数据,比如dataframe,不能被julia直接解析(需要额外处理),而且有写python的代码,很难用Julia去写。
比如以下代码为【获取前十大流通股东的信息】,我用Julia去改写,反反复复都没有通过。
q=query(finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(finance.STK_SHAREHOLDER_FLOATING_TOP10.code==code,finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date==day).limit(10)
df=finance.run_query(q)
后来发现julia里面,可以直接写python代码。
二、python版本——获取十大流通股东
下面的代码里,q=.........这一串代码,我花费了很长时间,也没能够用julia来正确改写。。。。。
def get_top10_holder(path:str,code:str,day:str):
"""
path:保存的路径,不带/
stock:股票代码
day:日期,一般选用公告日
"""
q=query(finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(finance.STK_SHAREHOLDER_FLOATING_TOP10.code==code,finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date==day).limit(10)
df=finance.run_query(q)
if len(df)> 0 :
display(df)
stockID = code.split(".")[0]
df.to_csv(f"{path}/{stockID}_{day}.csv")
def test():
path = "data"
stock = "600352"
day = '2020-03-31'
code = normalize_code(stock)
get_top10_holder(path,code,day)
print("okk!!!")
test()
三、在julia里面混合python的关键方法
(1)py""" """ 告诉julia,这是python代码块,相当于调用python的eval来执行
(2)py" " 告诉julia,这个地方是引用python object 的一个对象
#直接执行python代码块
py"""
【python代码块】
"""
#应用python代码中的变量或者函数
py"【python代码变量或者函数】"
四、改写以上的python代码
很简单,凡是python代码块,用py""" """包住你的python代码,相当于告诉julia编译器,这些代码要调用python来解释执行
py"""
python代码块
"""
"""
julia和python混合编程,以某量化接口包为例
"""
#引入包
py"""
import pandas as pd
from jqdatasdk import *
"""
#登录服务器
py"""
jqdatasdk.auth("137*******", "*****Quant008")
print("登录成功!!")
"""
#定义函数
py"""
def get_top10_holder(path:str,code:str,day:str):
#功能:获取股票【stock】在某个截止日【day】的前十大流通股东信息,并保存df为csv
#path:保存的路径,【不带/】
#stock:股票代码
#day:日期,一般选用公告日
q=query(finance.STK_SHAREHOLDER_FLOATING_TOP10).filter(finance.STK_SHAREHOLDER_FLOATING_TOP10.code==code,finance.STK_SHAREHOLDER_FLOATING_TOP10.end_date==day).limit(10)
df=finance.run_query(q)
if len(df)> 0 :
stockID = code.split(".")[0]
print(df)
df.to_csv(f"{path}/{stockID}_{day}.csv")
def test():
path = "data"
stock = "600352"
day = '2020-03-31'
code = normalize_code(stock)
get_top10_holder(path,code,day)
print(f"{stock}的k线数据保存成功!!")
test()
"""
真实的代码,自带高亮和格式,简直头等公民待遇
python代码调式,分块运行代码,结果如下,你也可以逐行运行,以便调试
登录成功!!
id company_id ... sharesnature_id sharesnature
0 4979131 420600352 ... 308007 流通A股
1 4979132 420600352 ... 308007 流通A股
2 4979133 420600352 ... 308007 流通A股
3 4979134 420600352 ... 308007 流通A股
4 4979135 420600352 ... 308007 流通A股
5 4979136 420600352 ... 308007 流通A股
6 4979137 420600352 ... 308007 流通A股
7 4979138 420600352 ... 308007 流通A股
8 4979139 420600352 ... 308007 流通A股
9 4979140 420600352 ... 308007 流通A股
[10 rows x 18 columns]
600352的k线数据保存成功!!
五、如果依旧想用julia来完成主要的业务逻辑,如何引用python编写好的函数
完整代码
# julia主逻辑
"""
julia主逻辑
"""
function main()
get_top10_holder = py"get_top10_holder" #把python定义的函数爆给julia
normalize_code = py"normalize_code" #同理,引用了一个python object ,它是一个函数
path = "data"
day = "2020-03-31"
stocks = ["600352","600353","600355","600359"]
stocks = normalize_code(stocks)
stocks .|> stock->get_top10_holder(path,stock,day)
end # function
main()
执行的结果如下:
下载的数据表
总结:
以julia为主要工作语言(胶水语言),python为辅助语言,男女搭配,干活不累!!!
计算量大的力气活julia去干,啰嗦复杂的针线慢活python去干!!!
调用只有python接口的第三方包,用python写或者引入,之后把函数传给julia去组织调用!!!
以画图为例,目前julia的plot包,不能很好的处理中文字符,那么,你用matplotlib吧,自带统计功能的seaborn模块也值得你拥有!!!
我觉得最方便的地方是:业务代码都放在一处了,随时改写,随时调试,调完一个模块,保存一个模块,美美哒!
后记,刚发布一分钟,就黄标了
请小编大人放行。。。。。。