我对编程有些新意,并且遇到运行问题并让它从列表中获取输入参数。这是我目前的代码:
import pandas as pd
import numpy as np
from pandas.io.data import DataReader
from datetime import datetime
def pairfinder(ticker1, ticker2):
symbols = [ticker1, ticker2]
stock_data = DataReader(symbols, "yahoo", datetime(2011,1,1), datetime(2011,12,31))
price = stock_data['Adj Close']
returns = np.log(price / price.shift(1))
diff = (returns[ticker1] - returns[ticker2])**2
mindif = ((1/(returns[ticker1].count()))*diff.sum())
corr = (returns[ticker1].corr(returns[ticker2]))
print(ticker1, ticker2, mindif, corr)
tickers = ['AKSO.OL', 'BWLPG.OL', 'DETNOR.OL', 'DNB.OL', 'DNO.OL', 'FOE.OL', 'FRO.OL']
该函数从yahoo finance下载股票数据并将调整后的收盘价放在数据框中,然后计算收益,并获取它们之间的平方差并将其相加。最后它显示了两个代码,总和平方差的结果,以及两个股票之间的相关性。
现在的问题是我想让这个功能通过代码列表运行,我希望它采用第一个代码,AKSO.OL并在其上运行函数和所有其他代码,然后转到下一个并做同样的事情。我试图构造一个for循环来做这个,但我不是那么稳定使用for循环并将它与函数结合起来。
最后我想将结果放到另一个数据框中并将其保存为csv文件或类似的东西,但我想如果有人能指出我的话,我可以自己解决这个问题。第一部分问题的方向。
答案 0 :(得分:2)
如果我理解你的问题,可能会这样做:
for t1 in tickers:
for t2 in tickers:
if t2 == t1:
continue
print "t1=%s, t2=%s" % (t1, t2)
pairfinder(t1, t2)
产生
t1=AKSO.OL, t2=BWLPG.OL
t1=AKSO.OL, t2=DETNOR.OL
t1=AKSO.OL, t2=DNB.OL
t1=AKSO.OL, t2=DNO.OL
t1=AKSO.OL, t2=FOE.OL
t1=AKSO.OL, t2=FRO.OL
t1=BWLPG.OL, t2=AKSO.OL
t1=BWLPG.OL, t2=DETNOR.OL
t1=BWLPG.OL, t2=DNB.OL
t1=BWLPG.OL, t2=DNO.OL
t1=BWLPG.OL, t2=FOE.OL
t1=BWLPG.OL, t2=FRO.OL
t1=DETNOR.OL, t2=AKSO.OL
t1=DETNOR.OL, t2=BWLPG.OL
t1=DETNOR.OL, t2=DNB.OL
t1=DETNOR.OL, t2=DNO.OL
t1=DETNOR.OL, t2=FOE.OL
t1=DETNOR.OL, t2=FRO.OL
t1=DNB.OL, t2=AKSO.OL
t1=DNB.OL, t2=BWLPG.OL
t1=DNB.OL, t2=DETNOR.OL
t1=DNB.OL, t2=DNO.OL
t1=DNB.OL, t2=FOE.OL
t1=DNB.OL, t2=FRO.OL
t1=DNO.OL, t2=AKSO.OL
t1=DNO.OL, t2=BWLPG.OL
t1=DNO.OL, t2=DETNOR.OL
t1=DNO.OL, t2=DNB.OL
t1=DNO.OL, t2=FOE.OL
t1=DNO.OL, t2=FRO.OL
t1=FOE.OL, t2=AKSO.OL
t1=FOE.OL, t2=BWLPG.OL
t1=FOE.OL, t2=DETNOR.OL
t1=FOE.OL, t2=DNB.OL
t1=FOE.OL, t2=DNO.OL
t1=FOE.OL, t2=FRO.OL
t1=FRO.OL, t2=AKSO.OL
t1=FRO.OL, t2=BWLPG.OL
t1=FRO.OL, t2=DETNOR.OL
t1=FRO.OL, t2=DNB.OL
t1=FRO.OL, t2=DNO.OL
t1=FRO.OL, t2=FOE.OL
基本上它贯穿了代码列表,它将函数应用于每个股票代码(t1)和所有其他代码(t2)跳过t1。
注意:它允许重复相同的对(即t1,t2与t2,t1不同)。如果不是所需的行为,请使用itertools.combinations
(如下面的另一个答案中所述)。
事实上,最好的方法是通过itertools.permutations
import itertools
for ticker1, ticker2 in itertools.permutations(tickers, 2):
print "t1=%s, t2=%s" % (ticker1, ticker2)
答案 1 :(得分:1)
享受:
import itertools
for ticker1, ticker2 in itertools.combinations(tickers, 2):
pairfinder(ticker1, ticker2)
Itertools是Python标准库中最有用的模块之一。它让我免于头疼多次。
答案 2 :(得分:0)
这将迭代列表代码中的每个项目,并对每个项目执行某些操作
for tick in tickers:
doSomething(tick)
答案 3 :(得分:0)
替换此
def pairfinder(ticker1, ticker2):
symbols = [ticker1, ticker2]
用这个
def pairfinder(symbols):
瞧,你的功能现在需要一个任意长的列表。现在,取该函数的最后一个块,它确实对两个符号进行操作,并将其移动到另一个函数中:
def calcpair(ticker1, ticker2, stock_data):
price = stock_data['Adj Close']
# etc.
所以现在pairfinder
只需要传递calcpair
每个可能的对,以及stock_data
的正确子集。 ElmoVanKielmo展示了获得对的好方法 - 如果你得到索引对,你可以使用它们下标符号和各种stock_data字段(或者你可以将索引传递给{{1首先,与calcpair
列表一起)。